Generate HTTP handlers from html/template definitions.
Declare routes in template names using http.ServeMux patterns. Muxt analyzes receiver methods and generates handlers that parse parameters to match method signatures.
You can use muxt generate to generate http.Handler glue code or you can just use muxt check, muxt list-template-calls, and muxt list-template-callers to find bugs and more safely refactor your "text/template" or "html/template" source code.
Standard http.ServeMux pattern:
[METHOD ][HOST]/[PATH]
Muxt extends this with optional status codes and method calls:
[METHOD ][HOST]/[PATH][ HTTP_STATUS][ CALL]
Define a template with a route pattern and method call:
{{define "GET /{id} GetUser(ctx, id)"}}
{{with $err := .Err}}
<div class="error" data-type="{{printf `%T` $err}}">{{$err.Error}}</div>
{{else}}
<h1>{{.Result.Name}}</h1>
<p>{{.Result.Email}}</p>
{{end}}
{{end}}
Implement the receiver method:
func (s Server) GetUser(ctx context.Context, id int) (User, error) {
return s.db.GetUser(ctx, id) // id automatically parsed from string
}Run muxt generate --use-receiver-type=Server to generate HTTP handlers.
Template names define the contract. Muxt analyzes method signatures using go/types and generates handlers that:
- Parse path parameters to method argument types (
string,int,bool, customTextUnmarshaler) - Bind form data to struct fields with validation
- Inject request context,
*http.Request, orhttp.ResponseWriterwhen named - Handle errors and return values through
TemplateData[T] - Set HTTP status codes from template names, return values, or error types
No (additional) runtime reflection. All type checking happens at generation time. The generated code uses only net/http and html/template from the standard library.
go install github.com/typelate/muxt@latestOr add it to your project's module go get -tool github.com/typelate/muxt (note the project license documentation).
- Create a template file
index.gohtml:
{{define "GET / Home(ctx)"}}
<!DOCTYPE html>
<html>
<body><h1>{{.Result}}</h1></body>
</html>
{{end}}
- Add generation directives to
main.go:
//go:embed *.gohtml
var templateFS embed.FS
//go:generate muxt generate --use-receiver-type=Server
var templates = template.Must(template.ParseFS(templateFS, "*.gohtml"))
type Server struct{}
func (s Server) Home(ctx context.Context) string {
return "Hello, Muxt!"
}- Generate handlers and run:
go generate && go run .The command tests were intended to be readable examples of muxt behavior.
- Local example - Complete application with tests (pkg.go.dev)
- Sortable Example - Interactive HTMX-enabled table row sorting
- HTMX Template - Full HTMX integration patterns
Comprehensive documentation organized by task:
- Getting Started Tutorial - Build your first Muxt application
- How-To Guides - Integrate, test, use HTMX, add logging
- Reference - CLI, syntax, parameters, type checking
- Explanation - Design philosophy, patterns, decisions
See the full documentation index for all available resources.
Paste these prompts into Claude Code or other AI assistants when building hypermedia apps:
| Prompt | Use Case |
|---|---|
| muxt-quick.md | Syntax lookup, minimal context |
| muxt-guide.md | Comprehensive guide for building apps |
| muxt-complete.md | Edge cases, testing patterns, advanced usage |
Start with muxt-guide.md for most sessions. Use muxt-quick.md when context is limited.
Muxt generator: GNU AGPLv3
Generated code: MIT License - The Go code generated by Muxt is not covered by AGPL. It is provided as-is without warranty. Use it freely in your projects.