Repository navigation
Releases: saltbo/zpan
Release list
v2.9.0
💥 BREAKING CHANGES
-
due to
ad0f21b- unify list pagination and realtime updates (PR #524 by @saltbo):migrated list APIs now accept pageToken and return nextPageToken instead of page and total fields.
Refs #450- fix: keep page tokens at the HTTP boundary
Move signed page-token handling out of the pure domain layer so dependency-cruiser architecture checks pass without changing behavior. - fix: route background job stats through usecase
Keep the HTTP boundary from reaching directly into repository ports and cover the new usecase wrapper. - fix: align clients and checks with cursor pagination
- refactor: unify pagination boundaries and infinite loading
- fix: keep page tokens at the HTTP boundary
-
due to
a5c281b- make site routes RESTful (PR #526 by @saltbo):site email, branding, analytics, licensing, WebDAV verification, and scheduler endpoint paths have changed.
-
due to
17db813- normalize persistent identifiers to Base62 (PR #554 by @saltbo):historical ZPan-owned IDs and public tokens require the one-time normalization migration; old public links and stored credentials are invalidated without runtime fallback.
- fix(ids): namespace public redirect tokens
Generate share tokens as s plus 11 Base62 characters and image tokens as i plus 11 Base62 characters. Dispatch /r by namespace prefix, reuse the single resolved record, and update migration validation, contracts, documentation, and tests. - fix(ids): guard future object storage keys
- fix(ids): normalize historical references safely
- fix(ids): namespace public redirect tokens
✨ New Features
1d58d5b- image-hosting: add configurable custom domain providers (PR #529 by @saltbo)6ad1563- image-hosting: automate Cloudflare domain setup (PR #530 by @saltbo)faea00d- image-hosting: improve custom-domain image links (PR #531 by @saltbo)c66590a- image-hosting: gate custom domains and support origins (commit by @saltbo)038e231- establish unified authorization kernel (PR #533 by @agent-kanban[bot])da286e9- declare explicit route authorization policies (PR #535 by @agent-kanban[bot])4817afe- migrate content APIs to unified authorization (PR #534 by @agent-kanban[bot])1b1b1db- add workspace agent API keys (PR #538 by @agent-kanban[bot])f2aea1b- stabilize multipart upload protocol (PR #537 by @agent-kanban[bot])d22227e- add delegated agent OAuth provider (PR #539 by @agent-kanban[bot])00d2986- publish Restish OpenAPI security bindings (PR #540 by @agent-kanban[bot])88916f4- add agent oauth consent management UI (PR #541 by @agent-kanban[bot])360237d- add restish zpan upload plugin (PR #542 by @agent-kanban[bot])d7ba55b- auth: support external agent resources (commit by @saltbo)8402844- store: add agent x402 capacity purchases (commit by @saltbo)2657f82- auth: add contextual OAuth workspace grants (PR #550 by @saltbo)8513b18- oauth: expose workspace authorization catalog (PR #551 by @saltbo)9b95117- oauth: manage dynamic client registrations (commit by @saltbo)0be5c1b- agent: support workspace-scoped resource access (commit by @saltbo)17db813- ids: normalize persistent identifiers to Base62 (PR #554 by @saltbo)fa19323- attribute files and downloads to actors (PR #559 by @saltbo)bbf4a8e- agent-skills: publish Realmroot ZPan skill80ca834- oauth: improve authorization details (PR #569 by @realmroot[bot])
🐛 Bug Fixes
1a61b6d- downloader: serialize attempt ledger updates (commit by @saltbo)f9c15a0- deploy: build worker before upload (commit by @saltbo)a6a9b1e- auth: keep API key writes out of Workers KV (commit by @saltbo)9b402c5- webdav: preserve single-query cold resolution (commit by @saltbo)ad0f21b- unify list pagination and realtime updates (PR #524 by @saltbo)5473db9- downloads: separate list data from task details (PR #525 by @saltbo)ece5f41- download: force browser-downloadable files to save (PR #527 by @saltbo)20feaa6- image-hosting: bypass auth on custom domains (PR #532 by @saltbo)808f861- events: rotate long-lived SSE connections (commit by @saltbo)bba4438- harden legacy downloader bootstrap (PR #536 by @agent-kanban[bot])af6e8d4- auth: preserve OAuth continuation through sign-in (commit by @saltbo)a968f85- auth: persist delegated agent identity (commit by @saltbo)4027f0c- auth: trust official worker preview origins (commit by @saltbo)711e69b- auth: use absolute callback URLs (commit by @saltbo)bb25161- auth: backfill Better Auth account issuers (commit by @saltbo)920d5ee- ci: retry transient quick tunnel failures (commit by @saltbo)4a9588e- ci: initialize cloud e2e command errors (commit by @saltbo)21305cc- ci: isolate quick tunnel callback traffic (commit by @saltbo)bde1bb4- auth: challenge invalid DPoP tokens (commit by @saltbo)bbb1a48- ci: serialize shared Cloud staging fixture (commit by @saltbo)d15ca86- store: recover interrupted capacity purchases (PR #548 by @saltbo)bc4a71f- api-keys: restore legacy Better Auth keys (commit by @saltbo)fa158cb- oauth: log agent assertion verification failures (commit by @saltbo)24eb5a0- deploy: configure production cloud service (commit by @saltbo)b818fac- x402: report missing receiver as unavailable (commit by @saltbo)- [
461becc](46...
v2.8.3
🐛 Bug Fixes
b4fea06- authz: restrict workspace job controls to editors0cc4cfd- docker: refresh GeoIP database source
♻️ Refactors
6c4c712- authz: centralize downloader credential policy
👷 Build System
fb41a71- deps: resolve release audit advisories
🔧 Chores
Docker
docker pull ghcr.io/saltbo/zpan:v2.8.3
docker pull ghcr.io/saltbo/zpan:v2.8.3-cliv2.8.2
🐛 Bug Fixes
1fa7ab4- security: block IPv6 transition SSRF bypasses (commit by @saltbo)8325133- security: escape user input in notification emails (commit by @saltbo)
👷 Build System
🔧 Chores
18cf673- release: v2.8.2 (commit by @saltbo)cc4a64b- openapi: regenerate client for secure auth dependencies (commit by @saltbo)
Docker
docker pull ghcr.io/saltbo/zpan:v2.8.2
docker pull ghcr.io/saltbo/zpan:v2.8.2-cliv2.8.1
v2.8.0
💥 BREAKING CHANGES
-
due to
b3ba6c0- unify errors to AIP-193 + Page pagination, enrich access log (#443) (PR #444 by @saltbo):unify errors to AIP-193 + Page pagination, enrich access log (#443) (#444)
-
due to
8abca2f- unify error handling on typed AppError + single jsonError renderer (PR #445 by @saltbo):POST /shares/{token}/objects quota rejection now returns 422
(was an inconsistent 400); every other quota path already returned 422. -
due to
7d819a5- move admin user management to better-auth admin plugin (PR #446 by @saltbo):move admin user management to better-auth admin plugin (#446)
-
due to
2ae603b- DELETE endpoints return 204 No Content (#443) (PR #447 by @saltbo):all DELETE endpoints now respond 204 with no body. License
unbind no longer returnscloud_unbind_error, so a partial cloud-unbind failure
is no longer surfaced in the response body.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com- fix(licensing): surface cloud-unbind failure as 502, don't swallow it as 204
The DELETE→204 sweep turned license unbind into an unconditional 204, which
hid a real partial failure: when the best-effort cloud unbind throws, the local
binding is cleared but the cloud side is left dangling. Reporting 204 (success)
in that case swallows the error.
unbindLicensenow returns a Result —{ ok: true }only when the cloud unbind
also succeeds, and a 502 AppError (reasonCLOUD_UNBIND_FAILED, the cloud error
indetails.metadata) when it fails. The local binding is still cleared either
way; the handler returns 204 on ok and throws the error otherwise.
DELETE success is still an empty 204 — this only restores fail-fast on the one
endpoint whose failure was a soft body field, never a thrown error.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com - test(spec): reconcile users.feature with #446 better-auth migration
pnpm lint:spec(a CI gate) was red on 11 orphanedspec/users.feature
scenarios — leftover from #446, which moved admin user management off our
/api/users/*routes onto better-auth's admin plugin and deleted the old
endpoints/tests but not their spec scenarios. Pre-existing on main; surfaced
here as the only failing CI check.
Reconcile the spec with reality:
- Re-link the behaviors that survived (now via better-auth) to the tests that
already cover them: list / admin-only(403) / disable(ban) / delete(remove) /
patch-missing(act-on-missing→404) → admin-users-ba.integration.test.ts;
quota-personal-org → the per-user quota test in users.integration.test.ts. - Drop scenarios for behavior that no longer exists: batch-toggle (now a
client-side fan-out, no endpoint), invalid-status (ban/unban are explicit),
multi-field filter (better-auth search is single-field, untested), the
unauthenticated 401 guard (better-auth owns it), and the inline
quota-entitlements-in-list (quota is now a per-user sub-resource).
lint:spec: 413 scenarios, all covered.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
- fix(licensing): surface cloud-unbind failure as 502, don't swallow it as 204
-
due to
78e2550- unify revoke/cancel on PUT /{resource}/{id}/status (#452) (PR #453 by @saltbo):unify revoke/cancel on PUT /{resource}/{id}/status (#452) (#453)
-
due to
7b8c8c9- unify object upload + rework delete/trash lifecycle (#448) (PR #454 by @saltbo):- removes PUT /objects/{id}/status and POST /objects/{id}/uploads
- PUT .../uploads/{sid}/status -> POST .../uploads/{sid}/completions {parts}
- DELETE /objects/{id} flips hard-purge -> soft-delete; permanent purge
moves to DELETE /trash/objects/{id} - DELETE /trash removed; restore is POST /trash/objects/{id}/restorations
- matters.status enum loses 'trashed' (migration backfills to trashedAt)
The migration swaps the matters_active_name_uniq partial index to exclude
trashed rows (WHERE status='active' AND trashed_at IS NULL). The single-PUT
presign is header-free so the uniform slice uploader's raw PUT matches the
S3 signature. Go downloader client + agent reworked to the unified flow.
-
due to
63d5b45- collapse polymorphic GET responses to one monomorphic schema (#449) (PR #455 by @saltbo):collapse polymorphic GET responses to one monomorphic schema (#449) (#455)
-
due to
0550e41- make landing shares public by default (commit by @saltbo):showOnProfile, listedAt, and the profile-listing endpoints are replaced by private and PUT /api/shares/:token/privacy.
✨ New Features
5836789- spaces, quota ownership, and sharing — design doc §5 implementation (PR #426 by @saltbo)6521d1b- events: unify SSE stream, replace frontend polling (PR #432 by @saltbo)91d10f9- openapi: global OpenAPI document + Scalar UI, drop hand-written stubs (PR #440 by @saltbo)e132cb9- openapi: complete API coverage with truthful schemas + unified error handling (PR #442 by @saltbo)00f48cf- avatars: host avatars + team logos on Cloud via SDK 2.4.0; remove public-bucket mode (PR #467 by @agent-kanban-local[bot])f24c6e2- avatar: self-host avatars on R2 on Workers + fix avatar refresh/fallback (PR #468 by @saltbo)f4b65e4- make forcePathStyle configurable per storage (PR #474 by @wujianguo)470a2d7- add admin form primitives (PR #478 by @agent-kanban-local[bot])82c5452- auth: move OAuth provider editor to drawer (PR #480 by @agent-kanban-local[bot])9acbc01- storage: add provider presets and request preview (commit by @saltbo)3695c80- downloads: add task event timeline (commit by @saltbo)02eda6d- add admin user activity feed (PR #493 by @agent-kanban[bot])7ccaba2- refine admin audit filtering (PR #495 by @agent-kanban[bot])556174f- admin: add team activity tab (PR #498 by @agent-kanban[bot])554c231- admin: redesign dashboard with pro analytics (commit by @saltbo)b7f7fa7- admin: implement operations dashboard stats (commit by @saltbo)6376e2a- admin: refine operations dashboard analytics (commit by @saltbo)75d7b50- webdav: support optional custom domains (commit by @saltbo)0bf1f9e- webdav: derive fixed domain from public URL (commit by @saltbo)e761b6a- webdav: verify derived domains before publishing (commit by @saltbo)d9da509- admin: add live dashboard overview (commit by @saltbo)40c5f10- admin: show storage change trend (commit by @saltbo)df0c5f3- auth: add configurable email verification (commit by @saltbo)23f679d- webdav: add admin service controls (commit by @saltbo)387c731- api-keys: unify user ownership and workspace scopes (commit by @saltbo)31005e1- workspaces: reorganize workspace settings (commit by @saltbo)- [
0cfc0fa](h...
v2.7.4
✨ New Features
e56d3dc- server: auto-trust loopback and LAN origins without TRUSTED_ORIGINS (commit by @saltbo)e6e67c5- licensing: harden cloud pairing — env keys, clear errors, confirm handshake (PR #424 by @saltbo)5ce3845- store: add coupon entry to checkout (commit by @saltbo)
🐛 Bug Fixes
d2f3a34- server: log underlying cause chain for failed D1 queries (commit by @saltbo)77ca806- store: auto-cancel pending plan order on duplicate checkout error (commit by @saltbo)fa136a5- upload: make Content-Disposition Latin-1 safe for non-ASCII filenames (commit by @saltbo)47b11bf- update the get-session cache logic (commit by @saltbo)60c51cf- auth: eliminate get-session hangs from cross-request pending init (commit by @saltbo)401eb3f- admin: register default quota input with valueAsNumber (PR #425 by @saltbo)
⚡ Performance Improvements
♻️ Refactors
🔧 Chores
Docker
docker pull ghcr.io/saltbo/zpan:v2.7.4
docker pull ghcr.io/saltbo/zpan:v2.7.4-cliv2.7.3
✨ New Features
9d70acf- licensing: support independent business authorization (commit by @saltbo)de0213a- add PostHog instance telemetry (PR #414 by @saltbo)f922fd4- quota: allow admins to edit and revoke granted entitlements (PR #419 by @saltbo)232ad89- admin: add diagonal license-edition corner ribbon to admin layout (PR #421 by @saltbo)891e331- admin: add About page with instance info and edition-aware cloud links (PR #422 by @saltbo)5a5583b- licensing: regroup comparison table by capability and add social-login/downloader gates (PR #423 by @saltbo)e700fd4- about: add changelog drawer, latest-version check, and commit hash (commit by @saltbo)6aa5257- about: take latest version from GitHub Releases, keep CHANGELOG drawer (commit by @saltbo)b9d4429- about: dedicated changelog renderer with per-version separators (commit by @saltbo)dc936e5- about: add changelog refresh button that bypasses the cache (commit by @saltbo)b880ebe- about: widen changelog drawer, refine styling, unlink commit (commit by @saltbo)53ca110- about: split runtime into runtime engine + deployment platform (commit by @saltbo)
🐛 Bug Fixes
e17e201- docker: use host hostname for downloader registration (commit by @saltbo)ecb38df- downloads: make remote usage billing resilient (commit by @saltbo)1d7ac9b- telemetry: use built-in product reporting endpoint (PR #416 by @saltbo)bd9f047- telemetry: report instance after deployment (PR #417 by @saltbo)61f643a- telemetry: clean up deploy report secret (commit by @saltbo)5c3df3c- telemetry: use PostHog SDK for instance reports (commit by @saltbo)7b5cd90- telemetry: use correct PostHog project token (commit by @saltbo)4009402- telemetry: align instance report fields (commit by @saltbo)178e731- telemetry: enable GeoIP enrichment (commit by @saltbo)f52213b- telemetry: standardize instance reports (commit by @saltbo)1a6a774- telemetry: disable reports during e2e (commit by @saltbo)48b82cc- telemetry: avoid generic disable flag (commit by @saltbo)6bcb540- telemetry: do not fail deploy on report timeout (commit by @saltbo)3b5f6c7- telemetry: persist detected site origin (commit by @saltbo)ef122ec- version: inject app version at build time (commit by @saltbo)af43701- version: set app version global in node entry (PR #418 by @saltbo)b10a1f3- quota: chunk batch quota IN queries under D1's 100-param cap (commit by @saltbo)0063557- docker: repair image startup and guard it in CI (commit by @saltbo)ee8eea1- i18n: add missing sitePublicOrigin admin settings keys (commit by @saltbo)bae4d62- deploy: provision archive queue and restore vite build step (PR #415 by @wshijiang)42342be- version: resolve app version from package.json, not git describe (commit by @saltbo)
⚡ Performance Improvements
♻️ Refactors
👷 Build System
ac00164- e2e: run core checks before cloud store flow (commit by @saltbo)120faaf- add Cloudflare deploy dry-run smoke job (commit by @saltbo)15698aa- release: guide developer to pnpm release on version mismatch (commit by @saltbo)
🔧 Chores
72328c6- sdk: update zpan cloud sdk (commit by @saltbo)43e92ca- config: consolidate project tooling (commit by @saltbo)f134805- release: v2.7.3 (commit by @saltbo)
Docker
docker pull ghcr.io/saltbo/zpan:v2.7.3
docker pull ghcr.io/saltbo/zpan:v2.7.3-cliv2.7.2
v2.7.1
✨ New Features
🐛 Bug Fixes
2e12929- downloads: improve downloader assignment handling (commit by @saltbo)c1cec37- downloads: report downloader transfer speed (commit by @saltbo)7e7eeb4- downloads: expose torrent listen port in docker (commit by @saltbo)475cb46- docker: use host hostname for downloader (commit by @saltbo)5f83099- docker: configure remote downloader runtime (commit by @saltbo)
Docker
docker pull ghcr.io/saltbo/zpan:v2.7.1
docker pull ghcr.io/saltbo/zpan:v2.7.1-cliv2.7.0
💥 BREAKING CHANGES
-
due to
41f3e45- enforce strict RESTful route conventions (commit by @saltbo):all listed API endpoints have changed paths or methods
-
due to
88e65b0- replace /dl/:token with /r/:token unified redirect (v2.4.0 T3) (PR #318 by @saltbo):replace /dl/:token with /r/:token unified redirect (v2.4.0 T3) (#318)
✨ New Features
6de9bbe- add ulink api for the feature editor save (commit by @saltbo)dd7d28a- returns the matter for the create api (commit by @saltbo)98357f0- user demo not allowed change password (commit by @saltbo)0a30c6a- add s3 path-style switch for the storage (commit by @saltbo)6e4eadc- add event worker for the vfs (commit by @saltbo)0e24e91- add authz support by the opa (commit by @saltbo)b817cab- ZPan v2.0 roadmap, architecture, and repo reset (commit by @saltbo)c6f94dc- scaffold v2.0 monorepo with working auth flow (commit by @saltbo)6b93794- add project infrastructure — testing, CI, linting, logging (commit by @saltbo)175c52a- fix CF Pages deployment and update project docs (commit by @saltbo)6b27354- add i18n infrastructure with react-i18next and en/zh locale files (PR #239 by @saltbo)a151090- add Better Auth organization + admin plugins (PR #241 by @saltbo)b2e813d- add S3 service layer and path template engine (PR #243 by @saltbo)b5362e1- add user management API and org quota CRUD (PR #244 by @saltbo)e5b4493- implement admin user management UI with quota settings (PR #246 by @saltbo)892a6fc- implement storage CRUD API with bucket pool selection (PR #249 by @saltbo)9ec5e45- add admin layout with storage management UI (PR #248 by @saltbo)c0daf53- server: implement system options CRUD API (PR #255 by @saltbo)6f9260d- server: implement file CRUD API with presigned URLs (PR #260 by @saltbo)53617e5- web: implement trash page with restore, delete, and empty trash (PR #264 by @saltbo)9216ff0- web: add file preview system for images, PDF, code, audio, and video (PR #265 by @saltbo)a8046c1- web: add admin system settings page for site name and description (PR #270 by @saltbo)f9a36e4- web: integrate SVAR File Manager with upload flow (PR #266 by @saltbo)e66c2e5- web: complete i18n coverage for UI primitives (PR #268 by @saltbo)efec832- Dockerfile + docker-compose for Node.js deployment (PR #271 by @saltbo)1620a2e- server: batch operations API for move, trash, delete (PR #272 by @saltbo)cd764c0- server: recycle bin API for matters (PR #273 by @saltbo)2da0d14- web: migrate to Hono RPC client, eliminate all raw fetch calls (commit by @saltbo)67475be- replace SVAR with custom file manager, path-based navigation, sidebar folder tree (commit by @saltbo)3a3364b- persist sort state in localStorage, add file search filter (commit by @saltbo)6edad56- enforce org storage quota on upload and copy (commit by @saltbo)b73d7a0- server: auto-migrate schema on Node platform boot (commit by @saltbo)b059af1- auth: pin activeOrganizationId on new sessions, tighten personal-org lookup (commit by @saltbo)bce4da3- quota: add default org quota with admin settings UI and db:reset script (commit by @saltbo)3b2fe7f- admin: add storage capacity setting to storage form (PR #275 by @saltbo)903f12b- admin: convert storage form dialog to right-side drawer (PR #276 by @saltbo)5c453bc- settings: implement profile and appearance settings page (PR #277 by @saltbo)3b80eff- migrate from CF Pages to Workers with one-click deploy button (commit by @saltbo)a8f1154- ci: run E2E tests on both Node and CF Workers runtimes (commit by @saltbo)abba373- deploy: auto-select staging env for non-production branch builds (commit by @saltbo)c376f2e- ci: add Codecov coverage reporting and badge (commit by @saltbo)bd26e54- ui: add responsive layout for desktop, tablet, and mobile (commit by @saltbo)6352a8c- ui: adaptive mobile preview with bottom drawer per file type (commit by @saltbo)e3b257e- e2e: add file preview tests with route mocking for S3 (commit by @saltbo)da08b01- auth: add better-auth username plugin (PR #279 by @saltbo)4b20e6b- add email service abstraction with SMTP and HTTP API drivers (PR #280 by @saltbo)97e30a5- add invite code system for registration gating (PR #281 by @saltbo)4a5fbb7- auth: add dynamic OAuth provider system (PR #282 by @saltbo)364cbc2- auth: add registration mode control and email verification (PR #283 by @saltbo)bd30514- auth: sign-in/sign-up UI overhaul (PR #286 by @saltbo)8973453- admin: add auth settings page for OAuth, invites, email, and registration mode (PR #287 by @saltbo)e40ba07- remove Name field from registration form (PR #291 by @saltbo)98059b2- add organizationClient plugin to auth-client (PR #292 by @saltbo)a22448c- add team RBAC middleware for org-level role enforcement (PR #293 by @saltbo)f1604c7- user public share homepage (/u/:...