Changelog
2026-07-25v0.35.0— House Green
- Added: Kandown finally has its own theme, and it is the default — a
kandownpreset built from the brand palette registered on the website:#88E138brand lime (the logo arrow) as the dark-mode primary,#7AD12Aas its light-background variant,#0CE931(the hero shader green) reused as thesuccesstoken,#F1FFB8for accent surfaces and#EBEBEBfor neutral borders, on 4px radius to match the website. Because lime cannot carry white text at any usable contrast,primary-foregroundis a near-black green in both modes (7.9:1 light, 11.2:1 dark) rather than the usual white. Every other foreground/background pair passes WCAG AA in both modes. - Fixed: The default skin silently resolved to Vercel —
DEFAULT_CONFIG.ui.skinalready read'kandown', butLEGACY_SKIN_MAPstill aliasedkandowntovercelfrom before the FABLE_UI theme system, so every fresh project opened in monochrome instead of the brand colors. The alias is gone, the preset now sits first inTHEME_PRESETS(and is therefore the[0]fallback for an unknown id), andnormalizeSkinIdfalls back tokandowninstead ofvercel. - Changed: Website hero rewritten — the technical breadcrumb (Local-first / MIT / Node / npm) is replaced by a short free, open-source, local promise, and the headline is reframed around Markdown tasks built for AI agents, long-running work, and the web/TUI/CLI trio. The shared tagline and description used for SEO and machine-readable docs were aligned with it.
- Added: Demo mode — a third backend for the web UI that answers the Kandown REST API from an in-memory
Mapinstead of a disk, so the whole application can run in a browser tab with no CLI, no server and no storage. It plugs in atapiFetch(src/lib/filesystem.ts) viaregisterDemoApi(), which is why the board, drawer, editor, search, archive and drag-and-drop all work without knowing anything changed — nothing is mocked. Built withpnpm build:demo, which also dropsvite-plugin-singlefilein favour of a normal chunked build. The entire feature is compiled out of the bundlenpx kandownships, behind the__KANDOWN_DEMO_BUILD__define. - Fixed: Header task counter rendered
[object Object] tasks—useAnimatedNumberreturns a MotionMotionValue, which has to be rendered by amotion.*component that subscribes to it; wrapping it inString()stringified the object itself. Every user of the web board saw this on every screen. - Fixed: Repository root could open as a project named
templates— implicit project resolution now checks the current directory and walks upward for the nearest valid.kandown/kandown.jsoninstead of recursively scanning child directories. This keeps the live board anchored to the canonical root.kandown/+tasks/layout, works from nested paths such assrc/, and prevents packaged init assets undertemplates/from being mistaken for a project. - Changed: Removed downward child-project auto-discovery — launching Kandown from a directory above a project no longer guesses which descendant board to open. Run it inside the intended project (or one of its subdirectories), or pass an explicit
--path, for deterministic selection. - Cleaned: Removed accidentally committed
templates/daemon.jsonruntime state andtemplates/kandown.htmlgenerated output. The configuration, documentation, and welcome-task seeds required bykandown initremain intemplates/.