Skip to content
WorkExperienceAboutContact
Request my CVOpen to work

StillKoi pond

Layer some sounds while you read

Sounds from StillKoi →

Name More!

Name an animal. The rarer, the better.

  • lion
  • elephant
  • giraffe
  • axolotl98

Open the game →

To do

  • Build my own OS
  • Ship my own products
  • Find my next team
  • More mint tea

Agency Ops

Agency Ops

DeployedSole engineer

OverviewWhat it replacesProductFinance, calendar, clientsEngineeringPermissions, portal, moneyDecisionsTrade-offs and testsNext projectStillKoi →

Engineering decisions

Safety in shared data

01

One policy, three enforcement points

Problem

Permission checks scattered across every API route, the client router and the navigation would inevitably drift apart.

Decision

Define one permission policy and use it in the server middleware, the route guards and the navigation.

Why

Adding a feature means adding one policy entry, not remembering three separate checks.

Tradeoff

The policy becomes a critical shared module, so changes to it need care and tests.

02

404 for cross-client access

Problem

A 403 on another client’s resource confirms that the resource exists.

Decision

Answer cross-client requests as if the resource didn’t exist, and test that boundary deliberately.

Why

A client portal must not reveal anything about other clients, not even their existence.

Tradeoff

Debugging access issues is less obvious, so server logs carry the real reason.

03

Integer cents and transactions

Problem

Floating-point money and multi-step updates are how accounting data quietly goes wrong.

Decision

Store every amount as integer cents and run multi-record workflows in transactions.

Why

Totals reconcile exactly, and a failed step can never leave an invoice without its line items.

Tradeoff

Formatting and tax math have to convert explicitly at the edges.

04

A modular monolith

Problem

The product spans a dozen domains, but it is run by a small team on modest infrastructure.

Decision

Ship one Nuxt application on one PostgreSQL database, deployed with Docker Compose and Caddy.

Why

Cross-domain features like reporting, search and the calendar are joins, not network calls, and it deploys in one step.

Tradeoff

Domain boundaries are kept by code organization rather than enforced by separate services.

Quality

Tests on the risky paths

  • ↳

    Unit tests

    Vitest unit tests covering permissions, money math, finance rules, scheduling and security helpers.

  • ↳

    Real-database tests

    An integration suite runs against a throwaway PostgreSQL in CI, covering portal isolation, route guards, recurring billing and webhook effects.

  • ↳

    Type safety

    TypeScript end to end, Nuxt typecheck and ESLint, and Zod schemas shared between client and server.

  • ↳

    Sample data

    A built-in demo agency dataset, so a fresh install can be explored safely before any real data goes in.