mux

A lightweight, http.Handler-compatible Go router that matches requests by path, host, method, headers, and query, and can reverse them back into URLs.

Library
Go
vv1.8.1
21,836 stars
BSD 3-Clause License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
49 /100 Fair
Development Activity 0
Maintenance 20
Community 76
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
73 /100 Good
Architecture 82
Code Quality 88
Innovation 55
Learning Curve 65

gorilla/mux implements a request router and dispatcher for Go’s net/http package. Like the standard library’s http.ServeMux, a mux.Router matches incoming requests against a list of registered routes and calls the handler for whichever route matches — but it goes far beyond prefix matching, supporting URL path templates with named and regex-constrained variables, host matching, HTTP method restriction, header and query-value matchers, and fully custom matcher functions.

Because Router implements http.Handler directly, it drops into any existing net/http-based server without adapters. Routes can be named and later “reversed” into concrete URLs (including host and query variables), which keeps templates and redirects from hardcoding paths. Nested subrouters let an application group related routes under a shared host or path prefix so common conditions are only evaluated once, which also serves as a performance optimization for large route tables.

As one of the original and most widely deployed Go routers, mux has shaped the ergonomics that most Go routing libraries since have followed: chainable route builders, http.Handler-native middleware via a simple func(http.Handler) http.Handler signature, and context-based access to matched route variables from within handlers.

What You Get

  • A Router that implements http.Handler, so it registers directly with http.Handle or an http.Server without any adapter layer
  • Path templates with named variables and optional regex constraints (e.g. /articles/{category}/{id:[0-9]+}), retrievable in handlers via mux.Vars(r)
  • Matchers for host, path prefix, HTTP methods, headers (including regex), URL schemes, and query values, composable on a single route
  • Named routes that can be reversed into concrete URLs, hosts, or paths via Route.URL(), URLHost(), and URLPath()
  • Subrouters for grouping routes under a shared host or path prefix, evaluated depth-first and reused for common-condition optimization
  • Router- and route-level middleware via a MiddlewareFunc chain, plus a built-in CORSMethodMiddleware helper
  • Configurable NotFoundHandler and MethodNotAllowedHandler for custom 404/405 responses
  • A Walk function to traverse the full route tree, including nested subrouters, for introspection or documentation generation

Common Use Cases

  • Routing REST API endpoints with path parameters, e.g. mapping GET /products/{key} and POST /articles/{category} to distinct handlers
  • Serving a single-page application’s static assets alongside a JSON API from the same router, using PathPrefix and a custom spaHandler
  • Building host- or subdomain-based routing, e.g. matching {subdomain}.example.com and extracting the subdomain as a route variable
  • Applying shared middleware — logging, authentication, CORS — across a group of routes via Router.Use or Route.Use
  • Building reversible, named URLs for redirects and templates so route paths are defined once and never hardcoded elsewhere
  • Enforcing HTTP method and content-type/header constraints per route, e.g. restricting an endpoint to POST with a specific Content-Type

Under The Hood

Architecture

A mux.Router holds an ordered slice of *Route plus a name-indexed map for URL reversal; Router.ServeHTTP cleans the incoming path (redirecting to the canonical form unless SkipClean is set), then delegates to Router.Match, which walks routes in registration order and returns the first one whose matchers all pass. Each Route embeds a shared routeConf (host/path regexps, matcher list, build scheme) that subrouters copy via copyRouteConf so nested routers inherit parent constraints without mutating them. Matched route variables and the matched Route/Router are threaded through the request via context.WithValue rather than global state, and middleware is applied in Match itself by wrapping the resolved handler back-to-front — so a single request pass both selects and decorates the handler with no second traversal. Subrouters are just Routes whose handler or matcher is itself a *Router, which is what lets Walk and Match recurse depth-first through the tree.

Tech Stack

Pure standard library — net/http, net/url, regexp, path, context, and strings are the only imports across the whole package (go.mod declares zero external dependencies, targeting Go 1.20+). Path and host templates compile down to regexp.Regexp instances at route-registration time via an internal routeRegexp abstraction (regexp.go), with a package-level RegexpCompileFunc variable left overridable for callers who need custom compilation behavior. There is no build step beyond the Go toolchain, and the Makefile wires up golangci-lint, gosec, and govulncheck as opt-in local/CI targets rather than bundled dependencies.

Code Quality

The project has an extensive test suite (mux_test.go, route_test.go, regexp_test.go, middleware_test.go, old_test.go, plus benchmark and runnable example tests) exercising path/host/query/header matching, subrouting, URL building, and middleware ordering, run in CI with -race and coverage reporting across two Go versions. GitHub Actions also runs gosec (static security analysis) and govulncheck (known-vulnerability scanning) on every push and PR to main. Error handling is explicit and typed via sentinel errors (ErrMethodMismatch, ErrNotFound, ErrMetadataKeyNotFound) rather than panics, and exported types carry full godoc comments including a dedicated doc.go package overview.

API Design The API follows a fluent, chainable builder style — r.HandleFunc(path, handler).Methods(“GET”).Host(”…”) — that composes naturally with Go’s http.Handler interface, so it requires no custom request/response types and no non-standard handler signature. Getting started is a two-line NewRouter() plus http.Handle(”/”, router), and the one non-obvious step (reading path variables via mux.Vars(r) from context rather than a handler argument) is documented in the package overview and reflected consistently across every example file.

Used by 35 apps in this directory

TypeScript
72%
AGPL 3.0

Firecrawl

AI Development · Developer Tools

194,745

Turn any website into clean, LLM-ready data with a single API call — no proxy headaches, no scraping complexity.

View details
89
Repo Health
83
Technical
65
Dependency
Built with
TypeScript 72%
Python 12%
Updated 1 weeks ago
TypeScript
54%
Other

Focalboard

Collaboration · Productivity · Project Management

26,522

Self-hosted, open source project management with Kanban, table, gallery, and calendar views — a privacy-first alternative to Trello, Notion, and Asana.

View details
56
Repo Health
82
Technical
64
Dependency
Built with
TypeScript 54%
Go 40%
Updated 5 months ago
Go
85%
Apache 2.0

frp

Networking

110,102

A fast reverse proxy that exposes local servers behind NAT or firewalls to the public internet with multi-protocol support.

View details
95
Repo Health
82
Technical
71
Dependency
Built with
Go 85%
Vue 11%
Updated 1 weeks ago
TypeScript
47%
AGPL 3.0

Grafana

Analytics · Monitoring

77,469

The open-source observability platform that unifies metrics, logs, and traces from any data source into dynamic, queryable dashboards.

View details
95
Repo Health
91
Technical
63
Dependency
Built with
TypeScript 47%
Go 47%
Updated 1 weeks ago
Go
62%
Apache 2.0

Harness Open Source

Code Editors · Developer Tools · Devops

38,684

A unified open source DevOps platform combining Git hosting, CI/CD pipelines, cloud development environments, and artifact registries in a single self-hosted system.

View details
90
Repo Health
79
Technical
64
Dependency
Built with
Go 62%
TypeScript 33%
Updated 1 weeks ago
Go
97%
Apache 2.0

kopia

File Storage

14,417

Fast, encrypted, deduplicated backups to any cloud or local storage with full client-side control.

View details
90
Repo Health
83
Technical
68
Dependency
Built with
Go 97%
Updated 1 weeks ago
TypeScript
51%
Other

Mattermost

Collaboration · Devops · Team Chat

39,418

Open core, self-hosted team collaboration with chat, AI agents, voice calling, and deep DevOps integrations — all under your control.

View details
96
Repo Health
87
Technical
65
Dependency
Built with
TypeScript 51%
Go 40%
Updated 1 weeks ago
Go
95%
Apache 2.0

Nakama

Developer Tools · Game Development

13,572

Open-source game backend server with built-in multiplayer, matchmaking, leaderboards, chat, authentication, and storage — deploy anywhere via Docker or binary.

View details
87
Repo Health
73
Technical
74
Dependency
Built with
Go 95%
Updated 1 weeks ago
Go
95%
Other

NetBird

Security

30,175

Replace your VPN with a zero-trust WireGuard overlay network that auto-connects devices, enforces SSO and posture checks, and deploys in under 5 minutes.

View details
92
Repo Health
82
Technical
66
Dependency
Built with
Go 95%
Updated 1 weeks ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers