Routing
Verb helpers, groups, prefixes, named routes, and route model binding. Routes live in routes/ and register through app/Routes.ts.
A route, the action behind it, the model under that, and the view it renders are all first-party and all typed against each other. Rename a model attribute and the compiler finds every caller, because there is no boundary where the types stop.
All of it in the same install, with nothing to wire together first.
Verb helpers, groups, prefixes, named routes, and route model binding. Routes live in routes/ and register through app/Routes.ts.
A route points at an action rather than a controller method. Actions are single-purpose files in app/Actions/, and models with the useApi trait generate their own.
defineModel() declares schema, validation, factories, relationships, and traits in one file. Migrations are diffed out of it, not hand-written.
Single-file components with a server/client script split, Blade-style directives, and signals for reactivity. No build config to own.
Request middleware in app/Middleware/, registered in app/Middleware.ts, applied per route or per group.
Attribute rules live on the model, so the same schema validates the request, the factory, and the generated API.
Buddy scaffolds, runs, and ships this the same way it does the rest of the app.
These share the same models, config, and types, so using them together costs nothing extra.