A personal planner. Kairos books my tasks, goal sessions and habits into the next 14 days, around fixed events like classes. When a block of half an hour or more ends, it asks how it went, and over time it learns how long things really take. Moving work to another day, or planning longer for a kind of task, waits for my OK.
Today: the current block, a proposal waiting for an OK, a check-in, and the week beside them. All screenshots are from a local demo account with seeded data, on the current development build.
14 days
planning window
306
test cases
45
API route files
Context
I got tired of time-blocking tools, so I built my own. It is a solo project, and this is the fourth build since March 2026. The earlier ones placed single tasks on a calendar. The October rebuild plans two weeks at a time and then checks the plan against how the time was actually spent.
How it plans
Every replan keeps each block whose slot still works, then places habits, then tasks, then goal sessions into what is left. If a task would miss its deadline, a second pass places the at-risk tasks first and keeps that plan if it saves more of them. Past blocks, the current block, pinned blocks and calendar events never move.
plan.tspure: same input, same output
iterate.tspure: plans, then holds back the changes that need a yes
load.tsreads everything the planner needs from the database
apply.tsruns load, plan, write, propose and mirror, one replan at a time per user
accept.tsapplies an accepted proposal exactly as shown
llm/provider.tsthe only file that builds an AI provider
The week. Grey blocks are fixed calendar events: classes, stand-ups and meetings. The coloured ones are placed by the planner and can be dragged.
Key technical decisions
code does the planning over letting the model plan
The planner is rule-based code. The AI suggests a duration when quick-add has none and drafts goals I confirm in a form. In chat it can add a task, ask for a replan or move a block within the same day; a move to another day still becomes a proposal. Every model call goes through one OpenRouter gateway and is logged with its tokens, cost and latency.
a pure planner over a scheduler that reads the database
The planning code gets plain data and the current time as arguments, with no database or network access. So 225 of the 306 committed test cases are unit tests on plain data with the clock passed in. The other 81 run the real services against an in-memory database, and a dev clock lets a check-in that is hours away be tested in seconds.
ask before big changes over silent replanning
Same-day shuffles of tasks and goal sessions apply on their own and are reported afterwards; moving a habit always asks. Moving work to another day, dropping it, or a deadline at risk becomes one Accept or Reject card. Blocks I have moved stay put: dragging a block pins it, and so does moving its event in Google Calendar.
proposed estimates over quietly adjusting durations
Every done check-in, including any +15 min added, feeds a planned-versus-actual ratio per tag and per goal over the last 60 days; skips feed a separate skip rate by time of day. Once a tag or goal has at least three done check-ins and its overall ratio is outside 0.8 to 1.25, Kairos offers a new multiplier. A rejected estimate proposal stays quiet for 14 days.
a separate Kairos calendar over writing into my own calendar
Kairos reads busy time from Google and mirrors its blocks into a calendar of its own. The plan and the planned-versus-actual history live in the app's database, so my real calendar is never overwritten.
A goal with a due date, three stages and the sessions the planner has booked for it.
Timeline
Mar–Apr 2026
Python prototype
A FastAPI service that scheduled tasks on Google Calendar, plus two Next.js front ends for it in quick succession. About 8,000 lines outside the tests by mid-April. The Google Calendar service alone was 1,051.
Apr–May 2026
Full-stack Next.js app
A rewrite in Next.js 16 that grew a plugin host with a Zod-checked contract, HMAC-signed HTTP plugins, theme and plugin marketplaces, and a chat that could read and write tasks. This is the build still running at kairos.clupai.com, behind a beta gate.
Oct 2026
Planner rebuild
Started from the earlier app's core and dropped the plugins, marketplaces and themes. Added the 14-day planner, check-ins, goals, habits and a Google Calendar mirror. It runs locally and has not been deployed yet.
Quick-add on a phone. One line becomes a duration, a due date and a priority before it is saved.
What I'd do differently
Get the core job right before building a platform around it. The April–May build grew a plugin host, two marketplaces and a theme system, and none of them got used. The rebuild cut all three and spent its effort on planning and learning. Next is deploying it on Vercel with a Neon database, since kairos.clupai.com still serves the older build.