Handee

Facilities compliance SaaS, first commit to first release in 24 days.

  • Wisdom Engineers
  • Sole-authored
  • May 26 to Aug 26
  • Retired 30 August 2026

The problem

Multi-site European property portfolios run vendor compliance, work orders, quotes, and invoices across disconnected systems and email. Nobody can answer the one question that matters: is this vendor certified for the work we just dispatched to it? The answer exists in a spreadsheet, in an inbox, in somebody's memory, and it is not attached to the job.

The constraints

  • Solo build. No second engineer to catch a bad architectural call.
  • Unfamiliar domain. I had never worked in facilities compliance.
  • Regulated data, so tenant isolation and audit had to be structural rather than procedural. A policy that says "do not query across tenants" is not a control.
  • A semi-technical co-founder who had to operate the product day to day, which sets the ceiling on how much operational complexity the design was allowed to create.

What I built

A layered Flask and SQLAlchemy application, views over services over repositories, on PostgreSQL 18 with row-level security set per request. Celery and Valkey for asynchronous work, a Vite frontend, and pytest, Vitest, and Playwright suites.

Access control is the part that answers the constraint: RBAC across 20 permission domains and 58 permission strings, 2FA, federated identity, session revocation, and a soft-delete audit regime so that nothing leaves the record when it leaves the interface. A data-processing agreement and service levels were published alongside it, because a compliance product that cannot state its own compliance posture is a hard sell.

The measured outcome

First commit, 12 May 2026. First tagged release, twenty-four days later. To 6 August 2026: 848 commits, all mine, 34 releases, 552 test files, 1,846 files, about 439k lines. All of it measured from the repository, not estimated: file and line counts are scc figures taken at the 1.9.0 release rather than from a working copy, lines being code lines with blanks and comments excluded, and test files are tracked files matching the test-naming conventions with conftest.py excluded.

What was handed over

Runbooks and agent playbooks written alongside the code rather than after it, so the operator could run the product without me and an agent could work in the repository without a briefing. That is the same handover discipline I would bring to a customer team: the deliverable is a system somebody else can run, not a system that needs me.

Read the method behind it