How I designed a private chef's booking dashboard around a conversation.
A private chef's bookings lived in her inbox — dates, headcounts, allergies and deposits buried in month-long email threads, with no record outside Gmail.
Treat an inquiry as a conversation, not a checkout. The form starts it, the dashboard holds it as it moves, and the portal never claims anything it can't actually know.
Live since September 18, 2026. Three inquiries, four journal entries she posted herself, and not one message asking me to change anything.
A private chef's business runs on inquiries. Someone writes in about a birthday for eight, mentions a gluten-free guest halfway through a paragraph, doesn't know the date yet, and asks whether a rental kitchen is a problem. The chef answers from her phone between services. A month later the same thread holds the deposit, the menu, a headcount change and a nut allergy, and the only record of any of it is a search through Gmail.
Kinda French Kitchen needed a website, and the site took most of a five week build. But the site was never the hard part. The hard part was the working side: somewhere for those inquiries to land, move, and turn into dinners without anyone messaging a developer to change a price or block a weekend.
The code is AI-written, to my direction. The product decisions, the interface, the language, and the rules it has to hold to are mine.
Why not an off-the-shelf booking tool: they assume a service that fits a slot — pick a time, pay, done. Private dining is not that. The date moves. The party grows. The price depends on a conversation. So the brief I set myself was to build the tool a chef would actually use, and to make every part of it honest about what it knows.
The booking page on the public site says it out loud: "No calendar widget. Just a conversation." Four steps a guest can read in ten seconds: you send the card, I write back within a business day, we settle the details and a deposit holds the date, you host.
Once you accept that framing, most of the product decisions fall out of it.
A blocked submit is a lost lead. An incomplete one costs the chef one follow-up email.
The instinct in every form is to collect everything up front. For an inquiry that's backwards. The form's job is to start the conversation, not to finish it. The dashboard's job is to hold the conversation as it moves.
Every inquiry arrives as a card, and the board has four columns that mirror the conversation: New cards, In conversation, Confirmed, Declined.
There's deliberately no "Completed" stage. A past confirmed dinner is just a confirmed card with an old date; the portal works out "past" from the calendar rather than asking the chef to do bookkeeping after every party. "Declined" is a bucket for "it isn't happening," which includes the very common case of a guest going quiet, not just a no.
The first version of the card editor locked almost every field, on the principle that the portal should never quietly rewrite what somebody submitted. The instinct was right and the conclusion was wrong. The chef's words during review: "these are suggested ranges but final varies right?" Exactly. A guest asks for the 10th with ten people, and the dinner ends up on the 9th with twelve.
So a card is two things. The record — name, email, phone, occasion, venue, the message — is never editable. The plan — date, end date, time, party size — moves with the conversation, and the first time it's edited, what the guest originally asked for is kept underneath.
The help note says it in the chef's terms: "The plan is yours to change. What they first asked for is kept."
The public booking form and the chef's calendar read the same list of closed days. Move a card to Confirmed and that night greys out on the booking page immediately, so nobody can book her twice. Block a four-day trip on the calendar and the booking form stops offering those days.
A day can be Away, Fully booked, Holding (someone's deciding), or anything she types, because she may want to block a dentist appointment and an enum would need a developer.
Guests are told exactly one thing about any closed day: "Not available." "Fully booked" was cut from the public side on purpose; it announced which nights she has work.
The two-way calendar is the feature clients notice. The part I'm prouder of is that it's one rule: a confirmed dinner is a closed day. I specified it as a repair rather than a setting — every save re-derives the relationship instead of trusting it was set correctly once. It broke once during the build. It hasn't since.
Services, prices, the about page, FAQs, SEO titles and contact details are all editable in the portal. None of them go live when saved. Edits sit as a draft, the site keeps showing the old words, and the button says so.
This isn't editing-with-an-undo. It's the difference between the chef rewriting a paragraph over three sittings and a guest reading sentence one of it. Things a stranger never sees mid-thought — moving a card, blocking a day, a private note — skip the draft step and save straight through.
Copy the chef hasn't signed off yet is marked in red on the live site until she clears it, so "still placeholder" is visible on the page instead of buried in a spreadsheet.
An empty screen must never hide a failure.
An inquiry board with no cards can mean a quiet week, or a database that stopped answering. Early on, both looked identical, and the reasonable assumption for a chef with no bookings showing is the first one. So the board now distinguishes them and says the useful thing: "Couldn't load your inquiries. This is a problem reading them, not an empty board. Nothing has been lost."
The same rule caught a real bug. During review, fifteen journal photos were uploaded; three appeared, twelve failed with no message at all. A hosting limit was rejecting the files before the upload code could explain anything. The fix was twofold: shrink photos in the browser before sending, and treat "silent" as a bug class in its own right, with a catalogue of every place the portal could claim something it had no way to know.
That's also why "Write back" is a prefilled email rather than in-app messaging. The chef's reply belongs in her own sent folder, and the portal can see that a compose window opened and nothing more. Any column claiming "sent" would be a guess stored as a fact.
Signing in is an emailed code, so there are no passwords to remember between services. Being able to receive email proves only that a mailbox exists, so access is a deliberately short staff list: the chef as owner, me as read-only builder.
I specified three checks on every save — hidden controls, a readable refusal, and the database's own rules — and only the third one is security. The first two are interface design; the third is the one that matters, because a dashboard that trusts login alone hands the guest list to anyone with an email address.
Each tab is named for a room, not a database table: The pass (overview), The card wall, The diary, The words, The ledger, The office. The nav runs in the order of a working day.
Every screen has a small "?" that opens a one-time explainer written in operational terms — "Confirming closes that night on your booking form, so nobody can book you twice" — because the chef asked for "a little instruction manual so it's not taking up too much real estate."
The SEO note even warns that after publishing "your website will look exactly the same, and that isn't a mistake," pre-empting the one support message every SEO field generates.
Two weeks for the dashboard, August 24 to September 7, inside a five week site build. What that bought, counted after launch rather than before it:
The site and the portal went live on September 18, 2026. In the twelve days since: three inquiries through the card wall, four journal entries posted, and a calendar filling with her own unavailability and appointments. No messages to me asking for a change. Nothing has broken.
Twelve days and three inquiries is not proof of anything. It is the first evidence, and each piece of it happens to test a decision that was made on an argument rather than on data:
Coming from someone who had no idea how to do anything — you gave me a little home portal and explained everything so clearly. The fact that I was able to move stuff around on my own before even chatting with you… I feel so capable.
Kaylee, Kinda French Kitchen
Moving cards before asking me how is the sentence the room names and the one-time explainers were written to earn. It is also the only measure of them I trust more than my own opinion.
What I don't know yet is the part that matters most. Whether the card wall still reads at thirty cards instead of three, and whether "Declined" stays honest when a guest simply goes quiet for a month, both need a season rather than a fortnight. Those are the first two things I'd instrument.
Each of these is written down in the portal's own help notes as "not yet," because a tool that implies a feature it doesn't have is the same bug as an empty board that hides an error.
Sample data, no signup. Move cards between columns, edit a plan, block a weekend, save a price as a draft. Nothing you change is saved, and a refresh starts you over.
Sample data only — the real portal holds a client's inquiries and is not public.
Most of what I'm proud of here is invisible: the portal never says something it can't know. Every decision above came from one question — what would the chef reasonably assume if this screen were wrong?
This one is live, in daily use, and you can open the back end yourself. If you're hiring for product design, I'd like to hear about it.