Chronomial: build the whole thing, then find out what to cut

#ai#llm#react#web#automation

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.

PieceChoice
CanvasReact Flow (@xyflow/react), 22 node types, drag to connect
EnginePure TypeScript, no React and no DOM: validation, cycles, layering, retry
ChannelsFive adapters, each encoding what is actually true about its platform
StateZustand, in memory, a refresh resets it
PersistenceA Prisma schema for Postgres that validates and is wired to nothing
HostingVercel, statically prerendered, zero API routes and zero server actions

The Chronomial control room: a sidebar of ten destinations, four headline metric tiles, and six panels covering approvals, recent runs, quick-start programs, upcoming transmissions, discovered signals and per-channel performance.

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 run parked at its first approval gate. The toolbar reads 5 of 15 nodes with an amber Waiting on you badge, four campaign angles sit side by side with confidence scores, and the inspector lists the frozen inputs and the execution log.

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 finished fifteen node graph, every step green, fanning out at both ends and stretching well past the width of the canvas. The toolbar reads 15 of 15 nodes, one minute seventeen seconds, completed.

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 same broadcast on a 375 pixel phone screen. Three of the fifteen steps are visible and two of them are cut off by the right edge of the display.

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.

BuiltBecomes
The canvasAn internal runtime no user ever sees
Ten product areas in the navFive: Queue, Signals, Calendar, Voice, Settings
Five channel adaptersTwo, X and Instagram
Approval gates routed to named assigneesOne person, one queue, three tabs
The analytics pageOne toggle per post: Mark as worked
The history log pageFailure cards in the queue
The templates libraryA section in Settings
Six invented nounsPosts, 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.