Registration, sign-in, email verification and password reset. Non-enumerable by wording and by timing.
A batteries-included web framework for Go. Routing, ORM, migrations, auth, queues, mail, cache and a scheduler already wired together — and a CLI that writes the boilerplate as real Go files you can read, step through and delete.
curl -fsSL https://ryla.io/install.sh | sh macOS · Linux / Windows or already have Go: go install github.com/Dshonored/ryla/cmd/ry@latest
The script installs a Go toolchain if the machine has none. Go is not optional for a Go framework, so installing it is part of installing Ryla.
ry new picks a database, a web mode, a frontend language and a stylesheet, then wires them together. Every combination compiles — twenty-four of them are scaffolded and built on every CI run, on Linux, macOS and Windows.
$ ry new myapp Database › sqlite — one file, no server postgres — a real server, transactional DDL Web mode › react — Vite, embedded in the binary Created myapp (45 files) Resolving dependencies… $ ry dev watching ~/myapp · vite on :5173 → http://localhost:8080
Not a list of packages you assemble. One framework where the session store, the queue driver and the mailer already know about each other.
Registration, sign-in, email verification and password reset. Non-enumerable by wording and by timing.
TOTP enrolment with a QR code, a challenge that holds the session, and single-use recovery codes.
Jobs with retries and backoff. Claims exclusively over SQL, Redis or Mongo — whichever the project uses.
Versioned Go files that carry their own schema snapshot, so history keeps doing what it did.
One Store interface over memory, the database, Redis or Mongo. Swap the driver with an env var.
SMTP and a log driver, templ-rendered mail views, and queued sends that survive a restart.
A cron registry with overlap prevention, so a slow task never runs twice at once.
Bind and validate into a typed struct. The error bag reaches the view keyed by field name.
Drives the real router with its own cookie jar and CSRF token. Failures print the response body.
// Posts handles the blog. type Posts struct { app *app.App } func NewPosts(a *app.App) *Posts { return &Posts{app: a} } func (c *Posts) Index(w http.ResponseWriter, r *http.Request) { var posts []models.Post c.app.DB.Find(&posts) // … }
App is a plain struct. Controllers hold a pointer to it and reach for what they need. Every dependency is visible, and the compiler checks all of it — nothing resolves at runtime, so nothing surprises you at 2am.
Generators never edit your files. ry make:controller writes a new file and prints the route lines to add. routes/web.go stays a table of contents you can trust.
Views are compiled. templ turns components into Go, so a typo or a wrong prop is a build error rather than a blank space in production.
ry build compiles the views, the frontend bundle and the static assets into a single static binary that carries its own commands. The machine that runs it needs no Go toolchain, no Node, and no ry.
$ ry build Checking types… 0 errors vite build → dist/ 198 kB Built myapp (21.8 MB) $ scp myapp server:/srv/ && ssh server /srv/myapp serve
"It compiles" and "it works" are not the same claim, so the docs sort features by how well each one is actually tested rather than by whether it is finished.
Scaffold, migrate and run in under a minute. Delete it just as fast if it is not for you.
curl -fsSL https://ryla.io/install.sh | sh