Changelog

What changed in createtodo, release by release.

Board Layout, Questionnaires & Full Width

Every list and view can now be a board. Display → Layout switches between List and Board (or press V), stored per view. Each group becomes a column — Group by None falls back to status — and dropping a card in another column writes that property. Cards put every property under the title in the detail page’s order; on a status board the status control is left off, since the column says it. Column headers carry the grouped value’s symbol, and subtodos show as cards or fold away. Drag a column header to reorder the columns — or a section header to reorder the list’s sections — per view, with Reset order in the Group by menu.

Agents can ask

An agent that needs a decision can now file a questionnaire instead of guessing: ct ask or the MCP’s create_questionnaire attaches single-choice, multiple-choice and free-text questions to a todo. A Questions row appears in the sidebar while one is open, the Questions page steps through it with letter shortcuts, an Other answer and Skip on optional questions, and the agent reads the answers back with ct answers or over REST. Everything an agent does now reads as AI · session · via member, so you can tell which Claude session did what even though they share one API key, and ct create --label lets agents tag the todos they file as AI.

Views: templates, seeds and windows

New view offers templates — Today, Upcoming, My todos and Overdue — that bring their filters, grouping and sort, and a new workspace is seeded with all four as shared views; the My todos and Upcoming pages retire in their favour. The due filter gains Tomorrow and Next 7 days windows, there is a Status date sort (how long a todo has sat in its column), favorite view rows count their matches, deleting a view is undoable, and the filter row folds away behind the Filter button.

Favorites you can drag

Favorites reorder by drag; drag a list or view in to favorite it and out to remove it, and an empty Favorites opens as a drop target when you carry something up. A todo can be a favorite too — from its context menu, or by dragging the row from the list into the sidebar. Favorites sit at the top of the sidebar under Create todo, every sidebar drag is undoable, and sidebar rows open their actions on right-click.

Full width and the sidebar’s edge

Press W (or use the Display menu) for full width on any page: the breadcrumb row becomes a ruled toolbar and lists fill the window, while the todo page keeps its reading column. Drag the sidebar’s edge to set its width, double-click it to reset, and rest the mouse on the left edge of the screen to peek a hidden sidebar in.

Composer and statuses

Paste a URL into the empty composer title and it unfurls: the page’s title becomes the todo’s and a bookmark card with its image opens in the description. Statuses can belong to one list, as labels can since last month: Settings → Statuses gets a list picker and every status picker narrows to the workspace’s statuses plus the list’s own.

Improvements
  • Acceptance criteria, design and notes on the todo page are plain sections aligned with the activity timeline; ticked criteria strike through
  • Subtodos no longer draw a guide line to their left
  • The sidebar has its edge line and dividers back, and keyboard focus rings draw inside it
  • Filter and Display are icon-only with tooltips; the create view dialog’s presets are choice cards
  • The state icons settle on one cut — the Terminal/Lucide switch in Settings is gone — and a parent’s status icon no longer draws a progress ring
  • ct 0.10.0 and MCP 0.24.0 carry questionnaires, --label and session attribution
Fixes
  • Tooltips are dark in dark mode instead of white
  • A closing menu no longer takes focus back from what its item focused
  • A description no longer jumps when the live editor replaces the loading preview
  • The composer survives a touch pick from its menus and keeps its title above the keyboard
  • The identifier reads “Draft” until the number syncs back, then rolls to it
  • Pending-write counts cover every table, and a pending delete survives a newer echo
  • The delete confirm promises undo only when there is one
  • Empty group headers show no collapse chevron and read as disabled; list sections fold to their headers while one is dragged

Standalone Views, Filter Chips & a Grown-up Sidebar

Saved views no longer belong to a list. A view opens on a page of its own under a Views › name breadcrumb, and its lists are just another filter: a List filter narrows it to one list or several, and none means every list. The Views page groups them under Favorites, Personal and Shared with a New view button, a Views section in the sidebar lists every view you can see, and a view’s actions — edit, duplicate, favorite, share, copy link, delete — sit in its ⋯ menu. A list opens as itself; a view is something you choose. The short-lived Overview page is retired, replaced by the Views page and the Lists page below.

Filters you can read

Filtering moves out of the ⋯ menu. A Filter button on the breadcrumb row (F opens it, Shift+F removes the last facet) opens a picker that searches facets and values in one list, and applied filters render as chips segmented property · operator · values · ×, each segment its own control. Facets have operators: is / is not; includes any / all / none for labels; before / after for a due date.

The sidebar grows up

Last release’s sidebar became the app’s spine. The workspace row sits at the top and opens a menu with Undo, Redo, Settings, Keyboard shortcuts and a Switch workspace submenu; the account row keeps to the footer. Under it, a search field shows the command palette’s results as you type, Create todo is a row with its C keycap, and a Favorites section holds the lists and views you heart. Lists reorder by drag straight from the sidebar, Drafts get a row and a page of their own, and the ↓/↑ buttons (or J/K) step through every row. Dark mode turned warm and muted, and on a phone the sheet opens with a swipe from the left edge.

The Lists title opens a Lists page: a card per list with its open count, archive and delete on hover, drag to reorder, and a trailing card that creates one.

Labels per list

A label can now belong to one list. Every picker, the filter, group-by-label and #label tokens offer the workspace’s labels plus the list’s own; a moved todo keeps its labels so it can still drop them. Settings → Labels gets a list picker.

Rows and previews

A collapsed parent row shows done / total for its subtodos. Group headers show their count and a + that opens the composer pre-filled for that group. The hover preview and breadcrumb card say when a todo was created and last edited, and when it was done or canceled. Hovering from row to row swaps the preview in place, and its description is the live editor.

View changes are local-first

Grouping, sorting, favoriting and filter edits are now local writes that sync like a todo edit: they work offline and land when you are back.

Improvements
  • The composer appears on demand with the toast’s slide-in; its Create button shows the Enter glyph and waits for a title; Save as draft accepts an empty composer as an untitled draft
  • “Show older completed” moves into the Display menu; the footer only shows while the reveal is active
  • Menus hand off to each other on hover, like tooltips
  • Dialogs no longer dim the page, and keep their desktop layout on phones
  • Archive and Trash render rows a page at a time, so switching tabs is quick with thousands of rows
  • Grouped view pages keep their columns as rows come and go, and show only the groups their filters admit
Fixes
  • No new-version toast on a page already running that build
  • Redo re-applies a delete undone while its toast was open; a list delete no longer flickers on undo
  • Menu items run their action on Enter and Space; Space or Enter on a focused control no longer fires page shortcuts
  • Discarding a draft names the draft in its undo entry; edits on a draft page land on the draft
  • Toasts stay in the corner unless the composer is under them
  • The composer stays open through its menus, the relation picker and a Safari click on Create
  • The preview’s description shows instantly with no cold flicker

Multi-select, Saved Views & the Composer

You can now select several todos and edit them together. Cmd/Ctrl-click toggles a row into the selection, Shift-click extends it, Shift+arrow grows it one row at a time, Mod+A selects every visible row, and a drag on the empty space beside the rows draws a marquee. A bar slides up from the bottom edge with the count and the todo page’s own property bar — status, priority, assignee, labels, due date — plus delete and clear, each applied to every selected todo and undone as one step. Drag a selected row and the whole selection comes along as an “N todos” pill.

Saved views

Save a list’s grouping, sorting and display toggles as a named view, and filter it by label, assignee, priority, status or due date. A view is personal or shared with the workspace; a shared view is edited by its owner or an admin. While a view is active, changes are held as a draft — the header marks it “edited” and offers Save changes or Discard — so you can try a grouping without rewriting the view.

The composer

The create dialog gives way to a composer docked at the bottom of the list: Enter creates and keeps it open for the next one, Shift+Enter opens a description row, Escape collapses it and keeps what you typed. Type @assignee, #label or a date phrase in the title and it becomes a chip, applied on create and stripped from the title; dismiss the chip to keep the words. While you type, up to three similar open todos show beneath the title, so a duplicate is caught before it exists. Save as draft opens the todo on its own page, where every editor works, with no number until you press Create todo.

Images, bookmarks and embeds

Paste, drop or pick an image in a description and it uploads to private storage, compressed in the browser first, with a progress ring; a selected image gets a width handle, alignment buttons and a caption. Pasting a URL opens a chooser: keep the link, turn it into a bookmark card with the page’s title and favicon, or a click-to-load embed for YouTube, Vimeo, Loom and Figma.

A sidebar

The first cut of a left sidebar lists the Inbox and every list with its open count, with Archive and Trash in the footer. Hide it with Mod+B; a hidden sidebar peeks in while the mouse rests on the corner toggle. On a phone it is a sheet.

Agents hold a lease

ct claim now takes an expiring, per-session lease on a todo: a live lease held by another session is refused by name, a stale one is reclaimed, and close releases it. The row shows a bot chip beside the assignee naming the session, fading when its heartbeat goes stale. Changes and comments made through an API key are attributed as “agent · via member” in the timeline and in comments.

Improvements
  • Press G then M to open the list’s timeline; Escape returns to the list
  • The command palette ranks a Top result, nests list actions behind ArrowRight and shows real shortcuts
  • The Space-toggled hover preview is editable: title, property bar and the live description
  • Rows animate in and out, slide between groups, and pulse when another client changes them
  • Held changes retry on their own — after 1, 5 and 15 minutes, on reconnect, and when the server version changes — and the sync dot opens a Retry now popover
  • “Make subtodo of…” in the row context menu, and a hint bar explains the highlighted menu item
  • The repeat rule lives in the due-date popover; recurrence changes show in the activity timeline
  • Closing a parent lists its open subtodos and lets you complete or cancel each one
  • Drag a todo onto your avatar to assign it to yourself
Fixes
  • Undoing a parent’s list move brings its subtodos back, and a move out of the Inbox undoes into the Inbox
  • Picking Done in the status filter shows finished rows even with Show completed off; filters re-evaluate at midnight
  • Esc closes the open Mod+F filter from anywhere on the page
  • Adjacent-month days are selectable in the due-date pickers; clearing a row’s date no longer strands its repeat rule
  • A dialog save or a create is one undo entry
  • The sync toast and avatar dot no longer flash on warm reloads
  • ct and MCP writes no longer need an updated_at stamp

List Timeline, Bulk Actions & Sync You Can Trust

Every list now has a timeline: activity across the whole list, grouped by calendar day and written as accomplishments — what got done, what moved, and who did it, in one readable stream. Cascading changes name their cause (“closed because its parent closed”), rapid-fire edits merge into one line, and archived history is folded in so the story doesn’t stop where the archive begins.

Do more at once

Bulk actions arrived: update or archive many todos in one call, select them by filter, and preview the selection with a dry run before anything changes. Archiving also got a cleaner rule — it’s decided at the root todo, and the whole subtree rides along.

Sync that refuses to lose your work

This release hardens the local-first write path end to end. If the server rejects one change, that change is quarantined on its own — with a visible notice, a count of what’s waiting behind it, and a manual retry — instead of silently wedging every write after it. Changes that depend on a quarantined row wait for it; everything else flows around. Rows that left your view while a device was offline are reconciled away on the next boot, queued writes flush before sync starts so nothing races, and a self-diagnosing error overlay can tell you which layer is down — readable even from a phone. If the API has a bad day, your edits wait it out and land when it’s back.

The app keeps itself fresh

When a new version deploys, open tabs now show a reload prompt — no more running last week’s app in a forgotten tab. Signing in takes you straight to your last workspace, the loading spinner stays continuous across the page load, and on wide screens the Space-toggled todo preview docks beside the list instead of covering it.

Quicker in the hand

Press H to open the palette in recently-visited history mode. Palette search now reaches the archive, and rows show their state icon. Sort and group menus flip direction by clicking the active option, and refuse each other’s field so you can’t group and sort by the same thing. On mobile there’s finally a proper tappable create button. And ct learned to work fully offline — reads and writes both — with a browser-approval login flow that never makes you paste a key.

Improvements
  • Workspace settings gained a Memory tab for the facts agents have saved
  • An opt-in preference wraps long todo titles instead of truncating them
  • Timeline rows wrap long text, in lists and on the detail page
  • The state icons were re-cut with the motion grammar of the retired engine — crisper at every size
  • Status marks honour their stored colour as a flat accent tint
  • Group and sort drops log the moved todo’s attribute change in its activity
  • The create-todo button hints its hold menu and leads with “Create more”
  • Subtodos inherit their parent’s list automatically
  • Preferences are grouped under Account in the settings sidebar
  • Archive opens instantly with skeleton rows
  • Big performance pass: list switches, archived lookups, and activity queries are all noticeably faster
Fixes
  • Rapid successive edits are never dropped by the stale-write guard
  • A synced row no longer discards a pending local edit it can’t outrank
  • Deleting a todo waits for its undo toast to close, so undo always works
  • The confirm-before-delete preference is honoured again
  • Escape in the subtodo filter stays in the filter; Mod+Z in a text field stays native undo
  • The due-date and recurrence panels open from the keyboard
  • Recurrence now closes the completed todo and spawns the next one — no more open twins
  • Archived todo pages no longer blank out, and archive requests pin their workspace
  • The filter bar survives the list → todo → back round trip
  • Your view preferences survive a no-op view change

A New Face, Recurring Todos & Agent Memory

createtodo has a new identity. The brand now sits on a Forest green ramp, anchored by a tiled check mark that carries through the favicon, the PWA icons, and the app itself. Every workflow state got its own hand-drawn icon in a refined ten-state set, animated with a morph when a status changes and a staggered check-in whenever anything lands on done. Colours across the app were rebuilt as nature-anchored families — bark, birch, forest, and friends — used by labels and statuses alike, with named swatches in the picker. Status glyphs default to your text colour; colour is opt-in per status, so the list stays calm until you decide otherwise.

The website was redesigned to match: an editorial layout, light and dark, a proper /docs section, and an /agents page documenting the MCP server, the ct CLI, and the agent skill.

Todos that come back

Recurring todos are here. Complete a recurring todo and the next occurrence spawns itself, on the schedule you set — and monthly recurrences keep their anchor day, so “the 31st” doesn’t drift to “the 28th” after February. The recurrence selector got a proper polish pass along the way.

Subtodos, your way

Each list can now show subtodos nested, flat, or hidden — pick per list. A todo can no longer be closed while its subtodos are still open, and adding a subtodo to a closed todo reopens it, so a parent’s checkmark finally means what it says. Per-todo collapse state is remembered per view, per person.

Agents that remember

The agent side took another leap. A new memory store lets agents save and recall workspace facts with full-text search — decisions, conventions, context that outlives a single session. Description edits made through the MCP now stream live into open editors, server-side, so you can watch an agent write. Read-only API keys with server-enforced scope let you grant lookup access without granting edit access, and the ct CLI learned to bind a repository to a list, with branch awareness.

Improvements
  • Descriptions are persisted locally, so they survive offline reloads
  • Show-completed and collapsed groups are remembered per view, and follow you across devices
  • Todo titles are capped at 255 characters, enforced everywhere — input, server, and MCP
  • Subtodo sort is a workspace-wide preference, with an alphabetical option
  • Label-selector colours render as tile swatches with names on hover
  • Switching sort adopts that sort’s natural direction
  • Trash restore surfaces server errors in toasts instead of failing silently
Fixes
  • A recoloured status no longer loses its colour mid-animation
  • Collaborative editing sessions fully tear down on release
  • Saving a description keeps <, >, and & literal
  • Stale collapsed-group keys are pruned as they’re written
  • The activity feed no longer overflows the page column
  • Logged-in visitors reach website pages correctly instead of being routed into the app