Chronomial researches your market, picks out the few things worth posting about, drafts for each account, then stops and waits for a person before anything goes out.
Live at: https://chronomial.com
It is about four days old, it is live, and as I write this it is being aggressively cut down to five screens and two channels.
New Target: Chronomial writes the drafts. You review them and then hit post. I built the largest version of the idea I could defend, so that deciding what to strip would be a reading of evidence instead of guesswork.
The idea (August 25)
The original brief is still sitting in the seed data, as the default Product Context that every broadcast reads:
Chronomial is a visual AI social media operations platform. Founders and growth teams wire up broadcasts that research a market, extract signals, draft per channel, pause for human approval, then publish.
The audience, from the same defaults: founders, growth leads, and social media managers at seed to Series B companies.
One conviction sits under all of it, and it is the only part that survives the pivot untouched. Every AI step returns several options side by side, and nothing publishes without a person choosing one. There is no auto-publish setting. Approval nodes have no bypass. Amber is used for exactly one idea across the entire product: this is waiting on you.
Everything, in one commit
First is create-next-app. Later the same day, the whole product: 70 files, 13,298 insertions. Booyah.
| Piece | Choice |
|---|---|
| Canvas | React Flow (@xyflow/react), 22 node types, drag to connect |
| Engine | Pure TypeScript, no React and no DOM: validation, cycles, layering, retry |
| Channels | Five adapters, each encoding what is actually true about its platform |
| State | Zustand, in memory, a refresh resets it |
| Persistence | A Prisma schema for Postgres that validates and is wired to nothing |
| Hosting | Vercel, statically prerendered, zero API routes and zero server actions |

Three more days of commits followed, all of them narrowing scope rather than adding. Real metadata, an OG image and a sitemap. Then making the sandbox and local-app split explicit in the config instead of implied by the fixtures. Then rewrote every string in the product for plain language and zero em dashes (so it doesn't look like AI slop heh). Then we restyled the whole app for mobile, 29 files. Next we fixed touch and added a first-run tour.
Twelve commits, four days, and then a snapshot.
The demo
Open the launch broadcast, press Run
↓
Competitor Research + Social Listening run side by side
↓
Competitor Research fails once (seeded 503) ── retry ──→ recovers
↓
park at approval ── you pick an angle ──→ resume
↓
five X drafts, park again ── you pick one ──→ resume
↓
adapt per channel, publish ── Instagram refuses ──→ keep what transmitted
↓
15 of 15 steps completed, 0 failed, ~35s of machine time
Wall-clock is longer, because the run parks twice and waits however long you take.

The value proposition is one sentence long. The machinery that delivers it is 4,852 lines of pure domain code. It works. It just kind of sucks.

The part that sucks
The canvas does not survive a phone. The fix was a Move mode: an explicit toggle that makes exactly one step draggable and brings its handles live, with desktop left fully direct-manipulation and no Move button at all.

The mode works. But when the core of your application needs a toggle mode to function on the device most people will open it with, something is definitely wrong.
The product invented six nouns. Broadcasts, transmissions, programs, signals, nodes, control room. A user had to learn all six before writing a single post.
None of these were mistakes at the time. They are now.
Where it is at this point
Real: clipboard formatting per channel, platform previews rendered to each feed's actual shape, composer deep links, channel validation and character counting, graph validation and cycle detection, concurrent scheduling, retry with backoff, pause and resume across approval gates, derived idempotency keys, the append-only event log, and the full approval lifecycle including rejection reasons and candidate lineage.
Mocked: research providers, model calls, publishing, metrics, OAuth, persistence, and streaming. Fixtures are deterministic, fixed clock and seeded pseudo-random, so the server and the client render identically and the app reads the same on every load.
The pivot (August 28)
The decision to target an exact persona became clear. And who better than...me! :D
Not growth leads and social media managers at seed to Series B. One solo founder who posts in their own voice, on X and Instagram, building in public.
No team, no assignees, no approval routing, because there is nobody to route to. I get to do all the things!
Their problem is not scheduling. It is being consistent and real. Generic AI output and posts are worse than not posting.
I cannot afford to lose credibility with my audience.
| Built | Becomes |
|---|---|
| The canvas | An internal runtime no user ever sees |
| Ten product areas in the nav | Five: Queue, Signals, Calendar, Voice, Settings |
| Five channel adapters | Two, X and Instagram |
| Approval gates routed to named assignees | One person, one queue, three tabs |
| The analytics page | One toggle per post: Mark as worked |
| The history log page | Failure cards in the queue |
| The templates library | A section in Settings |
| Six invented nouns | Posts, drafts, sources. Signals survives. |
The whole product collapses to one loop. A source fires, a founder asks, or the founder has a thought. A channel-native draft is generated with its reason attached. The founder approves, edits, or skips. They post it themselves in one tap. All three origins produce the same object, land in the same queue, and carry the same provenance line above the draft:
X · SPROUT RAISED SEATS 18% · PRICING PAGE · 7H AGO
That line is the signature element of the new design and it carries the entire argument: this draft exists because of a real, dated thing. The rule that falls out of it is a good one. Never show a draft without a provenance line, because if you cannot say why it exists, you should not have generated it.
Delete delete delete it all!
Publishing is manual now, by design. On X, build a web intent URL and open it. On Instagram, copy the caption, offer the image as a download, open instagram.com. The founder pastes and posts.
That one decision deletes all OAuth for both platforms, all token storage, the 1-hour and 60-day expiries and every line of refresh logic, Meta App Review at two to four weeks per permission with a screencast, the Instagram Business account requirement, X API write costs, and the entire class of "token expired mid-run" failures.
No scheduling, because posts go out when the founder is at a device. No performance data, because nothing flows back. A one-bit Mark as worked toggle replaces the analytics page, and that is the whole reporting surface.
What I learned
Building the maximal version is a legitimate way to find the minimum.
I could have argued about scope for a week. Instead we made a running artifact, a measured baseline, and a specific list of things to delete. Four days bought a much better conversation than four days of planning would have.
The hardest engineering was solving a problem the product did not need.
Vocabulary is scope. Six invented nouns is not a naming problem, it is a confession that the product is a system rather than a tool.
What's next
Simplification!
Thanks for reading. More soon.