Available for new opportunities

I build the systems
AI products stand on.

I’m a backend engineer: I ship idempotent ingestion pipelines for messy real-world input, multi-tenant APIs where isolation is enforced at the query layer, and model integrations that fail safely instead of silently.

01 / SELECTED WORK

Featured projects

Multi-tenant SaaS
P-01 / minglehub

MingleHub

A multi-tenant SaaS platform for bars and venues: an NFC tap opens a live game session on every phone at the table. The venue is derived from the auth token, never the request, so cross-tenant reads are impossible by construction. Game state is server-authoritative, billing is metered and idempotent on Stripe, and 459 tests plus a CI guard keep it that way.

FastAPI Neon Stripe Clerk Supabase React
Privacy-first Data Pipeline
P-02 / financetracker

FinanceTracker

A self-hosted ingestion pipeline that turns CommBank and Westpac CSV exports into categorised spending. Every row is fingerprinted, so re-uploading a statement is a no-op. Transfers between your own accounts are matched and netted out, and a fail-closed sanitiser guarantees raw bank data never leaves the machine. 1,192 tests across the parsers, the matcher and the privacy boundary.

FastAPI SQLite OpenRouter Tailscale Vite PWA
HealthTech
P-03 / nutriscan

NutriScan

Photograph a nutrition label and its macros land as validated rows in a 19-table Postgres schema, with per-user isolation enforced by row-level security rather than application code. Every image passes one validating gate and is never stored, and Gemini's answer is schema-checked before it reaches the log. A public REST API and a Claude connector let a claude.ai chat read the day and log meals, with every write previewed and committed only by a one-time code. Account deletion runs a 15-day grace period with export, abuse is blocked at a middleware rather than merely alerted, and the API pauses itself before the free database budget runs out.

FastAPI Neon Gemini Groq MCP React
Developer Tooling / MCP
P-04 / linkedin-formatter

LinkedIn Formatter

One formatting core shipped as three published artifacts: a VS Code extension, a zero-dependency CLI on npm, and an MCP server that lets AI agents apply LinkedIn's Unicode styling over stdio with exact code points. The preview card is the editor: type into the rendered post and every keystroke lands in the file already styled.

TypeScript MCP esbuild npm VS Code API
Developer Tooling
P-05 / claude-remote

Claude Remote

Tap a project on your phone and a Claude Code session starts on your Windows PC in that folder, with your own hooks, skills and MCP servers, then waits in the Claude app's Code tab. A zero-dependency Node agent stays on loopback, reached only through Tailscale serve and a scrypt-hashed passcode with backoff. A tile turns green only once the agent has proved a live process, and STOP tree-kills the session and confirms it by polling. It installs as a Claude Code plugin with one line, and updates itself with a rollback if the new agent does not come up.

Node.js PowerShell PWA Tailscale Web Push C#
02 / TOOLKIT

Skills & stack

The languages, frameworks, and infrastructure I reach for.

01

Languages

  • Python
  • SQL
  • TypeScript
  • JavaScript
02

Backend & APIs

  • FastAPI
  • Node.js / Express
  • REST design, rate limiting, async job queues
  • pytest (1,650+ tests shipped)
03

Data & Storage

  • Neon Postgres (row-level security)
  • SQLite (WAL)
  • Snowflake
  • AWS S3
04

Infra & DevOps

  • Docker / Compose
  • nginx
  • GitHub Actions CI
  • Vercel / Render
05

Auth & Security

  • JWT / JWKS verification
  • OAuth 2.0
  • Cognito / Supabase / Clerk
  • CORS, CSP & security headers
06

AI Integration

  • Structured extraction (schema-constrained output)
  • Multi-provider routing (OpenRouter, Gemini, Groq)
  • Fallback chains & timeouts
  • Sentence-Transformers
03 / CONTACT

Let’s build something that holds up.

Currently open to backend and platform engineering roles and internships in Melbourne. Have an AI product that needs a real backend behind it? Drop me a line.

Please enter your name.
Enter a valid email address.
Please include a message.
Message sent! I'll get back to you soon.