Roadmap
Devora.js is early and pre-1.0, built by one person. This page says what has shipped, version by version, and what is next. Every block below is taken from the changelog and the git tags (v0.3.2, v0.3.4 and v0.3.5 are the only tags).
The same content lives in ROADMAP.md on GitHub; the long, dated account of how each piece was built is the build log.
Done, by version
0.3.5
2026-10-16tag v0.3.5- Faster request handling in devora start: work that never changes per request is done once. Interleaved A/B on one machine: +15% JSON list, +32% authenticated GET, +21% POST, +41% pre-rendered page, +23% server-rendered page; form POST about 32,000 to 82,000 req/s. No security default weakened.
- A missing session store or secret stops devora start with one clear line; the header brand link's accessible name contains its visible text.
- Guides for Live updates (WebSockets) and Background jobs, a new examples/background-jobs, backend benchmark scenarios, and a restored roadmap.
- Packages: @devorajs/core 0.3.5, @devorajs/cli 0.3.5, create-devora 0.3.3; the adapters are unchanged.
0.3.4
2026-10-16tag v0.3.4- Catch-all routes ([...slug], [[...slug]]) for pages and API routes; ctx.params stays a string, the array is ctx.catchAll.
- Faster pre-rendered pages (served from memory with ETag and compression), correct content types, sitemap URLs from getStaticParams().
- A documented live-updates pattern with a runnable example; publish scripts refuse to publish an empty dist/.
0.3.3
Never published- Prepared and rolled into 0.3.4.
0.3.2
2026-10-12tag v0.3.2- Request access in loaders and actions, action results (fail(), 303 redirects), error pages, the head API, uploads, CORS, .env loading.
- Cookie and proxy settings; the Vercel runtime is no longer hard-coded; the first published @devorajs/adapter-node.
- Adapters 0.2.0 and 0.2.2 had been published without their build output and were replaced by 0.2.1 and 0.2.3.
0.3.1
2026-09-24- create-devora scope: --scope=fullstack|frontend|backend; devora --version reports the real version.
- The Vercel and Netlify adapters no longer fail on a backend-only app.
0.3.0
2026-09-23- Breaking: unified session auth — opaque IDs in a SessionStore you provide, one lookup for cookie and Bearer, revocation.
- api/** always answers JSON; devora dev --host; dev ports start at 10000.
0.2.2 and 0.2.1
2026-09-16- @devorajs/core 0.2.1 (footer structure in the branding component) and 0.2.2 (footer styles and a package exports restructure). The CHANGELOG notes for them were reconstructed from git history and npm publish times.
0.2.0
2026-09-16- The v2 backend: defineModule(), API routes, middleware, backend-only apps, getStaticParams() for ssg/isr.
- Repo-splitting (devora split, sync, status) and the streaming render mode.
- A security audit pass: cross-app cookie binding, request-body caps, path-traversal fixes, a 405 for undeclared API methods.
0.1.x
- 0.1.1 and @devorajs/cli 0.1.2 (2026-09-08): the npm scope became @devorajs, the shared scaffold package, per-package READMEs.
- @devorajs/core 0.1.2 (2026-09-09): dynamic routes and the devora deploy fixes of that day; its CHANGELOG note was reconstructed from git history.
- 0.1.0: the CHANGELOG records only the initial commit, 2026-09-07 (SSR/SSG/CSR/ISR, islands, sessions, security headers, SEO, the CLI, the three adapters), without a version number.
- 2026-09-09 has an entry (a CI fix, docs) with no version bump.
What is ahead
Now
- Outside testers: the 15-minute guide; what they hit shapes the next releases.
- Deploy this site with the numbers measured on the published 0.3.5 packages, and the release post.
- Verify 0.3.5 on a live Vercel and Netlify deployment (finding N1).
Later
- A third-party security audit and signed release provenance, once the API surface settles.
Not planned
- A built-in ORM, auth provider or file storage (bring your own).
- A real-time sync engine (use a realtime server: Live updates (WebSockets)).
- A custom RSC-style server/client serialization protocol.
Next: open findings, proposed order
A proposal for the maintainer to confirm or change, ranked by impact. Nothing here has a version or a date. Y1, Y6 and O2 stay Unconfirmed and are not ranked.
| Order | Finding | Why it ranks here |
|---|---|---|
| 1 | N1: 0.3.5 not verified on a live deployment | Every deploy claim depends on it |
| 2 | B5: several Set-Cookie headers and SSE from API routes | A real capability gap testers hit |
| 3 | O4: the scaffold writes @devorajs/backend into new projects | The name could collide with a future real package; harder to change later |
| 4 | U13, U14: an official session-store pattern or package; a built-in health route | Every production app needs both |
| 5 | P14: adb reverse docs for testing on a physical device | Small, docs only |
| 6 | U4: apiRoute() catches errors itself, so an outer wrapper cannot see them | Surprising for logging and monitoring wrappers |
| 7 | O5: signSession and verifySession still exported (deprecated) | A removal is a breaking change |
| 8 | V6, Y2: one large function per app; backend duplicated per app | Never measured; measure first |
| 9 | N3, X2: isr regeneration on a serverless filesystem | Verified only under adapter-node |
| 10 | N2, N4, N5: container platforms, systemd unit, DB client under load | Need real hosts or load tests |
| 11 | U9, X1: the CLI bundles core; dynamic ssg/isr needs getStaticParams() | By design; documented, not defects |
Vision (not started, no dates)
A desktop app and a native mobile app. If they happen, business logic, the backend client, validation and design tokens would be shared and the UI would be platform-specific. React was chosen partly to keep that door open.
Ideas (open, not promised)
Nothing here is planned, scheduled or numbered.
- Example: an idea goes here as one line, with no version and no date.
Performance program
The aim is to close the gaps and publish measured results, including where Devora.js is behind. Numbers come from the benchmark harness and are never edited by hand. After the first pass (published 0.3.5; a difference inside a framework's own run-to-run spread counts as a tie), Devora.js is ahead of the other four frameworks on the pre-rendered page, the server-rendered page and the form POST; on the JSON API scenarios it is behind Fastify, Hono and NestJS on Fastify, and level with four frameworks on the 2 ms async scenario (findings S1 to S4).
Definition of success
From architecture-v1 §14: v1 is "done" when a solo or small team can build a real project with a marketing site, an app and an admin panel sharing auth and a core, deploy each independently, get good SEO out of the box, and not hit a single window is not defined crash from a client library, all without reading framework internals to understand why something cached or didn't. Five things must all be true at once:
- Routes actually render (SSR, SSG, CSR, streaming, ISR per
renderMode). SSR and SSG/CSR/ISR were done in v1; streaming was deferred from v1 and shipped in v2. - Auth and session context is real, shared by default, isolable per app. Done.
- Client-only libraries (three.js, fabric.js) never crash on the server. Done;
clientOnly()is verified with a real negative control. - Each app deploys independently to at least one real target. Done: adapter-node, Vercel and Netlify were deployed live by the maintainer with releases before 0.3.2, by git integration and by
devora deploy. 0.3.4 is not yet verified on a live deployment by this project. - SEO primitives work: OG tags and a per-app opt-in
sitemap.xml, both verified.
Status board
Done: built and verified
- SSR, SSG, CSR, ISR and streaming rendering
- Sessions, CSRF, per-app auth modes (shared, isolated, none)
- Security headers (CSP, HSTS, X-Frame-Options) on by default
- Islands and partial hydration, in dev and production
- SEO primitives: OG tags, opt-in
sitemap.xml - Dynamic routes with
getStaticParams(); catch-all routes ([...slug],[[...slug]]) since 0.3.4 - v2 backend: modules, API routes, middleware, backend-only apps, repo-splitting
- 0.3.2: request access, action results, error pages, head API, uploads, cookie and proxy settings, CORS,
.envloading,@devorajs/adapter-node - 0.3.4: catch-all routes, the static file cache, content types, sitemap URLs, the live-updates pattern
- 0.3.5: faster request handling, one clear message for a missing session store, guides for live updates (WebSockets) and background jobs
clientOnly(); thedevoraCLI under npm, Yarn and pnpm- adapter-node, adapter-vercel, adapter-netlify: build output verified in isolation
- Live Vercel and Netlify deployment (all three apps) with releases before 0.3.2
devora deploy: a real authenticated deploy on both platforms before 0.3.2- Docker, self-hosted VPS (nginx and Caddy; systemd unit template untested), GitHub Actions CI
In progress / partial
- 0.3.5 on a live Vercel or Netlify deployment: not yet verified by this project
isron Vercel and Netlify: the initial build serves correctly; ongoing regeneration on a non-persistent serverless filesystem is unverified- Domain auto-binding for a
devora deploy-managed app: not built, deliberately scoped out
Known gaps, not scheduled
- Several
Set-Cookieheaders and streamed (SSE) responses from API routes - Moving the
esbuildoverride out ofpackage.json's"pnpm"field (pnpm 11 ignores it)
Planned
- A formal third-party security audit and signed release provenance, once the API surface stabilizes
Deliberately not planned
- A built-in ORM, auth provider or file storage
- A real-time sync engine
- A custom RSC-style serialization protocol
Planned goals, not started
- Desktop and native mobile apps. Nothing exists and there are no dates. React was chosen partly to keep that door open.
The 14 work items
Each is described in the build log as it was when it landed.
| # | Item | Status | Section |
|---|---|---|---|
| 1 | SSR request handler (blocks nearly everything else) | done | Build log #1 |
| 2 | Request context (ctx.requireAuth() / ctx.session) | done | Build log #2 |
| 3 | Islands / partial hydration | done, in both dev and production | Build log #3 |
| 4 | Adapters: real build output, not just config | done, including real live Vercel and Netlify deployments | Build log #4 |
| 5 | CSP/HSTS enforcement | done | Build log #5 |
| 6 | DB client | checked; a real issue was found, and a verified fix is now documented as a guide | Build log #6 |
| 7 | SEO primitives | done | Build log #7 |
| 8 | devora CLI bin | done | Build log #8 |
| 9 | clientOnly() verification | done | Build log #9 |
| 10 | Redirects, login/logout, CSRF, Secure cookie | done | Build log #10 |
| 11 | entry-server.tsx de-duplication | done (pure refactor, prerequisite for #10/#12) | Build log #11 |
| 12 | Render modes: ssg, csr, isr real; streaming explicitly deferred to v2 | done | Build log #12 |
| 13 | Multi-app-aware Vercel/Netlify | done, including a real authenticated deploy on both platforms | Build log #13 |
| 14 | Three more environments tried for real — Docker, a bare VPS (nginx/Caddy), CI | done | Build log #14 |
Live deployment history
- Vercel, git integration: all three demo apps live with releases before 0.3.2. Two bugs only a live deploy found were fixed:
Cannot find package 'react'andjsxDEV is not a function(NODE_ENVunset in the build step). - Netlify, git integration: all three demo apps live, before 0.3.2. Found live and fixed:
Could not resolve entry module "index.html"(a build-output-onlynetlify.toml), thenpackage.jsonandnode_modulesinincluded_files(2026-09-16). devora deploy: a real authenticated deploy on both platforms, before 0.3.2. Domain auto-binding not built.- Docker: real build, run and compose; login, CSRF and tampered-cookie regression inside the container; all three apps concurrently. Container platforms (Cloud Run, App Runner, Azure Container Apps) not verified.
- VPS:
devora generate:proxyverified against a real local nginx andcaddy validate. The systemd unit template is untested on a host. - CI: builds every app under npm, Yarn and pnpm, both adapter targets, and typechecks fresh scaffolds.
- 0.3.5 live: not yet verified on a live deployment by this project. Generated functions were run outside the monorepo only.
Findings
88 findings from the pre-v3 hotfix list, hotfix round 3 and VERIFICATION.md. Fixed means a release plus a file, test or changelog line that proves it; Unconfirmed means never reproduced or checked, and is not guessed.
| ID | Finding | Status | Version | Evidence | Described in |
|---|---|---|---|---|---|
| P1 | Published package was behind the docs (core 0.1.2 lacked defineModule/apiRoute) | Fixed | 0.3.0 | create-devora pins ^0.3.0 (CHANGELOG 0.3.0); core 0.3.0 to 0.3.5 are on npm. The suggested CI check that fails a docs deploy when versions differ does not exist. | pre #1 |
| P2 | apiRoute() was a no-op; uncaught errors leaked HTML to API clients | Fixed | 0.3.0 | packages/core/src/httpError.ts + apiRoute.ts wrapper; real-server tests devServer/prodServer.integration (JSON 500, message hidden in production); CHANGELOG 0.3.0 | pre #2 |
| P3 | Dev server localhost-only; no --host, no LAN URL | Fixed | 0.3.0 | devora dev --host, packages/cli/src/server/devNetwork.ts; CHANGELOG 0.3.0 | pre #3 |
| P4 | No route listing on dev boot | Fixed | 0.3.0 | CHANGELOG 0.3.0 (boot output includes each app's route table); packages/cli/src/terminal/bootSummary.ts | pre #4 |
| P5 | Hand-rolled Bearer tokens never expire, cannot be revoked | Fixed | 0.3.0 | Superseded by the unified session auth: opaque IDs in a SessionStore, active/idle/dead states, ctx.revokeSession(); CHANGELOG 0.3.0 (breaking) | pre #5 |
| P6 | Unmatched /api/** returned HTML | Fixed | 0.3.0 | isApiPath() in packages/core/src/apiRoute.ts; prodServer.integration test 'unmatched /api/** paths are a JSON 404' | pre #6 |
| P7 | Cookie-only auth, no Bearer support | Fixed | 0.3.0 | One lookup for cookie and Authorization: Bearer; CHANGELOG 0.3.0 | pre #7 |
| P8 | Action return values discarded; loaders had no query string | Fixed | 0.3.2 | actionData / fail() / 303, ctx.url (CHANGELOG 0.3.2, Request access and Actions return data) | pre #8 |
| P9 | No <head> customization hook | Fixed | 0.3.2 | Head API: defineApp({ head }) and meta().head (CHANGELOG 0.3.2) | pre #9 |
| P10 | No backend 'batteries' (logging, CORS, rate limiting, validation, uploads, jobs, realtime, email, test utilities) | Partly fixed | 0.3.2 / 0.3.4 | CORS (0.3.2), multipart uploads (0.3.2), realtime pattern (0.3.4, docs/guides/REALTIME.md), background jobs (three tested patterns, docs/guides/BACKGROUND-JOBS.md) and the /backend-capabilities docs page. Pagination helpers, background jobs, email, test utilities: not built, no plan. | pre #10 |
| P11 | Default dev port collisions | Fixed | 0.3.0 | Ports 10000 + index, devPort, fall-forward with a log line; CHANGELOG 0.3.0; devNetwork.ts | pre #11 |
| P12 | create-devora all-or-nothing, no frontend- or backend-only mode | Fixed | 0.3.1 | --scope=fullstack|frontend|backend; CHANGELOG 0.3.1 | pre #12 |
| P13 | Dev LAN exposure needs an explicit, opt-in posture and a warning | Fixed | 0.3.0 | --host opt-in only; one-line warning when bound beyond loopback; CHANGELOG 0.3.0 | pre #13 |
| P14 | 'Testing on a physical device' (adb reverse) is undocumented | Open | - | No 'adb reverse' text exists in this repo or the docs site (searched both). | pre #14 |
| C1 | No route listing on dev boot | Fixed | 0.3.0 | Same as P4 | r3 confirmed 1 |
| C2 | Dev server localhost-only | Fixed | 0.3.0 | Same as P3, P13 | r3 confirmed 2 |
| C3 | No native Bearer auth | Fixed | 0.3.0 | Same as P7 | r3 confirmed 3 |
| C4 | apiRoute() leaked HTML errors | Fixed | 0.3.0 | Same as P2 | r3 confirmed 4 |
| C5 | An isolated app's session could be replayed with a shared app's cookie | Fixed | 0.2.0 | CHANGELOG 2026-09-16: cookies are cryptographically bound to their own cookie name | r3 confirmed 5 |
| C6 | CSRF skipped for Bearer, enforced for cookies | Fixed | 0.3.0 | CHANGELOG 0.3.0: verifyCsrf() skipped for Bearer-authenticated requests | r3 confirmed 6 |
| B1 | No head hook; framework injected body{display:flex} and favicon unasked | Fixed | 0.3.2 | Head API; stylesheet and favicon only on pages rendering PageShell/AppHeader (CHANGELOG 0.3.2 Behavior changes) | r3 broken 1 |
| B2 | Loaders had no query string, headers or client IP | Fixed | 0.3.2 | ctx.url, ctx.headers, ctx.ip, ctx.method, ctx.request (CHANGELOG 0.3.2) | r3 broken 2 |
| B3 | Actions could only redirect | Fixed | 0.3.2 | actionData and fail() (CHANGELOG 0.3.2) | r3 broken 3 |
| B4 | island() found only in route files; islands are separate React roots | Partly fixed | 0.3.2 | Islands found in every imported module and checked with the parser (CHANGELOG 0.3.2). Islands still have no shared React context; the documented workaround is a shared store or browser events. | r3 broken 4 |
| B5 | API responses fully buffered: no SSE from an API route, one Set-Cookie (WebSockets: a separate realtime server and ws through a wrapper both work) | Open | - | No text/event-stream or WebSocket code in packages/ (searched). WebSockets: documented pattern with a separate server (0.3.4, docs/guides/REALTIME.md). A handler still sets headers as a plain object, so one Set-Cookie. | r3 broken 5 |
| U1 | Cookie Secure flag hardcoded to production; plain-HTTP logins fail | Fixed | 0.3.2 | sessions.cookie.secure: true | 'auto' | false, trustProxy (CHANGELOG 0.3.2) | r3 unconfirmed 1 |
| U2 | Errors thrown in page actions became generic 500s; redirect after POST was 302 | Fixed | 0.3.2 | HttpError keeps its status, error.tsx, 303 (CHANGELOG 0.3.2 Behavior changes) | r3 unconfirmed 2 |
| U3 | Page actions could not receive file uploads | Fixed | 0.3.2 | Multipart uploads as File objects, maxBodyBytes (CHANGELOG 0.3.2) | r3 unconfirmed 3 |
| U4 | apiRoute() catches errors itself, so a wrapper outside it cannot see the original error | Open | - | packages/core/src/apiRoute.ts still returns apiErrorResponse(err) from inside the wrapper. A wrapper inside apiRoute() sees the error; outside it sees a JSON response. By design, not re-decided. | r3 unconfirmed 4 |
| U5 | devora build executed every server file, even request-time-only ones | Fixed | 0.3.2 | 'devora build only imports ssg/isr routes' (CHANGELOG 0.3.2 Behavior changes) | r3 unconfirmed 5 |
| U6 | Type definitions broke tsc --noEmit in consuming apps (CsrfField returned unknown) | Fixed | 0.3.2 | CsrfField returns ReactElement (packages/core/src/csrf.ts:51; CHANGELOG 0.3.2 Types); CI typechecks fresh scaffolds (scripts/typecheck-fresh-scaffold.mjs) | r3 unconfirmed 6 |
| U7 | devora start ignored PORT/HOST | Fixed | 0.3.2 | CHANGELOG 0.3.2: devora start reads PORT and HOST | r3 unconfirmed 7 |
| U8 | --adapter accepted any value silently | Fixed | 0.3.2 | CHANGELOG 0.3.2 Behavior changes; CLI test 'rejects an unknown adapter before building anything' | r3 unconfirmed 8 |
| U9 | The CLI bundles its own copy of core | Open | - | By design: packages/cli/build.mjs inlines @devorajs/core. A core fix reaches dev/start only with a CLI release; the upgrade steps say to upgrade both together. | r3 unconfirmed 9 |
| U10 | Dev server silently moved to another port | Partly fixed | 0.3.0 | Falls forward with a log line (CHANGELOG 0.3.0); no strict option for an explicit devPort. | r3 unconfirmed 10 |
| U11 | React-18-only peer range, no engines field | Fixed | 0.3.2 | peer ^18.3.0 || ^19.0.0; engines node >=20 (CHANGELOG 0.3.2) | r3 unconfirmed 11 |
| U12 | Error messages pointed to ROADMAP.md | Fixed | 0.3.2 | CHANGELOG 0.3.2: error messages link the docs | r3 unconfirmed 12 |
| U13 | No official session store | Open | - | No store package ships; patterns in packages/backend/AUTH.md and the docs site /deployment page. | r3 unconfirmed 13 |
| U14 | No built-in health-check route | Open | - | A backend-only app answers GET / with a JSON status (CHANGELOG 0.3.2); no dedicated /_devora/health route. | r3 unconfirmed 14 |
| V1 | Adapter hardcoded the discontinued nodejs20.x runtime | Fixed | 0.3.2 | CHANGELOG 0.3.2: vercel.runtime, else running Node major, else engines.node, else nodejs24.x | r3 V1 |
| V2 | apps/<name>/api collides with Vercel's reserved api/ folder | Fixed | 0.3.2 | apiDir (new apps use endpoints/); preflight warns about a top-level api/ (CHANGELOG 0.3.2) | r3 V2 |
| V3 | Scaffolded vercel.json not workspace-aware; no --out | Fixed | 0.3.2 | devora build --out <dir> with --adapter=vercel --app=<name> (CHANGELOG 0.3.2) | r3 V3 |
| V4 | No documented build hook for codegen on a clean checkout | Fixed | 0.3.2 | defineApp({ prebuild: [...] }) (CHANGELOG 0.3.2) | r3 V4 |
| V5 | Misleading adapter log line 'NOT deployed ... see ROADMAP.md #4' | Fixed | 0.3.2 | Log line replaced (CHANGELOG 0.3.2); the string no longer exists in adapters/ or packages/ (searched) | r3 V5 |
| V6 | Single 17 MB function per app | Open | - | Still one function per app; size and cold start under an ORM were never measured. | r3 V6 |
| V7 | Suggested preflight check before a Vercel build | Fixed | 0.3.2 | Preflight checks: runtime, api/ at the Vercel root, session secret per auth mode, --out location (CHANGELOG 0.3.2) | r3 V7 |
| V8 | ESM bundle broke CommonJS dependencies at first request (pg) | Fixed | 0.3.2 | createRequire banner in both esbuild passes of both adapters (CHANGELOG 0.3.2; adapters/adapter-vercel/src/bundleForDeploy.ts; runtime.test.ts) | r3 V8 |
| K1 | No SameSite / noindex / per-app session lifetimes | Fixed | 0.3.2 | cookie.sameSite, security.noindex, activeSeconds/idleSeconds (CHANGELOG 0.3.2) | r3 K1 |
| K2 | island() discovery silent outside route files | Fixed | 0.3.2 | Same as B4; unsupported island() calls fail the build with file and line | r3 K2 |
| K3 | Route-imported CSS not linked in SSR/SSG HTML | Fixed | 0.3.2 | docs/guides/PAGES.md 'CSS imported by a route'; build writes dist/server/route-css-manifest.json | r3 K3 |
| K4 | No built-in CORS helper | Fixed | 0.3.2 | defineApp({ cors }) (CHANGELOG 0.3.2); packages/core/src/cors.ts | r3 K4 |
| K5 | Monorepo .env convention undocumented | Fixed | 0.3.2 | .env files loaded by dev, build, start, deploy (CHANGELOG 0.3.2) | r3 K5 |
| K6 | API-only apps pre-render / | Fixed | 0.3.2 | A backend-only build prints no 'pre-rendered' line (run during this audit on a fresh backend scaffold) | r3 K6 |
| K7 | Questions Khepra asked the team | N/A | - | Questions, not defects; answered by the 0.3.2 settings above. | r3 K7 |
| Y1 | Dependency bundling for native addons / ORM engines on serverless | Unconfirmed | - | Never confirmed by a failing deploy; no test bundles a native addon. | r3 YallaDo |
| Y2 | Backend code duplicated per app in the production bundle | Open | - | Not measured; each app is built separately. | r3 YallaDo |
| Y3 | No automatic .env loading | Fixed | 0.3.2 | Same as K5 | r3 YallaDo |
| Y4 | Fresh project did not typecheck (loose types) | Fixed | 0.3.2 | Same as U6; scaffolds ship typescript, @types/* and a typecheck script (CHANGELOG create-devora 0.3.1 entry) | r3 YallaDo |
| Y5 | devora add api generated unneeded page-app files | Fixed | 0.3.2 | devora add --kind=pages|api (CHANGELOG 0.3.2) | r3 YallaDo |
| Y6 | Transient 'invalid hook call' on first dev load (Vite re-optimization) | Unconfirmed | - | Not reproduced in this audit; no documented note in the docs. | r3 YallaDo |
| Y7 | CSRF cookie set on JSON responses to Bearer-only clients | Fixed | 0.3.2 | csrf: false per app (no CSRF cookie issued; CHANGELOG 0.3.2) | r3 YallaDo |
| Y8 | Docs contradicted each other on streaming maturity | Fixed | 0.3.5 | Every current document says streaming shipped in v2 (GET-only; buffered on Netlify); the old "deferred" wording is kept only in dated history (BUILD-LOG items, docs/history/CLAUDE-repo-state-archive.md, each marked as of its date) | r3 YallaDo |
| L1 | Shared login did not carry across subdomains | Fixed | 0.3.2 | shared.sessions.cookie.domain (CHANGELOG 0.3.2) | r3 known limitation |
| O1 | devora --version printed 0.1.0 | Fixed | 0.3.1 | CHANGELOG 0.3.1 | r3 also open |
| O2 | Docs examples with bare devora commands | Unconfirmed | - | No bare 'devora <command>' line found by search in the site routes; pages were not read one by one. | r3 also open |
| O3 | deployment page session-store step | Fixed | - | Section id='session-store' exists in the docs site deployment route | r3 also open |
| O4 | Scaffold names the project backend @devorajs/backend (collides with a future real @devorajs/* package) | Open | - | packages/scaffold/src/scaffoldAppFiles.ts:153 writes '@devorajs/backend' into new projects. | r3 also open |
| O5 | signSession / verifySession still exported (deprecated) | Open | - | packages/core/src/session.ts:177 and :184, marked @deprecated, not removed. | r3 also open |
| N1 | A live Vercel or Netlify deployment of the current release is not verified | Open | - | Generated functions were run outside the monorepo; live deployments exist only for releases before 0.3.2 (docs/guides/DEPLOYING.md, VERIFICATION.md). Still 0.3.4 unverified live. | VERIFICATION not verified |
| N2 | Container platforms (Cloud Run, App Runner/Fargate, Azure Container Apps, Oracle) | Open | - | Docker image run locally only. | VERIFICATION not verified |
| N3 | isr regeneration on Vercel/Netlify | Open | - | Fully verified under adapter-node; not exercised on a serverless filesystem. | VERIFICATION not verified |
| N4 | deploy/devora.service (systemd) against a real host | Open | - | Template only. | VERIFICATION not verified |
| N5 | A DB client under sustained production load | Open | - | A real Drizzle + better-sqlite3 client was verified in dev and reverted; no load test. | VERIFICATION not verified |
| X1 | A dynamic route without getStaticParams() cannot use ssg/isr | Open | - | By design: the build fails with a clear error (docs/history/VERIFICATION.md Known unsupported). | VERIFICATION known unsupported |
| X2 | isr disk cache unverified under real serverless conditions | Open | - | Same as N3. | VERIFICATION known unsupported |
| S1 | Every request re-did work that never changes (path joins, build keys, a URL object and a Headers object, a session-key HMAC, two manifest reads from disk) | Fixed | 0.3.5 | Five commits on perf/backend-speed (CHANGELOG 0.3.5). Interleaved A/B on one machine: +15% JSON list, +32% authenticated GET, +21% POST, +41% pre-rendered page, +23% server-rendered page; form POST 32,000 to 80,000 req/s in the full run (benchmarks/results/before-after.md, ab-published-vs-final.txt) | benchmarks |
| S2 | Devora.js API routes are behind Fastify, Hono and NestJS on Fastify on every JSON scenario | Open | - | Published 0.3.5, medians: JSON list 4th of 10 (26% below the leader), authenticated GET 6th (43% below), POST valid 5th (39%) and invalid 4th (36%); on POST it is level with Express (ranges overlap). Part of the gap is not in the framework (the same JSON.stringify runs in every app, about half of the list scenario); the rest is per-request work the bare frameworks do not do (security headers, a request context with session and CSRF methods, a real session lookup). benchmarks/results/backend-report.md | benchmarks |
| S3 | The built-in memory session store clones each record on every read (structuredClone, about 8% of an authenticated request) | Open | - | CPU profile of the authenticated scenario. Not changed: the clone keeps a handler from mutating the stored record; a cheaper copy needs a decision on that behavior. | benchmarks |
| S4 | Memory after load is higher than the bare backend frameworks | Open | - | Published 0.3.5: Devora.js 285 MB after the API scenarios against 167 to 258 MB for Express, Fastify and both NestJS platforms (Hono 222 MB; Next.js, SvelteKit, React Router and Astro are higher, 329 to 600 MB). A faster server also keeps more heap, so this is not proof of a leak; the 10-minute soak on the 0.3.5 code held steady (about 314 MB, +3 MB between the halves of the run). | benchmarks |
| R1 | ws on the same port as devora start | Partly fixed | - | Works through a wrapper script that calls createNodeServer (the function the CLI calls; a public, documented export of @devorajs/adapter-node that returns the http.Server) and handles upgrade itself: bad token 401, good token connected and echoed, API and security headers unchanged on the same port. Plain devora start exposes no server and no hook. Smallest core change: an onServer(server) option. Guide: Live updates (WebSockets). | lab |
| R2 | Server-sent events from an API route | Open | - | A string body is sent complete after the handler finishes (first byte at 1.5 s for three events 0.5 s apart, then the connection closes, so an EventSource reconnects in a loop); a ReadableStream, an async iterable or a Readable as the body answers 500. Smallest core change: let sendApiResponse pipe a stream or async iterable and destroy it when the client disconnects. | lab |
| R3 | Socket.IO as a separate server (examples/realtime) | Fixed | 0.3.4 | Run from a scratch copy on the published 0.3.4 packages: all 19 checks of examples/check.mjs pass. Not tested in a browser. | lab |
| R4 | Background jobs: BullMQ with Redis and a separate worker | Fixed | 0.3.5 | Tested on one Node server: an authenticated route enqueued (202), the worker ran it, the route returned completed in about 330 ms; unauthenticated enqueue is 401. bullmq needs ioredis installed separately. In CI as examples/background-jobs (the Redis part skips when there is no Redis). Guide: Background jobs. | lab |
| R5 | Background jobs without Redis: a SQLite queue and a worker | Fixed | 0.3.5 | node:sqlite: result in about 100 to 220 ms. One server only (both processes share the file). In CI as examples/background-jobs, always run. | lab |
| R6 | node-cron inside devora start | Partly fixed | - | Works, but there is no start-up hook: the schedule registers when the route that contains it is first imported (at its first request). | lab |
| R7 | Each of the above on Vercel or Netlify | Unconfirmed | - | Not deployed, so not verified. Expected from the platforms' documented model, not tested: WebSockets, long-lived timers and a SQLite file on a function's disk do not fit functions; a BullMQ worker must run elsewhere. | lab |
| T1 | A fresh scaffold prints npm warn Unknown project config "link-workspace-packages" on every npm command | Open | - | Source: packages/scaffold/src/scaffoldProjectFiles.ts:137 writes a project .npmrc containing link-workspace-packages=true, a pnpm setting (pnpm needs it so the plain "*" workspace dependencies link locally instead of being fetched from the registry). npm 11 does not know it and warns, saying it will stop working in the next major version. Verified: in a scaffold, npm config get registry warns with the .npmrc in place and is silent with it moved away. The repo root and every example carry the same file. Not fixed. | smoke test of 0.3.5 |
| T2 | On newer npm, install prints an allow-scripts warning for esbuild's postinstall | Open | - | Reproduced with npm 11.17.0 in an empty project: npm install esbuild@0.25.12 prints "1 package has install scripts not yet covered by allowScripts: esbuild@0.25.12 (postinstall: node install.js)". esbuild comes in through Vite. Install, devora dev and devora build still work. The warning comes from npm, not from Devora.js code; getting-started says so in one line. Not fixed. | smoke test of 0.3.5 |
Where the dates come from
Dates are the changelog's and the tags' dates. Versions without a changelog entry are listed as such rather than filled in.