Full-stack developer in Pretoria, South Africa.
Enterprise Java by day · Spring Boot + Angular/React after hours · tests, docs and trade-offs included.
I write enterprise Java web applications during the day, the kind with long-lived business rules, workflow engines and a QA process behind every release. After hours I build the other half of the stack: Spring Boot APIs and Angular/React front ends.
That split is deliberate. Work taught me how software survives in production. My own projects are where I go deep on the modern stack (stateless JWT auth, Angular Signals, WebGL, transactional checkouts) and then write down why I chose what I chose.
- 💼 3 years of professional full-stack experience, since June 2023
- 🎓 BSc Information Technology, North-West University (2023)
- 🧭 "Less but better": simple interfaces, dependable code, honest docs
- 🕹️ Side quests: producing music, soccer, reading, and far too much anime 🗡️
- 🐍 The snake at the bottom of this page eats my commit history. Stick around for it.
- 🔨 Shipping: taking GameStore from localhost to live. Docker, a production profile and CI on every push come first, then a public deploy.
- 📚 Studying: AWS Certified Cloud Practitioner · Oracle Certified Associate, Java SE 8 Programmer (1Z0-808)
- 🤖 Next up: AI engineering in Java, starting with retrieval-augmented generation (RAG), and running LLMs locally with Ollama.
Frontend
➕ Angular Signals · RxJS · React Router · WebGL (OGL)
Backend & Data
➕ Spring Security · JWT · Spring Data JPA · Flyway · Java EE · Oracle SQL
Testing & Quality
➕ JUnit 5 · MockMvc · H2 · Jasmine · Karma · ESLint · Prettier
Tools & Platforms
➕ Claude Code for AI-assisted development
| Project | What it is | Links |
|---|---|---|
| 🎮 GameStore | Full-stack game store: wishlist, cart, simulated checkout, rewards and an admin portal on a JWT-secured Spring Boot API | Backend · Frontend |
| 👔 Employee Management System | Stateless JWT auth done properly across a Spring Boot API and an Angular client | Backend · Frontend |
| 🃏 Code Pairs | Memory game on Angular standalone components + Signals, with combo scoring and S–C ranks | Repo · Live |
| 🌌 Personal Portfolio | One looping scroll over a WebGL aurora: no router, ten ADRs, gated by CI | Repo · Live |
Started as a React UI exercise. I kept asking what an actual store needs behind the pretty grid, and it turned into a full-stack app with the whole loop: discover → wishlist → cart → checkout → own.
- Two audiences, one API. Customers search the catalogue with live suggestions, keep a wishlist, check out and build a personal library. Admins get a separate portal with full CRUD over games and users.
- Checkout that respects money, even fake money. One transaction snapshots each line's price, grants ownership and returns a
DEMO-receipt. The rewards ledger (earn 10 points per R1, redeem 100 points for R1 off) is always recomputed on the server, and card details never leave the browser. - Security is the backbone, not a bolt-on. Stateless JWTs, USER/ADMIN roles in one ordered filter chain, identity taken only from the token (never from a
?userId=), and authorities reloaded from the database on every request. - Built to be trusted. Flyway owns the schema, 63 integration tests run against in-memory H2, and both repos ship an interactive engineering handbook plus a plain list of known limitations.
Plenty of tutorials stop at "login works". I built this one to find out where token-based auth actually leaks: the seam between an API that trusts nothing and a client that has to remember everything.
- Java 17 / Spring Boot 3 REST API over employee records: CRUD behind a Spring Security 6 filter chain that issues and verifies JWTs on every request.
- The Angular side holds up its end. An HTTP interceptor attaches the token to outbound calls; route guards keep protected routes protected instead of just hiding the nav link.
- A UI that only promises what it does. Light and dark themes with measured WCAG AA contrast, a dense table that drops columns by priority on smaller screens, and distinct loading, empty, no-results and error states. Buttons that led nowhere were removed, not styled.
- Decisions on paper. The API ships an architecture and MVP roadmap doc; the client records its theme and layout choices as ADRs.
A code-themed card matching game that I tore down and rebuilt on Angular's standalone components and Signals. The rewrite was the point.
- Game state as derived state. One service holds the raw state in writable signals, and everything else (multiplier, accuracy, rank) is
computedfrom it, which killed a whole class of stale-UI bugs. - Actual game design. Three difficulties, each with its own grid, lives and par time. Consecutive matches ramp a combo multiplier up to 3×, and every win is graded S, A, B or C.
- Neo-brutalist "Paper & Ink" design system built on CSS custom properties, with 3D CSS card flips. Every button splits into a stationary hit box and a moving face, so a press can't slide off its own target.
- Playable by everyone. Keyboard controls, screen-reader announcements for every flip and match, full reduced-motion support, and unit tests on the game rules.
🔗 Repository · Live Demo
I didn't want a résumé with a nav bar, that's boring. This one is a single continuous scroll: five destinations that wrap into a seamless loop, floating over a WebGL aurora.
- No router. The whole site is one scroll loop with a cloned first section at the end, so reaching the bottom wraps back to the top without a jump or a route change.
- One frame loop drives everything. A GLSL aurora rendered with OGL and an SVG constellation that morphs between the five destinations both run on a single shared
requestAnimationFramepulse outside Angular's zone, which keeps change detection off the 60 fps hot path. - Every real decision is an ADR. Ten so far, including the ones I tried and rejected. The repo also ships an interactive onboarding guide for anyone reading the code cold.
- Nothing reaches production unchecked. Every push runs lint, a format check, unit tests on the pure scroll and motion maths, and a build that generates the Content-Security-Policy.
🔗 Repository · Live Demo
- Decisions get written down. Ten ADRs in the portfolio (rejected ideas included) and three in Employee Manager. GameStore ships an interactive engineering handbook that spans both of its repos.
- Tests live where the logic lives. 63 integration tests cover the GameStore API against in-memory H2. The portfolio keeps its maths in pure, unit-tested functions, and CI checks every push.
- The schema is code. Flyway owns the GameStore database through versioned migrations with
ddl-auto=validate, so schema drift stops the app at startup instead of hiding. - Accessibility is part of done. Keyboard play, screen-reader announcements and reduced-motion support in Code Pairs; measured WCAG AA contrast in both Employee Manager themes.
- Limitations are stated plainly. Both GameStore READMEs keep a "Known limitations" section: what doesn't work yet, and why.
| Project | What it is | Built with |
|---|---|---|
| 📋 Agile Board | Kanban-style task manager with multiple boards, TODO / DOING / DONE columns and a remembered light/dark theme | Vanilla JS (ES modules) · CSS · localStorage |
| 😂 Meme Generator | Pulls templates from the Imgflip API and lets you caption them; my hands-on lesson in React state and controlled forms | React · JavaScript |
| Certification | Issuer | Issued | Proof |
|---|---|---|---|
| Claude Code 101 | Anthropic Academy | Apr 2026 | Verify |
| Claude 101 | Anthropic Academy | Apr 2026 | Verify |
| JavaScript | Scrimba | Dec 2025 | Verify |
| HTML and CSS Fundamentals | Scrimba | Dec 2025 | Verify |
| Artificial Intelligence Fundamentals | IBM | Oct 2024 | Verify |


