AI rendering platform for construction contractors. A contractor uploads one job-site photo and types what they want to build ("6ft cedar board-on-board fence, 10ft off the house, gate on the walkway"). RenderOS returns a photorealistic render of the finished project, branded and ready to send to the homeowner, in about 15 seconds for a few cents of compute.
Built solo as a production system, then evaluated at the partner level by a company's leadership team. This README documents the architecture and the decisions; the implementation lives in this repo.
Product of Caipher AI. Built by York Sims.
- Render from a photo + a sentence. The contractor never touches a 3D tool. They photograph the site, describe the job in their own words, and get a finished render. Trade-specific vocabulary (fencing, decking, roofing, pavers, railing, concrete, landscaping) is baked into prompt generation so "board-on-board" and "picture-frame border" mean the right thing.
- A judgment layer the contractor can trust. Every render is graded by a separate vision model acting as a strict QA inspector. If the requested element isn't actually in the output, the render fails, retries up to three times, then escalates to human review. Nothing ships to a homeowner unverified.
- A full delivery and sales surface. White-label branded PDFs and shareable galleries, an embeddable widget for contractor sites, blueprint and AutoCAD (DXF) import, an AR view, CRM webhooks (Jobber, Housecall Pro, ServiceTitan), automated homeowner follow-ups, lead scoring, and Stripe-metered billing.
The render pipeline is a forward-only state machine. No agents, no orchestration framework. Each job moves through fixed states and either succeeds, retries, or lands in human review.
flowchart LR
A[Photo + spec] --> B[Scene analysis<br/>Gemini Flash: vision, depth,<br/>lines, segmentation, trade detect]
B --> C[Prompt generation<br/>Claude Opus 4.7<br/>+ deterministic spatial preprocessing]
C --> D{Render path<br/>chosen deterministically}
D -->|default| E[Nano Banana 2]
D -->|accuracy| F[FLUX Kontext max]
D -->|spot edit| G[FLUX Fill + bbox mask]
E --> H[QA inspection<br/>Gemini Flash, score 1-10]
F --> H
G --> H
H -->|score >= 7| I[Deliver: watermark + PDF<br/>+ gallery + email]
H -->|score < 7| J[Retry up to 3x]
J --> C
H -->|exhausted| K[Human review]
Jobs are queued on BullMQ + Redis with retries and concurrency control; render and delivery run as separate workers. State and history live in SQLite via Drizzle ORM. The API is Express 5; the UI is React + Vite + Tailwind. Everything ships as a single Docker image on Render.
Every job carries its full trace. Below, a "lush English cottage garden" request runs the precision path (Gemini landmark detection + FLUX Fill mask), and the QA inspector holds the line: after three retries it still scores 5/10, so the job routes to human review instead of shipping to the homeowner.
Stack: TypeScript · Express 5 · React + Vite + Tailwind · Drizzle ORM + SQLite · BullMQ + Redis · Stripe · Resend · Sharp + PDFKit · Docker on Render
AI: Anthropic Claude (Opus 4.7, Sonnet 4.6 fallback) · Google Gemini Flash (scene analysis + QA) · fal.ai (Nano Banana 2, FLUX Kontext, FLUX Fill)
- Deterministic-first AI. The LLM is used only where judgment is genuinely required: reading the scene, writing the edit instruction, and grading the result. Everything else is plain code. Spatial language ("10ft from the house") is converted to visual descriptions deterministically before the model sees it, render-path selection is a deterministic function, and the QA pass-threshold overrides the model's own verdict. This thinking later became nia.
- QA fails closed. A render that can't be validated does not pass. A perfectly preserved photo with the requested element missing scores zero, not partial credit. The contractor's reputation is the product.
- State machine over agents. A render is a pipeline with retry, not a conversation. Fixed states make every job auditable and every failure recoverable.
- Graceful model fallback. Opus to Sonnet to a deterministic template; accuracy and spot-edit paths fall back to the fast path. A degraded render beats a failed job.
| Phase | Delivered |
|---|---|
| 1 — Infrastructure | BullMQ + Redis job queue (render + delivery workers, retries, concurrency, progress); database-backed CRM webhooks with delivery logging and exponential-backoff retry. |
| 2 — Security | JWT + API-key auth, role-based access control (admin / contractor / viewer), per-contractor data scoping, Helmet headers, tiered rate limiting. |
| 3 — Billing & Admin | Stripe subscriptions (free / starter / pro / enterprise), per-render usage metering and enforcement, admin dashboard (MRR, contractors, users, queue and webhook health). |
| 4 — Product & delivery | The rendering studio plus white-label delivery, embeddable widget, blueprint and AutoCAD import, AR view, homeowner project pages, lead scoring, supplier sourcing, and automated follow-ups. |
Built solo in roughly six weeks (April to May 2026), the bulk of it in a four-week sprint, while running two other products. Empty repo to demoed, evaluated product. The company's leadership reviewed the build across multiple working sessions as part of a Managing Partner conversation. The partnership went another direction (an internal hire), but the relationship stayed open. Their words: "we will continue to have fractional opportunities and will include you."
York Sims — yorksims.com · AI systems builder. I ship production LLM applications, autonomous agents, and full-stack SaaS.

