flow · build plan · mvp

A daily magazine about
your housing market.

Agents watch a local market, run real-estate strategies against it, and an editor publishes a small daily issue of cards — generated editorial front, real data on the back. You flip through it like a strange little magazine somebody made for your town.

2026-08-12 · repo: home0-xyz/flow · working codename "flow" · market #1: North Fork Valley

The plan in one breath: one repo, three deployables (Next.js site, Convex backend, flue agents). One market agent per market with two nightly beats — sweep (collect) and press (publish the issue). For the MVP the agent's thinking runs locally on the codex subscription and art runs through pix, so a nightly issue costs roughly nothing. No auth, no payments, one market, ~6 strategies, public website. Five build streams, each ending in something you can hold.

01 · The pipeline

market data → strategies → findings → editor → issue (5–8 cards) → front generated image · back live data

Everything upstream is structured JSON; everything downstream is presentation. The front of a card is disposable art we can regenerate forever. The back is the system of record — exact numbers, listing history, evidence, links. The front makes a claim; the back shows its work.

02 · Shape: one repo, three deployables

Same proven layout as homezero — one PR ships a feature across all three layers. Fully independent of homezero: own data pipeline, own Convex deployment, own worker.

app/

Next.js site

The dial. Three routes: /, /:market, /:market/:date. Card dial + flip, mobile-simple, desktop shows neighbors peeking in. Public, read-only, no auth in v0. OpenNext on Cloudflare.

convex/

Backend

What the site serves: markets, issues, cards. The agent writes finished issues here; the site reads them reactively. Card front images live in Cloudflare Images (pix already uploads there).

flue/

Market agent

One Durable Object per market. Owns the listing store (its own SQLite) and the domain tools. Two beats: sweep — Bright Data Zillow pull; press — run strategies, compose the issue, art-direct fronts, publish.

03 · How it runs (and why it's nearly free)

The flue agent is the durable body — store, tools, HTTP surface. But for the MVP, the thinking is driven locally, the same dial-local pattern the homezero market agent already uses:

# nightly, via launchd on the Mac
sweep:  driver → agent tools → Bright Data → listing store
press:  codex exec (ChatGPT sub) reads the store,
        runs strategies → composes issue JSON,
        art-directs fronts → pix (ChatGPT sub) → CF Images,
        writes issue → Convex → site is live
Graduation path When the product needs to survive the Mac being off, the beats flip to hosted flue alarms + API keys. The tools and the issue contract don't change — only who's driving. Fallback until then: if pix is unreachable, fronts render typographic (which we want anyway — see the bakeoff).

04 · The launch strategies (~6)

Strategies are skills, not agents — each is a prompt plus a deterministic pass over the listing store, emitting Findings JSON. They live in the repo for the MVP; the marketplace and the strategy-mining agent come later.

Motivated Sellerprice cuts + days-on-market + back-on-market signals stacking up
Price-Cut Pulse"1 in 3 sellers has blinked" — market-wide leverage stats
New This Weekfresh listings, editorialized — not a feed dump
Most Optimistic Sellerthe outlier ask, priced per local $/sqft — playful
ADU Watchlot + structure characteristics that fit a second dwelling
Back on Marketfell out of contract — why, and what it means

05 · The card contract

The editor emits one JSON per card. Fronts can be regenerated, restyled, A/B'd; the back never lies.

{
  "front": { "headline": "THE SELLER BLINKED",
             "subhead":  "$55K disappears from a Paonia listing.",
             "art_direction": "bold independent real-estate magazine…",
             "renderer": "image-gen | native" },
  "back":  { "title": "218 Cedar Ave",
             "metrics": [["Current price","$484,000"], ["Cut","$55,000"], ["DOM","74"]],
             "chart": "price_history",
             "evidence": ["…why the strategy flagged it…"],
             "actions": ["view_listing"] }   // v0: link out; watch/ask come with auth
}

06 · Build order — five streams

Each stream ends in something real you can look at. Real North Fork data from day one — nothing mocked, ever, on anything public.

S0 Scaffold

Repo, Next app shell, Convex project, flue worker skeleton, dev deploy lane. Boring on purpose.

Proves the three deployables exist and deploy.

S1 Data

Market agent DO + sweep beat: Bright Data → North Fork listings, price history, status changes into the agent's own store. flow's own pipeline, independent of homezero.

Proves the store holds today's real market, refreshed nightly.

S2 Issue spine

Convex schema + press beat v0, driven locally by codex: three strategies, real findings, a composed issue in Convex. Fronts are typographic for now.

Proves the editor can look at a real market and say something interesting.

S3 The dial

The site: card dial + flip, mobile-simple, desktop peek. Reads the real issue from S2. This is the product's whole interaction vocabulary — left/right, tap to flip.

Proves the core question: is flipping through this fun?

S4 Generated fronts

Art-direction spec → pix → Cloudflare Images → the generated front renderer, with a native/generated toggle per card. The bakeoff from the design conversation, live on real cards.

Proves the "holy shit" card — and which renderer wins where.

S5 Nightly

launchd schedule, issue archive (/:market/:date), pix-down fallback, share URLs. Then point a domain at it.

Proves you wake up to a fresh issue three mornings straight without touching it.

07 · Decisions locked

DecisionCall
Repo topologyOne repo (flow), three deployables. Split only if it ever hurts.
DataOwn pipeline — Bright Data Zillow sweep into the agent's own store. Independent of homezero.
Card artpix (ChatGPT-subscription path), fronts stored in Cloudflare Images. Typographic fallback.
Agent shapeOne market agent per market; strategies are skills, not agents. Editor = the press beat.
ExecutionMVP beats driven locally (codex sub + pix + launchd); hosted flue alarms are the graduation path.
Auth / billingNone in v0. Public read-only magazine. Clerk arrives with "watch this property."
ScopeOne market (North Fork Valley), ~6 strategies, daily issue of 5–8 cards.

08 · Open questions