Two products live in production · Espoo, Finland

I build production software by running AI like an engineering team.

I design the system and write the specification. AI agents write most of the code. Automated tests check every change before it ships, and security audits try to break it.

2 products live
~230k lines of TypeScript
~6,700 automated tests
5.0 App Store, 15 ratings
claude — totalhost
~/totalhost ❯ claude
› Build email receipts (spec 2026-08-03)
⏺︎ Read the spec · email ingest
⏺︎ Plan · small tasks, tests first
✓ infra SES → S3 → SQS + DLQ
✓ db claim-first ingest (0031)
✓ ingest spam and virus verdicts
✓ ui receipts land in review
⏺︎ npm test 1,212 passed
⏺︎ deploy → api.totalhost.fi ✓ healthy
Reconstructed from a real TotalHost feature: email receipts, Aug–Sep 2026
How I build

A process, not prompts.

AI is fast but confidently wrong. Every step around it exists to catch that before a customer does.

  1. 01
    Specify Written design before any code. 58 specs and plans for TotalHost.
  2. 02
    Plan Small steps, each checkable on its own.
  3. AI
    Agents build Claude Code writes most of the code. I review and steer.
  4. 04
    Test ~6,700 automated tests, run in CI on every change.
  5. 05
    Audit 34 declared security rules. An audit skill I built tries to break each one.
  6. 06
    Ship Infrastructure as code, deployed through a locked-down pipeline.
Case study 01 · Fintech / accounting

TotalHost

Bookkeeping and VAT for Finnish Airbnb and Booking.com hosts.

Live on AWSJun 2026 →Co-founder · all software

Hosts forward receipts and bank statements. TotalHost keeps double-entry books, reconciles the bank, prepares VAT and closes each month. The host sees profit per apartment and what they owe the tax office.

Engineering that matters for money
  • Ledger can't be edited after the fact. Each entry is hash-chained to the one before, and the app can only add rows, never change them. Try it below.
  • Filed VAT periods are locked by the database itself. Corrections go in as new entries, so filed numbers can never drift.
  • Each client's data is walled off inside Postgres: 127 row-level security policies, tested end to end.
  • Receipts by email: a private address per client, with spam and virus checks.
  • OCR that knows its limits: it only fills fields it's at least 85% sure of. The rest go to a person.
  • Direct filing client for Verohallinto's API over mutual TLS, built and tested, not switched on yet.
182API endpoints
~6,600tests
90DB migrations
~160AWS resources
Stack
NestJSPostgres 16React 19TerraformApp Runner · RDS · SES · SQS · KMSAzure Document Intelligence
TotalHost client portal with demo data
VAT summary for a locked period
Client portal and a locked VAT period. Demo data.
Interactive

Try to change the books.

Four ledger entries, each one sealed with a SHA-256 hash that includes the previous entry's hash. Change a past amount and watch what happens.

#1041 2026-01-08
Accommodation sales, Rantatie 5
800,00 €
prev 000000000000…
hash c539f71e8b50…
#1042 2026-01-14
Booking.com commission (EU reverse charge)
120,00 €
prev c539f71e8b50…
hash c300e1afcd29…
#1043 2026-01-20
Cleaning supplies
75,00 €
prev c300e1afcd29…
hash adf994655696…
#1044 2026-01-31
VAT for January
88,87 €
prev adf994655696…
hash 1a09f9d5f911…
✓ Verified: 4 entries, every link matches.
Real SHA-256, computed in your browser. In TotalHost the database also refuses edits outright; the chain proves nothing changed behind its back.
Case study 02 · Marketplace / mobile

Jard

Yard-work marketplace for the Helsinki area. Homeowners name a price; vetted local workers take the job.

Live on the App Store 5.0 · 15 ratingsFeb 2026 →All software

I built the iOS app, the website and the backend, and I run them in production. Customers post a job and set the price; workers accept or counter; a €5 service fee is charged when the customer picks one.

Engineering highlights
  • Payments that can't double-charge: the job is claimed in a database transaction before the card is ever charged.
  • Security rules attacked by 77 tests on every change: fake ratings, free leads, promoting yourself to worker.
  • Contact details stay hidden until a booking exists, with Finnish-aware filtering of phone numbers and emails in messages.
  • Cost and abuse controls: an automatic billing kill-switch, rate limiting, bot protection, and location data stripped from photos.
  • Silent over-the-air updates that install during the splash screen.
64cloud functions
26app screens
77security tests
~50klines of code
Stack
Expo / React NativeNext.jsFirebaseStripeResendSentry
Tooling

The setup behind it.

What I built to make AI reliable enough for production work.

Own Claude Code plugin

Six hooks: context loading, test and lint gates, and an independent review on any change that touches money.

Custom skills, with tests

A security audit against declared rules, a capacity check, and a skill that lets AI watch and critique video.

Seven-agent marketing team

Strategist, copywriter, designer and more, with a brand guardian that can reject any draft. It wrote the text of Jard's App Store listing.

Teaching it

Writing a Claude Code course from fifteen real mistakes and what fixed them.

More work

  • LaudaturJul 2026

    A matriculation-exam trainer. Spaced repetition, 664 sourced questions, and Claude grades essays against the exam board's criteria.

  • Video as codeJul–Sep 2026

    Jard's social videos, built as code in Remotion, with tests on the numbers they show and an automated check that catches frozen frames.