Skip to content
VEStudio

Full-stack engineer · Building on Django, Next.js and Docker

I build production systems, end to end.

Multi-tenant platforms with deep domain models, real-time features that actually work under NAT, and the deployment infrastructure underneath them. Django and DRF on the back, Next.js and React Native on the front, Docker and a shared Caddy edge in between.

01 / Work

Selected work

Production systems I designed, built and deployed. Numbers are counted from the repositories, not estimated.

  • Transio

    Multi-tenant fleet operations platform

    Live

    Twenty-four Django apps covering vehicles, assignments, custody, compliance, inspections, defects, maintenance, tyres, fuel, dispatch and telematics — every model scoped to an organization for row-level multi-tenancy. The centrepiece is a policy engine: PolicyDefinition and CompanyPolicyValue make per-company business rules data rather than code, so onboarding a customer with different WOF thresholds or a stricter defect-review chain is a configuration change. Live GPS is append-only with geofence-breach detection, and nightly jobs turn raw telematics into driver behaviour scorecards.

    Django apps
    24
    Portal routes
    113
    Clients
    Web + mobile
    • Django 6.0
    • DRF
    • PostgreSQL 18
    • Celery
    • Channels
    • Redis
    • Next.js 16
    • Expo
    • Stripe
  • navya

    AI-powered learning platform for children

    Live

    Adaptive-difficulty curriculum across maths, science, English, history and art, with a rewards and characters layer to keep children engaged and a parental-controls surface for the adults. The AI sits behind a provider-agnostic adapter over Gemini, Groq and OpenAI, so a model or vendor change is one implementation, not a rewrite. Real-time chat and video calling are genuinely wired — Channels for signalling, coturn for TURN relay when symmetric NAT or mobile CGNAT would otherwise drop the call silently, and LiveKit as an SFU for shareable meeting rooms.

    Django apps
    23
    Frontend routes
    272
    Real-time
    WebRTC + SFU
    • Django 5.2
    • DRF
    • PostgreSQL
    • Celery
    • Channels
    • LiveKit
    • coturn
    • Next.js 16
    • Gemini / Groq / OpenAI
  • VE Property

    Land and property asset ERP

    In development

    Nineteen Django apps modelling the parts of property ownership that spreadsheets lose: SaleDeed with its parties, assets and payment schedule; OwnershipTransfer; Lease with RentSchedule, LeaseEvent and SubLease. Geography is first-class via DRF-GIS rather than a pair of float columns. A dedicated migration pipeline — ImportJob, ImportIssue, LegacyPropertyMap — exists because the real work was moving a decade of legacy records in without silently dropping the rows that did not parse.

    Django apps
    19
    Frontend routes
    72
    API docs
    OpenAPI
    • Django 4.2
    • DRF
    • DRF-GIS
    • PostgreSQL
    • Celery
    • drf-spectacular
    • Next.js 14
    • Leaflet
  • Akeedat 2.0

    Literary publishing platform

    Live

    Posts, poems, comments, tags, author profiles and a newsletter, with a three-tier role model — reader, author, admin — gated additionally on an active flag so access can be revoked without deleting an account. A ground-up Django and Next.js rewrite of an existing Laravel and Blade application, which meant the data model had to be reconstructed from the old schema rather than designed fresh.

    Django apps
    7
    Frontend routes
    35
    Migrated from
    Laravel
    • Django 5.0
    • DRF
    • PostgreSQL
    • Celery
    • Channels
    • Next.js 15

Also built

  • Pieces of Us

    In development · 2026

    Writers publish a book one chapter at a time while readers comment and react. Deliberately small: five models, no Celery, no Redis, no Channels — the complexity budget went into the writing and reading flow instead.

  • Dollar Restaurant

    Design + architecture · 2026

    A flat NZ$1 per order instead of percentage commission, order-ahead-and-pickup first. This one is architecture work rather than a shipped product: the order state machine, the fee model, dispatch, and a twelve-domain decomposition are designed and documented, with a buildable skeleton behind them and no business logic yet.

  • Realty Redefine

    Archived · 2025

    The monolithic Django application that VE Property replaced — classic MVT with 300-odd templates, import/export tooling and a long tail of hands-on data cleanup. Superseded, but its property dataset and the hierarchy problems it surfaced are what shaped the successor's import pipeline.

02 / Stack

What I work with

Chosen for the same reason across every project: a boring, well-understood core with complexity spent only where the domain actually needs it.

Backend

  • Python
  • Django
  • Django REST Framework
  • Celery
  • Django Channels
  • PostgreSQL
  • PostGIS
  • Redis

Frontend

  • TypeScript
  • Next.js (App Router)
  • React
  • Tailwind CSS
  • TanStack Query
  • Zustand
  • React Native / Expo

Infrastructure

  • Docker & Compose
  • Caddy
  • nginx
  • GitHub Actions
  • GHCR
  • Cloudflare
  • DigitalOcean
  • Let's Encrypt (DNS-01)

Real-time & integrations

  • WebSockets
  • WebRTC
  • coturn
  • LiveKit
  • Stripe
  • Razorpay
  • Twilio
  • S3

03 / About

How I work

I build and ship full-stack products on my own — the data model, the API, the web client, the mobile app, and the deployment that puts them in front of people. Most of what I work on is multi-tenant business software where the domain is the hard part: fleet compliance, property ownership chains, adaptive curricula.

The work I am proudest of tends to be invisible. A policy engine that turns per-customer rules into rows instead of branches. An import pipeline that records every row it could not parse rather than quietly skipping it. A TURN relay for the ten percent of calls that would otherwise fail with no error at all.

That extends to infrastructure. The site you are reading sits behind a shared Caddy edge that terminates TLS for every app on one droplet, resolves the real client IP through Cloudflare, and hands each application exactly one trusted header — because the alternative is a rate limiter where the entire internet shares one bucket and the logs look fine.

04 / Contact

Get in touch

Open to interesting problems — particularly ones with a domain worth modelling properly.