Skip to content
CelPlume
select · Enteropen · Escclose Powered by Pagefind

Implementation Progress

Scope, status, audit closure, and roadmap.

MarkMeaning
DoneImplemented, tested, and verified.
In progressImplemented; verification or polish is pending.
PlannedScoped but not yet built.
RejectedExplicitly out of scope.
PhaseScopeStatus
Phase 1Core platform: auth, files, quotas, roles, storage sources, system settingsDone
Phase 2Uploads (multipart/resume), previews, shares, admin panels, API keys, WebDAV, free modeDone
Phase 3AWS S3, appearance theming, admin logins, announcement dismissalMostly done; Oracle provider pending
Phase 4Path-variable DSL ({year}/{month}), analyticsPlanned
AreaStatusNotes
Deployment: Cloudflare Pages + WorkersDoneVercel and EdgeOne rejected.
Storage providersDoneR2 and S3 implemented; Oracle pending; 9 other providers rejected.
File browse (card/list views)DoneGET /api/files, sort, search, pagination.
Upload (single file)DoneSession-based with quota reservation.
Upload (multipart / large files)DoneResume + server-side part records.
Hard deleteDoneMetadata-first transaction, async object cleanup.
RenameDonePUT /api/files/:id.
Move (Saga)DoneSource-delete + target-write permission checks.
Previews: image / video / audio / codeDoneImage zoom/rotate; video canvas thumbnails; highlight.js with pre-escaping.
Selection and multi-selectDoneGrid + list, range selection in list view.
Drag sort and drag moveIn progressDrag move works; verification notes pending.
View memory per folderDoneStored in localStorage.
Properties panelDoneSticky sidebar (desktop) and right drawer (mobile); title/color/cover/emoji editing.
Copy linksDoneMulti-file dialog; direct/HTML/Markdown/BBCode; direct public path or signed URL.
SharesDonePassword, expiry, download limits, QR code.
AppearanceDoneLight/dark/system, accent color (HSL + YIQ foreground), blur, background image/URL, folder preview switch. Solid-color background removed.
i18n (zh / en)Done
Responsive layoutDoneDesktop/tablet/mobile; floating action bar tested at 350-1080 px.
UsersDoneRegister, login, email verify, guest role, free mode.
Permissions and quotasDone3 roles, path ACLs, file/path passwords, storage and file-count quotas. Download speed and monthly traffic quotas rejected.
Storage configurationDoneMounts, upload/CDN domains, path prefix, sort, signing. Same-path multi-mount and path DSL pending.
AdminDoneDashboard, users, storage, mounts, rules, shares, files, logs. Analytics pending.
System settingsDoneSite info, registration/guest toggles, Turnstile.
API keys + compatible protocolsDonepk_x.sk_y opaque tokens, WebDAV, PicGo/PicList. S3/OSS protocol gateway rejected.
SecurityDoneCSP, CSRF, rate limiting, path traversal, SSRF, SQL parameterization, atomic download tokens. Hot-file detection and forced signed URLs planned.
Image editor link (Squoosh)Done
Video/audio playersDone
DecisionReason
Recycle binRemoved to avoid soft-delete inconsistency between object storage and database.
Download speed / monthly traffic quotasOnly storage size and file-count quotas are needed.
S3 / OSS protocol gatewayOnly WebDAV and the custom upload API are provided.
9 additional providers (B2, IDrive, GCS, COS, OSS, OBS, Scaleway, Filebase, Kodo)Not in scope.
Client-side encryptionOut of scope; sensitive-path links require signed URLs instead.
Vercel / EdgeOne hostingCloudflare only.

Findings were remediated and locked with regression tests. See workers/tests/security-regressions.test.ts, workers/tests/s3-provider.test.ts, frontend/src/lib/escape.test.ts, and frontend/src/pages/Register.test.tsx.

RiskFixEvidence
Free-mode credentials stored in plaintext in KV (high)AES-256-GCM encryption with short TTL, random sid cookie, IP bindingEncrypt/decrypt/tamper cases
API-key IP allowlist not enforced (high)apiKeyAuthMiddleware returns 403 for non-allowlisted IPsIn/out allowlist cases
Multipart parts always empty, no resume contract (high)Server-side parts_completed, GET /parts resume contract, skip pre-HEAD mergeResume flow: gap → reject → complete
/register missing, forgot-password placeholder (high)Standalone /register and /reset-password pages calling the real APIsRegister submit/error cases
Download token consumed non-atomically (medium)KV get→delete replaced with atomic DELETE ... RETURNINGSingle-consumption and duplicate-401 case
Rate limiting fail-open (medium)Auth/sensitive write endpoints fail closed (503) on KV failureKV failure in production case
S3/Oracle provider tests + capability matrix (medium)Presigned multipart URL unit tests (local signing); Oracle pendingS3 provider cases
highlight.js escaping + frontend regression (medium)escapeHtml pre-escaping as defense in depthEscape cases
CI/CD + coverage gate (medium).github/workflows/ci.yml (bun, CI only), frontend coverage gate, route lazy loadingCoverage lines 100%
  • Backend: 127 Vitest tests pass; tsc --noEmit clean.
  • Frontend: 7 Vitest tests pass; build succeeds; tsc --noEmit clean.
  • Language: zh + en.
  • Oracle Cloud provider implementation.
  • Same-path multi-mount support.
  • Path-variable DSL ({year}/{month}).
  • Admin analytics.
  • Hot-file detection and forced signed URLs.
  • Ongoing verification notes for drag interactions and property-panel editing.

Related guides: architecture, API reference, frontend guide, development guide, deployment guide.