Releases: ridingbytes/kaisho
v2.5.2
Adds the kanban-scheduling feature (snooze a task until a future date, see a deadline cue when it's close) and lands a cluster of correctness fixes from the post-feature code review — most of them touching the cloud-sync path where v2.5.1 left small gaps.
Kanban scheduling
- Snooze + deadline data model across all four backends (org, markdown, sql, json) and the cloud wire format. SQL ships an idempotent
ALTER TABLEso existing databases pick up the new columns on next open. [#159] - Snooze UI: scheduled tasks drop off the board until the day arrives, then return with a small alarm-clock badge top-left; clicking acknowledges and clears the snooze. A toolbar pill lists snoozed tasks with one-click Wake. Deadlines within three days (or overdue) get a separate bell badge, per-device-acknowledgeable so the underlying date stays on the task. [#161]
- CLI + MCP parity:
kai task add/kai task updateaccept--scheduled/--deadline.task listshows both inline. The API rejectsdeadline < scheduledand the edit form gates the Save button. [#163] - Per-column collapse replaces the global "Show done" toggle. Each column has its own chevron; collapsed columns shrink to a narrow strip with a rotated label, the choice persists per profile. [#157]
- Done flag goes load-bearing. The badge in Settings → Task States now toggles whether the state counts as completed. The kanban's tick icon moves a task to the first state flagged done; if none is flagged, the tick disappears entirely so deleting the DONE column can't silently orphan tasks. [#166]
Cloud-sync correctness
- Cloud-WS data-change events now wake the kanban path correctly. Periodic poller broadcasts the right
kanbanresource key (was sendingtasks, which the frontend silently no-op'd). Closes #150. [#162] scheduled/deadlineno longer get clobbered by a cloud-pull update whose wire payload omits them (legacy peer, PWA, iOS on an older build). [#164]- PAUSED-on-pull clear is now scoped to events that actually touched the entry's timing. Editing notes on the iPhone for a paused entry no longer wipes the local pause flag on desktop. [#164]
- JSON backend normalises legacy task dicts so
scheduled/deadlinealways come back asNone(matching SQL and markdown). [#164] - Broadcast plumbing tightened:
BROADCAST_RESOURCESconstant, per-iterationtry/except, tz-awarenext_run_time, drop the redundant WS pending-set. Snooze filter + deadline badge use local-timetodayso users in negative-UTC timezones no longer see snoozes expire / deadlines fire a day off. [#165]
Smaller things
v2.5.1
Fixes a cluster of cloud-sync edge cases that left the desktop showing stale paused / running / merge state whenever another device (PWA, iOS) made a change. Plus two dev-loop fixes that landed alongside.
Cloud sync
-
Clear the desktop-local
PAUSEDflag on every cloud-origin pull.PAUSEDis a desktop-only UI affordance that never crosses the wire, so a paused entry that another device has since resumed or stopped used to stay marked paused locally — the running-timer card kept offering "Resume" for an entry the cloud thought was finished. [#156] -
Run the cloud sync once at startup instead of waiting a full five minutes for the first interval tick. A fresh app launch now reconciles with the cloud immediately, so a timer running on another device shows up in the desktop's running-timer card right after boot. [#155]
-
Pull from the cloud when a
timer:startedarrives over the cloud WebSocket. The map previously only triggered a sync ontimer:stopped, so a timer started or resumed on another device only fired the immediateclocksbroadcast — the desktop frontend invalidated its query and re-read the same pre-start local state, leaving the running-timer card empty until the 5-minute poller caught up. [#154] -
Record a cloud tombstone when merging two clock entries so the deletion of the merged-away entry propagates to other devices. Before, the merge router only dropped the source from CalDAV — the surviving entry's update was pushed but the deletion never was, so the PWA and iOS kept showing both originals plus the merged result. [#151]
-
Refresh the desktop UI when the cloud broadcasts
entries:changed,entries:deleted,inbox:changed,tasks:changed, ornotes:changed. The sidecar already pulled the new rows into local SQL but never told the React frontend to invalidate its queries. Closes #148. [#149]
Robustness
- Fix a
FileNotFoundErrorcrash inwrite_org_filewhen two writers raced on the same org file (e.g. a kanban list request that backfilledTASK_ID/SYNC_IDwhile the background cloud sync was also writing). Each writer now gets a uniquetempfile.mkstempscratch. Same fix applied tokb_index.save_index. [#153]
Dev loop
- Strip duplicate newlines and re-split bursts when piping
kai-serveroutput inbin/dev --desktopso Python tracebacks render with one[kai]-prefixed line per frame instead of a single squashed blob with a blank line between every entry. [#152]
v2.5.0
Expose the MCP HTTP allow-tier in Settings so write and destructive tools can be enabled without editing the stdio CLI flags [#147]
Before 2.5.0 the HTTP MCP transport mounted by kai serve was hard-wired to allow="read". Stdio users could pick a tier with kai mcp-server --allow ..., but HTTP clients (the default Claude Desktop / Claude Code / Cursor setup the integration panel hands out) saw only the read-only tool surface and had no way to widen it without editing source.
A new Permissions selector in Settings → Integrations → Local MCP server persists the chosen tier as a flag file at ~/.kaisho/mcp-allow (mirroring the existing mcp-disabled pattern, so the desktop app, a shell user, and a deploy script can all set it without parsing YAML):
read— query tools only (default after install).write— addsadd_task,start_clock,book_time,add_note, and the rest of the create / update tools.destructive— also addsdelete_*andrename_profile.
The default stays at read so an upgrade never silently widens what a remote client can drive with the bearer token.
Restart-aware UI. FastMCP registers the tool list once at startup, so changing the tier requires restarting kai serve (or the desktop app). The panel detects when the on-disk preference has diverged from the live tier and surfaces an inline "restart required" hint until the running server catches up.
Kaisho v2.4.1
See CHANGELOG.md for details.
Kaisho v2.4.0
See CHANGELOG.md for details.
Kaisho v2.3.2
See CHANGELOG.md for details.
Kaisho v2.3.1
See CHANGELOG.md for details.
Kaisho v2.3.0
See CHANGELOG.md for details.
Kaisho v2.2.5
See CHANGELOG.md for details.
Kaisho v2.2.4
See CHANGELOG.md for details.