Project Roadmap 2026
SveltyCMS 2026 roadmap — active backlog and forward-looking initiatives to be implemented. Shipped deliverables live in the Achievements Log.
On this page
This document is strictly the active backlog and forward-looking initiatives to be implemented. For all shipped features, architectural milestones, and performance achievements, see the Achievements Log and Competitive Comparison.
🎯 Priority for Implementers
| Priority | Initiative | Key Deliverables |
|---|---|---|
| P0 | System Language P0 remainder | Finish remaining hardcoded English strings in admin chrome (bun run check:copy) |
| P1 | Quality Gate Type-Checking | Wire svelte-check --threshold error into bun run check to eliminate silent type drift |
| P2 | Commerce Engine Add-Ons | Promotion rule groups (ConditionPlugin), BOGO/tiered discounts, multi-warehouse, FX resolver, and Stripe Billing |
| P2 | Enterprise Cluster & Cloud | Distributed session clustering, Redis pub/sub worker bridge, and Svelty Managed Cloud recipes |
1. Core Architecture & Performance (Active Backlog)
- SQLite Write Tail Acceptance Gate:
- The SQLite group commit batcher is default ON. Finalize acceptance: achieve a replica run free of 🔴 rows and pass
--strict-varianceacross a ≥3-run ensemble.
- The SQLite group commit batcher is default ON. Finalize acceptance: achieve a replica run free of 🔴 rows and pass
- Write-Lane Adaptive Coalescing (2027):
- Shipped adaptive UPDATE lane (
SVELTY_WRITE_COALESCE_UPDATE=1): an update on an idle gate skips the coalescer scheduler hop; once any mutation is in flight, updates coalesce. Inserts/deletes keep their previous scheduling unlessSVELTY_WRITE_COALESCING=1. Metrics:adaptiveUpdates { enabled, immediate, coalesced }. - Evaluate same-tick (
0ms) vs1–2msinsert coalescing windows against 100k and 1M row datasets. - Complete the 1M-row PostgreSQL replica proof.
- Shipped adaptive UPDATE lane (
- Two-Plane Core Phase 5 Verification:
- Run 24-hour PostgreSQL soak with 32 concurrent workers on mixed workloads (
LONG_SOAK_HOURS=24). - Demonstrate noise-aware memory leak proof with a flat native residual (
rss - heapTotal - external) over ≥15-minute steady windows. - Publish networked 4-cell matrix separating Cache-Hit (Cell 1) from Origin-Miss (Cells 2 & 3).
- Add differential wire-vs-domain test coverage for the no-
status-column fail-closed branch.
- Run 24-hour PostgreSQL soak with 32 concurrent workers on mixed workloads (
- Multi-Core Cluster Worker Pub/Sub Bridge:
- Bridge in-process
graphql-yogapub/sub (entryUpdated,yjs:*, SSE) across workers via Redis Pub/Sub when running underSVELTY_CLUSTER_WORKERS.
- Bridge in-process
- API-Only Build Profile (
bun run build:api):- Shipped dedicated headless build profile (
SVELTY_API_ONLY=1) that stubs(app)and(admin)UI route modules with zero runtime UI bundle overhead, leaving API, GraphQL, setup, and auth endpoints fully intact.
- Shipped dedicated headless build profile (
- System Copy & i18n Chrome Completion:
- Reached 100% localization across all 110
(app)files (bun run check:copyreporting 0 offenses) across 8 locales (en, de, fr, es, it, nl, pl, ar).
- Reached 100% localization across all 110
- Multi-Day Memory Soak:
- Execute a 24h+ multi-worker soak row measuring
heapTotal,external, andarrayBuffers. - Add long-horizon memory profiles for non-SQLite engines (PostgreSQL, MariaDB).
- Execute a 24h+ multi-worker soak row measuring
- Engine-Native Capability Gaps:
- Normalise group keys read from JSON extraction types across all SQL adapters to prevent caller post-processing.
- Harden MariaDB dynamic-field filters (
JSON_UNQUOTE) against loose type coercion on numeric vs string comparisons.
- Hardware-Adaptivity Proof On Small Boxes:
- Boot the Linux image in a 256 MB / 1 vCPU container and run the seed + read + write lanes — the built server carries platform-native modules, so the container is where “boots in 256 MB” is demonstrated rather than derived.
- Verify the
index.cjsheap-cap skip path under Phusion Passenger (the guard is unit-adjacent only; thePASSENGER_*branch has no runtime proof yet). - Re-measure the lanes with the entry-applied
UV_THREADPOOL_SIZE: the boot-hook assignment was a runtime no-op until 2026-10-14, so historical local runs used libuv’s default of 4 — fs/crypto-heavy paths (media, audit hashing) are the ones expected to move. - Publish a small-box row in the comparative ledger (1 vCPU / 512 MB, then 256 MB) so the derived budgets stay a measured column instead of a claim.
- Add a CI job that runs the profile under
docker run --memory=256mand asserts the expected tiers, so a future hardcoded budget fails the build. - Derive the adapter-node body ceiling for stacks that never launch through
index.cjs(systemd unit,node build/index.jsdirectly), where the 100 MB default still applies.
- Role-token migration for the remaining admin surfaces: beyond the wizard, ~294
src/Svelte files still paint palette utilities — ≈2 500 pairedsurface-*light/dark classes (concentrated inconfig/design-system/+page.svelte, the widget UIs and older pages; theinput/textarea/select/stepperprimitives are included, so every form inherits them) — plus 38 files / ≈244 legacy-palette usages (gray-*/slate-*pairs,bg-white,dark:bg-[#0d0f12]). The setup wizard is fully migrated and documented as the reference (see style guide); migrate screen by screen with a visual pass, primitives first, and add a budget guard (likeconsolidate-shades) so the raw-class count can only go down.
2. Collection Builder & Content Modeling (Active Backlog)
- Content Hierarchy & Organizational Trees:
- Implement tenant-scoped hierarchical nodes (
folder,tag,term) with two edges:parentIdfor single-parent tree navigation and a membership join table for tags/terms. - Surface sidebar taxonomy filtering across collections and media assets.
- Implement tenant-scoped hierarchical nodes (
- Schema Model Relation & Filter Enhancements:
- Compile relation operators
some,none, andeveryto capped ID lookups (RELATION_FANOUTcap) viasrc/services/sdk/namespaces/collections/relation-filter.ts. - Support nested mutations
{ connect, disconnect, create }with a maximum depth of 2. - Implement
onDeleteschema actions (cascade,setNull,restrict) bounded by a fan-out cap of 100. - Add virtual field support (
type: "virtual") and projection masking (omit/graphql.omit).
- Compile relation operators
- Content write & read correctness:
- Optimistic locking on entry updates (
If-Match/expectedVersion→ compare-and-set,409 VERSION_CONFLICTwithdetails.currentVersion); legacy writes stay last-write-wins. - Revision restore (
POST /api/collections/:c/:id/revisions/:version/restore) plus bounded pruning (revisionLimit, default 100). - Filter-path validation (
400 FILTER_UNKNOWN_FIELD) for unknown keys and unaddressable nested paths. - Access predicate → WHERE fragment merged before count + page (field stripping stays a separate layer).
- Draft version row + publish promotion/rollback (reuse
content_drafts). -
enforceAccessby default for every CRUD call, with a loggedsystem: trueescape for system callers.
- Optimistic locking on entry updates (
- CMS Tables & List Platform (Smart Table):
- Team & Cloud Saved Views: enterprise tenant-shared view presets with RBAC visibility controls.
- Observability integration: pipe
list-query-metricsinto continuous benchmark trend reporting. - Publish formal operational documentation for Bloom filter thresholds and 404 negative cache eviction (see cache system).
3. Media Pipeline Consolidation & GC (Active Backlog)
- Derivative Pipeline Unification:
- Collapse the SIZES ladder and deferred preset passes into a single consolidated, deduplicated pipeline.
- Background precompilation for operator-defined SIZES presets.
- Delivery Boundary & Storage GC:
- Reference-aware version retention and orphan blob release (
media:cleanup,media:sync-status,metadata.processingStatus) — shipped 2026-10-19; see Media System → Processing status, version retention & cleanup. - Implement directory-aware deletion for adapters that support prefix removal (current release is DB-reference-driven because object stores cannot list a prefix portably).
- Automated derivative GC sweep that reclaims disk for deleted parent media beyond the explicit admin command.
- Surface focal-point and watermark coordinates directly in REST/GraphQL image payloads.
- Add ThumbHash LQIP support via the
thumbhashpackage.
- Reference-aware version retention and orphan blob release (
- Media gallery coverage & unimplemented surfaces (2026-10-21):
- Server pagination: the loader reads
?page, preserves the adapter total and the views merge pages; pinned bytests/e2e/routes/mediagallery/media-pagination.spec.ts(2026-10-24). - Server-side search across unfetched pages:
getByFolderhas nosearchoption on all four adapters, so search still ranges over fetched rows. Needs an adapter-level contract +?q=in the loader. - Large-library batched rendering (60-tile window + IntersectionObserver sentinel) pinned by
tests/e2e/routes/mediagallery/large-library.spec.ts. - Client-side pre-upload optimization (Canvas 2D, 1920×1080 clamp, WebP) pinned by
upload-optimization.spec.tsagainst the stored dimensions. - Remote-URL ingestion success + SSRF rejection pinned by
remote-ingestion.spec.ts(real local HTTP peer via the test-only exact-origin allowlist). - Folder drag-and-drop is covered by
move-remote.spec.ts(sveltednd workspace drop target). - Video playback + adaptive HLS:
hls-video-player.svelte(native HLS or lazyhls.js) is mounted from the details modal whenevermetadata.hls.masterexists;POST /api/media/transcodeproduces HLS/MP4 derivatives in the background through ffmpeg and fails closed with503 FFMPEG_UNAVAILABLEwhen the binary is absent. Pinned byvideo-transcode.spec.ts+media-batch-transcode.test.ts. - Batch resize/filter:
batch-processor.svelteis mounted from the gallery selection toolbar andPOST /api/media/batch-processapplies one uniform resize/filter/watermark to ≤100 assets with per-asset results. Pinned bybatch-processing.spec.ts+media-batch-process.test.ts(integration).
- Server pagination: the loader reads
- Large-file upload lanes:
- TUS 1.0.0 resumable uploads (
POST/HEAD/PATCH/DELETE /api/media/tus) with a reload-safe browser client — shipped 2026-10-19. - SigV4 presigned direct-to-storage instructions for S3/R2 (
upload-instructions+direct-upload/complete) — shipped 2026-10-19. - Cloudinary signed direct-upload preset (currently the TUS fallback lane).
- Multi-instance TUS spool: a shared volume or Redis-backed session store instead of the local spool directory.
- TUS 1.0.0 resumable uploads (
4. Commerce Engine Add-Ons (Active Backlog)
- Promotions & Discount Rules:
- Implement
ConditionPluginfor complex promotion rules (cart minimums, coupon combinations, category discounts). - Add BOGO and tiered volume pricing calculations.
- Implement
- Inventory & Payments:
- Multi-warehouse inventory allocation.
- Real-time currency exchange (FX) resolver with caching.
- Stripe Billing recurring subscription webhooks and customer portal integration.
- Durable idempotency storage across server restarts (persisted key locks).
- Database-level conditional stock decrement for multi-node deployments.
- Storefront SEO:
- Inject Schema.org structured data markup (
Product,Offer,AggregateRating) on/shoproutes.
- Inject Schema.org structured data markup (
5. SEO & GEO Engine Enhancements (Active Backlog)
- SEO Config Cascade:
- Implement site → collection → entry defaults for title and description templates with token fallbacks.
- Sitemap Variants:
- Generate specialized image and news sitemap feeds conforming to Google sitemap guidelines.
- Social & Structured Data Automation:
- Automated templated OG social image generation.
- Per-type automatic Article and WebPage JSON-LD extraction from CMS fields.
6. System Language & i18n Workstream (P0–P4) {#system-language-p0-p4}
- P0: Complete EN/DE Coverage:
- Eliminate remaining hardcoded English strings in admin chrome using
scripts/check-hardcoded-copy.ts.
- Eliminate remaining hardcoded English strings in admin chrome using
- P1: EU Pack + Arabic (RTL):
- Complete review and verification of seeded language catalogs (FR, ES, IT, NL, PL, AR).
- P2: Transparent Language HMR:
- Hot-reload language catalogs in development after
bun run paraglidewithout manual server restart.
- Hot-reload language catalogs in development after
- P4: Compliance Documentation:
- Publish verifiable translation workflow documentation and Crowdin integration guide adhering to UWG §6.
7. Quality Gates, Testing & Codebase Hygiene (Active Backlog)
- Type-Checking Gate Integration:
- Wire
svelte-checkinto pre-commit and CI quality gates (bun run check), including a machine-reporter parse (scripts/check/check-svelte-diagnostics.ts) that fails on warnings as well as errors —--threshold warningonly widens output and still exits 0, so it alone was not a gate.
- Wire
- Editorial Journey Matrix (next step for E2E):
- Composite multi-field journey (
kitchen-sink.spec.ts) + zero-error guard + editor-boundary journey + browser-vitality benchmark + widget interaction matrix (2026-10-23, see achievements 3.60). - Extend the composite journey to the remaining widget families:
RichText,Textarea,Select,Date,Tags,MediaUpload,Relation,Repeater— include one uploaded image and one relation row, and assert the unsaved-changes guard. - Add a shared-harness
page.on('pageerror')trap to the whole chromium project (not only the new journeys) once the current console-error allowlist is proven stable. - Tighten the browser-vitality budgets from a recorded baseline (domInteractive < 5 s / fill < 1 s / heap < 180 MB are placeholder ceilings) and add an INP measurement for rich-text typing.
- Browser-mode component tests for
RichText, repeater drag-and-drop, the date picker and the media picker (jsdom cannot exercise layout/pointer behaviour). - Unhappy paths: double submit, browser Back mid-edit, rejected upload, and direct-URL 403 for an editor.
- Composite multi-field journey (
- Shipped —
/useredit dialog & admin table optimization (2026-10-25):- Fixed
modal-edit-form.svelteandmodal-edit-token.sveltereactivity: replaced staticpage.datadestructuring with$derived, guaranteed non-emptyuser_id('self'fallback) foreditUserSchema, guarded$effectseeding by target identity (seededTargetKey) so active user input is never overwritten, and forwardedclose({ success: true })soDialogManagercloses andUserManagementrefreshes rows. Consolidated duplicate token expiry helpers intouser-remote-utils.tsand skipped the redundant mount-timeGET /api/userfetch when SSRinitialUsersis present. See achievements 3.64.
- Fixed
- Integration Test Suite Wall-Time Optimization:
- Consolidate the remaining
prepareAuthenticatedContextcall sites (the per-testbeforeEachwipes incollections,media,system,telemetry,theme,website-tokensare now singlebeforeAllcontexts;tokenkeeps its per-test reset because that reset also clears thecreate-tokenrate limiter). - Remove the remaining redundant
cleanupTestDatabase()hooks inafterAll(19 removed 2026-10-16 — every suite already resets inbeforeAll; the rest do real media/file cleanup). - Move 3 hermetic integration tests (
unified-data-hub/federation.test.ts,resilience-load.test.ts,setup-presets.test.ts) totests/unit. - Collapse SQL adapter smoke tests into a single engine-parameterized contract suite.
- Replace the remaining soft-skips with hard assertions — done for
security,security-negative,collections(now provisions its fixture via/api/testinginstead of a sandbox-blocked file write),auth-2fa,themeand both Unified-Data-Hub federation suites; the harness reset now throws instead of warn-and-proceed. Also de-vacuumedmetrics,search,marketplace,outbox-plugin-storage,settings,dashboard,website-tokens,graphql(tenant-scoped query now gated onMULTI_TENANT), and the DB contract suites (transaction-contract— the concurrent test inserted viadb.crudinstead of the txn handle, so its “rollback leak” was a test bug;pool-contention,health-contract,content-nodes-contract,db-interface,resilience-load,cache-contract). - Replace the remaining fixed sleeps with condition waits (the harness reset path now health-polls; several API suites still pad with fixed waits).
- Consolidate the remaining
- Recently shipped (2026-10-22):
buildFieldSkeleton()seeds every declared field before the first widget mount (fixes the/collection/posts?create=true500 frombind:value={undefined}); session rotation retires the predecessor for a 2-minute grace window andcreateSession({ isRotation: true })skips the device/parallel caps;getFreshLayoutUser()strips credentials before the layout user is serialized into page data; Access Management tabs are static imports so the permissions table is server-rendered; admin tables useSMART_TABLE_*chrome; plugin workspaces render inside the content column instead of a fullscreen overlay; sidebar navigation uses plaingoto()so it reuses the hover preload instead of forcingrefreshAll. - Also shipped (2026-10-22): the remaining client-only config pages (automations + its new editor load, webhooks, trash, workflows, sync, system-settings, extensions, design-system) now return their first payload from
+page.server.ts; the dashboard renderscpu/disk/memory/system-messagestiles during SSR via an eagerimport.meta.globregistry (FirstScreenWidget);/userseedsinitialUsers+initialSessionsthroughgetRequestLocalCMS();(app)/+layout.server.tsno longer duplicatescontentStructure;getStatusFacets()is SWR-cached and the collection warm-up writes the canonical find-cache key; the media gallery and monitor dashboard load in a singlePromise.all; benchmark history is pruned to 50 rows per series per engine. See achievements 3.58. - Open — brand palette vs WCAG AA:
--color-primary-500(oklch(76.87% 0.2296 137.58deg)) cannot be used as text (1.58:1 onsurface-200) or as a white-on-fill badge (1.94:1). Fixing it means darkening the default primary ramp to ≈primary-900luminance or amending the status-shade contract; both change everytext-primary-*usage, so it needs a design decision before the Auth & Branding RTL audit can go green. See achievements 3.59. - Recently shipped (2026-10-18):
src/plugins/init.server.tsmerges a plugin’sindex.server.tswith itsplugin_workspaceslot server;scripts/benchmark-matrix/index.tssplitsFeature HTTP Readto isolate heavy relational and mixed workloads (relational-performance,mixed-workload) into their own sequential lane, eliminating SQLite lock contention under full-matrix runs without lowering reliability guards; server-siderequiredIfandshowIfevaluation added toCollectionsNamespacewrite path with zero hot-path overhead; server-side cookie consent logging wired tosys_consent_auditvia public plugin route/api/plugins/cookie-consent/consentandconsentStorewithallowedOriginsenforcement. - Codebase & Documentation Cleanup:
- Reconcile documented-but-unmounted components (
TokenPickermounted once in(app)/+layout.sveltewithTokenRegistryentry-field registration;two-factor-setup-modaldocumented as superseded bymodal-two-factor-auth). - Prune deprecated zero-caller symbols:
MigrationEngine.executeMigration,buildRawTenantFilter,resolveSameSourceJoinTarget,UpsertOperation. - Prune orphaned scripts (2026-10-18):
analyze-base-metrics.ts,check-deprecated.ts,generate-comprehensive-comparison.ts,provision-e2e.ts,record-cold-warm-benchmarks.ts, plus the one-shot locale codemods (add-page-title-suffix-key.mjs,fix-embedded-expression-messages.mjs,verify-locale-parity.mjs) and the duplicatecreate-app.ts(the published bin iscreate-app.js). - Validate inline code paths: resolve 107 stale inline
`src/…`references in docs and add verification totests/lint-docs.ts. - Wire up server-side cookie consent logging in
src/plugins/cookie-consent/api.server.ts.
- Reconcile documented-but-unmounted components (
- State Migration:
- Migrated legacy stores (
systemState,overallState) insrc/stores/system/state.svelte.tsto Svelte 5 runes ($state(),$derived()), fully eradicatingsvelte/storewith internal native#listenerssubscription support.
- Migrated legacy stores (
8. Enterprise, Security & Community (Active Backlog)
-
Row-level access as a query constraint:
-
ACCESS_RULESprivate setting compiles per-collection/per-role read rules into a WHERE fragment merged before pagination, keyset cursors,COUNT(*)and streaming; also enforced on single/bulk update and delete. Dynamic tokens:$user._id,$user.role,$tenant.id. Shipped 2026-10-19 (src/services/security/access-rule-service.ts). - Write rules beyond read (create/update/delete per row) and operator support (
$ne,$inbeyond arrays, relation traversal). - Admin UI for rule authoring with validation and a preview of the generated filter.
-
-
Third-Party Security Audit — posture: Security posture:
- Commission an independent external penetration test prior to enterprise GA. Not performed as of 2026-10-18.
-
Cryptographic agility (PQC readiness) — reference: Quantum security:
- Key-ID envelopes (
v2:<keyId>:…, binary key IDs,SCHB2backups) and a configured decrypt ring (*_KEY_RING). Shipped insrc/utils/security/envelope.ts; rotation is now a two-phase operation. - Hybrid at-rest envelope (AES-256-GCM payload under a random DEK, DEK wrapped with ML-KEM-768 + HKDF). Primitive shipped in
src/utils/security/hybrid-kem.ts; opt-in for backups viaPQC_HYBRID_BACKUPS=trueand collection fields viaPQC_HYBRID_FIELDS=true(src/utils/security/field-encryption.ts). - Optional SHA-384/SHA-512 checksum profile (
CHECKSUM_ALGORITHM) for new artifacts; legacy bare-hex values still verify as SHA-256. The append-only audit chain stays SHA-256. - Pin the documented parameters with
crypto-inventory,key-ring,hybrid-kemandchecksum-profiletests; extend them when an envelope format changes.
- Key-ID envelopes (
-
GraphQL Supergraph:
- Apollo Federation v2 compatibility for multi-service enterprise architectures.
-
Cross-Source Data Merge (v3.1):
- Federated queries across heterogeneous databases.
-
Community & Launch:
- Framework quickstart guides (Next.js, Astro, Nuxt, SvelteKit consumers).
- Marketplace static OpenGraph card synchronization on live docroot.
- Interactive “Was this page helpful?” feedback component on docs routes.
- Public ecosystem launch (Product Hunt, Hacker News, awesome-cms).
9. AI Provider Architecture (Active Backlog)
Based on publicly available release notes for Drupal AI 1.5.0 (Workflows of AI, 2026-10-12). Adopted items are recorded in achievements-2026 §3.53.
- Provider port:
- Extracted typed
AiProviderinterface (src/services/ai/ai-provider.ts) defining generate/chat/embed/usage contracts with OpenTelemetry GenAI naming, decoupling inference callers from specific LLM vendors with server-side provider resolution.
- Extracted typed
- ChatProcessor seam:
- Moved
/api/chatbehindChatProcessorinterface (src/services/ai/chat-processor.ts,AI_CHAT_PROCESSORsetting) with pluggable custom processor registration and abort handling.
- Moved
- ChatMemory:
- Persisted conversation threads server-side (
src/services/ai/chat-memory.ts), scoped bytenantId+conversationIdwith L1/L2 cache, 24h TTL, 40-turn / 8k / 32k window, andPOST /api/ai/chat/reset.
- Persisted conversation threads server-side (
- Streaming guardrails:
- Deterministic
redactSecrets()and chunk-safecreateStreamRedactor()(src/utils/security/stream-redaction.ts) applied across chat responses, SSE streaming, and content events.
- Deterministic
- Moderation fail-closed:
- Fail-closed
moderateAiText()(src/services/ai/moderation.ts) with private-setting / env config andMODERATION_UNAVAILABLEon provider downtime.
- Fail-closed
- Reranker: re-order semantic-index candidates by answer relevance (top-N configurable), keeping keyword scores as the fallback.
- Token budgets: per-tenant daily token ceilings derived from the existing quota primitive, surfaced in the admin dashboard.
- Exporter: optional OpenTelemetry OTLP export for the
gen_ai.*attributes already emitted (currently structured logs only).
10. UX & Design-System Consistency (Active Backlog)
Findings from the 2026-10-24 theme/UX review that need a design decision or a cross-page refactor (the chrome, status-shade and control-size items shipped in §3.63 of the achievements log):
- Permissions matrix: the access-management permissions table is still bespoke. Move it onto
SmartTableShell(or the native table primitives) so sorting, empty state and responsive overflow match the other admin lists. - Save models: the Design System page exposes three separate save paths (user overrides, admin theme, preset import). Define one dirty-state/save contract and make the action bar consistent across them.
- SmartTableShell adoption: media table, trash, queue and webhook logs still hand-roll their tables. Adopt
SmartTableShell(including its unusedtoolbarslot) so list chrome has one owner.