Contents
The waffle card in our kitchen drawer is nearly twenty years old, creased and splattered, and the two in "2 eggs" is crossed out in pen with a three over it. We've made these waffles hundreds of times.
On a Tuesday my wife stood at the counter trying to work out what to eat. Not what to cook for an occasion. What to eat, on a Tuesday. She had a phone with every recipe ever published on it and nothing she wanted. I wanted waffles. I went looking for the card, held it and realized it was the only copy we had. Not a photo, not a note, not a bookmark. One piece of paper.
Recipes are personal. The ones worth having are the ones the people you know cook, and they live on paper in drawers, in cookbooks and in group chats that scroll away.
Forktales is what I built about it. A better camper was the last thing I built, data layer first, by a crew of sub-agents against specs I wrote. I ended that article saying the agents plant faster than they weed, and that keeping the documentation coherent was the hard part. Forktales picks up from there. Eight things changed in how I work, in the order they happened. By the end, the product was not the one I set out to build.
The loop across the top is the same on every project now: talk to people, find the gap, write the spec, build with agents, ship to friends, measure everything and back to the spec. The first passes through it are fast, clumsy prototypes.
Under it is the stack, the pieces that are the same every time: hosting, auth, payments, models, email, analytics, brand, a marketing site, scheduled jobs and, new on this project, agents that read the usage and write the next proposal.
The rest of this article is the loop as it ran.
The loop
- Talk to people
- Find the gap
- Write the spec
- Build with agents
- Ship to friends
- Measure everything
Then back to the spec.
The stack
Hosting
Vercel
Auth and data
Supabase
Payments
Stripe
Models
OpenRouter
Email
Resend
Analytics
PostHog
Brand
One mark, one palette
Marketing site
Static, its own repo
Automation
Scheduled jobs
Agents on usage
Propose the next change
01
Talk first
Before I wrote any code I talked to friends. Not a survey. Dinners, bike rides and messages, with the same two questions each time: where do your recipes live, and how do you decide what to eat? The answers repeated. Screenshots. A photo of a cookbook page. Everyone had a system and nobody could find anything in it.
The field is crowded with recipe-box apps, all of them good at the box. The gap was that none of them had your people in it.
The first spec, written on the third of September, was still a recipe box. It lasted four days.
02
Specs before code
Forktales was my first project on OpenSpec.
Every change starts as a written proposal: why, what changes, which capabilities move and what it touches. A design and a task list follow. Then agents build it, and they build it from the spec rather than from a chat.
I was running several agents at once, on different models, in parallel branches. Without a shared spec they drift. Each one makes a reasonable guess about what the product is and the guesses diverge. With one, every agent works to the spec, and when a new idea arrives or I want to cut something, the spec changes first and the code follows.
On abettercamper the specs were documents I wrote, and they went stale as fast as the agents outran them. OpenSpec makes the spec the thing that moves.
Each change carries its own deltas to the capability specs, and archiving it folds them into the main specs. The description of the product is always current and every agent reads the same one. Less drift, fewer surprises in review and I can be more hands off.
The side effect I did not plan for is the archive. Sixty-five changes are archived and dated, and the folder read back is every decision with its reason, in the words I used at the time.
The archive
65 changes archived between 3 September and 2 October, most of them in the first ten days and on the first of October.
- 13 SepFirst spec: a recipe box called Dinner, 25 recipes free
- 24 SepNamed Forktales, with a mark and a palette
- 37 SepThe pivot: the feed is home, posts not recipes. Cap to five
- 48 SepRecipe cap removed
- 59 SepThe catch-up digest
- 613 SepPlus taken off sale. A waitlist instead
- 726 SepSales back on as credits and Plus
- 81 OctDaily quiz. Import from any page
- 92 OctNewcomer nudge
03
Build on tokens
OpenRouter was new to me, and it changed what I was willing to try. One key reaches every model, so the job picks the model rather than the model picking the job. The AI work in Forktales is all food: read a recipe card from a photo, read a screenshot cut into strips, import a recipe from any page, estimate nutrition, search your box by what you feel like eating.
Each of those is a model call, and each can run on whichever model does that one job well for the least.

The first time I photographed the waffle card and watched it fill itself in, I laughed out loud. The paper was barely legible. Title, nine ingredients, six steps, no typing, about ten seconds, on a frontier model at three or four cents a read.
Two weeks later I ran the same prompt on half a dozen models against that baseline. A smaller model read every ingredient and quantity the big one did, at a fraction of a cent. Switching was one line.
It is the same job as the first data product I built, the Global Wine Database, which gets a verified record out of a hand-annotated label. A recipe card is that problem at a kitchen table.

The recipe page.

Cook mode. One step at a time, the screen stays on.

Nutrition, estimated from the ingredients. Still marked beta.
Forms are going away, and fast. Photograph the card, paste the link or drop in the screenshot, and a model reads it into shape. You still check it, because it is your recipe. That takes seconds. The typing took the minutes, and people pay for convenience.
Subscription or à la carte? Both.

A recipe costs nothing to store, so recipes are never capped.
Model time costs, so that is what you buy. Scans run on credits: one per scan, page import or nutrition read, none charged when it fails.
Everyone starts with five credits. Inviting a friend earns more, a pack buys more and a subscription covers people who cook a lot.
Spends a credit
- −1Scan a card or a screenshot
- −1Import a recipe from a page
- −1Read the nutrition
- 0A read that fails
- 0Store a recipe, however many
Earns credits
- +A few to start
- +5A friend joins through your link and saves a recipe
- +5A perfect quiz round, once a week
- +10A pack, or +25 for the larger one
- PlusA monthly allowance, for people who cook a lot
04
Show it, don't say it
The marketing site needed to explain the app, and I did not want to do it in paragraphs. This was right off the back of Opus 5.5, and I wanted to be crazier than I had been. Could an animated hero be possible at all, built by an agent, on a static site?
It could. The homepage plays a 34-second loop. The Forktales mark flies to four sources in turn, a printed card, a recipe blog with ads, a screenshot and a friend's post. Each one goes into the recipe box and comes back out as a typed-up card. After the fourth, the four results fan out and it starts again. The sparkles are drawn on a canvas. It pauses when it is off screen and shows the finished fan to anyone who asks for reduced motion. Nobody reads a feature list. Everyone watches the card come back out.

Once that worked, every feature page got its own loop. The search types "egg" and switches from your recipes to a friend's. Cook mode ticks off milk and vanilla and moves to the next step. The scan page shows the waffle card going in and the form coming out. I pushed further than I was comfortable with, and that is the part I would repeat.
05
Nobody wants another app
The hard part of a new app is no longer building it.
Everyone is building apps now, and everyone I know is tired of being asked to try one. "Make an account, add your friends, give it a week" is a big ask for something nobody has heard of, and a recipe app is not a thing people wake up wanting.
So the way in is not the app. It is a game: ten seconds to start, no sign-up, fun enough to send to a friend, with a reason to come inside at the end.
I made two, mostly for fun, both rough.
The daily food quiz gives everyone the same seven questions, twenty seconds each, no account needed. There is a board for the day, the week and the month, a link to challenge a friend and a streak bonus for playing day after day. A perfect round once a week pays five scan credits, which is the bridge from the game into the app. Members who play signed in appear under their handle, and the challenge link is how a player who has never heard of Forktales meets it.
The quiz is the most popular part of the site today.

The island is the one in three.js, which was new to me and the most fun I have had building in years. You cook through a day against the clock on a small island that owes something to Lost. The dish of the day scores double, the same dish twice scores half and every recipe you cook for the first time teaches you one thing about why the technique works.

My seven-year-old demands both games every day. In-person user testing checks out.
06
Bring people back
The next thing I built was mail that brings people back. Resend sends it, written as rules rather than a sequence. A welcome note when you join. A note to whoever invited you when their link works. A catch-up digest if you have been away a week and your friends have posted since, at most one a week, and it stops after two go unanswered.
One nudge, to a newcomer who has been in for two days and made nothing. It leads with the plates their friends have posted and asks for something smaller than a post: ask a friend for the recipe behind one of them.
One switch turns all of it off and every email carries a one-click unsubscribe.
The mail, as rules
You finish onboarding to Welcome note
the moment you join.
A friend joins through your link to Your invite worked
sent to you, not to them.
You have been away a week to Catch-up digest
only if friends posted since. one a week, stops after two go unanswered.
Two days in and nothing made to Newcomer nudge
once ever, leads with friends’ plates. never on a digest day.
Played the quiz yesterday, not today to Streak reminder (proposed)
opt-in, proposed.
The digest did not send for a while. It selects on when a member last opened the app, and that stamp was never set in production. Nothing was mailed and nothing complained. A spec for the nudge found it, because the nudge paces itself against the digest and I could not reason about one while the other was inert. A quiz streak reminder is the next one, for anyone who played yesterday and has not played today.
07
The desktop
Forktales was built for a phone. Every signed-in screen was one narrow column with a tab bar fixed to the bottom, and on a laptop that is a phone-sized strip in the middle of an empty page. I assumed nobody would use it there.
The analytics said otherwise. Desktop was a real share of use, not a rounding error, and the recipe editor was opened more often on a desktop than on a phone. People find a recipe at a computer and want to fix it at a computer.
So the phone layout stays as it was. Above a desktop width the tab bar becomes a side rail, the feed lays out in columns and a screen's main action sits with its content instead of across the bottom of the window.

Next, the recipe list beside the open recipe, and the photos beside the form while you check a scan.
08
What friends are up to
My friends were in it two days after the first commit, and the first thing they did was post plates and not recipes.
Ten plates, one recipe. People photograph what they ate. They do not write down how.
The first two days: ten plates posted, one recipe written up.
So the spec that replaced the first one made the feed the home screen, built from posts rather than recipes. A post is a photo and a few words, "I made this" or "I bought this". The box moved behind the feed, where it has stayed. The feedback came fast, and the next changes came out of it.
Adding a recipe got as easy as posting a photo: scan a card, paste a link, cut a screenshot into strips. When a friend's plate is the only photo of your recipe, their plate becomes its cover. And when a friend's recipe is almost right, you fork it: your own version with its own ingredients and steps, linked back to theirs, with theirs left alone.
Version control for recipes.

One tester's library was almost all food they had bought, and the button said "Share what you cooked". It says "Share what you ate" now.

Somewhere in those changes the product stopped being recipe storage. What I open it for now is to see what my friends are up to. Who cooked, who bought, who finally got the ragù right.
The recipes are still there, behind it, and they are the reason it is useful. But the feed is the reason I come back, and it is a feed of people I know, newest first, with nothing ranked and nobody performing.
I think that is where this goes. Not another network for everyone, but small private ones for a group of people who already know each other, built around one thing they share.
The next thing I want to build is an old-school Twitter for friends only. Nothing earth-shattering. Short posts, your people, no algorithm. Forktales got there by accident, and I would like to get there on purpose.
The waffle card is scanned now. It will not get lost, my friends can make the waffles too, and the next Tuesday has an answer.
Forktales is at forktales.app. The quiz is at forktales.app/quiz and the island at forktales.app/kitchen. If you try either, tell me what you think.
