Go's standard library, SQLite, and files you can read โ nothing decided behind your back.
- Filesystem routing
actions/orders/[id]/cancel.POST.go becomes POST /orders/{id}/cancel โ the directory structure is the route table. Bracket segments are path params, the filename suffix is the HTTP verb, and rastrillo generate writes it all into a plain gen/router.go on Go's standard http.ServeMux: committed, readable, diffable.
- Platform-ready by default
rastrillo.Run speaks the CARLOS platform's activation contract end to end โ hibernating instances, carlos-app@ systemd unit tenants, plain instances, and a bare dev fallback, no separate integration per deployment shape. Hibernation is the cost-efficiency receipt: your app isn't running when nobody's knocking, and the platform wakes it when someone does.
- Localization built in
- Declare your locales and
/fr/orders and /orders reach the same route. Request-scoped T/Tf fall back through catalogs so a missing translation stays visible, never blank โ and generate --check fails loudly on incomplete catalogs before you ship, not after.
- A UI vocabulary, zero JavaScript
rastrillo/ui ships list-screen and form partials plus design tokens: light and dark, WCAG AA contrast, and not one line of client-side JavaScript. examples/blog is a real blog, admin side and all, from stock components only.
- One binary, no toolchain sprawl
go install gets you the CLI, go build gets you the app โ a single static binary with SQLite compiled in. No bundler, no separate codegen service, no runtime to babysit. The framework whose family motto is "no build step" doesn't ship one to your visitors either.