v1.1.0 v1.0.0 · stable roots GA · x/* families carry explicit maturity labels View release posture →

stdlib-only · zero external deps · v1.1.0

Go HTTP your agent and your team can both read.

Route registration, middleware order, and dependency wiring stay in one explicit file — readable in every code review. Machine-readable specs give AI coding agents the same operating model as your senior reviewers. net/http compatible: existing handlers work without changes.

cd reference/standard-service && go run . or go get github.com/spcent/plumego@latest
internal/app/routes.go
func (a *App) Routes() http.Handler {
    r := router.New()

    // middleware order is explicit, not hidden
    r.Use(middleware.RequestID)
    r.Use(middleware.Logger(a.log))

    // route ownership visible in one file
    api := r.Group("/api/v1",
        middleware.Auth(a.cfg.JWTSecret))
    api.Get("/users/:id", a.users.Get)
    api.Post("/users",    a.users.Create)
    api.Get("/items",     a.items.List)

    return r
}

stdlib-only

Zero external dependencies in the kernel.

The 9 stable roots import only the Go standard library. No transitive dependency risk, no forced upgrades, no version conflicts in your module graph.

go get github.com/spcent/plumego single import path, no dependency tree
Stability & compatibility →

explicit wiring

Every route visible in one file, every review.

Route registration, middleware order, and dependency wiring all live in internal/app/routes.go. A reviewer sees the full request map without opening a single package.

func (a *App) Routes() http.Handler { … } all routes declared in one canonical location
Why explicit matters →

agent-ready

Machine-readable specs guide every change.

specs/task-routing.yaml routes work to the right module before a line is written. specs/dependency-rules.yaml enforces boundaries in CI. Agents and humans share the same operating model.

specs/ · tasks/ · module.yaml control plane readable by humans and agents alike
See the control plane →

Agent-ready

Built for the way modern teams work.

This section is about AI coding assistants — Copilot, Claude, Cursor — tools that write or review code. It is not about building AI agent services; for that, see x/ai.

As AI coding assistants take on more execution work, the question shifts: does your repository give them a clear operating model — or do they guess? Plumego's control plane gives agents the same routing signals a senior reviewer uses.

specs/task-routing.yaml task routing

Maps work types to owning modules. An agent reads this before writing a single line.

specs/dependency-rules.yaml boundary enforcement

Import violations are caught by a machine, not by reviewer memory.

<module>/module.yaml per-module scope

Each module declares its own checks. Agents run only what is relevant.

Try a scenario — see where it routes

Add rate limiting to an HTTP endpoint
routing rule middleware
owner middleware/
why Transport-only cross-cutting concern — no x/* import needed. Stable roots handle this entirely.

Running in under two minutes.

Install, write one handler, run. Continue to reference/standard-service for the full canonical service shape.

main.go
package main

import (
    "log"
    "net/http"

    "github.com/spcent/plumego/contract"
    "github.com/spcent/plumego/core"
    plog "github.com/spcent/plumego/log"
)

func main() {
    app := core.New(core.DefaultConfig(),
        core.AppDependencies{Logger: plog.NewLogger()})

    if err := app.Get("/ping", http.HandlerFunc(
        func(w http.ResponseWriter, r *http.Request) {
            if err := contract.WriteResponse(w, r,
                http.StatusOK,
                map[string]string{"status": "ok"}, nil); err != nil {
                log.Printf("write: %v", err)
            }
        })); err != nil {
        log.Fatal(err)
    }

    if err := app.Prepare(); err != nil {
        log.Fatal(err)
    }
    srv, err := app.Server()
    if err != nil {
        log.Fatal(err)
    }
    log.Println("listening on :8080")
    srv.ListenAndServe()
}
Verify
$ go mod init myservice
$ go get github.com/spcent/plumego@latest
$ go run .

$ curl localhost:8080/ping
{"data": {"status": "ok"}}

expected response

where to start

Where to go next.

Evaluate fit before the technical details. Browse the modules overview to find the right x/* family. See how Plumego compares to Gin, Echo, and Chi.

fit

Why Plumego

Start here when the question is whether Plumego fits your team, your service shape, and your review expectations — before investing time in the technical details.

Evaluate fit →

agent-first

Agent Workflow

See how machine-readable specs route AI coding agents to the right module, enforce boundaries in CI, and share the same operating model as human reviewers.

See agent model →

extensions

x/* Extension Families

Browse all x/* capability families by maturity tier. 7 beta families with frozen APIs, plus experimental families for product-specific capability work.

Browse extensions →

comparison

Compare Frameworks

Gin, Echo, Fiber, Chi, and Plumego — handler signatures, response contracts, stdlib compatibility, migration cost, and honest benchmarks side by side.

See comparison →

Start from the reference app. Pick the right x/* family. Keep boundaries clear.

Clone reference/standard-service for the stable kernel path. Browse the modules overview to find the right capability family. Let the control plane guide coding assistants and reviewers alike.