Dashboard activity rows now display change metadata inline (e.g.
"status: open → done") when available. Adds parseActivityChanges
helper and subtle muted styling for the change text.
page.params.workspace is string | undefined, but EmptyState expects
string. Add fallback to empty string so the type narrows correctly.
Fixes CI failure from svelte-check.
The activity list endpoint returned raw entries without item context,
causing the activity page to show bare "Created"/"Updated" verbs.
The dashboard already enriched entries via GetItem() lookups — now the
activity handler does the same, and the frontend reads top-level fields
with metadata fallback.
Create PhaseChart SVG component showing task completion over time with
an ideal burndown line, actual step chart, and today marker. Wire it
into PhaseTasks (shown when phase has start_date) and pass phaseFields
from the item detail page.
Collections can now define a content_template in their settings — a
markdown template that pre-fills new items. When creating a bug report,
for example, the template can include "Steps to Reproduce", "Expected
Behavior", "Actual Behavior" sections automatically.
- Add content_template to CollectionSettings (Go model + TypeScript type)
- Sidebar "New" button uses template when creating items
- Dashboard quick-create buttons use template
- Template is stored in collection settings JSON, configurable via
the collection edit UI
Toast notifications from SSE events (agent/CLI item creation) now
include a link to the created item. Clicking the toast navigates
to the item detail page. The notification panel history entries
are also clickable when they have links.
- Toast and HistoryEntry types gain optional `link` field
- ToastContainer renders clickable toasts with hover state and → hint
- NotificationPanel renders linked entries as buttons with hover
- Workspace layout passes item URL to SSE-triggered toasts
Dashboard: Complete rewrite as command center with active work cards,
collection grid with status dots and progress bars, phase progress,
side-by-side attention/up-next, skeleton loading, instant creation buttons.
New pages: Activity feed with date grouping, action/source/collection
filters, and pagination. Sidebar navigation link + "View all" from dashboard.
New components: Keyboard shortcuts overlay (press ?), notification center
(bell icon + slide-out panel with toast history), contextual empty states
per collection with agent prompt hints.
Improvements: Command palette with search icon, item refs, colored status
badges. Mobile board horizontal scroll with snap-to-column. Collection
page header with collapsible filter toggle. Saved view tabs. Item detail
relationships section (blocks/blocked-by/wiki-links). Sidebar shows
active item counts only. Mobile header taps to dashboard. PWA manifest.
Bug fix: Mobile sidebar swipe zone reduced to left edge (0-24px) to
avoid conflicts with board horizontal scrolling.
Full-stack feature: move items between collections (e.g., idea → task)
with automatic field migration.
Backend:
- Field migration engine (items/migrate.go) maps matching fields,
handles type conversions, drops incompatible fields, applies defaults
- Store method updates collection_id and assigns new item_number
- POST /api/v1/workspaces/{ws}/items/{slug}/move endpoint
- Activity logging with "moved" action and from/to metadata
- 6 migration unit tests covering type matching, conversion, and edge cases
CLI:
- pad move <slug> <target-collection> [--field key=value ...]
- Accepts singular collection names (task, idea, bug, etc.)
Web UI:
- "Move to..." dropdown on item detail page
- Shows all collections except current with icons
- Redirects to the item's new URL after move
Field migration rules:
- Same type: transfer directly (validate select options)
- Compatible types (text↔url, number→text, select→text): auto-convert
- Incompatible types: drop silently
- Missing required target fields: apply defaults or error
Dashboard improvements:
- New "In Progress" section at the top showing clickable chips for
collections with in-progress items — jump straight to what you're
working on
- Agent activity gets a purple left-border and "AGENT" badge in the
activity feed, making AI contributions visually distinct
- CLI activity gets a blue "CLI" badge
- Removed redundant "by you via web" text — the badges are cleaner
The dashboard now clearly shows the human-agent collaboration story:
you can see at a glance what the AI has been doing alongside you.
j/k or arrow keys to move between items, Enter to open, Esc to clear
focus. Works in both list and board views. Focused item gets a blue
outline ring and auto-scrolls into view.
Skips keyboard handling when typing in inputs or when the quick-create
bar is open. Doesn't conflict with existing Cmd+K, Cmd+N, etc. global
shortcuts since those all use modifier keys.
This is the kind of keyboard-first navigation that makes developer
tools feel fast — no mouse needed to browse your task board.
When the CLI or an agent creates items, the web UI now shows a subtle
toast notification like "Agent created: Fix OAuth redirect" or
"CLI created: New task". Only fires for non-web sources — changes you
make in the browser don't trigger redundant notifications.
This makes the agent collaboration feel alive — you can see items
appearing in real-time as your AI works alongside you.
Click "+ New Task" to open a title input right in the page header.
Type a title, press Enter — item is created instantly without navigating
to a separate form. Press Esc to cancel. The item appears in the current
view immediately via local state update.
This is how Linear/Todoist handle creation — no page navigation, no forms,
just type and go. Much faster for rapid item creation during planning or
when an agent is working alongside you.
- Fix SQL injection in sort parameter: validate field names against
alphanumeric regex before interpolating into json_extract queries
- Restrict CORS to localhost origins only (remove http://* wildcard)
- Change Makefile HOST default from 0.0.0.0 to 127.0.0.1
- Add Apache-2.0 license field to web/package.json
- Use tick() in startEditTitle() for reliable DOM focus instead of reactive $effect
- Add ?new=1 param to /new page redirect so title editing triggers on the detail page
- Board view: move empty column text inside .column-cards so it aligns at top instead of bottom
- List/Board views: capture reorder data before awaiting status change to prevent reactive overwrite of drop position
- Onboarding: add dismiss button with localStorage persistence and re-show option, copyable prompts using shared clipboard utility, clearer setup instructions, and proper spacing below the checklist
Export/Import:
- `pad export -o file.json` exports workspace (collections, items,
comments, links, versions) to portable JSON
- `pad import file.json --name X` creates new workspace with
regenerated UUIDs and remapped relations
- GET /workspaces/{slug}/export and POST /workspaces/import endpoints
- "Download JSON" button in workspace settings
- Import tab with drag-and-drop in the create workspace modal
- Full transaction wrapping for atomic imports
Create Workspace Modal:
- Extracted from sidebar dropdown into a proper centered modal
(sidebar's CSS transform was trapping fixed-position elements)
- Rendered at root layout level via uiStore flag
- Create and Import tabs with template picker and file drop zone
Spreadsheet-style third view option alongside list and board. Sortable
columns for all schema fields, clickable status cycling, inline progress
bars, resolved relation labels, sticky header, and horizontal scroll.
Persisted per-collection in localStorage, configurable as default view.
Quick wins:
- IDEA-31: URL autolink + link popover in editor (SafeLink with data-href
prevents mobile navigation, popover shows open/edit/remove actions)
- IDEA-36: Focus title on new item creation, Enter moves to editor
- IDEA-38: Add `pad link` CLI command to link directory to existing workspace
- IDEA-34: Show checklist progress bar on item cards (parses markdown checkboxes)
- IDEA-28: Workspace rename (already existed in settings)
Medium effort:
- IDEA-33: Drag-and-drop task reordering in Phase documents via svelte-dnd-action
- IDEA-26: Archive collections (frontend wiring — backend already supported soft delete)
- IDEA-29: Archive workspaces with danger zone confirmation in settings
- IDEA-37: Raw markdown editor toggle + inline Mermaid diagram rendering
(NodeView with ignoreMutation to prevent ProseMirror re-parse loops)
- Print suggested /pad prompts after `pad init` creates a new workspace
- Add `pad onboard` command that detects project tooling (language, build system,
test runner, CI, linter) and suggests matching conventions from the library
- Replace empty workspace welcome box with OnboardingChecklist component showing
a 4-step guided setup with progress bar and /pad prompt hints
- Add contextual tips with /pad prompts to empty collection states
- Add onboarding workflow to /pad skill for agent-driven codebase analysis
- Fix relation fields storing slugs instead of UUIDs: server now resolves
slugs/refs to UUIDs for relation-type fields on both create and update
Status change and sort order updates were firing concurrently, causing
SQLITE_BUSY errors. Now handleFinalize awaits the status change before
sending reorder updates. Switched all frontend API calls from item.slug
to item.id (UUID). Added UUID support to ResolveItem in the store layer.
New QuickAction type in collection settings lets users define prompt templates
with variables ({ref}, {title}, {status}, etc.) that resolve at click time.
Lightning bolt menu appears on item detail and collection pages. Includes
default actions for Tasks, Ideas, Phases, and Docs collections. Fully
customizable via new Quick Actions tab in EditCollectionModal.
Replace nested svelte-dnd-action zones (which treated the whole board as one
drop target) with native HTML5 drag events on column headers. Source column
fades during drag, blue left-border indicates drop position. Card drag-and-drop
within/between columns still uses svelte-dnd-action.
Show field summary after create/update CLI commands. Make svelte-check
blocking in CI. Improve editor block handling, field editor layout,
conventions page, and minor UI consistency fixes across pages.
Board columns and list groups can now be reordered by dragging their headers.
New order persists by updating the collection schema's field options array.
Column names remain left-aligned with drag handle on hover.
Select text in the editor to see a floating "Extract" button. Clicking it
opens an inline form to pick a collection and edit the title, then creates
the item and replaces the selection with a [[wiki-link]]. Full selected text
is included as item content when the title is edited shorter.
Added title attributes with localized timestamps to every relativeTime()
display: item detail meta, item cards, dashboard activity, activity feed,
comments, and version history.
Sidebar now has "Collections" and "Agent" section headers with visual
distinction. Drag handles appear on hover for reorderable collections.
Also fixed uniqueSlug to check all rows including soft-deleted when
generating slugs, preventing UNIQUE constraint violations when creating
items with names matching archived items.
Board columns and list groups now show an archive icon on hover with inline
confirmation to bulk-archive all items in a group. Collection page has a
"Show archived" checkbox that loads archived items via include_archived param.
Restore handler wired up for restoring individual archived items.
Reorganized the modal into three tabs (General, Fields, Display) at 680px
width. General tab has name/icon/description/prefix. Fields tab has improved
field cards with key identifiers and a cleaner add-field section. Display tab
uses a two-column grid for settings. Fixed scroll containment so footer stays
pinned while tab content scrolls.
EditCollectionModal now includes a Display section with controls for: default
view (list/board), item layout (balanced/fields-primary/content-primary), board
and list group-by fields (populated from select fields), and list sort-by field.
Settings are saved alongside schema changes in the same PATCH request.
URLs now use collection prefix + item number (e.g. /ideas/IDEA-15) instead of
long slugs. Backend ResolveItem() accepts either format for backwards compat —
old slug-based URLs and bookmarks still work. Updated all frontend link
generation (item cards, sidebar, search, wiki-links) to use refs.
CreateCollectionModal now shows a template picker as the first step with 8
templates: Bug Tracker, Feature Requests, Meeting Notes, Decisions, Tech Debt,
OKRs, Sprint Backlog, and Knowledge Base. Selecting a template pre-fills name,
icon, description, fields, and settings. A "Blank" option starts from scratch.
Redesigned the EditCollectionModal to support full schema evolution: editable
field labels, delete fields, reorder with up/down buttons, and per-option
chip editing for select/multi_select fields. When select options are renamed,
a bulk migration updates all existing items via SQLite json_set/json_extract.
Library link was accessible from Conventions/Playbooks pages already. Board
columns now stretch to match the tallest column so items can be dragged to
any column when scrolled down.
Generate favicon sizes (16, 32, ico), Apple touch icon (180),
PWA icons (192, 512), and web manifest from padicon.png. Add
Open Graph meta tags for social sharing previews.
ListView: items with empty group field values now appear in an
"Uncategorized" group at the bottom instead of being silently dropped.
Detail page: field and title updates now show the subtle "Saving..."
→ "✓ Saved" status indicator instead of firing toast notifications
on every change. Toasts are reserved for errors only.
Clicking "+ New Item" now immediately creates a blank item with
default fields and navigates to its detail page with the title
input focused and selected, ready to type. No more separate
creation form — creating and editing an item are the same
experience. Both the collection page button and sidebar button
use this flow.
The infinite loop was caused by bind:value on a dynamic key of a
$state proxy Record (existingOptionsText[field.key]). Replaced with
_optionsText stored directly on each field object, avoiding the
proxy key-access reactivity cycle.
Fix infinite loop when changing a field's type in Edit Collection
modal — existingOptionsText now initializes entries for all fields.
New item creation page now shows all editable schema fields (priority,
category, assignee, phase, etc.) using FieldEditor components, not
just status. Fields reset when switching collections.
Pad — project management for developers and AI agents.
Single Go binary with embedded SvelteKit web UI, SQLite storage,
CLI, and Claude Code /pad skill integration.
https://getpad.dev