Repository navigation
Releases: asyncdotengineering/plandesk
Releases · asyncdotengineering/plandesk
Release list
Plan Desk 5.0.0
Self-hosting is now one command or one button on Docker, Cloudflare Workers or Vercel, and every target prepares its own database. See Self-hosting → Deployment topologies.
Breaking
PLANDESK_SESSION_SECRETis no longer read. Rename it toPLANDESK_BETTER_AUTH_SECRET(same value). A server that still has only the old name refuses to start and says so.- S3 storage needs
PLANDESK_STORAGE=s3. SettingPLANDESK_S3_*without it is now an error that says so, instead of a settingplandesk servesilently ignored. - Docker files are renamed.
Dockerfile.serveris nowDockerfileanddocker-compose.hosted.ymlis nowcompose.yaml, which reads.env(cp .env.example .env). The container listens on 7526, the same port asplandesk serve. plandesk deploy flyis gone; no Fly configuration ever shipped.plandesk deploy vercelis new, and thecloudflareanddockerguides describe what the repository actually deploys (Workers + Turso + R2, not D1 or Pages).- Removed package exports, none of which had a caller:
@plandesk/api:version,removeOrganizationMember,updateOrganizationMemberRole,parseActor,InvalidActorSerializationError,healthRouter.SyncServiceis nowTriageService.@plandesk/db:version,getArtifactByProjectAndId,getNoteByProjectAndId,viewConfig.upsertSubmission/UpsertSubmissionInput,revokeGuestSession,revokeRenderTokenandlistPrototypeLinksByFromArtifactmoved to@plandesk/db/testing.@plandesk/mcp-client:version.@plandesk/cliand@plandesk/runner: the"."entry. Both are command-line packages; run their binaries.
- Migration 0025 drops the unused
sync_statetable. @plandesk/serveris a new published package, and@plandesk/clinow depends on it:plandesk serve, the Docker image, the Worker and the Vercel function share its one composition. Publish it before the CLI that depends on it.@plandesk/mcp-clientand@plandesk/runnerare not part of this release. Their export changes above ship with their own next versions; the published1.0.0and0.1.0are unchanged.
Added
- The server prepares its own database.
plandesk serve, the Docker image, the Worker and the Vercel function all run migrations, the better-auth tables and the workspace backfills before serving, under a 60-second lease row (__plandesk_lease) so only one instance migrates at a time. While another instance holds it, requests answer503 {"error":"schema_behind","schema":…}and retry. A remote database no longer needs a manualplandesk migrate; the command stays for operators who prefer a CI step. - Deploy to Cloudflare and Deploy with Vercel from the repository root (
wrangler.jsoncwithpnpm run deploy;vercel.json). Both serve MCP at/mcp; the Vercel entry never did before. - Real S3-compatible storage (AWS S3, R2's S3 API, MinIO): signed PUT and GET, bytes proxied through the server. An unreachable bucket answers
502 storage_unavailable. - One environment reader for every target. Values are trimmed and blank means unset; GitHub and S3 settings are all-or-nothing and a half-set group names what is missing. Workers and Vercel answer
500 misconfigurednaming the variable.
Changed
- Storage kind
localis nowdb(bytes in the database).localis still accepted inPLANDESK_STORAGEandplandesk.server.json. - Notes and comments written over REST or the web app are stored as HTML, converted from Markdown in the service, the same as MCP writes.
- Uploaded files are served under a script-free sandbox CSP. An uploaded SVG carrying
<script>cannot run on the Plan Desk origin when opened directly; SVG still renders in<img>. [::1]is recognised as loopback for a server URL, like127.0.0.1andlocalhost.- The task lane shows and can be set on cards and the task drawer.
plandesk loginhas no default server. With no--serverit reuses the one saved in~/.plandesk/config.json, or tells you to pass--server <your Plan Desk URL>. It used to fall back to a host that serves only these docs.plandesk admin invite-ownerbuilds its claim link on your server's public URL:--base-url, thenPLANDESK_BASE_URLorbaseUrlinplandesk.server.json. It warns when it can only fall back to loopback.- Imported file URLs must be
https:(orhttp:to a loopback host), and their userinfo is dropped. An org export that carries any otherexternal_urlis now refused on import, all or nothing; edit that URL in the export and import again. File responses also sendReferrer-Policy: no-referrer.
Fixed
- Writes on a remote database are atomic again. Every multi-statement write (goals, tasks, projects, documents, folders, artifacts, prototypes, canvas) ran
BEGINandCOMMITon separate libSQL streams, so on Turso or sqld a successful write answered 500 and a failed one was not rolled back. Local file boards were never affected.
Install or upgrade: npm i -g @plandesk/cli@latest (published: @plandesk/db, api, mcp, server, cli at 5.0.0). Upgrading from 4.x: the 4.x → 5.0.0 guide. Full history: CHANGELOG.md.
Plan Desk 4.0.0
A major release because three surfaces are removed and every write path now rejects input it cannot honour. Everything else is additive. The board migrates in place on the next plandesk serve (migrations 0021–0024); see Upgrading → 3.x → 4.0.0.
Breaking
- Arguments the server cannot honour are rejected, not dropped. MCP tools were registered with a bare zod shape, which the SDK wraps in a non-strict object, so an unknown argument was stripped and the call reported success (
create_taskdroppedcommit_refs;scaffold_project_from_planonce droppedgoal_id). Every MCP input schema is now strict, and RESTPOST /projects/:id/tasksandPATCH /tasks/:idanswer 400 naming the unknown key. Fields a sibling tool already accepted were added where they were missing (create_task.commit_refs/due_date,create_document.status_line,update_document.parent_id,create_edge.arrow_direction, scaffold task fields). RESTPATCH /tasks/:idnow forwardsassigneeanddue_date, which the canvas panel sent and the route lost. sync_pullandplandesk pullare gone. They talked to@plandesk/sync-server, removed in 1.x; no server answered, andsync_pullalways replied "not promoted". Thesync_remotestable is dropped.plandesk legacy-upgradeis retired. Anyone still on a 0.20.x board runsnpx @plandesk/cli@3.6.0 legacy-upgradeonce, then upgrades normally.
Added
- A task can belong to no goal.
goal_id: nulldetaches a task over MCP and REST, and creates one with no goal. Omittinggoal_idstill attaches to the current goal, and the create response now says how it resolved (goal_resolution). With no active goal, new work gets no goal and no placeholder "General" goal is created;get_next_taskserves goal-less todos. - Search reads bodies. Document, note and task bodies are indexed (SQLite FTS5, trigram), so paths like
docs/foo-bar.mdmatch as typed. Results rank title hits first and carry an excerpt, in MCPsearch, REST/searchand the command menu. - Documents can say which repo file they mirror, and when anything was last verified.
source_pathon documents;verified_at/verified_refon documents and tasks, set only explicitly.check_references(MCP) andGET /projects/:id/reference-checkreport mirrored files that no longer exist. The disk is probed only on a loopback server; elsewhere the answer isunknown. - Share links say how far they reach. They are built on
PLANDESK_BASE_URLwhen set, and carryreachable_from: this_machine | network. - Skills install with
npx skills add asyncdotengineering/plandesk. Copiesconnectvendors into a repo are markedmetadata.internal: true, so a connected public repo does not appear to publish them. The heaviest skills load their conditional material on demand.
Fixed
- A project link sets its workspace. Opening
/projects/:idin another workspace made the breadcrumb, switchers and search describe the old one. The project's own workspace now becomes active; a project you cannot read shows a not-found page at once instead of three retries. - Share links no longer show org chrome to guests.
/p/<token>rendered inside the app shell, exposing the org sidebar and switchers. - The workspace breadcrumb opens the project list, not the workspace picker.
- Unknown
/apipaths answer 404, not405 Allow: GET, underplandesk serve. plandesk-groom-taskfrontmatter is valid YAML, so strict skill loaders stop dropping it.- Factory run state has one path (
.agents/factory/runs/), andmetrics.jsonlis tracked, as the factory contract always said. - In-process callers can no longer act as owner by default. A service with no request context and no explicit principal now throws instead of assuming owner.
Removed
- About 4,000 lines with no live caller: GitHub OAuth helpers left behind when better-auth took over sign-in, the sync client, the legacy upgrader, a one-release hook migration, and unreferenced symbols. Every vocabulary now has one owner, and MCP tools register from one table.
Install or upgrade: npm i -g @plandesk/cli@4.0.0. Full history: CHANGELOG.md.