Roadmap
This page summarizes where JSlop is going. For the design rationale, read PLAN.md. For the current punch list with statuses, read TODO.md. This file just stitches the two together.
Where we are
Working today (in vite dev and in production builds):
.jslopparsing + AST-aware identifier rewritingcell/derived/effect/batch/untrack- DSL keywords:
state,prop,derived,let,function,view,head,style,load - Reactive scopes:
createScope/runInScope/disposeScope/onCleanup.{#if}swaps and{#each}removals dispose the prior subtree’s effects, no leaks. - View constructs: elements, components,
{expr},on<event>handlers,bind:value/bind:checked,{#if}/{:else}/{/if},{#each list as item, i (key)} - Per-component
head { ... }fragments (SSR-merged, route wins over layout) - Per-component
style { ... }blocks — scoped via a hashed class on the component root - Keyed
{#each}reconciliation: DOM identity preserved per key across reorders / inserts / removes; per-item child component instances reused for matching keys. - SSR with serialized state capsule
- Client boot that resumes rather than hydrates
- File-system routing with dynamic
[param]segments,_layout.jslopchains,_404.jslop - Per-route and per-layout
load { ... }blocks (server-only, async, merged into props) andnotFound()to trigger the 404 chain from inside a loader - Client-side SPA navigation:
<a>interception +pushState/popstate, programmaticnavigate(), scoped-style merge across page swaps - Vite plugin: transform + virtual modules + dev SSR middleware + dual-pass production build (
vite build→dist/client/,vite build --ssr→dist/server/entry-server.js) @jslop/node-adapterfor serving the production build (static assets +render(url))- Optional Tailwind v4
North star priorities
In order, from TODO.md:
Effect disposers + keyed✅ Done.<For>reconciliation.Two-way binding sugar (✅ Done.bind:value={cell}).Layouts + 404 routes.✅ Done.Production build path.✅ Done — two-pass build +@jslop/node-adapter. Static prerender and Bun/edge adapters still to come.- Interim server-action block.
action { … }inside a.jsloproute, callable from the client by name, auto-refetchesloadon success. Surfaced byexamples/tasks/, where today every mutation goes through hand-written/api/*handlers inserve.mjs+ a parallel dev middleware + a client-sidesrc/api.js. Stepping stone to (7), not a replacement. pnpm create jslop+ published packages. Today the only path to a working app is “clone the monorepo and edit an example.” Until there’s a 30-second quickstart and real@jslop/*versions on npm, the framework is invisible to drive-by visitors. SeeTODO.md→ Onboarding / startup experience for the punch list.- Server functions. The killer protocol from PLAN.md. Split bundling + JSON-only RPC + security defaults.
- Schema-native forms. Built on top of server functions.
Big features still on the design board
Note
Everything in this section is designed but not built. It’s what we’re aiming for; treat it as a forecast, not a feature list.
server data = await db.x.find()— async server values with auto-wiredloading/error/refresh().server function name(...) { ... }— typed RPC with CSRF, validation, auth context.when,mount,cleanupblock syntax.style Name { variants: ... }— first-class variant declarations on top of the existing scopedstyle { ... }block.schema Form { ... }+<Form schema={Form} action={save}>with no-JS fallback.local todos = collection<Todo>("todos")+sync todos with server.todos { ... }— local-first data.<Await value={x}><Pending/><Error/><Resolved/></Await>.- Devtools showing the reactive graph (where a value came from, what it updates, SSR vs client, size).
Explicitly out of MVP scope
Important
The following are intentionally not in scope until the core is good:
- Native mobile
- Edge runtime
- Plugin system
- Animation system
- Built-in ORM / auth / i18n / CMS
How to contribute
There’s no CI, contribution guide, or license yet — those are also on the todo list. If you want to poke at the codebase:
- Read
docs/internals/architecture.mdto learn what each package does. - Pick something from
TODO.md— the early items are scoped to be tractable. - Run
pnpm install && pnpm build && pnpm dev:counterto confirm your environment works.