You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A new routing engine: routes compile at registration instead of being regex-matched per request, exact routes match instantly from an index, and dynamic routes only check relevant candidates
Optional route parameters (/posts/{id?}) and inline constraints (/users/{id:[0-9]+})
Leaf Crash is the error engine: structured reports with frames, request context, breadcrumbs from your logs, views, queries and jobs, redaction, and a debug page in Leaf's design language
Named route groups cascade (admin.users.index), and resource routes name themselves
Router::reset() clears routes, hooks, middleware and cached request state for long-running processes and test suites
Environment reads are cached per request, making _env() dramatically faster; _envUncached() reads live when you genuinely need it
Fixed
Group middleware runs on dynamic routes: middleware like auth.required is no longer silently skipped for /{id}-style routes inside groups when a global middleware exists
Base path detection only strips URL prefixes when requests actually live under your script's folder, so php -S and CLI runs no longer 404
Changed
Raw regex routes no longer match: patterns without {} placeholders are literal paths. Rewrite with named parameters, optional parameters or inline constraints
Custom error handlers receive a single Leaf\Crash\Report instead of three whoops arguments
Exact routes always beat dynamic ones, regardless of registration order
Debug output follows APP_ENV: production shows clean error pages, development gets the full crash experience, no configuration
Async support is paused while Eien is rebuilt: $app->ws() and eien.enabled are removed