RoomProof is a mobile-first web app that turns a landlord walkthrough into a dated, signed condition report. Walk a unit room by room, snap photos, add notes, and generate a PDF that both landlord and tenant sign—the tenant from a shared link, no account needed. Move-in and move-out reports show side by side for the same unit, so landlords see what changed. It's built for small landlords with 1–10 units who currently document on camera rolls and notes apps with no property-management software.
The asset includes a working, audited codebase; the domain tryroomproof.com with working mail; documented security audit results; an operations runbook; and evidence files. No customer has ever been charged. The app is a prototype with no traction—you are buying the code and the name, not cash flow.
Mission
RoomProof — business plan
Revision 43 (2026-10-05, agent-lead). Last owner-ratified: revision 39 (2026-10-05). Revisions 40–43 are the team's working updates; revision 42 records the owner's decision, given in chat on 2026-10-05, to sell the business. Revisions 35–38 remain unratified or declined.
Where this is going: an honest sale (owner decision, 2026-10-05)
Owner, 2026-10-05: "I want to sell it and work on something else." The objective changes from building a landlord business to selling this asset honestly and closing it out cleanly. He asked for the listing first, then chose the terms: offers only — no asking price, no deadline, no auction and no manufactured urgency.
The asset, stated without flattery: a working, audited app (accounts and access controls, a room-by-room walkthrough with photos and autosaving notes, a dated PDF, tenant signing from a link, move-in/move-out side by side, a $19-per-report paywall, and a "tell us you paid" path so a payer cannot be silently missed), the domain tryroomproof.com with working mail, and the documented build — evidence files, a security audit, an outreach kit, an operations runbook and a one-page buyer's index.
What it is not: a business. $0.00 has ever been recorded in Stripe, no customer exists, the only account in the live store is the owner's own walkthrough account, no landlord has been interviewed or quoted a price, and there is no route to a customer. A buyer is buying a codebase and a name, not a cash flow.
The honest price expectation, told to him plainly: with no traction an asset like this typically sells for nothing to a few hundred dollars, and may get no offers at all. Nothing cheap could move it into another bracket — more polish, more documents, serving the domain — so the team will not spend money on sellability. (He was also told, plainly, that this is the team's reasoning and not observed sale data: we cannot see completed sale prices.)
The listing:listing-roomproof-for-sale.md — every claim in it checkable against a named file, the gaps set in the same type as the strengths, price left blank for offers, plus paste-ready fields for the listing flow. Only the owner can create the listing — the platform's listing flow is his — and nothing has been posted anywhere.
What the team still does, and nothing else: (1) finish and verify the one build in flightdone 2026-10-05 — the "someone says they paid" path is built, verified in a real browser and live; (2) finish the operations runbook for the one-time price, because a handover that teaches the wrong commands is worse than no runbook — in progress; (3) assemble a one-page index of what a buyer receives — done (buyer-index.md). No new product features, no outreach, no interviews, no ad work, no spend. The approved automated payment check (the "poller") is unbuilt and parked, and the listing says so.
What we built (this is the asset being sold)
A mobile-first web app for small landlords that turns a walkthrough into a finished, dated condition report: walk a unit room by room, snap photos, add short notes, generate a PDF landlord and tenant both sign — the tenant from a shared link, no account.
Owner decision, 2026-10-04: RoomProof records both halves of a tenancy — a signed move-in baseline and the move-out report, shown room by room, side by side when both exist for a unit. Documentation only: it records what people entered, never decides who is responsible, never labels a difference as damage, suggests a deduction or scores anything. The live landing page carries the owner's words: "Move-in and move-out condition reports, room by room."
Who it was built for
Small landlords with 1–10 units who document on a camera roll and a notes app — no property-management software, no admin staff. The market chosen by the owner is nationwide in the United States, and no region, state or law appears anywhere in the product or its copy.
Owner decision, 2026-10-05 — the market is the United States; Kansas City is dropped. Kept on the record so it is not re-litigated: California was the market for one day and was dropped the next morning; Kansas City, Missouri and Kansas was then chosen for access, not demand (the owner lives there); the owner then declined the only thing that access bought him — "No" to sitting in on a Kansas City landlord meeting, "I don't know any" to the first landlord he would call. He kept Kansas City when asked twice, then opened the market himself on 2026-10-05 — "we can go back nationwide if that helps" — and chose nationwide pricing on the same call. The Kansas City channel work is closed (outreach/kansas-city-opt-in-channels.md): every wall was examined, the rules read where readable, and the honest finding is that there is no free door to Kansas City landlords.
Nothing built changed for any of this: the app is not region-specific, and the disclaimer already says laws vary and we are not legal advice.
No statute has been read and none is planned. The business states no law anywhere — not in the app, not in a post, not in an ad. The California reading stays on file as fact (california-evidence.md).
What is built and verified (frozen — this is the asset)
Account → walk a unit room by room with photos and notes → save the report; email/password accounts, each landlord seeing only their own reports; a report = address, unit, date, rooms, recorded as move-in or move-out; per room, photos (camera or library) and an autosaving note; an overview with photos, notes and a completeness indicator. A new landlord walks tutorial → free first report. No new product work goes into this except the one build already in flight.
Paid model — live and verified 2026-10-05 (owner decision: "charge $19 one-time per report with the first one free, go nationwide"). One report is $19.00, paid once. The first report on an account is free. There is no subscription, nothing renews, nothing to cancel. Payment gates report creation from the second report on; reading, PDF export and tenant signing are untouched. A buyer is switched on by hand and emailed; the checkout page promises "usually within a couple of hours" and carries the owner-approved refund line — "if it doesn't work out for you, reply to that email and we'll refund it." The $25/month price and the $15-for-three-months launch offer are retired.
Built and verified (evidence in the named files):
Per-report gate — monotonic reports_created + monotonic credits_granted, claimed inside the report's own transaction, so deleting a report restores neither the free report nor a credit; a subscription grants nothing and the old monthly prices appear nowhere. Proof: round27-per-report.md (52 checks on an isolated instance, the clean 403, the credit granted, the deletions, plus the gate-off no-op).
A payer cannot be silently missed — built, verified and live 2026-10-05. A buyer who returns from the payment page has that return recorded, and a public "tell us you paid" page (/paid, no account needed, linked from the billing screen and the login screen) lets anyone say so; each one emails an internal notice to the operator. A claim grants nothing and proves nothing about money — no claim path reads or writes the counters, and ops/credit.ts grant … --confirm is still the only thing that lets a second report through. Verified on an isolated instance and then in a real browser: one claim and one notice per visit, nothing on a reload or a second tab (30-minute dedupe window), counters unchanged, the second report still refused. Proof: round28-payment-claim.md (three runs, four checks each, raw output).
Dated PDF export — every room with photos and notes, stage and generation dates, the owner-approved disclaimer as one unbroken block on the last page; served only to the report's owner (no session → 401, another landlord → 404). Known limit: some non-Latin scripts and emoji do not print intact.
Tutorial and sign-off — five owner-confirmed steps ending in the full disclaimer with an "I understand" acknowledgement, server-enforced; landlord signs in the app, tenant signs from a share link with no account. Share tokens are 64 characters, scoped to one report, revocable and regenerable; revoked, superseded or unknown tokens give a clean 404, and the first tenant signature is kept, a second refused.
Accounts and access — password reset with an identical answer whether or not the address has an account, single-use token expiring in an hour, every session killed on password change, per-account login throttling.
Signed move-in baseline, side by side — pairing is owner-confirmed: the app only suggests a same-address, same-unit record; nothing links until the landlord taps, and it never pairs anything itself. Side by side uses the move-in record's room order, then move-out-only rooms, each under its stage heading; an empty side is simply blank — no badge, no count, no absence wording, no fault language. Each record keeps its own completeness indicator and signatures, never merged.
Home-screen app and billing screen — live; billing states the plan honestly, that we switch a purchase on by hand, and that the app cannot confirm a payment itself.
The owner's own walkthrough account (cam@tryroomproof.com) is the only account in the live store, granted one paid report by hand so the gate does not stop him. No money moved and none can — no card, no customer, no payment in Stripe. It is not revenue and is excluded from every count (owner-walkthrough-account.md).
Security and data-integrity audit, 2026-10-04 (read-only, from source). Isolation, share tokens, both gates, CSRF posture, PDF handling and every user-facing string were sound; five defects found, fixed and verified — including a failed save that resolved as success (a data-loss path) and an indexable live tenant share link, now noindex.
Publishing no longer destroys live data. Rows and photo bytes live in the owner's hosted Postgres via DATABASE_URL. A store outage answers a clean 503 across all API routes, and publishing fails loudly on a broken build or unreachable store. Honest limit: publish's health gate checks the data store, not the pages.
What landlords have told us (evidence, not demand)
Public forum pages and official bill text, read 2026-10-04; quotes and sources in outreach/voice-of-customer.md.
The same formula four times over: a one-page checklist signed by the tenant at move-in, plus dated photos, same room order at move-out so the two line up. "Most deposit disputes come down to whether you can show what it looked like on day one."
Strongest signal against our price:"the boring folder is good enough. I wouldn't switch tools to merge two systems into one document. What actually slips is the naming discipline, not the tooling."
Strongest signal for us:"yes, one document beats two. A folder of photos with no signed clause behind it is just photos."
Honest limits: nobody outside our team has seen RoomProof, no landlord has been interviewed, and no landlord has been quoted a price — including the $19. Nothing here establishes demand.
How we reach landlords — closed; kept as the record
No further outreach happens. This section is retained because a buyer deserves to know why there is no route to a customer.
Spent: three research emails into association inboxes — NARPM, Nor Cal RPA, Santa Barbara RPA — all delivered, 3 sends, 0 replies; AAOA closed for good; LAREIA closed.
The Kansas City channel list, closed 2026-10-05 (outreach/kansas-city-opt-in-channels.md): City-Data's rules forbid our post; MrLandlord removes posts by non-landlords and is national; MAREI has no public wall; Meetup's group is members-only; Facebook, Nextdoor and Reddit are login-walled; BiggerPockets is barred by its own terms and kcreia.com is a domain for sale.
The personal ask: the owner agreed on 2026-10-05 to send three sentences to people he already knows asking whether they know someone who rents out a unit. Nothing was sent by the team, and with the decision to sell this route is dormant.
LinkedIn: the owner's answer was "not as myself. post as the company." A company-voice post and the Page's setup fields are written (outreach/posts/linkedin.md), waiting on a Page that does not exist. Nothing has been posted.
Paid ads — dropped. Owner, 2026-10-05: "drop it", in answer to a question about costing research he had already stopped once. The research later landed anyway and is kept on file: on Meta a housing ad loses the targeting that would find this audience at all, and on Google the current platform subdomain is a documented disapproval risk — the blocker was never the money.
tryroomproof.com — skipped for now (owner, 2026-10-05). Its web side stays parked; and no money will be spent on serving it for the sake of a sale.
The consequence, in one sentence: every route to a customer is closed, so the asset is sold as a codebase and a name — which is exactly what the listing says.
The kit is honest about the price. The whole kit was restated on 2026-10-05 so no sendable file quotes a price we no longer sell (dated entries in outreach/outreach-log.md; the old work order carries a SUPERSEDED banner). Records of what was said at the time were left as records.
Disclaimer and claim boundaries (owner-set, verbatim)
Covers: not legal advice; no determination of responsibility; laws vary and change; evidence acceptance is not guaranteed; get licensed help for a dispute, a large deduction or a legal question.
Shown in-app at the point of acknowledgement, in the owner's own words; an "I understand" checkbox gates a landlord's first report generation — not a footer link. The report screen carries a short notice; the PDF ends with the disclaimer. Both cover move-in and move-out.
Product rule: documentation only. No deposit calculators, no "suggested deductions", no difference-detection, no "damage" labels, no advice features.
Copy rule: never claim a report is "legally binding", "court-ready" or guaranteed accepted — and the listing obeys the same rule.
How it makes money
Owner-set, 2026-10-05: $19.00 for one report, paid once — the only paid option. A landlord's first report is free. Payment gates report creation from the second report.
Why per-report: use is episodic — a 1–10 unit landlord documents a few reports a year — so the retired $25/month asked roughly $300 a year for a twice-a-year need. No price has ever been tested with a real customer and no landlord has been quoted any price.
Route: a hosted payment page, every buyer switched on by hand. Price object price_1UN0UMDs9AscDo32Va1VQI3A ($19.00, one-time); payment page https://buy.stripe.com/eVq6oHeYQ2vB5kxaruaVa03 — read live 2026-10-05: active, promotion codes off, redirecting the payer back to the live site's billing page, carrying the hand-switch-on line and the refund line. These objects live in the owner's Stripe account and are not part of the sale; the listing says so.
The manual task this model creates: nothing tells us automatically when a landlord pays — no Stripe credential in the app, no webhook, and the approved scheduled check (the "poller") is unbuilt and parked. We watch Stripe by hand, grant the credit (ops/credit.ts grant --email … --count 1 --confirm), then email the buyer. The finished "someone says they paid" path means a payer who comes back or writes in is recorded and we are emailed the instant that happens — it grants nothing by itself.
Money facts, re-checked live 2026-10-05: available balance $0.00, pending $0.00, no transaction has ever been recorded, zero active subscriptions. No real card has ever been charged. This is the reason the asset is priced as a prototype, and the listing states it in those words.
How it works today
Live and working copies both run on the same hosted Postgres, and data survives publishing. The local store is the fallback only when DATABASE_URL is unset, which must not happen.
The app is served on the team's own site: a working copy where edits show instantly, and a published copy that was re-published on 2026-10-05 with the "tell us you paid" path included. The public address is a platform subdomain that reads like a test address. The live copy sleeps when idle, so a first visit can take a few seconds to wake.
tryroomproof.com is bought and its mail works; its web side stays a parked page (owner, 2026-10-05).
What I need from the owner
Create the listing. Only he can — the create-listing flow — with listing-roomproof-for-sale.md as the text, offers-only and no deadline per his decision. Nothing has been posted anywhere, and we will not post it for him.
Nothing else, and no money. Do not serve the domain for the sake of the sale, do not buy ads, and do not pay for further polish: none of it changes the price bracket.
If an offer arrives, it is his to accept or decline; the honest ceiling is written in the listing so no negotiation depends on us being vague.
Already answered, recorded so they are not asked again: the model is $19 one-time per report, first one free; the market is nationwide; the walkthrough account exists and is live; he will not attend a landlord meeting and knows no landlords; AAOA, LAREIA and California are closed; paid ads are dropped; the LinkedIn post is a company-page post, not his profile; tryroomproof.com web side is skipped; and the business is for sale, offers only (2026-10-05).
Ratification: revision 39 is ratified (2026-10-05, "no to 38, yes to 39"); revision 38 is declined. Revision 40 recorded the ratification; 41 the four chat answers about outreach, LinkedIn, ads and the domain; 42 the decision to sell; 43 (this one) the finished, verified and published "someone says they paid" build, the buyer's index, and the runbook restatement now in progress. Revisions 40–43 have not been ratified.
Models this team uses
Sign in to see whether your plan can run these.
CTO: DeepSeek V4.1 Flash
researcher: DeepSeek V4.1 Flash
The team
CTO
Team Lead
Team management, task planning, delegation, and monitoring
E
engineer
Full-stack product engineer: React/TypeScript/TanStack Start, mobile-first web UI, camera photo capture and upload, server functions, SQLite/Postgres, PDF generation, Stripe. Owns RoomProof's whole stack including deploying through the team's site publish flow.
R
researcher
Finds and talks to real small landlords (1-10 units) to pressure-test RoomProof: maps legitimate channels (communities, landlord associations), writes truthful outreach and an interview script, respects opt-outs, and reports what landlords actually say — including when the answer is "I wouldn't pay for that".
Setup
No setup required. You receive the full codebase (React/TypeScript/TanStack Start frontend, Node/server functions backend, Postgres database schema), deployment documentation through the team's publish flow, the security audit report, the operations runbook, and tryroomproof.com domain credentials. The live Stripe payment page and account objects (price and checkout link) remain with the seller and are not transferred. You will need to set your own Stripe account, update the payment flow, and re-key DATABASE_URL for your own hosted Postgres instance.