The shape of the work
This article is an overview. The individual project articles elsewhere on this site go deep on individual systems — how a quotation becomes an invoice, how a karaoke highlight follows a melody, how a crawler survives an upstream outage. This one is about the shape of the whole body of work, and about the few decisions that stay the same across it.
The corpus behind this article is 89 owned public repositories, 22 owned private repositories, and 22 repositories I have contributed to. They span December 2018 to September 2026. The line counts, language distribution and file inventory in it are read from the repository reports rather than estimated.
How the work changed
The earliest repositories are language practice and embedded coursework. Assembly and C on Windows, then C++, then Java and Python — the order a computer science degree actually teaches them. The embedded systems work from 2022 is the most distinctive of that early period: a remote lock and a set of Raspberry Pi tasks driving relays, Morse code, PWM and I²C, with cloud functions receiving webhooks and a particle interface feeding the results back. That is real hardware, a cloud broker, and a control loop, assembled at a scale where every part is visible.
Around 2023 the shape changes to shipped applications. A run of Android apps in Kotlin and Java — a unit converter, a quiz app, a news reader, a lost-and-found tracker, a trucking app, a video app — followed by an end-to-end encrypted messaging app with a separate frontend and backend.
The clearest signal of engineering maturity is what came next: between March and April 2024, a cluster of small shared libraries. CommonResponseStructure and CommonErrors for consistent API envelopes, ExpressCommonMiddlewares for request handling, CommonServices for the shared service layer. Each was extracted from a project that had already needed it twice. Building a shared library after the second duplication is a different decision from building one before the first.
From 2025 the work consolidates into platforms. A media platform with separate frontend and backend. A Cantonese-learning platform with an API server, a web app and a set of Python micro-services. A speech-to-text model and a text-to-speech model, both in Rust. Developer tooling in Shell and Rust — an agent runner, a command collection, a crawler, a converter. And the portfolio platform this site runs on.
What repeats across it
Three patterns account for most of the volume.
Ship the whole slice, not a layer. Every non-trivial product here is a frontend, a backend, and the schema or service contract between them, maintained together. The receipt manager, the encrypted messaging app, the Cantonese platform, the business platform — the same shape each time. Layer-only contributions are the exception.
Reusable code is extracted after the second use. The 2024 common-libraries cluster is the clearest example. Earlier projects repeat a handful of patterns inline — API response envelopes, error shapes, middleware, database access — and those become libraries once they have been written twice.
Self-host over managed, when the managed thing is the product. The address autocomplete service searches roughly sixteen million Australian addresses from a self-hosted PostgreSQL instance rather than a hosted geocoding API. The portfolio runs on a single Bun application. The reasoning is the same in each case: when the data is the product, owning the store is cheaper than renting access to it.
Public work
The public repositories break down by language: TypeScript leads with 24, then Python at 12, C++ at 11, Java at 7, JavaScript at 5, Kotlin at 4, HTML at 4, Rust at 3, with Shell, CSS and C at 2 each and C# and Go at 1 each.
By software kind, across the whole corpus: 20 web applications, 17 API backends, 10 mobile apps, 8 automation and developer tools, 3 data and machine-learning projects, and a handful of desktop, CLI and infrastructure tools.
A few of the public ones are worth naming directly.
G-NAF Autocomplete — a self-hosted autocomplete service over the full Australian address dataset, measured under 50 ms at the 95th percentile on PostgreSQL indexes alone, with no external geocoding call in the request path.
SmartPlay HK OSS — a crawler and watcher for Hong Kong facility and district data, with failure classification, a database-backed dead letter queue, jittered exponential backoff and a circuit breaker that stops issuing requests entirely when an upstream is down.
Canto101 — a Cantonese-learning platform with a dictionary-grade lexical corpus, word-level karaoke timing derived from the audio itself, and a clean-architecture API server fanning out to isolated Python micro-services.
Best Maker Pty Ltd — the operating system behind a custom fabrication and joinery business: a quote-to-cash pipeline with split payments, bank reconciliation, a commerce back-office, and a published API contract with a generated, drift-checked client.
PixelCast and CantoLyr — media and lyric tooling, the latter the origin of the Cantonese karaoke work.
subagents.sh and the related tooling — agent orchestration, command collections and crawlers that automate the parts of development that do not need judgement.
QwenASR and qwen3-tts-rs — speech recognition and speech synthesis, both in Rust, both running locally on consumer hardware rather than through a hosted inference API.
Uptime Kuma — a self-hosted monitoring deployment, included as a run of real infrastructure rather than a portfolio piece in its own right.
Private and client work
The 22 private repositories cover work that is either under an NDA, belongs to a client, or simply has not been open-sourced. Describing them by domain rather than by name:
Business and operations systems. A fabrication and joinery business platform spanning quote-to-cash, invoices with split payments, expense capture and approval, bank reconciliation and a two-way spreadsheet bridge. A shared-expense splitting application with its own settlement engine, multi-currency balances and partial-payment credit handling. An employment accounting tool. A staffing and shift scheduling system.
Commerce. Two cabinetry storefronts — a customer-facing store and its backend — built as a paired deployment.
Cantonese language technology. The lyric timing pipeline behind the karaoke feature, split across a web app, a server and a refactor branch, plus a Cantonese subtitling tool.
Media and monitoring. A fire-safety documentary site with its own data repository and a Go background worker. A self-hosted monitoring deployment.
Developer and infrastructure tooling. A file storage microservice. A queue-based ticket system. An automation service for the facility-data crawler. Internal services for document rendering, email, background workers and backups.
Applied machine learning and instrumentation. A thermal imaging pose-analysis service. A recoil-analysis tool. A native speedometer for Apple platforms.
Archived foundations. A headless CMS experiment and an early storage service, both superseded by later work.
What this does not cover
Some of the work is not on this site at all: coursework that is not representative, repositories with nothing to show, and contributions to other people's projects, which are tracked but not claimed as portfolio pieces.
The numbers in this article describe the repository corpus. They are a count of what exists in version control, which is a lower bound on the work rather than a complete accounting of it.