Skip to content

Active development — do not use in production yet. Build-in-public project. First stable release: v1.0.0. Expect breaking changes, missing features and rough edges before then.

kandown
116 releases

Changelog

2026-08-15

v0.52.0· Structured Categories

Added

  • Hash-based category chips (toggleable via Settings → Appearance → "Colored category chips", on by default): every category name renders in a chip with a stable color and icon derived from a hash of the name (FNV-1a into a 40-color palette, pastel background with near-black 90% text). Same category, same color, nothing stored. Applies to the "All tasks" section headers, the drawer/editor header chips, every board card, list row and collapsed stack.

  • Three new bundled themes appear in the picker without any install step: shadcn (ultra-clean zinc neutral, the new default), vercel (black and white, mono display type, compact density) and linear (dark-first violet with elevated glass popovers, ported from the community registry).

  • Column colors render as a 3-4px accent bar on top of the column card (board view) and the section header (list view) instead of a faint full-column tint. The bar uses a new solid COLUMN_BAR_MAP; the old COLUMN_COLOR_MAP tints were removed.

  • kandown doctor now detects a pnpm workspace accidentally rooted at your home directory. If ~/package.json, ~/pnpm-workspace.yaml and/or ~/node_modules exist together, pnpm treats ~/ as the workspace root for every project below it: pnpm dev can hang while scanning the whole home graph, installs may target the wrong virtual store, and the project's own lockfile can silently fall out of sync. The project itself looks perfectly normal, which is what makes this so hard to debug.

    The new check (detectHomeWorkspace in src/cli/lib/home-workspace.ts) requires at least two of the three markers before warning, so a lone stray package.json never triggers a false positive. It is advisory only — kandown doctor still exits 0 — but prints the offending paths and a concrete fix (remove the files, or declare a local pnpm-workspace.yaml in each project). Covered by 5 regression tests in src/cli/lib/__tests__/home-workspace.spec.ts.

Changed

  • The default skin is now shadcn instead of the lime house theme. DEFAULT_CONFIG.ui.skin, the demo seed and the unknown-id fallback all point at it. The kandown theme stays bundled and selectable.
  • The task category moved out of the title into a first-class frontmatter field. Tasks previously carried it as a leading [CATEGORY] bracket inside title: ([UI] Fix the login button), parsed ad hoc by four different helpers. The source of truth is now category: UI in the frontmatter, with the bracket form still accepted everywhere as a fallback for legacy files. The visual surface is unchanged: the web drawer chip, the "All tasks" grouping and the TUI category rows all render the same category from the structured field.
  • Filenames keep their category segment, now derived from the field. tasks/t232_UI_fix_login_button.md still reads at a glance; changing the category in the drawer still auto-renames the file through git mv.
  • Creating a task still accepts a bracket title. kandown create "[UI] Fix the button" and the web quick-add normalize the bracket into the category: field and store a clean title.
  • A one-shot migration script (scripts/migrate-task-categories.ts) moves existing bracket titles in any kandown repo into the new field: npx tsx scripts/migrate-task-categories.ts --dry-run.

Notes

  • BoardTask gained a category field and taskToBoardTask surfaces it without printing a duplicate metadata entry on the card.
  • buildTaskFilename now accepts the category explicitly, with the legacy title-bracket derivation as default, so old callers keep working.
  • Card and list-row selection checkboxes float over the content edge with a fade instead of reserving layout space; task ids render as a badge in the bottom-right corner of each card; collapsed stacks show the task count with a checklist icon.