Everything a web application needs, in one framework.
Each subsystem below is part of the same workspace, versioned together at 2.0.0, and documented with the code it ships. Every page shows real API — copied from the framework’s docs and the sample application.
The basics
-
Routing & middleware
Routes are typed, and so is their middleware.
Routes, groups, names and constraints in the shape you would expect — with middleware attached as values the compiler checks, rather than strings a map resolves at runtime.
-
Validation & form requests
Form requests authorise, then validate, then hand you a struct.
A form request is the rules for an input plus who may send it. The controller receives a typed value that has passed both — and the same rules describe the endpoint in the generated OpenAPI document.
Database
Security
Digging deeper
-
Queues & jobs
Jobs are structs; the queue is a setting.
A job is a serialisable struct with its name, queue and retry count as constants. Dispatch it, and a worker runs it on whichever driver the environment chose.
-
Task scheduling
The schedule is code, and its locks are checked.
Jobs, console commands and closures on a schedule declared in
routes/console.rs, run byschedule:workor by cron callingschedule:run. -
Events & failure reporting
Everything that fails is an event.
Application events with typed listeners — and every failure the framework swallowed into a response, a retry or a log line, reported as one of 27 typed events.
-
Broadcasting & WebSockets
Events reach the browser on the port you already serve.
Mark an event
Broadcastableand it is pushed to public, private or presence channels. Rainier serves the WebSockets itself, on the HTTP port. -
Cache & locks
One cache API, six stores.
Get, put, remember and atomic locks over memory, Redis, Redis Cluster, Memcached, DynamoDB or Cloudflare Workers KV.
-
File storage
Disks, not paths.
Put and get files on named disks — local, memory, or S3 and the services that speak it, like Cloudflare R2 and MinIO.
-
Mail
Mailables render views and go out through any transport.
A mailable is an envelope and content. The content is an ordinary template, so a mail is previewable and testable like a page.
-
Notifications
One notification, every channel the user has.
Send a notification to a notifiable and it is delivered to each channel it asks for: the database (an in-app bell), mail, Discord.
Observability
-
Observability
Spans for everything, with no code to write.
Turn on the
telemetryfeature and every request, query, cache call, job, mail and event opens a span, exported over OTLP to your collector. -
Lookout
See what each request did, inside the app.
An opt-in diagnostics dashboard at
/_lookout, built from the spans the framework already emits. Each request, job, command and scheduled task becomes a batch of what it did.
Testing
Deployment
Add-ins
-
Billing with Stripe
Subscriptions without the glue.
The
billing-stripeadd-in: checkout sessions, subscriptions with trials, and typed, verified, de-duplicated webhooks. -
Migrating from PHP
Run beside the PHP app you are leaving.
The
compat-phpadd-in reads and writes a PHP application’s sessions, encrypted cookies, cache values, queued jobs and$2y$password hashes — so both can serve the same users while you move routes across. Use it to migrate, not to stay.