A single-tenant AI operating system for one NYC real estate broker. Built solo in roughly one week, without an engineering background.
- Built in
- ~1 week, solo
- Architecture
- Ten rules every feature obeys
- Status
- Working system, single tenant
Five software systems, each built solo by first learning the domain well enough to understand the problem, then designing and shipping the system around it. Every one is documented as the problem, the operating insight, the system, the decisions behind it, the result and its limits, with the architecture open for anyone who wants to read it.
Every entry follows the same path: the problem, the operating insight, the system, the key decisions, the result, its limits, and then the technical detail behind the fold.
How to read the diagrams
Single-tenant operating system · NYC real estate
A single-tenant AI operating system for one NYC real estate broker. Built solo in roughly one week, without an engineering background.
The broker's day before software.
The broker's product is relationship knowledge, but every tool in the category stores transactions. And real estate decisions do not happen on a schedule: they happen at life transition moments.
Explicitly not a CRM. The stated goal is that the system answers one question every day: what should I do right now, and why.
Every input becomes an immutable event, events become memory, memory produces signals, signals produce a recommendation with its evidence attached, and the recommendation becomes a one-tap action. The model touches the two ends, never the middle.
A working system with a specification of roughly 3,400 lines behind it, built solo in about one week. It answers one question every day: what should I do right now, and why.
The architecture contract: ten rules every feature obeys.
Event-first. Every input becomes an immutable record before anything updates.
Two memories. Structured queryable facts alongside a narrative summary per person. Raw logs are never shown without a synthesized summary.
Signals to Decisions to Actions. No recommendation may exist without the stored signal that produced it.
AI holds fixed roles and never replaces data.
Every inferred fact, task and score carries confidence, evidence, and a one-sentence explanation.
BBL is the truth for property. Not address, not BIN.
A feature is not done unless it flows Event to Memory to Signal to Recommendation to one-tap Action.
Ambiguous matches require human approval.
Push, do not pull. The system initiates.
Outcomes, dismissals and corrections are stored as feedback, not discarded.
Three concentric data rings, from raw public staging inward to private user-owned records.
Consumer platform · regulated document domain
A consumer platform that prepares European visa applications end to end, priced at $399 per household. Researched, scoped, architected, built, priced and shipped by one person: six weeks from first commit to a live product in March 2026, and seven months of operation since.
An applicant preparing a European visa. The output is a stack of documents that must be internally consistent with each other.
The domain is unforgiving about facts. Generative models are unreliable about facts. Most products in this space either avoid the technology entirely or point it at precisely the thing it is worst at.
A hard boundary between deterministic and generative. Every visa fact has one home, and values derive rather than duplicate: change the base figure and every consumer moves. Where official sources conflict, the platform uses the higher figure because it is safer for the applicant.
Retrieval runs in two passes, scoped to the user's pathway first and then unfiltered, with a tag-based pass alongside as a gap-filler, everything filtered to recently verified articles. The verified-facts block computes this specific family's thresholds at request time, including per-country dependent age rules, so the answer names the actual person and the actual number.
Six weeks from first commit to a live product, built solo and live since late March 2026. The figures below are the state after seven months of operation and roughly 450 commits, not the six-week build.
Three pathways live end to end: Spain's digital nomad visa, Portugal's D8 and the Dutch-American Friendship Treaty. Six more priced in the free calculator but not built, with Spain's non-lucrative visa furthest along. Fifty-five API routes, 135 task definitions, 76 knowledge-base articles, 61 published guides, and a policy monitor reading 91 government sources for rule changes.
The public product, rather than a diagram of it. The homepage runs a live demo of the post-paywall app on fixture data, the calculator is the free front door, and the form is one of the eight government templates the platform fills, here with the test fixture's synthetic applicant.




A rule a script enforces is a different claim from a rule the author follows. Each of the three has a check behind it that fails a test, a deploy, or an edit, rather than a convention someone remembers.
The most production-grade piece of the codebase is the one a demo never shows. The database client is wrapped in an extension that inspects every query before it runs.
Three tiers of sensitivity, from ordinary personal data outward to the identifiers a passport carries and the categories the platform refuses to hold at all.
“A Spanish visa” is not one procedure. Spain is served by nine US consulates, each with its own forms, appointment method, fees, accepted payment types and submission rules, and jurisdiction follows where the applicant lives rather than where they are going. The platform detects the office and generates against it.
The supporting documents are not a list, they are a graph. An FBI identity history summary has to exist before it can be apostilled, and the apostille has to exist before it can be sworn-translated, a chain that takes weeks and that no checklist without dependencies can warn you about in time.
The nine scheduled jobs in the stack are not plumbing. Four of them run a deterministic sequencing engine over every active application, deciding each day whether to say anything and, if so, which one thing.
One application, no separate services: a deliberate solo-operator constraint. Also running: a policy-monitoring system watching 91 government sources for rule changes.
Reusable skills and agents · removing the founder from the loop
Roughly fifteen reusable skills and agents that run the recurring work of a solo operation.
One person running content production, domain research, specification writing, form field mapping, knowledge-base maintenance and inbound analysis by hand. Recurring work plotted against the operator's week, with the compounding items marked.
A solo operation's binding constraint is not capability, it is the operator's attention. So the highest-value work is the work that removes the operator from the loop.
The skills library as a map, grouped by the function each one removes, with trigger and output for each. Research passes chain into specification, specification into support coverage, and every output inherits the voice layer.
The chain produced the preparation packages for the Greece and Italy retirement pathways, both priced in the platform's free calculator and not yet built, in roughly half the time the same work took by hand for the first pathway.
Adding a visa pathway to the platform has automated steps and manual ones. This is not end to end.
The chained portion runs pathway research into a verified fact sheet, the fact sheet into a specification, and the specification into requirement lists and knowledge-base articles. Each output feeds the next.
That chain produced the preparation packages for the Greece and Italy retirement pathways, both priced in the platform's free calculator and not yet built. The chained preparation ran in roughly half the time the same work took by hand for the first pathway. The build itself stays manual, and for those two it has not started.
Multi-agent system · reverse-engineered from live AI screening
A multi-agent system that measures an application before it is sent, against a reconstruction of the AI screening tier built by reverse-engineering how current AI-powered applicant tracking systems actually generate criteria and score against them. No service, no database, no runtime: markdown files and Claude Code.
The modern hiring screen. Several hundred applicants per role.
Candidates treat the screen as a black box, but the vendors publish how it works. Ashby documents how criteria are generated from the posting text and publishes the rules for writing them, and its own audit reports that 11.4 percent of real evaluations land on UNCERTAIN.
A failure that appears only against the unwritten gates is a channel signal, not a document signal. Pedigree and industry gates are what a warm introduction overrides and a résumé cannot.
Agent topology with isolation boundaries drawn explicitly. Model tiering is part of the design: composition and research on the larger model, both gates on the small one.
Every application produces a tailored résumé, audited form answers, and a verdict sheet carrying quoted evidence per criterion across three reconstructions of the screen, plus a routing decision. Four applications run so far, 13 to 17 artifacts each.
The truth gate runs first; the effectiveness gate only ever sees text that has already passed it.
The screening tier is a black box to candidates, but it is not an unknowable one. The reconstruction is built from Ashby's published rules and audit data: how criteria are generated from the posting text, the rules for writing them, and an audit reporting that 11.4 percent of real evaluations land on UNCERTAIN. Ashby's credit economics, where one credit covers one candidate against up to fifty criteria, imply the screening tier runs on small, efficient models. The pipeline reconstructs that screen three ways and scores against all three, because a single reconstruction would be a guess presented as a number.
The reconstruction is what makes the rest of the system possible: the evaluator is pinned to a small model precisely because that is the tier the reconstruction says is doing the screening, and the three-valued verdict exists because that is what the screen returns.
Single-operator back office · brand and agency inbound
A single-operator back office for one creator's brand and agency inbound: triage, research, rates, contracts, accounting, relationships. Content strategy is deliberately out of scope: this runs the business behind the feed, not the feed.
Brand and agency inbound for one creator. Every email needs triage, research on the sender, a rate against the card, a contract read when one is attached, and a reply, and every list that tracks it, pipeline, obligations, comps, accounting, drifts the moment it is maintained by hand.
Every view is generated on request rather than maintained, so there is no stored list that can fall out of date.
Contacts are people, not deals, which is what lets the record survive an agency change: the person stays, the deal folder closes.
Two things are stored: a record per deal and a record per contact. Every view (the contact list, the pipeline, obligations, comps, the accounting workbook, one list per deal type) is generated from them on request.
A typical inbound fires four of the eight agents and leaves behind a filed record, research on the sender, a rate analysis, and a reply draft that has already cleared the floor gate. Cost is a design parameter: the expensive model runs only on attached contracts, novel terms, or a missing comp.
raw.md, record.yaml, research.md, analysis.md, reply-draft.md.CONTACTS, PIPELINE, obligations, comps.csv, accounting.xlsx, and one list per deal type. Never hand-edited.decisions.jsonl, learnings.md.Eight agents, each pinned to a model in its own frontmatter. Cost is a design parameter here, not an afterthought.
| Agent | Model | Fires |
|---|---|---|
| filer | haiku | every paste |
| researcher | sonnet | anything not ignored |
| rates | sonnet | anything getting a reply |
| drafter | sonnet | anything getting a reply |
| contract | opus | only when a document is attached |
| adversary | opus | only above a value threshold, novel terms, or a missing comp |
| accounting | haiku | scheduled |
| archivist | haiku (sonnet quarterly) | scheduled |
A typical inbound fires four agents, not eight. Each subagent costs roughly 25–35k tokens just to initialize, so fanning out on every deal would erase the savings from routing the cheap work to Haiku.
Leave CLAUDE_CODE_SUBAGENT_MODEL unset. It overrides the per-agent frontmatter and silently collapses this whole table to one model.
0 8 * * 1 cd /path/to/repo && claude -p "Run archivist. Report only what needs attention." >> log/weekly.txtHeadless claude -p survives a reboot and does not need the desktop app open. Each run is a full session and counts against usage limits.
Enforcement, not judgment. Every rule below is a check a script can run; none of them require an agent to have taste.
reply-draft.md opens with a machine-read declaration: <!-- QUOTE: none --> or <!-- QUOTE: <rate-card-key> <amount> -->. The gate validates the declaration against canon floors, checks that the declared amount actually appears in the body, and, when quoting, requires the usage-window and exclusivity asks. Declines that mention the other side's lowball number pass cleanly.00-canon/rates.md, parsed at gate time. Unreadable canon fails closed for quotes.validate() flags a signed deal with no usage_window_end, because an absent end date defaults to perpetual.exclusivity_check.py catches them before a quote goes out, not after.CONFLICTS.md, parked there deliberately rather than papered over. Two are material: until they are arbitrated, every rate recommendation downstream of them rests on a default the system picked rather than a decision the operator made.