Skip to content

What's New

This page tracks notable changes, new features, and improvements across EreoJS releases.

v0.1.24

The latest release consolidates the framework's core packages, adds the RPC layer, and brings significant improvements to forms, caching, and developer tooling.

Core

  • createApp — New application factory for configuring plugins, environment, and middleware in a single entry point.
  • RequestContext — Typed request context that flows through middleware, loaders, and actions. Use context.get() and context.set() to share data across the request lifecycle.
  • Plugin system — Register plugins via createApp({ plugins: [...] }). Plugins can hook into the build pipeline, add middleware, and extend configuration.
  • Environment handling — Built-in environment variable loading with type-safe access. Supports .env, .env.local, and .env.production files.
  • Caching layer — Tag-based and path-based cache invalidation with configurable adapters (memory, Redis, or custom). Supports maxAge, staleWhileRevalidate, and on-demand revalidation via webhooks.

Router

  • File-based routing — Routes are defined by file structure in routes/. Supports index.tsx, [param].tsx, [[optional]].tsx, [...catchAll].tsx, route groups (group)/, layouts _layout.tsx, and error boundaries _error.tsx.
  • Middleware_middleware.ts files run before route handlers. Middleware can modify context, redirect, or short-circuit the request.
  • Typed middleware — Middleware can declare the shape of context it provides, and downstream loaders/actions receive those types automatically.
  • Validation — Route-level search params and hash params validation via defineRoute().searchParams(schema).

Client

  • HooksuseLoaderData, useActionData, useNavigation, useRouteError, useParams, useSearchParams, and useLocation for accessing route state in components.
  • <Link> and <TypedLink> — Client-side navigation with prefetch strategies (none, intent, render, viewport). <TypedLink> enforces valid route paths at the type level.
  • <Form> — Progressive enhancement wrapper around <form>. Submits via fetch on the client, falls back to standard form submission without JavaScript.
  • Navigation API — Programmatic navigation with navigate(), goBack(), goForward(). Supports replace, state, and viewTransition options.
  • Prefetching — Preload route data and modules before navigation for instant transitions.
  • Islands.island.tsx files and 'use client' directive mark components for selective hydration. Hydration strategies: load, idle, visible, media, none.
  • ErrorBoundary — Export from route files to catch errors inline, or use _error.tsx for directory-level error handling.

Data

  • defineRoute builder — Chain .loader(), .action(), .head(), .meta(), .cache(), .searchParams() with full type inference across the entire chain.
  • Schema adaptersereoSchema() for Zod alignment with z.coerce, schemaBuilder() for schema creation without external dependencies, and Standard Schema V1 auto-detection.
  • LoaderscreateLoader with shorthand and options forms. Options include cache, transform, and onError.
  • ActionscreateAction, typedAction, jsonAction, and the simple action() wrapper. Built-in FormData parsing and validation support.
  • Data pipelinescreatePipeline with dataSource, cachedSource, optionalSource for dependency-aware parallel data loading with timing metrics.
  • Cache utilitiesrevalidateTag, revalidatePath, revalidate, onDemandRevalidate, createRevalidationHandler for webhook-triggered invalidation.
  • RevalidationshouldRevalidate export on routes to control when loaders re-run after navigation.

State

  • Signalssignal(initial) creates reactive primitives with .get(), .set(), .update(), .subscribe(), and .map().
  • Computed signalscomputed(fn, deps) for derived values that automatically recompute when dependencies change.
  • Storesatom(initial) for simple state atoms.
  • React integrationuseSignal(sig) hook backed by useSyncExternalStore for safe concurrent-mode rendering. batch(fn) to group multiple signal updates.

Forms (@ereo/forms)

  • useForm — Core form hook with per-field signal architecture, ES Proxy access (form.values.user.email), and derive-don't-configure validation.
  • useField — Single field registration with validation, error handling, and touched/dirty tracking.
  • useFieldArray — Dynamic field arrays with append, prepend, remove, swap, move, insert, and replace operations.
  • useWatch — Reactive observation of field values without requiring field registration.
  • useFormStatus — Read-only form state (isSubmitting, isValid, isDirty, errors) for use in child components.
  • Validation — 20+ built-in validators, async validation with sync-gate-async pattern, cross-field dependencies via dependsOn, and focusOnError for auto-focusing the first invalid field on submit failure.
  • Schema adapters — Zod, Valibot, and Standard Schema V1 support for form-level and field-level validation.
  • Components<FormField>, <FieldError>, <FormErrors> for declarative form rendering.
  • Multi-step wizards — Per-step validation with data persistence across steps, back/forward navigation, and step completion tracking.
  • Server actions — Integration with EreoJS actions for server-side form submission with automatic error mapping from ActionResult to field errors.
  • Accessibility — ARIA attributes, error announcements, and keyboard navigation support built into form components.

RPC

  • Procedures — Define typed server functions with createProcedure. Supports input validation, middleware, and error handling.
  • RoutercreateRPCRouter to group procedures into a namespace with shared middleware.
  • Client — Type-safe RPC client generated from the router definition. Call server procedures like local functions.
  • Middleware — RPC-specific middleware for authentication, rate limiting, and logging.
  • HooksuseRPC hook for calling procedures with loading/error states in React components.
  • PluginrpcPlugin() registers the RPC handler as an API route automatically.

Server

  • BunServer — Production server with configurable host, port, TLS, and shutdown hooks.
  • Middleware — Server-level middleware for compression, CORS, static files, and request logging.
  • Streaming — HTML streaming via React's renderToPipeableStream with configurable flush strategies.

CLI

  • ereo dev — Development server with hot module replacement and fast refresh.
  • ereo build — Production build with tree-shaking, code splitting, and multiple output targets.
  • ereo start — Start the production server.
  • bunx create-ereo@latest — Project scaffolding with template selection.
  • ereo deploy — Platform-specific deployment commands for Vercel, Cloudflare, Fly.io, and Railway.
  • ereo db — Database migration and seed commands (works with Drizzle and SurrealDB adapters).

Database

  • Drizzle adapter — Integrate Drizzle ORM for SQL databases with migration support via ereo db.
  • SurrealDB adapter — SurrealDB integration for document/graph database workflows.

Plugins

  • Tailwind CSS — Zero-config Tailwind integration. Add tailwindPlugin() to your config and it handles PostCSS setup automatically.
  • Images — Automatic image optimization with responsive sizes, format conversion (WebP, AVIF), and lazy loading. Use <Image> component or the imagePlugin().
  • Auth — Session management with cookie-based and server-side sessions. OAuth providers (GitHub, Google) and middleware-based route protection.

Previous Releases

Earlier releases focused on foundational work: initial router implementation, SSR pipeline, bundler integration, and the core plugin architecture. Detailed changelogs for pre-0.1.24 versions will be added as the project approaches 1.0.

Versioning Policy

EreoJS follows Semantic Versioning:

  • MAJOR (1.x.x) — Incompatible API changes. Migration guide provided.
  • MINOR (0.x.0) — New features that are backwards compatible.
  • PATCH (0.0.x) — Bug fixes and minor improvements, backwards compatible.

During the 0.x phase (pre-1.0), minor versions may include breaking changes. These will always be documented in the release notes with upgrade instructions.

How to Upgrade

To update EreoJS to the latest version:

bash
bun update @ereo/core @ereo/router @ereo/client @ereo/data @ereo/server @ereo/state @ereo/cli @ereo/forms

If you are upgrading across multiple minor versions, check the Version Upgrade Guide for any breaking changes and the recommended migration steps.

Contributing

See the contributing guide for how to contribute to EreoJS. Bug reports, feature requests, and pull requests are welcome.

Released under the MIT License.