Releases: PerpetualSoftware/pad
Release list
Pad v0.10.0
Highlights
Pad v0.10.0 is a hardening-and-surface release: a security audit sweep, a big
expansion of the agent/MCP tool surface (v0.9 → v0.14), new web UX foundations,
mobile OAuth sign-in, and a batch of CLI + reliability improvements.
🔒 Security hardening
Driven by the security ecosystem audit (PLAN-1990). Session User-Agent binding
gains an enforce mode (TASK-2056), share-link password verification is now
rate-limited against brute force (TASK-2055), TOTP login codes are single-use
(BUG-2054), webhook HMAC secrets are encrypted at rest and masked in responses
(BUG-2057), the webhook SSRF guard now runs at dial time with a wider deny-list
(#836), and OAuth consent completes when the authorize scope is absent
(BUG-2088). Dependencies moved to Go 1.26.5 with govulncheck in binary mode
plus x-crypto / gRPC security bumps (#896).
🤖 Agent & MCP surface (v0.9 → v0.14)
The MCP tool catalog grew substantially: a read-only pad_attachment surface
(#875), pad_project ready + stale actions (#878), an agent-accessible
activity feed via pad project activity + MCP action (#877), field-level PATCH
with an optimistic-concurrency conflict envelope and read-only item version
history (TASK-2022), summary-shaped item list with --full opt-in and MCP
limit clamps (TASK-2000), and a bootstrap convention_index for
triggered-convention discovery (TASK-2004). Bootstrap now emits compact JSON
for agents (TASK-2021).
🖥️ Web UX foundations
A shared native-dialog Modal primitive with focus trap now backs the form
modals across the app (TASK-2023, plus route-inline and roles-page migrations),
the API client handles 429 / Retry-After with a "server busy" toast
(TASK-2026, TASK-2080), the SSE connection-status indicator renders
(TASK-2027), and the command palette surfaces body-content matches (TASK-2008).
Several route monoliths were broken up (contentSaver / collab-flush extraction).
📱 Mobile OAuth sign-in
OAuth sign-in landed on both mobile shells — iOS via
ASWebAuthenticationSession (TASK-1717) and Android via Custom Tabs deep-link
callback (TASK-1767) — backed by secure token storage and biometric unlock
(TASK-1718).
🛠️ CLI & reliability
New pad item open command (#919), a width-aware item-list table with
STATUS/PRIORITY columns (TASK-2030), claude-code + codex targets for
pad mcp install (TASK-2040), and root usage/error hygiene (TASK-2031).
Under the hood: atomic field + parent-link updates (BUG-2013), parent-link
cycle guards (BUG-2073, BUG-2074), panic recovery on background goroutines,
and dashboard/bootstrap N+1 collapses into set-based queries (BUG-2002,
BUG-2003).
🙏 Thanks to our contributors
Huge thanks to everyone who contributed a PR to this release:
- @molloyzak13 — parent commands now exit non-zero on an unknown subcommand (#861)
- @dchaudhari7177 — migrated the KeyboardShortcuts modal to the shared Modal primitive (#900)
- @cnYui — wrap comment not-found errors with item context (#910)
- @raj921 — added Windows and macOS smoke tests to CI (#911)
- @Rionlyu — added the
pad item opencommand (#919) - @hfl0506 — support the OpenCode install target for
pad agent(#923)
Install
brew install perpetualsoftware/tap/pad
# or pull the container image
docker pull ghcr.io/perpetualsoftware/pad:0.10.0Verifying
Every archive is signed with cosign (keyless / Sigstore OIDC) and ships an
SBOM + SLSA build provenance. As of v0.10.0 the checksums signature ships as a
single Sigstore bundle (checksums.txt.sigstore.json) — verify with:
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--bundle ./checksums.txt.sigstore.json \
./checksums.txtChangelog
Features
- feat(cli): add pad item open command (#919)
- feat(security): enforce session UA binding under strict mode (TASK-2056) (#912)
- feat(cli): add claude-code + codex targets to pad mcp install (TASK-2040) (#909)
- feat(cli): width-aware item-list table with STATUS/PRIORITY columns (#894)
- feat(web): surface rate_limited errors as a server-busy toast (TASK-2080) (#888)
- feat(web): 429/Retry-After handling in API client (TASK-2026) (#882)
- feat(web): shared native-dialog Modal primitive + migrate form modals (TASK-2023) (#881)
- feat(items): field-level PATCH + conflict envelope + read-only version history (TASK-2022) (#876)
- feat(mcp): expose pad_project ready + stale actions (#878)
- feat(project): agent-accessible activity feed (pad project activity + MCP action) (#877)
- feat(mcp): add read-only attachments surface (pad_attachment) (#875)
- feat(editor): add "Attach file" to the block context menu (TASK-2067) (#862)
- feat(editor): add explicit attach-file button to tiptap menu (TASK-2067) (#860)
- feat(bootstrap): add convention_index for triggered-convention discovery (TASK-2004) (#848)
- feat(store): guard against schema-ahead downgrade + pre-migration snapshot + upgrade docs (TASK-2006) (#843)
- feat(cli,mcp): summary-shaped item list with --full opt-in + limit clamp (TASK-2000) (#842)
- feat(web): surface body-content matches in command palette (TASK-2008) (#839)
Bug fixes
- fix(release): migrate cosign signing to v3 bundle format (BUG-2091) (#925)
- fix(agent): support OpenCode install target (#923)
- fix(e2e): disable rate limiting on the E2E server to stop 429 flakes (BUG-2089) (#922)
- fix(oauth): default absent authorize scope so consent completes (BUG-2088) (#921)
- fix(cli): wrap comment not-found errors (#910)
- fix(security): encrypt webhook HMAC secrets at rest, mask in responses (BUG-2057) (#915)
- fix(security): make TOTP login codes single-use (BUG-2054) (#914)
- fix(security): rate-limit share-link password verification (TASK-2055) (#913)
- fix(ci): let Go fetch the 1.26.5 toolchain go.mod pins (unbreak CI) (#901)
- fix(cli): root usage/error/format hygiene (TASK-2031, BUG-2032) (#893)
- fix(web): distinguish transient failures from not-found (BUG-2025) (#884)
- fix(web): flush pending raw-markdown on unload (BUG-2024) (#883)
- fix(web): render SSE connection-status indicator (TASK-2027) (#880)
- fix: parent commands exit non-zero on unknown subcommand (#850)
- fix(playbooks): enforce draft gate server-side + expose status (BUG-2020) (#874)
- fix(store): workspace-level guard for N-hop parent cycles (BUG-2074) (#871)
- fix(store): close parent-link cycle & stale-old-parent TOCTOU races (BUG-2073) (#870)
- fix(server): guard degraded/degraded_sections in bootstrap dashboard (BUG-2072) (#869)
- fix(store): make item field + parent-link update atomic (BUG-2013) (#868)
- fix(webhooks): track delivery goroutines + bounded retry (BUG-2012) (#864)
- fix(server): surface dashboard sub-query failures instead of silent empty sections (BUG-2014) (#867)
- fix(server): add panic recovery to background sweeper goroutines (BUG-2071) (#865)
- fix(server): add panic recovery to goAsync background tasks (#863)
- fix(mobile): hide bottom nav when on-screen keyboard is up (BUG-2070) (#859)
- fix(server,cli,mcp): default item list to per-collection non-terminal filter (BUG-2001) (#845)
- fix(mcp): sync tool-surface docs to v0.9 after item-list default bump (#844)
- fix(web): exact-pin coordinated Tiptap packages + CI drift guard (BUG-2009) (#838)
- fix(webhooks): enforce SSRF guard at dial time + widen deny-list (#836)
- fix(cli): safe SQLite db backup/restore (config path + VACUUM INTO) (#837)
Performance
- perf(bootstrap): compact JSON for agents; trim SKILL.md reference sections (#873)
- perf(server): collapse dashboard/bootstrap N+1 into set-based queries (BUG-2002) (#847)
- perf(store): batch parent-lineage enrichment into one scoped query (BUG-2003) (#846)
Refactors
- refactor(web): migrate KeyboardShortcuts modal to shared Modal primitive (#900)
- refactor(web): migrate roles page dialogs to shared Modal primitive (#891)
- refactor(web): migrate remaining route-inline modals to shared Modal primitive (TASK-2083) (#890)
- refactor(web): extract collab-flush path from item-detail monolith (TASK-2082) (#889)
- refactor(web): unify mobile breakpoint into one shared isMobile store (TASK-2028) (#886)
- refactor(web): extract contentSaver + shared progress-merge from item/collection monoliths (TASK-2029) (#885)
- refactor(mcp): make pad_plan/ideate/retro prompt bodies surface-neutral (#872)
- refactor(cli): split cmd/pad/main.go by resource (TASK-2015) (#866)
Other changes
- build(deps): govulncheck binary mode + Go 1.26.5 / x-crypto / gRPC security bumps (#896)
Full Changelog: v0.9.2...v0.10.0
Pad v0.10.0-rc.2
Pad v0.9.2
Highlights
v0.9.2 is the "honest deletion + real recovery" release. Both major themes make Pad's destructive actions trustworthy: they do exactly what the UI says, and — where the data model allows — they're recoverable.
Delete your account, export your data (PLAN-1956)
The account settings page gains a Danger Zone. You can now export all your data with one button, and delete your account through an explicit confirm flow (password + typed confirmation, plus optional TOTP re-verification for accounts with 2FA). Under the hood, the account-deletion FK cascade was hardened (TASK-1959) so a delete actually purges the trailing activity/audit rows instead of orphaning them — deletion now means deletion.
Workspace deletion is honest — and undoable for 30 days (PLAN-1969)
Deleting a workspace used to claim it "archived." It didn't. Now the Danger Zone copy is honest — it deletes — but deletion is a soft-delete with a 30-day recovery window before a scheduled job hard-purges it (honoring the 30-day GDPR erasure SLA). Within that window you can restore from anywhere:
- Web: an Undo toast right after deleting, a "Recently deleted (N days left)" section in the workspace switcher, and a dedicated
/console/deleted-workspacespage. - CLI:
pad workspace deletedto list what's still restorable,pad workspace restore <slug>to bring it back. - MCP:
pad_workspacegainsdeletedandrestoreactions (ToolSurfaceVersion → 0.8) so agents can list and recover deleted workspaces too.
Also in this release
- BUG-1965 — corrected two inaccurate claims on the live
/privacypage (workspace transfer + 1-year audit retention). /auth/menow exposespassword_set, so the UI can tell password vs. passwordless accounts apart.
Install
brew install perpetualsoftware/tap/pad
# or pull the container image
docker pull ghcr.io/perpetualsoftware/pad:0.9.2Verifying
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate checksums.txt.pem --signature checksums.txt.sig \
checksums.txtChangelog
Features
- 1b99c41: feat(cli): add 'pad workspace restore' + 'pad workspace deleted' (TASK-1972) (#833) (@xarmian)
- 7687521: feat(mcp): add pad_workspace restore + deleted actions (TASK-1973) (#834) (@xarmian)
- 1d8b04e: feat(server): expose password_set on /auth/me + TS User type (#819) (@xarmian)
- 022280a: feat(server): require TOTP re-verification to delete account (#822) (@xarmian)
- f5b437a: feat(server): workspace restore + deleted-list endpoints (TASK-1970) (#827) (@xarmian)
- b73ba63: feat(store): hard-purge soft-deleted workspaces after 30 days (TASK-1966) (#825) (@xarmian)
- fa34ac3: feat(web): "Recently deleted" section in workspace switcher (#829) (@xarmian)
- 87f8192: feat(web): add Danger Zone section with Export my data button (TASK-1961) (#820) (@xarmian)
- d53262c: feat(web): add delete-account confirm flow to settings Danger Zone (#823) (@xarmian)
- 0faa481: feat(web): add deleteAccount + exportAccountData API client methods (#818) (@xarmian)
- 7b6739e: feat(web): add workspaces.restore + listDeleted API client methods (#828) (@xarmian)
- 727deb2: feat(web): dedicated /console/deleted-workspaces page (#830) (@xarmian)
- ef5e5d7: feat(web): post-delete Undo + honest 30-day recovery copy on settings (#831) (@xarmian)
Bug fixes
- 366d4fb: fix(store): harden account-deletion FK cascade (TASK-1959) (#821) (@xarmian)
- 9efc1d3: fix(web): make workspace Danger Zone honest — it deletes, not archives (#826) (@xarmian)
Other changes
Pad v0.9.1
Highlights
Clearer "Connect your workspace to an agent" flow. The connect-workspace modal now leads with MCP setup instead of a claim code. Most people opening it have never connected an agent, and a claim code only does something once you already hold an OAuth grant — so it's now the default first step, with CLI second and the claim code moved to a dedicated "Connect code" tab framed as what it actually is: a way to add one more workspace to an agent you scoped to specific workspaces. Opening that tab with no connected agent now steers you to set one up first instead of handing over a code nothing can redeem. Self-host deployments without a public MCP URL cleanly show just the CLI path. (#817)
Install
brew install PerpetualSoftware/tap/pad
# or
docker pull ghcr.io/perpetualsoftware/pad:0.9.1Verifying
Artifacts are cosign-signed (keyless, Sigstore OIDC) with SBOMs and SLSA build provenance:
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate ./checksums.txt.pem \
--signature ./checksums.txt.sig \
./checksums.txtChangelog
Features
Pad v0.9.0
Highlights
✉️ Email self-registration + verification (Pad Cloud)
Pad Cloud now supports self-service signup with email verification, delivered as a five-wave build (IDEA-1927 / PLAN-1933). New email_verified_at tracking, a verification-token table with a background reaper, RequireVerifiedEmail enforcement across every mutation perimeter, cloud register/resend endpoints, an admin force-verify override, and an in-app verification banner. A batch of invite/login flow fixes landed alongside it — masked email prefill on /join, OAuth-signup invitation preservation, and the /verify-email/<token> frontend route.
🌐 WebMCP — browser-side MCP surface
Pad's MCP tool catalog is now callable from inside the web app (PLAN-1888). A webmcp_enabled platform setting gates it; the full tool surface is exposed over an authed REST endpoint with per-action read_only flags; the browser module registers catalog tools for both read and write dispatch, with an untrustedContentHint and a consent-verification checklist. REST endpoints for project next / standup / changelog closed the last dispatch gap.
🔒 Auth-perimeter & visibility hardening
A wide security sweep closing restricted-owner visibility gaps: workspace and account export no longer leak hidden-collection content (BUG-1922, BUG-1945); restricted owners can no longer escalate collection access, modify or delete hidden collections, or mint share links for hidden-collection items; bearer-admin bypass gaps on single-item and collection visibility are closed; admin settings no longer return unmasked 2FA or email secrets.
🗂️ Kanban & item-card UX
Move-left / Move-right on the kanban card context menu (PLAN-1907), a menu-driven per-item reorder — top / bottom / up / down (IDEA-1898), a copy-ID icon on collection cards (IDEA-1904), and a fix for cards re-floating to the top of a Manual lane when opened (BUG-1899 / BUG-1941).
🔧 CLI & agent onboarding
Headless admin bootstrap via --email / --name / --password (BUG-988), Codex skill auto-install on pad init (BUG-1156), the MCP server now requires an explicit workspace and never silently falls back to a default (BUG-1865 — was causing writes to the wrong workspace), and activity-log rows now show the item ID (BUG-1748).
Install
# Homebrew (macOS / Linux)
brew install perpetualsoftware/tap/pad
# Docker
docker pull ghcr.io/perpetualsoftware/pad:0.9.0Or download a signed archive from the release assets below.
Verifying
Every release is signed with Sigstore keyless cosign and ships SLSA build provenance. Verify the checksums:
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate ./checksums.txt.pem \
--signature ./checksums.txt.sig \
./checksums.txtChangelog
Features
- f34e662: feat(admin): admin force-verify email override (TASK-1939) (#809) (@xarmian)
- 665f191: feat(cli): headless admin bootstrap via --email/--name/--password (BUG-988) (#761) (@xarmian)
- 7c0b137: feat(server): REST endpoints for project next/standup/changelog + WebMCP wiring (TASK-1894) (#791) (@xarmian)
- 3105308: feat(server): RequireVerifiedEmail enforcement across all mutation perimeters (TASK-1937) (#807) (@xarmian)
- 3c0aed5: feat(server): add webmcp_enabled platform setting + session flag (#763) (@xarmian)
- 4a7c054: feat(server): cloud email self-registration + verify-email/resend endpoints (TASK-1938) (#808) (@xarmian)
- e4caad2: feat(server): expose MCP tool-surface over authed REST endpoint (#764) (@xarmian)
- 6a63fba: feat(store): add users.email_verified_at column + model plumbing (TASK-1935) (#805) (@xarmian)
- b0eeef1: feat(store): email_verification_tokens + SendEmailVerification + token reaper (TASK-1936) (#806) (@xarmian)
- 2b11383: feat(web): WebMCP browser module — register catalog tools (read dispatch) (#765) (@xarmian)
- fb40a62: feat(web): WebMCP untrustedContentHint + consent verification checklist (#767) (@xarmian)
- 2ee7dd3: feat(web): WebMCP write/mutating dispatch + bootstrap (TASK-1893) (#766) (@xarmian)
- 645ba00: feat(web): add Move left/right to kanban card context menu (TASK-1908) (#777) (@xarmian)
- 1574b53: feat(web): add copy-ID icon to item cards (IDEA-1904) (#782) (@xarmian)
- a040915: feat(web): email verification banner + resend + register success (TASK-1940) (#810) (@xarmian)
- b051b30: feat(web): per-item reorder context menu in all views (IDEA-1898) (#768) (@xarmian)
Bug fixes
- 7e59170: fix(admin): don't persist masked Maileroo API key on email settings save (BUG-1890) (#778) (@xarmian)
- 9b9e2eb: fix(admin): stop leaking 2FA secret via GET /admin/settings (BUG-1909) (#779) (@xarmian)
- 010af13: fix(ci): gofmt internal/models/workspace.go to unbreak Go job (BUG-1911) (#784) (@xarmian)
- 4e4d4ed: fix(ci): raise race-step go test timeout to 45m (BUG-1913) (#787) (@xarmian)
- e32bf92: fix(cli): detect machine-level agent tools, not just project-local (BUG-1156) (#783) (@xarmian)
- 7d07bfa: fix(cli): share stdin reader in login so piped --interactive works (BUG-1886) (#762) (@xarmian)
- f29fb65: fix(collab): dedup binary frames by content in replay-cursor test (BUG-1924) (#797) (@xarmian)
- c22b6d1: fix(collab): don't snapshot-flush unchanged content on view (BUG-1899) (#769) (@xarmian)
- 9f85a85: fix(deps): clear CI vuln audits (x/image TIFF CVEs, linkify-it ReDoS) (#772) (@xarmian)
- df3cf55: fix(mcp): stop cloud session-workspace bleed across users (BUG-1865) (#780) (@xarmian)
- d36f27c: fix(server): auth-perimeter hardening — B6–B9 from the IDEA-1927 audit (TASK-1932) (#811) (@xarmian)
- 0c0a71f: fix(server): bearer-gate canEditComment's admin bypass (BUG-1919) (#796) (@xarmian)
- da21598: fix(server): bearer-gate checkItemVisible's admin bypass (BUG-1918) (#793) (@xarmian)
- a7f6fdf: fix(server): bearer-gate visibleCollectionIDs to close BUG-1917 (#792) (@xarmian)
- 44ee6a4: fix(server): consistent soft-delete handling across item sub-resources (#771) (@xarmian)
- 84637ba: fix(server): deny account export to restricted owners (BUG-1945) (#814) (@xarmian)
- 7eff417: fix(server): deny restricted owners from escalating collection access (BUG-1925) (#815) (@xarmian)
- b633144: fix(server): deny workspace export to restricted owners (BUG-1922) (#813) (@xarmian)
- f3335ad: fix(server): filter handleListUserGrants through caller visibility (BUG-1928) (#799) (@xarmian)
- 22ac559: fix(server): gate ID-keyed grant/share-link handlers on target visibility (BUG-1923) (#798) (@xarmian)
- d78efab: fix(server): gate collection update/delete on visibility (BUG-1921) (#795) (@xarmian)
- d9b9dd9: fix(server): gate share-link and grant minting on item/collection visibility (BUG-1920) (#794) (@xarmian)
- 111e43d: fix(server): invitation-preview endpoint + read-only email prefill on /join (BUG-1934) (#803) (@xarmian)
- e41ed8a: fix(server): reserve parent/plan schema field keys (TASK-1912) (#786) (@xarmian)
- b3cb11c: fix(web): add /verify-email/[token] route to consume verification tokens (BUG-1942) (#812) (@xarmian)
- 6c0e336: fix(web): carry the invitation through OAuth signup on /join (BUG-1931) (#804) (@xarmian)
- bcc4a69: fix(web): dedupe collab flush in editor-markdown space (BUG-1941) (#816) (@xarmian)
- 4429af5: fix(web): default logged-out /join visitors to register mode (BUG-1930) (#801) (@xarmian)
- a3d0b02: fix(web): don't mask/redirect on 401 from auth-form submissions (BUG-1929) (#800) (@xarmian)
- 7bf4679: fix(web): harden WebMCP scalar param readers against malformed types (TASK-1895) (#790) (@xarmian)
- b7bedc8: fix(web): resolve item-detail wiki-links via local-first index, not full /items (#770) (@xarmian)
- 915f7e6: fix(web): show issue ID and status pills in activity log (BUG-1748) (#776) (@xarmian)
- 584ac9a: fix(web): treat CLI/MCP-created workspaces as agent-connected (BUG-1557) (#781) (@xarmian)
Performance
- 20544fd: perf(test): build the SQLite migration chain once per test binary (IDEA-1914) (#788) (@xarmian)
- 0a1dbc8: perf(test): wire remaining store helpers onto storetest fixture (TASK-1915) (#789) (@xarmian)
Refactors
- ae62c09: refa...
Pad v0.8.0
Highlights
🕸️ The dependency graph
0.8.0's headline is a full interactive knowledge graph of your workspace. A new /graph route renders every item as a node with typed edges (blocks/blocked-by, parent/child) — as both a 3D force graph and a 2D directional renderer. It's live: SSE pushes glow/pulse animations onto nodes as work happens. And it's explorable — fly-to focus with neighborhood highlighting, blocker-chain tracing lit as a path, search with collection/status/role filters, and a per-item detail drawer you can deep-link via ?graph=1. Item headers gain a Graph button that opens the drawer in place.
🚀 Launchpad onboarding, natural-language-first
Brand-new workspaces now open into a launchpad with a setup-progress checklist and an active "want me to set it up?" offer. Onboarding is natural-language-canonical end to end — skill, MCP catalog, seeded playbook bodies, web copy, and the editor/library all lead with NL invocation. Workspace intent is captured at creation to warm the onboard run, the first agent-created item gets an aha-highlight, and there's a manual escape hatch for users who skip the guided flow.
📦 Portable playbooks & conventions
Move playbooks and conventions between workspaces as Markdown + frontmatter artifacts. Full surface coverage: pad item export / pad item import CLI, pad_item MCP export/import actions, server endpoints, and a web UI for both.
♻️ Archived-item recovery
Archived items are no longer masked as "missing." They surface in-place with an archived banner, and you can restore them from the item detail page, the CLI, and MCP.
🔐 Self-host auth hardening
Localhost password recovery for locked-out self-host admins (pad auth reset-password + the loopback /auth/local-reset endpoint), server version surfaced on /auth/session, a unified single-browser-handoff first-run setup, Apple as a cloud OAuth provider, and sliding session renewal.
Thanks
Special thanks to @b4rk13 for their first contribution to Pad — fixing SQLite account-token storage (#732). 🙏
Install
# Homebrew (macOS / Linux)
brew install perpetualsoftware/tap/pad
# Docker
docker pull ghcr.io/perpetualsoftware/pad:0.8.0Or download a signed archive from the assets below.
Verifying
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate checksums.txt.pem \
--signature checksums.txt.sig \
checksums.txtChangelog
Features
- bf40cc9: feat(artifact): MCP pad_item export/import actions (#758) (@xarmian)
- 7ea552f: feat(artifact): MD+frontmatter export/import core for playbooks & conventions (#754) (@xarmian)
- 285a58e: feat(artifact): pad item export/import CLI commands (#756) (@xarmian)
- 4f0984b: feat(artifact): server export + import endpoints for playbooks & conventions (#755) (@xarmian)
- 02106a1: feat(artifact): web UI for playbook/convention export & import (#757) (@xarmian)
- 10a55d1: feat(auth): accept provider=apple in cloud oauth-login/link/unlink (TASK-1773) (#714) (@xarmian)
- 616a6d2: feat(auth): localhost password recovery for locked-out self-host admins (#760) (@xarmian)
- 14614c9: feat(auth): surface server version on /auth/session (TASK-1839) (#740) (@xarmian)
- 248f7c5: feat(items): expose item restore via CLI + MCP (TASK-1828) (#734) (@xarmian)
- 09335c4: feat(onboard): active "want me to set it up?" offer on needs_onboarding (TASK-1850) (#742) (@xarmian)
- fa8064e: feat(onboard): capture workspace intent at creation, warm the onboard run (TASK-1855) (#746) (@xarmian)
- 7962fab: feat(onboard): make natural language the canonical onboard trigger (TASK-1849) (#741) (@xarmian)
- a2827ec: feat(playbooks): NL-canonical invocation in seeded bodies + CLAUDE.md (TASK-1861) (#751) (@xarmian)
- 3c3016a: feat(server): focused neighborhood mode on workspace graph endpoint (TASK-1781) (#718) (@xarmian)
- 9322084: feat(server): workspace graph endpoint — nodes + typed edges (TASK-1731) (#699) (@xarmian)
- 7ec19b5: feat(skill): NL-canonical playbook invocation in SKILL.md + MCP catalog (TASK-1859) (#749) (@xarmian)
- db3917f: feat(web): /graph route MVP — lazy-loaded 3D force graph (TASK-1733) (#701) (@xarmian)
- 771d102: feat(web): 2D directional dependency-graph renderer (TASK-1783) (#720) (@xarmian)
- 1d62035: feat(web): NL-canonical onboarding banner copy (TASK-1851) (#743) (@xarmian)
- e056e9c: feat(web): NL-canonical playbook invocation in the editor + library (TASK-1860) (#750) (@xarmian)
- 80a939f: feat(web): aha-highlight the first agent-created item (TASK-1853) (#745) (@xarmian)
- 372d95c: feat(web): archived-item recovery on the item detail page (TASK-1829) (#735) (@xarmian)
- 2904802: feat(web): blocker-chain tracing as lit path + edge styling by type (TASK-1737) (#705) (@xarmian)
- a37fa16: feat(web): deep-link the dependency-graph drawer via ?graph=1 (TASK-1786) (#723) (@xarmian)
- 1bd3e52: feat(web): graph SSE live layer — glow/pulse on touched nodes (TASK-1736) (#704) (@xarmian)
- a20095e: feat(web): graph TS types + API client method (TASK-1732) (#700) (@xarmian)
- 1c3db43: feat(web): graph focus interaction — fly-to, neighborhood highlight, detail card (TASK-1734) (#702) (@xarmian)
- 30bdbeb: feat(web): graph layout tuning — gravity wells + terminal recede (TASK-1738) (#706) (@xarmian)
- 0234239: feat(web): graph node labels — always-on for hubs, distance-faded elsewhere (TASK-1743) (#708) (@xarmian)
- 77dcd07: feat(web): graph search fly-to + collection/status/role filters (TASK-1735) (#703) (@xarmian)
- bd16b9b: feat(web): graph view enhancements — larger drawer, node detail panel, toggleable legend, bigger cards (TASK-1787) (#724) (@xarmian)
- f45a45a: feat(web): graph.getFocused client + truncated field for focus mode (TASK-1782) (#719) (@xarmian)
- 4bd048c: feat(web): item-header Graph button + dependency-graph drawer (TASK-1784) (#721) (@xarmian)
- ac43e49: feat(web): launchpad render-mode for unset-up workspaces (TASK-1852) (#744) (@xarmian)
- 4456030: feat(web): live SSE updates in the dependency-graph drawer (TASK-1785) (#722) (@xarmian)
- 4a99f5f: feat(web): manual escape hatch on the skipped-onboarding board (TASK-1856) (#747) (@xarmian)
- 408e578: feat(web): setup-progress checklist on the launchpad (TASK-1857) (#748) (@xarmian)
- 8c8e858: feat(web): show archived banner in-place on live archive (TASK-1833) (#736) (@xarmian)
- dc8cb78: feat(web): surface Apple as a linked provider in console settings (TASK-1777) (#715) (@xarmian)
- c93f2aa: feat(web): unified mobile top bar with always-on workspace switcher (IDEA-1835) (#737) (@xarmian)
Bug fixes
- 341cbd3: fix(artifact): normalize import field map so json fields validate (BUG-1883) (#759) (@xarmian)
- 22d901c: fix(auth): unify first-run setup into one browser handoff (BUG-1843) (#739) (@xarmian)
- ba734d5: fix(editor): symmetric table cut/paste — structural row cut, TSV cell reconstruction (BUG-1247) (#712) (@xarmian)
- 99b4649: fix(items): surface archived items instead of masking them as missing (BUG-1791) (#733) (@xarmian)
- 33e4943: fix(server): non-fatal UA session binding + sliding session renewal (#727) (@xarmian)
- 03d7347: fix(store): allow NULL api_tokens.workspace_id on SQLite for account tokens (#732) (@b4rk13)
- b4e9e20: fix(web): collapse WorkspaceSheet switcher list when the sheet closes (IDEA-1720) (#711) (@xarmian)
- 35cc26d: fix(web): collection cards show real child-item progress; child-progress endpoint (BUG-1509) (#710) (@xarmian)
- eb5b2bf: fix(web): comment wikilinks resolve refs + carry username prefix (BUG-1744) (#709) (@xarmian)
- 45d032c: fix(web): graph node click/dbl-click + Open as real link (TASK-1788) (#725) (@xarmian)
- 38f18ac: fix(web): graph repaints in place instead of full-scene refresh (BUG-1742) (#707) (@xarmian)
- 62fafc4: fix(web): kanban board height accounts for workspace top bar (BUG-1844) (#738) (@xarmian)
- 00d4fe0: fix(web): quick-capture docks above bottom nav, mutually exclusive with other sheets (BUG-1765) (#713) (@xarmian)
Other changes
- db14721...
Pad v0.7.0
Highlights
🔗 Public read-only collection sharing
Share any collection as a public, read-only page at /s/[token]. The share payload now carries settings, schema, item content, and your saved views — so the public page renders the matching view (board, list, etc.) with schema-driven colors, empty/large-collection states, a read-only view switcher, and inline row expansion. (TASK-1678 → TASK-1684)
📊 Insights — project analytics
A new Insights page with windowed project reports: cycle-time, WIP and aging metrics, a LayerCake-powered chart library with per-category hover tooltips, per-user layout customization, navigation across past periods with reconstructed historical WIP/status snapshots, a print-optimized exec report (Save as PDF), and a "What shipped" card on the dashboard. Also available via pad project report / the pad_project MCP action. (TASK-1630 → TASK-1647)
🏷️ Tags
Workspace-wide tags: an enumeration endpoint, a chip editor on the item detail page, tag chips on cards/list rows/headers, a dedicated tag page with list/board toggle, multi-select tag filtering with per-collection counts, and a --tag filter on pad item list. (TASK-1653 → TASK-1658)
🗂️ Board enhancements + bulk operations
Trello-style inline draft card creation, per-lane sort overrides, lane-header add buttons and kebab menus, and bulk lane actions through a new bulk-mutation endpoint (single batched SSE event) with confirm + undo toasts backed by a bulk-restore op. (TASK-1668 → TASK-1676)
💬 Richer comments
Paste/drop image attachments directly in comments with inline thumbnails and a click-to-expand lightbox, plus inline comment/reply editing via a lean Tiptap editor. (IDEA-1650, IDEA-1660, TASK-1663 → TASK-1665)
📱 Mobile bottom navigation
A mobile bottom nav bar for the web UI. (PLAN-1694)
🛠️ Notable fixes
- Structured status-transition log + backfill, with a monotonic seq tiebreak for same-second transitions and a Postgres
jsonbLIKE cast fix (BUG-1702). - Collab: resolved collab-snapshot diffs and collapsed autosave bursts (BUG-1612).
- Auth/share: gated the ref-resolver admin bypass on bearer auth (BUG-1618); grant-aware attachment upload for share-link editors (BUG-1661).
- Cross-visibility collection moves now emit moved-out tombstones (BUG-1675), plus several web reactivity fixes.
Install
# Homebrew (macOS / Linux)
brew install perpetualsoftware/tap/pad
# Docker
docker pull ghcr.io/perpetualsoftware/pad:0.7.0
# Or grab a signed binary from the assets below.Verifying
All artifacts are signed with cosign (keyless / Sigstore) and ship with SBOMs + SLSA build provenance.
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate checksums.txt.pem --signature checksums.txt.sig checksums.txtChangelog
Features
- 1d9a611: feat(api): bulk restore op for undo (TASK-1674 backend) (#675) (@xarmian)
- dfd3811: feat(api): bulk-mutation endpoint + single SSE batch event (TASK-1668) (#669) (@xarmian)
- 634e834: feat(board): Trello-style inline draft card creation (TASK-1676) (#678) (@xarmian)
- 2cd8932: feat(board): confirm + undo toast for destructive bulk actions (TASK-1674) (#676) (@xarmian)
- 9dd4fa6: feat(board): lane-header + add button + kebab menu shell (TASK-1671) (#672) (@xarmian)
- 710c76f: feat(board): per-lane sort override in the kebab menu (TASK-1673) (#677) (@xarmian)
- 99e8802: feat(board): wire bulk lane actions via the bulk endpoint (TASK-1672) (#674) (@xarmian)
- cd8ac9b: feat(charts): per-category hover tooltips + a11y titles (TASK-1638) (#648) (@xarmian)
- b9ddd02: feat(cli): add --tag filter to
pad item list(TASK-1658) (#662) (@xarmian) - 949ae03: feat(cli,mcp): pad project report + pad_project report action (TASK-1635) (#641) (@xarmian)
- 1be42e5: feat(collections): multi-select tag filter + per-collection tag counts (TASK-1666) (#668) (@xarmian)
- 5203809: feat(collections): page-wide sort control + priority-weight helper (TASK-1670, closes IDEA-1648) (#673) (@xarmian)
- 076fb9b: feat(comments): comment editing backend — user_id, UpdateComment, PATCH, SSE (TASK-1663) (#665) (@xarmian)
- 0d5f966: feat(comments): inline comment/reply editing via CommentEditor (TASK-1665) (#667) (@xarmian)
- 6ed16ef: feat(comments): lean Tiptap CommentEditor — inline image thumbnails (TASK-1664) (#666) (@xarmian)
- e179c59: feat(comments): paste/drop image attachments in comments + inline render (IDEA-1650) (#663) (@xarmian)
- 4c2c4d1: feat(comments): thumbnail comment images + click-to-expand lightbox (IDEA-1660) (#664) (@xarmian)
- 9870f36: feat(insights): "What shipped" card with linked item IDs on the dashboard (#657) (@xarmian)
- 0d0c660: feat(insights): navigate to past periods (offset + prev/next) (TASK-1639) (#649) (@xarmian)
- eeff781: feat(insights): per-user layout customization + persistence (TASK-1634) (#645) (@xarmian)
- 0d46842: feat(insights): print-optimized exec report view (Save as PDF) (TASK-1642) (#652) (@xarmian)
- 4368c57: feat(insights): reconstruct historical WIP + status snapshot for past periods (TASK-1640) (#650) (@xarmian)
- 619465a: feat(onboard): suggest an independent AI code reviewer (model != implementer) (TASK-1645) (#654) (@xarmian)
- d9fab3e: feat(report): cycle-time + WIP/aging metrics (TASK-1631) (#642) (@xarmian)
- b68164a: feat(report): opt-in 'what shipped' completed-items list (TASK-1641) (#651) (@xarmian)
- a1d09c9: feat(report): windowed project report endpoint + DateBucket dialect (TASK-1630) (#638) (@xarmian)
- 873d351: feat(server): enrich collection share payload with settings, schema, item content (TASK-1678) (#680) (@xarmian)
- be53856: feat(share): include saved views in collection share payload (TASK-1681) (#682) (@xarmian)
- d293924: feat(share): inline read-only row expand in public shared view (TASK-1684) (#685) (@xarmian)
- d4ff473: feat(share): read-only view switcher on shared collection route (TASK-1682) (#683) (@xarmian)
- ae055ab: feat(share): render matching view on /s/[token] (TASK-1680) (#681) (@xarmian)
- b422988: feat(share): schema-driven colors + empty/large-collection states (TASK-1683) (#684) (@xarmian)
- 5dfc292: feat(store): structured status-transition log + backfill (TASK-1637) (#637) (@xarmian)
- 5c0d367: feat(tags): list/board view toggle on the tag page (TASK-1656) (#661) (@xarmian)
- 1e3b325: feat(tags): render tag chips on cards, list rows, and the item header (TASK-1655) (#660) (@xarmian)
- feb068a: feat(tags): tag chip editor on the item detail page (TASK-1654) (#659) (@xarmian)
- 1b10685: feat(tags): workspace tag enumeration endpoint + cross-collection filter (TASK-1653) (#658) (@xarmian)
- 5afacaf: feat(web): Insights analytics page (TASK-1633) (#643) (@xarmian)
- 0c8c066: feat(web): LayerCake chart component library for Reports (TASK-1632) (#639) (@xarmian)
- 1a728fe: feat(web): add Insights sidebar nav link (TASK-1636) (#644) (@xarmian)
- 2721d89: feat(web): bulk-mutation API client method + types (TASK-1669) (#671) (@xarmian)
- 5c491b7: feat(web): mobile bottom navigation (PLAN-1694) (#692) (@xarmian)
- a58c64f: feat(web): public read-only collection view renderers (TASK-1679) (#679) (@xarmian)
Bug fixes
- a5c7fc9: fix(attachments): grant-aware upload auth so share-link editors can attach (BUG-1661) (#688) (@xarmian)
- a666715: fix(insights): professional print formatting for the exec report (TASK-1647) (#656) (@xarmian)
- ae8173b: fix(server): gate ref-resolver admin bypass on bearer auth (BUG-1618) (#690) (@xarmian)
- a4e0eb1: fix(share): stop ShareDialog effect from wedging the scheduler in prod (#686) (@xarmian)
- 3704cc2: fix(store): cast jsonb metadata to text for Postgres LIKE + gofmt (BUG-1702) (#693) (@xarmian)
- 333f509: fix(store): monotonic seq tiebreak for same-second status transitions (TASK-1643) (#655) (@xarmian)
- 57995c5: fix(sync): moved-out tombstones for cross-visibility collection moves (BUG-1675) (#670) (@xarmian)
- 72d8963: fix(timeline): resolve collab-snapshot diffs + collapse autosave bursts (BUG-1612) (#691) (@xarmian)
- 034b540: fix(web): de-reactify open-transition tracke...
Pad v0.7.0-rc.1
Changelog
Features
- 1d9a611: feat(api): bulk restore op for undo (TASK-1674 backend) (#675) (@xarmian)
- dfd3811: feat(api): bulk-mutation endpoint + single SSE batch event (TASK-1668) (#669) (@xarmian)
- 634e834: feat(board): Trello-style inline draft card creation (TASK-1676) (#678) (@xarmian)
- 2cd8932: feat(board): confirm + undo toast for destructive bulk actions (TASK-1674) (#676) (@xarmian)
- 9dd4fa6: feat(board): lane-header + add button + kebab menu shell (TASK-1671) (#672) (@xarmian)
- 710c76f: feat(board): per-lane sort override in the kebab menu (TASK-1673) (#677) (@xarmian)
- 99e8802: feat(board): wire bulk lane actions via the bulk endpoint (TASK-1672) (#674) (@xarmian)
- cd8ac9b: feat(charts): per-category hover tooltips + a11y titles (TASK-1638) (#648) (@xarmian)
- b9ddd02: feat(cli): add --tag filter to
pad item list(TASK-1658) (#662) (@xarmian) - 949ae03: feat(cli,mcp): pad project report + pad_project report action (TASK-1635) (#641) (@xarmian)
- 1be42e5: feat(collections): multi-select tag filter + per-collection tag counts (TASK-1666) (#668) (@xarmian)
- 5203809: feat(collections): page-wide sort control + priority-weight helper (TASK-1670, closes IDEA-1648) (#673) (@xarmian)
- 076fb9b: feat(comments): comment editing backend — user_id, UpdateComment, PATCH, SSE (TASK-1663) (#665) (@xarmian)
- 0d5f966: feat(comments): inline comment/reply editing via CommentEditor (TASK-1665) (#667) (@xarmian)
- 6ed16ef: feat(comments): lean Tiptap CommentEditor — inline image thumbnails (TASK-1664) (#666) (@xarmian)
- e179c59: feat(comments): paste/drop image attachments in comments + inline render (IDEA-1650) (#663) (@xarmian)
- 4c2c4d1: feat(comments): thumbnail comment images + click-to-expand lightbox (IDEA-1660) (#664) (@xarmian)
- 9870f36: feat(insights): "What shipped" card with linked item IDs on the dashboard (#657) (@xarmian)
- 0d0c660: feat(insights): navigate to past periods (offset + prev/next) (TASK-1639) (#649) (@xarmian)
- eeff781: feat(insights): per-user layout customization + persistence (TASK-1634) (#645) (@xarmian)
- 0d46842: feat(insights): print-optimized exec report view (Save as PDF) (TASK-1642) (#652) (@xarmian)
- 4368c57: feat(insights): reconstruct historical WIP + status snapshot for past periods (TASK-1640) (#650) (@xarmian)
- 619465a: feat(onboard): suggest an independent AI code reviewer (model != implementer) (TASK-1645) (#654) (@xarmian)
- d9fab3e: feat(report): cycle-time + WIP/aging metrics (TASK-1631) (#642) (@xarmian)
- b68164a: feat(report): opt-in 'what shipped' completed-items list (TASK-1641) (#651) (@xarmian)
- a1d09c9: feat(report): windowed project report endpoint + DateBucket dialect (TASK-1630) (#638) (@xarmian)
- 873d351: feat(server): enrich collection share payload with settings, schema, item content (TASK-1678) (#680) (@xarmian)
- be53856: feat(share): include saved views in collection share payload (TASK-1681) (#682) (@xarmian)
- d293924: feat(share): inline read-only row expand in public shared view (TASK-1684) (#685) (@xarmian)
- d4ff473: feat(share): read-only view switcher on shared collection route (TASK-1682) (#683) (@xarmian)
- ae055ab: feat(share): render matching view on /s/[token] (TASK-1680) (#681) (@xarmian)
- b422988: feat(share): schema-driven colors + empty/large-collection states (TASK-1683) (#684) (@xarmian)
- 5dfc292: feat(store): structured status-transition log + backfill (TASK-1637) (#637) (@xarmian)
- 5c0d367: feat(tags): list/board view toggle on the tag page (TASK-1656) (#661) (@xarmian)
- 1e3b325: feat(tags): render tag chips on cards, list rows, and the item header (TASK-1655) (#660) (@xarmian)
- feb068a: feat(tags): tag chip editor on the item detail page (TASK-1654) (#659) (@xarmian)
- 1b10685: feat(tags): workspace tag enumeration endpoint + cross-collection filter (TASK-1653) (#658) (@xarmian)
- 5afacaf: feat(web): Insights analytics page (TASK-1633) (#643) (@xarmian)
- 0c8c066: feat(web): LayerCake chart component library for Reports (TASK-1632) (#639) (@xarmian)
- 1a728fe: feat(web): add Insights sidebar nav link (TASK-1636) (#644) (@xarmian)
- 2721d89: feat(web): bulk-mutation API client method + types (TASK-1669) (#671) (@xarmian)
- 5c491b7: feat(web): mobile bottom navigation (PLAN-1694) (#692) (@xarmian)
- a58c64f: feat(web): public read-only collection view renderers (TASK-1679) (#679) (@xarmian)
Bug fixes
- a5c7fc9: fix(attachments): grant-aware upload auth so share-link editors can attach (BUG-1661) (#688) (@xarmian)
- a666715: fix(insights): professional print formatting for the exec report (TASK-1647) (#656) (@xarmian)
- ae8173b: fix(server): gate ref-resolver admin bypass on bearer auth (BUG-1618) (#690) (@xarmian)
- a4e0eb1: fix(share): stop ShareDialog effect from wedging the scheduler in prod (#686) (@xarmian)
- 3704cc2: fix(store): cast jsonb metadata to text for Postgres LIKE + gofmt (BUG-1702) (#693) (@xarmian)
- 333f509: fix(store): monotonic seq tiebreak for same-second status transitions (TASK-1643) (#655) (@xarmian)
- 57995c5: fix(sync): moved-out tombstones for cross-visibility collection moves (BUG-1675) (#670) (@xarmian)
- 72d8963: fix(timeline): resolve collab-snapshot diffs + collapse autosave bursts (BUG-1612) (#691) (@xarmian)
- 034b540: fix(web): de-reactify open-transition trackers in 3 more modals/banners (#687) (@xarmian)
- d2e80ef: fix(web): reflow page content when sidebar collapses (BUG-1651) (#689) (@xarmian)
Other changes
- a88f775: chore(ci): bump Node 20 actions to Node 24 ahead of June 2026 deadline (TASK-1165) (#635) (@xarmian)
- d2bcbd3: chore(deps,docs): bump x/image v0.41.0 + sync seed ship-playbook codex guidance (#646) (@xarmian)
- 24707fc: chore(templates): make seeded ship playbook review loop tool-neutral (TASK-1644) (#653) (@xarmian)
Pad v0.6.0
v0.6.0 — Release Highlights
Wiki-link backlinks ("Mentioned in") — PLAN-1593
Pad's [[...]] syntax has always flowed one way: an item shows who it links to. v0.6.0 adds a materialized reverse index so every item can answer "what mentions me?" cheaply, surfaced as a new Mentioned in panel and a per-item count badge. The rollout shipped in four phases: a server-side reverse index for ref-form links (Phase 1, TASK-1594), title-form [[Title]] resolution with a rename cascade so backlinks survive item renames (Phase 2a, TASK-1595), cross-workspace links + a request-independent ACL helper so the panel honors membership for bearer-auth and MCP requests (Phase 2b, TASK-1597), and the UI panel + count badge + CLI + MCP plumbing (Phase 3, TASK-1596). Parent↔child mentions are suppressed from the panel to keep it useful (TASK-1607).
pad_library MCP tool + ToolSurfaceVersion 0.5 — PLAN-1560
The convention + playbook library is now reachable from pure-MCP agents. New pad_library catalog tool with list / get / categories / activate actions (TASK-1563) closes the gap that previously had the onboard playbook telling MCP-only agents to "work from your own knowledge." Backed by extended HTTP endpoints (?category, ?summary, /library/entry, TASK-1561) and a pad library get CLI command + --full flag + server-side category filter (TASK-1562). ToolSurfaceVersion bumps to 0.5 to advertise the new action surface; the bootstrap shape is unchanged.
Plan-limit UX + Stripe-ready upgrade CTAs — PLAN-825
The limit-hit experience is now polished end-to-end. A standardized plan-limit error envelope flows through HTTP / MCP / CLI / UI so every surface speaks the same shape (TASK-788). Every limit-hit point in the web UI gets an inline "Upgrade to Pro" CTA wired through to POST /billing/checkout and a Stripe Checkout session (TASK-800). The free-tier workspace cap drops from 5 to 3 (TASK-1609), with a paired migration so existing deployments converge on the new default (TASK-1610).
Security: go-jose CVE clear (BUG-1619)
github.com/go-jose/go-jose/v3 bumped from v3.0.4 to v3.0.5 to clear GO-2026-4945 (Go JOSE panics in JWE decryption), reachable indirect via ory/fosite from the OAuth authorize handler. Caught by govulncheck during release pre-flight. Drop-in dependency bump, no API changes.
Bug fixes
Share button on item pages no longer throws a TypeError on items with null grants/share-link slices (BUG-1598); admin-modal reactive loop on open is broken (no specific BUG ref — landed with the modal series). CI hardening: golang.org/x/net bumped to clear GO-2026-5025..5030 (#618), Go (PostgreSQL) job unbroken, gofmt unblock on workspace_members.go (BUG-1565).
Other notable
- Inline-expand DOM removed from the admin users page in favor of the modal (TASK-1555, refactor)
- README gains a cross-link nav row (site, blog, changelog, X, Bluesky) (#617)
- Cross-workspace wiki-link resolution honors the new request-independent ACL helper (PLAN-1593 Phase 2b)
Install
# Homebrew (macOS / Linux)
brew install perpetualsoftware/tap/pad
# Docker (multi-arch)
docker pull ghcr.io/perpetualsoftware/pad:0.6.0
# Direct download
# https://github.com/PerpetualSoftware/pad/releases/tag/v0.6.0Verifying
All artifacts are signed via Sigstore keyless OIDC. To verify the checksums:
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate checksums.txt.pem \
--signature checksums.txt.sig \
checksums.txtThe container image manifests are likewise cosign-signed; SBOMs (SPDX) ship alongside each archive, and SLSA v1 build provenance is attested per-archive (verify with gh attestation verify <archive> --repo PerpetualSoftware/pad).
Changelog
Features
- a04e521: feat(admin): GET /admin/users/{id}/activity paginated feed (TASK-1546) (#601) (@xarmian)
- eff0824: feat(admin): GET /admin/users/{id}/detail per-workspace breakdown (TASK-1545) (#600) (@xarmian)
- 48323e2: feat(admin): GET /admin/users/{id}/metrics windowed engagement metrics (TASK-1547) (#602) (@xarmian)
- 0c5ec04: feat(admin): extend user list with aggregations + sort/filter (TASK-1544) (#599) (@xarmian)
- 35ac755: feat(backlinks): UI panel + mention badge + CLI + MCP (Phase 3) (#623) (@xarmian)
- 905876a: feat(backlinks): cross-workspace wiki-links + request-independent ACL (Phase 2b) (#622) (@xarmian)
- 8e7d404: feat(backlinks): server-side reverse index for [[...]] (Phase 1) (#620) (@xarmian)
- 4aff8c7: feat(backlinks): suppress parent↔child mentions from "Mentioned in" panel (TASK-1607) (#625) (@xarmian)
- c67c167: feat(backlinks): title-form wiki-links + rename cascade (Phase 2a) (#621) (@xarmian)
- de1beb4: feat(cli): pad library get + list --full + server-side category filter (TASK-1562) (#613) (@xarmian)
- 6433cc5: feat(mcp): pad_library catalog tool + ToolSurfaceVersion 0.5 (TASK-1563) (#615) (@xarmian)
- 2df6ede: feat(server): library endpoints gain ?category, ?summary, /library/entry (TASK-1561) (#612) (@xarmian)
- 0a09c1d: feat(store): add users.last_write_at column + write-path hook (TASK-1543) (#598) (@xarmian)
- 88a30e5: feat(web): admin modal Activity tab (TASK-1554) (#609) (@xarmian)
- 6765542: feat(web): admin modal Overview tab (TASK-1553) (#608) (@xarmian)
- 4308723: feat(web): admin modal Settings & overrides tab (TASK-1551) (#606) (@xarmian)
- 46ca27c: feat(web): admin modal Workspaces tab (TASK-1552) (#607) (@xarmian)
- 5990008: feat(web): admin user list — pagination + sort + filter UI (TASK-1549) (#604) (@xarmian)
- 0249147: feat(web): admin user modal shell with empty tabs (TASK-1550) (#605) (@xarmian)
- 8a85eca: feat(web): admin user table — cheap aggregation columns (TASK-1548) (#603) (@xarmian)
Bug fixes
- f48c99e: fix(auth): scope admin platform role to cookie session auth (BUG-1616) (#632) (@xarmian)
- 83716a6: fix(backlinks): scope cross-workspace admin enumeration to membership for bearer auth (BUG-1617) (#633) (@xarmian)
- 3a04c06: fix(backlinks): suppression must query item_links, not items.parent_id (TASK-1607 followup) (#626) (@xarmian)
- 8cf460b: fix(ci): unbreak Go (PostgreSQL) test + clear x/net govulncheck findings (#618) (@xarmian)
- 08f76f3: fix(deps): bump go-jose/v3 to v3.0.5 to clear GO-2026-4945 (BUG-1619) (#634) (@xarmian)
- c1c9f2e: fix(share): guard nil grants/share-link slices to prevent ShareDialog TypeError (BUG-1598) (#624) (@xarmian)
- ef7eaba: fix(web): admin modal reactive loop on open (#611) (@xarmian)
Refactors
Other changes
- a7fb14e: Reduce free-tier workspace cap from 5 to 3 (TASK-1609) (#627) (@xarmian)
- 342679a: Standardize plan-limit error envelope across HTTP/MCP/CLI/UI (TASK-788) (#628) (@xarmian)
- 225fb4a: Wire upgrade CTAs with Stripe-ready billing flow (TASK-800) (#629) (@xarmian)
- 66dce32: chore(mcp): point library-activate not-found hint at pad_library (TASK-1564) (#616) (@xarmian)
- 9a47c36: chore(store): rephrase comment to unblock gofmt (BUG-1565) (#614) (@xarmian)
Pad v0.5.0
v0.5.0 — Release Highlights
Onboarding overhaul — the /pad onboard flow (PLAN-1496)
Workspace setup is now driven entirely by the canonical /pad onboard invokable library playbook, auto-seeded into every new workspace (including a new blank template that ships only the onboard playbook). The pre-existing IDEA-1 / BACK-1 / FEAT-1 first-person seed pattern is retired across all software templates. A new needs_onboarding flag in the agent bootstrap response lets the skill render a one-line nudge until the first user-created item appears. Collection/role rename + delete now ship as agent-callable surfaces (pad collection update|delete, pad role update, plus matching MCP actions) so the onboarding agent can adapt seeded scaffolding to the actual project.
Invokable playbooks v1 (PLAN-1377 + PLAN-1397)
Playbooks are now first-class invocable procedures. New schema fields invocation_slug (workspace-unique kebab-case) and structured arguments make /pad ship, /pad plan, /pad decompose, /pad onboard dispatch directly from Claude Code, the CLI (pad playbook run …), and MCP (pad_playbook tool with list/get/run actions). The agent bootstrap response embeds per-playbook metadata so routing happens with zero extra tool calls. A dedicated web editor at /[ws]/playbooks/[slug] handles slug validation, args builder, and live test-invocation preview. The library was overhauled to surface invokable workflows first; nine pre-PLAN-1377 trigger-only bodies were archived (compiled but not surfaced) pending per-entry promote/retire decisions.
URL import (TASK-1469–1474)
Pull external content directly into items: new POST /api/v1/import/url endpoint with an SSRF-guarded fetcher, generic HTML→Markdown conversion, and a dedicated OpenAPI 3.x→Markdown converter. The TipTap editor gets an "Insert from URL" toolbar button and modal. Imported items carry a source_url ghost-field with a one-click "Refresh from source" affordance.
OAuth connections + unified Connect-to-agent modal (TASK-1520–1528)
Connected apps now live in per-connection state tables (with dual-read introspection during the cutover), a rewritten consent screen, full CRUD mutation endpoints, and an edit UI. The new Connect-to-agent modal unifies what was previously several disjoint flows into a single claim-code experience; pad_workspace.create and pad_workspace.claim MCP actions let agents bootstrap a new workspace without leaving the assistant. Post-workspace-create, the Connect modal opens automatically to guide users to their first agent install.
MCP bootstrap v0.4 — ~40% lighter payload (PLAN-1410)
The bootstrap envelope returned by pad_set_workspace, pad_meta.action: bootstrap, and pad://workspace/{ws}/bootstrap is substantially slimmer: BootstrapCollection and BootstrapRole projections drop UUIDs/timestamps/settings, recent_activity duplication is removed, dashboard sub-arrays are capped at 5 with parallel overflow counts, and redundant schema labels are omitted. One breaking shape change for MCP clients: collections[].schema is now a nested JSON object instead of a JSON-encoded string — clients that previously JSON.parse()'d the value must consume it directly. ToolSurfaceVersion is bumped to 0.4 to advertise the contract.
Store hardening (IDEA-1479–1489)
Migrations now run inside atomic transactions. collections.settings is enforced NOT NULL with end-to-end normalization and a corrective backfill for legacy shape violations. JSONB NOT NULL hardening extended to items and views, with handler-level shape validation closing the loop. Workspace freshness ordering now reflects item activity, not just workspace mtime.
Bug fixes
open_children 409 surfaced in the web UI with a force-override path (BUG-1538); SSE write errors no longer silently drop (BUG-1532) and keepalive is linked to IdleTimeout; search palette no longer hangs on numeric queries (BUG-1531); scroll restoration uses SvelteKit's snapshot API (BUG-1425); Y.Doc seed waits for workspace items so wiki-links don't bake in as plain text (BUG-1461); MCP per-token burst raised and 429s correctly classified as ErrRateLimited (BUG-1430); MCP item create accepts flexible field-JSON shapes (BUG-1431/1432); slash-menu matches against id + keywords (BUG-1419); typed-input field saves debounced and same-field activity runs collapsed (BUG-1466); CLI pins server URL in .pad.toml for remote workspaces (BUG-1535); plus the --sort-order flag on pad item update (BUG-1536).
Other notable
- Cross-workspace wiki-link resolution (IDEA-1492)
pad session shapeCLI for Claude Code context-window telemetry (IDEA-1491)- Refusal to mark an item terminal while it has open children (IDEA-1494)
- Generic
shipplaybook seeded in thestartuptemplate - Single-roundtrip
/padcontext-load viaGET /api/v1/workspaces/{ws}/agent/bootstrap
Install
# Homebrew (macOS / Linux)
brew install perpetualsoftware/tap/pad
# Docker (multi-arch)
docker pull ghcr.io/perpetualsoftware/pad:0.5.0
# Direct download
# https://github.com/PerpetualSoftware/pad/releases/tag/v0.5.0Verifying
All artifacts are signed via Sigstore keyless OIDC. To verify the checksums:
cosign verify-blob \
--certificate-identity-regexp "^https://github.com/PerpetualSoftware/pad/.github/workflows/release.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--certificate checksums.txt.pem \
--signature checksums.txt.sig \
checksums.txtThe container image manifests are likewise cosign-signed; SBOMs (SPDX) ship alongside each archive, and SLSA v1 build provenance is attested per-archive (verify with gh attestation verify <archive> --repo PerpetualSoftware/pad).
Changelog
Features
- 9ebdfb5: Revert "feat(cli): pad session shape — Claude Code context-window telemetry (IDEA-1491) (#569)" (#570) (@xarmian)
- 24f0445: feat(bootstrap): single-roundtrip /pad context-load endpoint (TASK-1379) (#518) (@xarmian)
- 96a32aa: feat(bootstrap,skill): add needs_onboarding flag + retire legacy Onboarding workflow (TASK-1504,1505) (#578) (@xarmian)
- a3799a1: feat(cli): add --sort-order flag to pad item update (BUG-1536) (#596) (@xarmian)
- 351f83a: feat(cli): pad session shape — Claude Code context-window telemetry (IDEA-1491) (#569) (@xarmian)
- f76520f: feat(cli,mcp): expose 'collection delete' via CLI and MCP catalog (TASK-1511) (#573) (@xarmian)
- f557930: feat(cli,mcp): expose 'collection update' via CLI and MCP catalog (TASK-1510) (#572) (@xarmian)
- 8c9974f: feat(cli,mcp): expose 'role update' via CLI and MCP catalog (TASK-1512) (#574) (@xarmian)
- 7c663a3: feat(collections): add blank workspace template + retire auto-upgrade hook (IDEA-1479) (#560) (@xarmian)
- 936145c: feat(collections): seed generic ship playbook in startup template (TASK-1386) (#523) (@xarmian)
- 4bbd0a2: feat(collections): widen LibraryPlaybook with InvocationSlug + Arguments (TASK-1398) (#527) (@xarmian)
- fc6afd0: feat(connect): unified Connect-to-agent modal + claim-code endpoint (TASK-1525) (#586) (@xarmian)
- 8efcc21: feat(library): add ship playbook to library, shared body with startup seed (TASK-1400) (#529) (@xarmian)
- 8eb927c: feat(library): author the decompose invokable playbook (TASK-1402) (#531) (@xarmian)
- ad3926f: feat(library): author the plan invokable playbook (TASK-1401) (#530) (@xarmian)
- 8094883: feat(links): cross-workspace wiki-link resolution (IDEA-1492) (#568) (@xarmian)
- 9607139: feat(mcp): add pad_playbook tool (list/get/run) (TASK-1381) (#521) (@xarmian)
- 73208bf: feat(mcp): expose AgentBootstrap via three MCP surfaces (TASK-1380) (#519) (@xarmian)
- aec67e2: feat(mcp): workspace.create + workspace.claim actions + claim-code mechanics (TASK-1521) (#582) (@xarmian)
- 905baaa: feat(oauth): backfill session.Extra into oauth_connections + switch read path (TASK-1522) (#583) (@xarmian)
- 26aa800: feat(oauth): connected-apps mutation endpoints + edit UI (TASK-1524) (#585) (@xarmian)
- 93b9590: feat(oauth): consent screen rewrite + new-tables write path (TASK-1523) (#584) (@xarmian)
- 3f6bcc0: feat(oauth): per-connection state tables + dual-read introspection gate (TASK-1520) (#581) (@xarmian)
- fed4b60: feat(playbook): add pad playbook CLI (list/show/run) + endpoints (TASK-1382) (#520) (@xarmian)
- c38b3bf: feat(playbooks): add invocation_slug + arguments schema fields (TASK-1378) (#517) (@xarmian)
- 507793e: feat(playbooks): author canonical /pad onboard library playbook (TASK-1499) (#576) (@xarmian)
- e621eac: feat(server): POST /api/v1/import/url endpoint + integration tests (TASK-1472) (#556) (@xarmian)
- e59d390: feat(server): refuse to mark item terminal while it has open children (IDEA-1494) (#571) (@xarmian)
- ec71903: feat(store): JSONB NOT NULL hardening on items/views + handler shape validation (IDEA-1486+1488) (#566) (@xarmian)
- 7134216: feat(store): corrective backfill for collections....