Full-stackdeveloperwho understands
Six years building and shipping production web applications. I learned the craft writing every line by hand, and I've since moved to AI-driven development — not to think less, but to put the thinking where it counts. The engineering judgement is still mine; the typing no longer has to be.
Scroll ↓Tech stack
What I build with.
TypeScriptReact
Next.js
Vue
Nuxt
JavaScript
Tailwind
GSAP
Laravel
Livewire
Zod
TanStack Query
SCSS
Bootstrap
HTML
CSS
Docker
Git
GitHub
Digital Ocean
Ubuntu
Cypress
Figma
Adobe XD
Shipping soon
Built on my own time.
Personal products rather than client work — scoped, planned and tested the same way regardless. Small enough to actually finish, and the status here moves as each one does.
- In build
Beepo
A medication reminder that tracks your schedule and your health alongside it — and pairs you with an accountability partner who can check in on you. Staying on top of your medicine shouldn't be a dull chore you do alone.
- Platform
- iOS·Android
- In build
Momo
A gamified Pomodoro timer that turns focus into something you want to come back to. Being productive shouldn't be boring.
- Platform
- iOS·Android
- Announcing soon
More soon
A third app is already scoped and waiting its turn. Details when it's close enough to be worth naming.
How I work
Understand it first. Build it once.
Most wasted engineering is a correct build of the wrong thing. Before I design a system, I want to know what the business actually loses today — and that only comes from talking to the people living with it.
- 01
Talk to the stakeholder
Start with how the work happens today — the spreadsheet, the workaround, the thing everyone does manually on a Friday. What people ask for is a solution they've already guessed at; I want the problem underneath it.
- 02
Find the real problem
The person paying for it and the person using it daily rarely describe the same pain. I look for that gap early, because building for only one of them is how a project gets delivered and then quietly abandoned.
- 03
Design the system
Data model, the flows between screens, where the boundaries sit and what talks to what. Decided deliberately and written down, so the architecture is a choice rather than whatever the first sprint happened to produce.
- 04
Prototype and show it
Low fidelity to high fidelity, put in front of them before it's built. A stakeholder can't review a paragraph, but they'll tell you exactly what's wrong with a screen.
- 05
Re-iterate
Then change it, and show it again. Redrawing a screen costs an afternoon; rebuilding a shipped feature costs a sprint and the client's confidence. I'd rather be wrong early and cheaply.
- 06
Agree the scope
What's in, what's explicitly out, what we're assuming. Signed off before implementation starts — so the thing that ships is the thing everyone agreed to, and scope creep is a conversation instead of a surprise.
Working with AI
AI makes me fast. The planning is what keeps it correct.
I lean on AI heavily to speed up development — scaffolding, refactors, test suites, migrations, the work that used to eat whole days. What I haven't handed over is the thinking. AI slop is what happens when you skip straight to generation; every artefact below exists before the first prompt, and that's the difference between output that ships and output that merely compiles.
- 01
Problem statement
Before a single prompt, the problem gets written down in plain language: who is stuck, what they're trying to do, and what it costs them today. Hand a model a vague problem and it will confidently solve a different one.
- →Who has the problem
- →What they do instead right now
- →What success looks like, measurably
- 02
Aggressive planning
Every unclear requirement gets resolved before it gets built. I push the model to surface edge cases and argue design decisions through rather than take the first one that compiles — because an assumption made silently at this stage becomes a rewrite later.
- →Ambiguities named and resolved, not assumed
- →Edge cases enumerated up front
- →Alternatives weighed with trade-offs stated
- 03
User stories
The most important artefact. Stories keep the work anchored to a person instead of a spec, and they're what acceptance criteria hang off. Without them AI optimises for something plausible; with them it optimises for something someone actually needs.
- →As a… I want… so that…
- →Acceptance criteria per story
- →Sized so one story is one deliverable
- 04
UI flow
Screens and the transitions between them, designed before implementation. AI writes markedly better code against a flow it can see than against a paragraph it has to imagine — and the states everyone forgets get caught here rather than in QA.
- →Screen inventory and entry points
- →Empty, loading, error and success states
- →The path a real user takes, start to finish
- 05
Out of scope
Written down explicitly. Naming what we are not building is the single cheapest way to stop a model generating three features nobody asked for — and it turns scope creep into a conversation instead of a surprise.
- →Deferred features, listed
- →Assumptions made explicit
- →The line between v1 and later
- 06
Test-driven
Tests written against the acceptance criteria before the implementation exists. The suite becomes the specification the model has to satisfy, which is what separates code that runs from code that is correct — and it catches the regression before a user does.
- →Red first, against the story's criteria
- →The model writes to a failing test, not a vibe
- →Regressions caught by the machine, not the user
Work history
The teams I've built with.
2026 — Present
● Current
Full Stack Developer
Caravea
Building and maintaining a suite of internal systems — a custom CRM, project boards and inventory. I work both ends of every feature: the Laravel APIs and data model, and the TypeScript, React and Inertia interfaces built on top of them.
- Maintaining and extending multiple systems in daily production use — a custom CRM, project boards and inventory — with ongoing module and schema work as each one grows.
- Building both ends of every feature — designing the Laravel APIs and data model, then building the React and Inertia interfaces that consume them, fully typed in TypeScript end to end.
- Integrating third-party services including Twilio — API design through to webhook handling, retries, and the failure paths that only surface in production.
June 2025 — January 2026
Full Stack Developer
Sundra
Multilingual learning and translation SaaS. Laravel APIs and a Nuxt v4 + TypeScript frontend, plus the infrastructure work that made shipping it repeatable.
- Replaced Stripe with Paddle across the platform — secure webhook handling and full subscription lifecycle management.
- Upgraded Nuxt v3 → v4 and refactored the codebase for performance, modularity and maintainability.
- Designed and built the Laravel backend APIs behind core platform functionality and its integrations.
- Stood up GitHub Actions CI/CD, Sentry monitoring and Dockerised local development, so releases and debugging stopped being bespoke.
- Built the editor module, the reusable component library and the Webflow-based pricing page.
January 2025 — June 2025
Full Stack Developer
Freelance
Full ownership from development through deployment and maintenance, across React, Next.js, Inertia, Nuxt, Vue, Laravel, Ruby on Rails and Firebase.
- Created and optimised RESTful APIs in Laravel and Ruby on Rails — secure, efficient and built to scale.
- Translated complex designs into responsive, high-performance UIs in React, Next.js, Nuxt and Vue.
- Managed Dockerised deployments and CI/CD pipelines across GitHub Actions and Bitbucket.
- Standardised four different stacks on shared ESLint and Prettier config, and brought dependencies back up to date.
April 2024 — November 2024
Frontend Engineer
LotHunt
Frontend for a land-investment platform in Vue.js and TypeScript, with backend contributions in Ruby on Rails.
- Built a custom map overlay marker rendering 5,000+ markers without clustering — measurably faster to render and navigate than the clustered original.
- Wrote and maintained unit and end-to-end Cypress coverage, keeping test coverage high as the surface grew.
- Owned Bitbucket CI/CD pipelines and integrated Sentry for error logging.
- First responder for critical incidents, including unplanned outages.
- Worked with the designer to propose UI/UX changes rather than just implement handoffs.
June 2023 — March 2024
Frontend Lead / Full Stack Developer
Spondise
Led the frontend team: planning and assigning work, reviewing PRs, reporting to stakeholders, and building alongside them in Nuxt 3 and Laravel.
- Built realtime chat and notifications with Nuxt 3, Laravel Echo and Pusher, designing the REST APIs alongside the backend developer.
- Planned and assigned frontend work, and reported project status directly to stakeholders.
- Reviewed every frontend PR for readability and quality.
- Shipped an SSR blog in Nuxt for SEO, and a custom role and permission handler.
- Helped manage the servers and deployments.
September 2022 — May 2023
Full Stack Web Developer
Advanced Exteriors
Two products on Vue 2, Vue 3 and Laravel — turning prototypes into shipped features, with unit coverage and component documentation.
- Built PDF receipt and invoice generation for the subscription app in Laravel.
- Took features from low-fidelity prototype through to production code in Vue.
- Repaired Storybook so the component library was documented and usable again.
- Added Jest unit coverage, and rebuilt the email templates in Blade alongside other UI fixes.
June 2022 — August 2022
Full Stack Web Developer
LGU — NHA Office
A National Housing Authority applicant-management system on the TALL stack. I led planning, development and deployment.
- Led the whole process — planning, development and deployment.
- Ran discovery with the office staff on how their setup actually worked, then proposed a better one rather than digitising the old one.
- Presented a high-fidelity Figma prototype to the client before any code was written.
- Implemented roles and permissions with Spatie, and optimised how applicant records were collected, stored and retrieved.
November 2020 — June 2022
Full Stack Web Developer
Freelance
Where it started. Small-to-medium projects across whatever stack the client already had — consultancy, deployment, UI repair and net-new features.
- Integrated third-party APIs including Xero and Amazon, and built REST APIs in Laravel.
- Replaced Laravel Spark with Laravel Cashier (Stripe) so subscriptions ran on a supported billing path.
- Worked extensively with Firestore, Realtime Database and Firebase Authentication.
- Deployed to Digital Ocean droplets, bare VPS and shared hosting, depending on what the client already had.
- Rebuilt an existing Joomla site in Laravel + Blade, and built landing pages for businesses.
Write-Ups