yk.camelcase.work

Recent Work

Recent products, built end to end. Each entry names the engineering decision that shaped it, not the feature list.

Every project below started from a real problem. From there the role is the same: product concept, system architecture, implementation, infrastructure, deployment and continuous delivery - each product keeps evolving well past its first release.

DreamBank - Closed-loop virtual banking platform

DreamBank is the financial layer of a closed game ecosystem: virtual cards, multi-currency balances, transfers, cashback, savings and virtual credit, with no path out into real money. The currencies are fictional, the accounting is not - it runs as a double-entry ledger with immutable postings behind a set of Go services. The design goal I optimised for is that every balance change can be explained to the person who owns it.

Problem

DreamBank is one of several products in the Dream ecosystem, alongside DreamBox, DreamFarm and DreamMarket - and the one all of them settle through. The ecosystem itself grew from a different idea: online shopping easily turns into a habit that costs real money, yet research suggests most of the pleasure comes from the search, the choice and the checkout rather than from owning the thing. Dream keeps that experience and removes the cost with virtual currency that never turns into real money. For that to feel real, the money has to behave like money - cards, balances, a history - across every product at once.

Double-entry ledgerGo, PostgreSQLMulti-currency accountingclosed-loop fictional currenciesTransactional outboxat-least-once, idempotent consumersRisk and anti-abuse decisionsvelocity, reputation, holdsCard-first product modelvirtual cards, shared cards, receive detailsInstallable client, native-readyNext.js PWA, static export

Architecture

  • Double-entry ledger for play money. Every balance change is a journal entry whose postings sum to zero, posted rows are immutable, and balances are projections rebuildable from postings. A stored balance column would have been far simpler and permanently unexplainable.
  • One bucket per card, no wallet. Three cards in one currency are three independent balances, and moving value between them is a real transfer. A pooled user-level balance is explicitly forbidden, so no flow can quietly invent one.
  • Cross-currency movement stays explicit. Each ledger account and each posting carries exactly one currency, so no transfer can silently convert. Cross-currency movement is a separate operation that records quote, rate, rate version and expiry before confirmation.
  • Rewards are not money yet. Cashback accrues as points in a separate append-only journal and reaches the money ledger only through a confirmed redemption. Points settle only once the reversal window has closed, so a refund cannot drive a point balance negative.
  • Counting attempts, not successes. Velocity counters increment while an operation is being evaluated, before the decision, so rejected attempts still count. I traded accuracy as an activity record for immunity to threshold gaming by rapid retries.

Editron

An API-first text transformation service. Its own web editor is a first-party client of the same public API and is forbidden from bypassing it, which is what keeps the integration surface honest; the processing engine is swappable behind one internal contract, with tenancy, API keys, quotas and usage accounting as first-class concerns, plus a published TypeScript SDK.

Lernklang

A gated listening platform for language learning with a school-facing analytics dashboard. One image, three roles: scheduled work runs as its own container, so restarting or scaling the web app never skips or double-runs a job - and configuration is validated at startup, the process refusing to boot on an invalid variable rather than failing quietly in production.

Herald

Topic-driven news collection, processing and delivery. Deduplication is enforced at delivery, keyed per channel by content hash with URL as fallback over a rolling window, so syndicated and live-updated articles are never sent twice; each article yields three independently produced formats, every one stamped with the exact pipeline version that made it, for reproducibility and cost accounting.

Smaller products and focused experiments are part of the same practice: they let an idea, an interaction pattern or a new workflow be validated quickly, before a larger system is committed to.