Inspiration
I have about fifty side projects and three customers waiting on quotes I have not sent. You can guess which of those I worked on yesterday.
That is the whole thing. It was never a shortage of ideas or lists. The work somebody else is waiting on loses, every single time, to the work that is more fun to start. A static planner goes stale by Tuesday. A chatbot will cheerfully write me a fresh list and then take no further interest in whether I did any of it.
So I gave myself a fortnight and built the thing I obviously needed: something that would not let me pretend. The idea of tracking momentum per project came from an earlier prototype of mine called Tao, where each project carried a wind: tailwind if it was moving, headwind if it was fighting me. The daily rhythm of context, work, reflection came from a 30-day challenge tracker I had been running on myself. The nagging personas came from a mentor app I built and abandoned. Daily Chief is those three ideas finally living in the same place.
What it does
You give it a time-boxed sprint, usually a fortnight, and the streams you are carrying: a launch, a partnership, a sales pipeline, a certification you keep putting off, the social commitments nobody invoices you for.
Each morning it asks two questions. How many hours do you have, and how much is left in the tank. From those it ranks everything against the day using five weighted signals: project momentum, deadline pressure, how well a task fits your current energy, how long it has sat untouched, and whether it is simply too big for the hours available.
$$\text{score} = 2w + 3d + 1.5e + s - 2o$$
where $w$ is project momentum, $d$ deadline pressure, $e$ energy fit, $s$ staleness, and $o$ effort overflow. It will never hand you a Top 3 that does not fit inside your capacity.
The ranking shows its working on every row. In the demo, the customer quotation scores 11 and the launch announcement scores 9, and the launch loses even though its project has more momentum, because deadline pressure carries three times the weight. You can read that on screen and disagree with it.
Then you lock it, which turns a list into a commitment the rest of the day is measured against.
Two other views sit over the same day. An importance-versus-urgency board sorts open work into Do first, Schedule, Batch and Backlog, where importance means what the work is for plus whether a person is waiting on it. A customer quotation therefore outranks a domain renewal that is due sooner. A wind map tracks momentum per stream, and blocked work is marked blocked instead of quietly rotting.
When a client call lands inside your deep-work window, the Chief moves work around it through constrained tools, and every mutating tool returns a signed, hash-chained receipt bound to the request, the result, and the before and after state.
The part people remember: it talks back
Daily Chief ships with eight personas. A Singaporean bro or sis, a strict coach, a supportive friend, a witty buddy, a naggy nanny, a lazy sloth, an annoying minion, and a K-pop bias. You pick one and it runs everywhere, not as a skin on a settings page.
Each persona covers thirteen moods tied to real state: the morning brief, locking in, being on track, being derailed, falling down a rabbit hole, parking an idea, three flavours of evening depending on how many of your three you finished, streaks, finishing a task, running behind, and clearing the board.
Finish something and it says so, with confetti and a line written for that moment. In the demo, checking off the customer quotation produces:
"Quotation sent, Harbourline Logistics settled, steady lah, keep the momentum going!"
It names the task because the line is generated per event against that persona's voice brief. If no model is configured, or the call is slow, or the reply comes back too long, it falls back instantly to a hand-written line in the same voice. The app is never mute and never blocks on a model. The same voice brief is prepended to the Chief chat system prompt, so the assistant you argue with about your schedule is the same character that cheers when you finish.
Planning apps are silent and neutral, which is exactly why they are so easy to ignore.
How we built it
Next.js 15 and React 19 on Vercel, TypeScript throughout, Upstash Redis for workspace state, Clerk for identity.
The model work goes to the OpenAI Responses API with gpt-5.6-luna: onboarding, Chief
chat, the persona reaction lines, and short and long-term memory summaries. The split is
deliberate. GPT-5.6 does what it is better at than code, which is reading a messy
situation and speaking in character. It touches nothing where being right matters more
than being fluent. The ranker is deterministic. The receipts are cryptographic rather than
asserted. The preview and apply surfaces are application code. Every generated persona
line has a hand-written fallback underneath it.
Codex was the engineering companion for the qualifying build: the reversible direct OpenAI provider path, the provider and safety tests, the evidence and readiness tooling, and adversarial review over both the code and this submission.
The demo video is filmed by driving the real app over CDP inside an Xvfb framebuffer at 2560x1600, with a synthetic cursor, eased scrolling and per-character typing so genuine browser state does not read like a slideshow. Narration timestamps are derived from the encoded MP4 rather than from planned waits.
Challenges we ran into
A reload loop that hit every signed-out visitor. The app shell mounts two independent state fetchers. Signed out, both received a 401, and the guard meant to prevent a reload storm cleared itself on the second failure: one caller reloaded while the other re-armed the guard, forever. Anyone landing on the site while logged out sat in an infinite reload, burning function invocations. The fix is one line. Finding it took reading a 50KB console log where the same two 401s repeated every few hundred milliseconds.
Four test suites that had never run. vitest.config.ts used a hand-maintained list of
test files rather than a glob, so any new test silently did not execute. Switching to a
glob revealed four suites sitting in the repo, committed, passing nothing, running under
no runner at all. There is now a meta-test that fails if any test file is not picked up by
exactly one runner.
A Rules of Hooks violation on the two main screens. A hook was called after an early return, so React was pairing state to the wrong slots between renders. It also left a function in the temporal dead zone for one button's click handler.
Clicks that silently did nothing. The recording harness computes click coordinates
from getBoundingClientRect, which is viewport-relative. Once the ranked list rendered,
the lock button sat below the fold, and the click was dispatched into empty space with no
error. The plan was never locked, so work sessions never rendered, so the entire payoff
half of the demo could not be filmed. Three takes went by before we worked out that the
weak ending was a bug and not a staging choice.
A recording that sabotaged the app it was recording. Video was being streamed into a directory inside the repo, which tripped the Next dev file watcher, which recompiled mid-request, which invalidated the chunks the page was still loading. The browser died with a syntax error while parsing an error page as JavaScript.
Accomplishments that we're proud of
The quadrant gave a dead field a job. Project.category had been collected during
onboarding and read by nothing since. It is now the importance axis, and building it
surfaced a trap worth naming: if you score startup work high and admin low, the board
files your customer follow-ups under Batch and automates the exact failure the app exists
to prevent. Importance is therefore what the work is for plus whether a person is waiting
on it, and there is a test named after the constraint that a pending customer quotation
must land in Do first.
The labels are not the textbook ones, for a reason. A solo founder has nobody to delegate to, so that box is Batch. And Backlog holds "not yet" as well as "never", because a certification exam eight days out is not droppable, it is just not today's problem.
The persona layer degrades honestly. Model configured, it writes you a fresh line that names your task. No model, slow model, over-long reply, and a hand-written line in the same voice appears instantly instead.
257 tests across 31 files, with regression tests that were verified to fail against the pre-fix code rather than merely passing after it.
What we learned
Put the model where it beats code, and nowhere else. The temptation is to let it rank the day. A model that ranks cannot show you why, cannot promise the result fits in six hours, and cannot be argued with. Deterministic ranking plus generated personality turned out to be a much better product than either half alone.
A label is not a trace. While storyboarding the demo we wanted to claim GPT-5.6 was running. The chat reply proves a model ran; it does not prove which one, because the model name is rendered nowhere in the UI. So that claim stays in this write-up, where a judge can verify it from the repo, and out of the narration, where it would have been an assertion over footage that cannot support it.
Measure timings from the artifact, not the plan. Narration synced to intended holds drifts against the encoded video. Every timestamp now comes from the file that ships.
What's next for Daily Chief: the plan that survives reality
Voice. The personas are written to be spoken and currently only appear as text. Browser speech synthesis is the cheap first step: no API key, works offline, and a distinct rate and pitch per character.
The other half of accountability. behindSchedule exists in every persona and in the API,
but nothing in the product triggers it yet, so the buddy can currently only celebrate. It
should get on your case about the follow-up that has been overdue for three days.
Then the community version. This was built to be run by more than one person: the workspace model is already per-member, and the plan is to hand it to a workation community so everyone runs their own fortnight, with streaks visible to each other.
Log in or sign up for Devpost to join the conversation.