A minimal, fast, and production-ready HTTP response renderer for Go.
It provides a clean abstraction over net/http responses with support for JSON, XML, Text, Bytes, Files, and a safe handler adapter compatible with Chi and standard library HTTP.
- ⚡ Zero-dependency core (stdlib only)
- 🧠 Clean Response abstraction
- 🔐 Panic-safe HTTP handler wrapper
- 📦 JSON / XML / Text / Bytes / File responses
- 📁 Streaming file support (no memory overload)
- 🔧 Header support on all responses
- 🧩 Chi / net/http compatible
- 🧪 Fully testable design
go get github.com/thedevsaddam/renderer/v2package main
import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/thedevsaddam/renderer/v2"
)
func main() {
r := chi.NewRouter()
r.Get("/hello", renderer.Handle(func(r *http.Request) (renderer.Response, error) {
return renderer.JSON(200, map[string]string{
"message": "hello renderer v2",
}), nil
}))
http.ListenAndServe(":8080", r)
}renderer.JSON(200, map[string]string{
"name": "Saddam",
})renderer.JSON(200, data).Indent()renderer.JSON(200, data).
Header("X-App", "renderer")renderer.Text(200, "hello world")type User struct {
Name string `xml:"name"`
}
renderer.XML(200, User{Name: "Saddam"})renderer.Bytes(200, []byte("hello"), "application/octet-stream")file := strings.NewReader("file content")
renderer.File(200, file, "report.txt")renderer.File(200, file, "report.txt").Inline()type HandlerFunc func(r *http.Request) (Response, error)r.Get("/ping", renderer.Handle(func(r *http.Request) (renderer.Response, error) {
return renderer.JSON(200, map[string]any{
"ping": "pong",
}), nil
}))All handlers are automatically protected from panics and return HTTP 500 safely.
- Explicit over magic
- Composition over framework lock-in
- Streaming-first design
- Minimal API surface
go test ./...go test ./... -bench=.MIT