- set_entry removes entry from old bucket when type changes (fixes duplicates)
- PUT /api/entries/:id now accepts type field
- Tag clicks navigate via URL (#type/x/tag/y or #tag/y) instead of mutating state
- Replace magic 'all' hash with empty hash as the all-entries route
- Clickable tags in entry detail view
- Tag filter dropdown updates URL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Storage: nested object buckets per type, integrated next_id into meta,
migration from old flat task:N key format, seeded default types (task/idea/note)
- Server: /api/entry-types CRUD + /api/entries replacing /api/tasks, type
validation, blocks deletion if entries exist
- Frontend: dynamic nav per type, Entry_Type_Dialog, Entry_Dialog with type
selector, type chip in All view, Manage Types view
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- parent_id on tasks; roots shown by default, others expandable
- Expand/collapse per node with expand/collapse button
- Sub button creates subtask directly from the row
- Make subtask of button in edit dialog with searchable picker
- Remove parent clears the parent link in the dialog
- Flat mode toggle shows all tasks indented by depth
- Tree filter shows nodes whose descendants match, not only direct matches
- Deletion blocked if task has subtasks (client + server)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New /api/render-markdown proxy to Gitea (configured via config.yaml)
- lib/config.mjs loads config.yaml with yaml-js
- Edit/Preview tabs on the body field in the task dialog
- Title and body rendered as markdown inline in the task list
- Gitea markup+chroma CSS extracted and vendored to public/gitea-markup.css
- Markdown cached in memory per text string
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Node.js + Express 5 backend with flat NDJSON key-value store (borrowed from
electronics-inventory). Sequential integer IDs per namespace. Vanilla JS SPA
with filters for status, priority, and tags.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>