
HAMR bundles the pieces most Go web apps end up wiring together anyway: Templ, HTMX, session auth, CSRF, migrations, a dev server, and a project shape that stays readable once the app grows.
It is opinionated on purpose: one codebase, one binary, HTML first, JSON where it helps. If that is how you already like to build, HAMR saves you a lot of setup work.
# Install the CLI
$ go install github.com/FyrmForge/hamr/cmd/hamr@latest
# Scaffold a new project
$ hamr new myapp
$ cd myapp
# Start the dev server (file watching, hot reload, builds)
$ hamr devNot a giant abstraction layer. Just the parts teams keep rebuilding from scratch.
Return HTML to the browser and JSON to an API client from the same handler. HTMX stays simple instead of spawning a second controller layer.
Templ turns views into Go code. You find broken markup at build time instead of after deploying a typo in a string template.
HTMX and Alpine are there for the places where a little client-side state helps. The default path is still HTML over HTTP.
Cookie sessions, Argon2id hashing, CSRF, and a subject loader that works with your own user model.
hamr dev handles templ generation, rebuilds, reloads, and Docker services so you can stay in one terminal instead of five.
Postgres setup, migrations, retries, and a repo layer are already wired so your first real feature can talk to data.
You should not have to choose between a "web handler" and an "API handler" for the same piece of application logic. HAMR keeps that branch close to the response instead of splitting your app in two.
See the response helpersfunc (h *handler) List(c echo.Context) error {
books, err := h.repo.All(c.Request().Context())
if err != nil {
return respond.Error(c, err)
}
// HTMX or browser → renders the Templ component
// API client → returns JSON
return respond.HTML(c, http.StatusOK,
templates.BookList(books))
}Most apps do not need microservices on day one. HAMR is built for the part where you are trying to ship something useful.
The browser gets HTML first. JSON is there when another client actually needs it. The same handler can do both.
HAMR works with your IDs and your user model. It does not try to own the center of your app.
Scaffolding is fine. Hidden runtime magic is not. You should be able to open generated code and understand it.
Cookies, CSRF, password hashing, CSP, structured logs, and migrations should not be an afterthought you bolt on later.
If you want a SPA starter kit or a giant extension marketplace, HAMR will probably feel restrictive. That is part of the design.
Start with the docs, then build the bookmark app. You will know pretty quickly whether the constraints feel helpful.