This episode walks you through the birth of chi in 2015, its evolution from goji to v5.3.x in 2026, and the lightweight, idiomatic, and composable philosophy that sets it apart. You will also see the routing and middleware problems chi solves compared to other approaches.

Before writing routes, you need to know why chi exists. Episode 1 tells the history, background, and reasons chi is needed — so that choosing chi for a project is not a bandwagon decision, but a deliberate one that understands the problem being solved.
Many Go developers struggle to choose a router: there's plain net/http, chi, Gin, Echo, and Fiber. Each one emerged from a different philosophy. chi comes with one main promise: stay net/http, only add an idiomatic routing and middleware layer. This episode traces where that promise came from and how it has survived for more than a decade.
chi was created in 2015 by Peter Kieltyka, inspired by zenazn/goji — a minimal router for Go — and pure net/http. Instead of building a new abstraction, Peter wanted a router that sits neatly on top of the standard library. The result is chi: lightweight, idiomatic, and composable.
This philosophy is embedded in every design decision:
http.Handler, http.HandlerFunc, and context as they are.Since 2015, chi has been continuously refined without abandoning its philosophy:
go.mod and the module system.go list -m -versions github.com/go-chi/chi/v5go list -m -versions github.com/go-chi/chi/v5 shows all installable releases. You can see the progression from v5.0.0 to v5.3.1 yourself.
net/http before Go 1.22 only offered simple prefix-based route matching. For real applications, you need:
/users/42 with a dynamic value in the middle of the path./api, /v1, and other resources.chi solves all of this with a single concept: a router that is also an http.Handler, so there is no re-invention of the standard library.
Because chi is pure net/http, all middleware and libraries written for the standard library work directly without adapters. Your http.Handlers, someone else's http.ServeMux, and hand-built servers can all be combined with a chi router.
go get github.com/go-chi/chi/v5@v5.0.0The go get github.com/go-chi/chi/v5@v5.0.0 command is useful if you need to test this major line's behavior since its first version.
chi sits in the middle of the spectrum: more than plain net/http because it provides params, subrouters, and built-in middleware; but less than Gin, Echo, and Fiber, which bring their own binding, validation, and conventions.
net/http: the most minimal, but you write a lot of boilerplate yourself.net/http, so it offers extreme performance with a compatibility trade-off.net/http, composable, and transparent.A comprehensive comparison — including criteria for choosing a framework — will be fully dissected in episode 22.
chi pays off most when you want full control, appreciate idiomatic middleware, and value the fact that every handler is an ordinary http.Handler. For backend developers who favor a minimalist approach, this is the right home.
Your journey will go more smoothly with the right references:
You don't need to leave the terminal to read documentation:
go doc github.com/go-chi/chi/v5go doc github.com/go-chi/chi/v5 shows a summary of the router API directly from the installed module. It's the fastest way to check function signatures without opening a browser.
Before following the next episode, always make sure you're using the latest release:
go list -m -versions github.com/go-chi/chi/v5go list -m -versions github.com/go-chi/chi/v5 shows all releases — compare them with the release notes on GitHub to make sure no security fix has been missed.
Key takeaways:
net/http.net/http — it only adds on top of it.net/http and feature-rich frameworks.In the next episode 2 we will dissect chi's core concepts and main architecture — what a radix tree is, how chi.RouteContext works, why the Go context carries params and the middleware stack, and what components make up this router. Prepare yourself, because from here on we get into code.