I build AI systems that fit how a business already works, and keeps working as it grows.
It's just me helping your business get organized, and helping you use a tool that knows your business. If it's a property management company, when the lease is due, when the renewal is coming up: you type that in and get an answer immediately, and it cites where it came from.
The approach
Everyone can rent the same models now, for almost nothing. So pointing AI at your business isn't the hard part anymore. The hard part is that most of a business isn't a process you can automate. It's a pile of stuff nobody can find. Point AI at a pile and you don't get order, you get more pile, faster. My own drive was the pile. Years of real estate records, thousands of files, no shape to any of it.
I decided most of it didn't need a system at all. It needed to be made findable. So I sorted it with a method that reads everything first, writes down where every file is going, and never deletes anything. Dry run, then move, with a log I could reverse. The part that matters more than the sort: when I hit folders that were actually code, not documents, I stopped and used a lighter touch. Three folder decisions, not the full method. Reaching for the heavy approach where a light one is correct is the same mistake, one level down. I ruled out the two easy versions of this: letting an AI decide what to throw away, and automating the whole thing end to end. Both trade away the one thing that made it safe.
The method is careful on purpose, which makes it slower than telling an AI to clean it up. If you want fast and lossy, this isn't that. The whole point is that nothing is unrecoverable, and that costs time. On the verify pass before parking anything, it caught files that existed in only one place. A blind delete would have destroyed them. That's the risk this trades time to avoid.
804 files moved, 789 clean and 15 duplicates pulled aside, 217 media files left where they already belonged, zero deleted, and a log of every move I can walk backward. Plus two small scripts that do it again on the next messy area without starting over. The pile became findable. The business got legible to an AI without handing an AI the power to lose anything.
Same method on the next messy corner, then hand a business the same thing I built for myself. Not a tool they log into and babysit. A way of sorting they own outright, that keeps working after I'm gone.
The work: five builds
A roofing contractor ran his business on two SaaS tools that didn't talk to each other. Estimates, the materials catalog, and invoicing lived in separate systems, and he paid $835 a month for the privilege of re-entering the same job in three places.
Built one system covering the full estimate-to-payment lifecycle instead of wiring the two existing tools together or bending an off-the-shelf CRM to fit. Also built a trainer/briefing intelligence layer, then switched it off, pending adoption, rather than ship a feature nobody had asked to use yet.
integration would have preserved the seam that caused the pain; the point was to remove it.
It's finished and frozen. The value is real but unrealized until the owner runs it on live jobs, which is his call, targeted around October. Today it's a complete portfolio build with a dormant deployment, not a live win.
One system instead of two. Roughly 7.5 hours for the initial production build across 13 sprints, 900+ automated tests, a 1,550-item materials database imported from supplier price sheets by OCR, branded PDF estimates, customer portals with e-signature, and full draft → sent → viewed → approved → invoiced → paid tracking, live on Azure.
Nothing until adoption. When the owner turns it on, the briefing layer comes back and the first month of real jobs becomes the outcome study.
An operator needed to get from a pile of raw deal documents to a decision, fast, and couldn't justify paying per-lookup for market data he'd re-run on every property.
The model reads, the code decides. Extraction and context come from the LLM; the actual numeric verdict stays in deterministic code, so the number is auditable and doesn't drift with the model.
letting the model produce the verdict would have made every answer unrepeatable.
The RV-path handling is less validated than the core flow. That's the next test surface before I'd lean on it for that deal type.
Deal docs to calc to live market data to a verdict plus what's missing, at about $0.60 an analysis, 180+ tests, an 8-to-10-hour build. A paid, retained engagement.
Build out RV-path coverage to match the core flow.
Deliver real coaching, programming, nutrition, and check-ins, through an app without the AI going off the rails or the trainer losing control of what a client actually sees.
Multi-model routing (a mid-tier model for chat, a frontier model for the complex work), event sourcing, and a human-in-the-loop gate so no check-in synthesis reaches a client until the trainer approves it.
snapshot model, not normalized: the client's history is a record of what happened, not a mutable current state.
The trainer-approval gate is a discipline, not a wall. It holds because I run it; a larger team would need that enforced structurally before scaling client count.
A persistent conversational coach with full client context, nutrition coaching with live restaurant-menu lookups, bi-weekly check-in synthesis gated on trainer approval, 1,600+ automated tests, and five clients training on it today.
Enforce the approval gate in structure rather than habit before adding clients past what one trainer can watch.
I needed an operational assistant running across every business without having to design every workflow it might ever perform up front.
Migrated off the old harness for a diagnosed reason: it forced me to pre-design every workflow, so the agent would detect a task but never act on it. The replacement writes its own reusable skills from tasks it completes. I retired a planned governance VPS once the built-in sandbox backend covered it, and kept the whole thing model-agnostic with a deliberate exit path from any single provider.
the capability gain came from removing the pre-design requirement, not from adding a model.
Container sandboxing is chosen and eligible but not yet switched on; the terminal backend still runs as my user. That's the next hardening step before I'd hand it anything with real blast radius.
A self-improving agent at about 20 cents a briefing and $6 to $8 a month, with hard limits it never crosses: it never spends money and never sends anything outbound without review. Those limits were set the way real safety rules get set, after an incident made the boundary obvious.
Enable the Docker sandbox backend before widening what it's allowed to touch.
A fictional commercial-property manager's drive held nine leases, a stale rent roll, duplicate copies of the same lease, and an HVAC responsibility clause that contradicted its own amendment. Renewal deadlines lived in one person's head, not in any file.
Built the drive into an index that cites its source for every answer, with one hard rule: no source, no answer, and if the files disagree, say so and route it to a person. Ruled out letting the system pick a side on the HVAC conflict or trust the stale rent roll over the signed leases.
a system that guesses past its own limits is worse than one that says it doesn't know.
This is the audit and build stage, graded against a 12-question answer key, not evals at scale. The 30-case eval pass, the measured cost per run, and the economics are the next phase, not yet run. It's one fictional company, so it hasn't been proven to generalize.
Graded 12 out of 12 against a hand-labeled answer key (7 normal questions, 3 edge cases, 2 escalation cases), including both escalation cases handled correctly: it flagged the HVAC conflict instead of guessing, and it named a person instead of answering past what the files actually say.
Run the 30-case eval pass and measure real cost per run before calling this more than a working demonstration.