fabrik

Full-stack, idiomatic Go,
without the boilerplate.

Fabrik is a full-stack framework that generates the wiring you'd normally hand-write - routing, dependency injection, a runnable server - as idiomatic Go. Framework speed, without the magic.

How Fabrik works

Annotate your Go code with a few //fabrik:* directives. fabrik wire scans them and generates main.gen.go: all the wiring your app needs,
as idiomatic Go code, reviewable, without the implicit magic.

web.go - you write this
package web

//fabrik:provider
func NewGreeter() *Greeter {
    return &Greeter{Prefix: "Hello"}
}

type Handlers struct {
    Greeter *Greeter
}

//fabrik:http GET /
func (h *Handlers) Index(
    w http.ResponseWriter,
    r *http.Request,
) {
    name := r.URL.Query().Get("name")
    if name == "" {
        name = "world"
    }
    w.Write([]byte(h.Greeter.Greet(name)))
}
main.gen.go - Fabrik generates the wiring
// Code generated by fabrik. DO NOT EDIT.
package main

func run() error {
    // Providers
    webGreeter := web.NewGreeter()
    webHandlers := &web.Handlers{
        Greeter: webGreeter,
    }

    // Routes
    mux := http.NewServeMux()
    mux.HandleFunc("GET /", webHandlers.Index)

    addr := ":8080"
    if p := os.Getenv("PORT"); p != "" {
        addr = ":" + p
    }
    return http.ListenAndServe(addr, mux)
}

Get started in a minute

  1. Install the CLI
    go install github.com/gofabrik/fabrik/fabrik@latest
  2. Scaffold and run
    fabrik new hello
    cd hello
    fabrik run
  3. Say hello
    curl 'localhost:8080/?name=fabrik'
    # Hello, fabrik!