gofastr

module
v0.85.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 8, 2026 License: MIT

README

GoFastr

CI Release Go version Go Reference CodeRabbit Pull Request Reviews

The full-stack Go framework that doesn't get in the way of you or your agents.

Docs, component gallery, and live demos →  ·  Quickstart  ·  A GoFastr app in production

GoFastr is a pre-v1 full-stack Go framework. The API can still change between releases, under the deprecation policy. Declare your domain in Go and get server-rendered screens, REST endpoints, MCP tools, an OpenAPI spec, SQL migrations, and a typed query builder. The output is plain Go you can read, edit, and own: no reflection discovers your entities, no generated code you can't open. Auth, background jobs, search, and storage are opt-in packages, and you can drop to net/http or database/sql at any point.

It is built for both the agentic web and AI-assisted development. The app you ship joins the agentic web: the agents your users bring call your data over MCP, with the same login and permissions your users have. While you build, gofastr dev hands your coding agent, Claude Code or Codex, the app's routes, config, and logs over MCP, to help build and debug it.

Start with the quickstart. Or scaffold a whole app in one command: screens, API, and auth from gofastr init <name>, or gofastr generate from a one-file declaration (blueprint tutorial).

A shoutout to CodeRabbit: it reviews every PR in this repo and keeps catching what everyone else missed, like six Major findings on #198 while the checks list showed pass. Every finding is triaged on the PR before merge.

Quickstart

Requires Go 1.27+. Install the CLI:

go install github.com/DonaldMurillo/gofastr/cmd/gofastr@latest

Three complete programs, smallest to fullest, the same three the site's homepage shows (examples/site): plain core/, one framework entity, and the full app shape. CI extracts all three from this README, compiles them, boots them, and curls them (cmd/gofastr/readme_quickstart_test.go).

Core only

core/ is stdlib-first building blocks: router, typed handlers, render, a SQL query builder, schema, migrate, mcp. Each is usable without the framework. The basic app is one screen and one API route:

package main

import (
	"context"
	"net/http"

	"github.com/DonaldMurillo/gofastr/core/handler"
	"github.com/DonaldMurillo/gofastr/core/render"
	"github.com/DonaldMurillo/gofastr/core/router"
)

type Pong struct {
	Status string `json:"status"`
}

func main() {
	r := router.New()

	// A server-rendered page.
	r.Get("/", render.HTMLHandler(func(req *http.Request) render.HTML {
		return render.Tag("h1", nil, render.Text("Hello from core."))
	}))

	// A typed JSON route: the adapter binds input and serializes output.
	r.Get("/api/ping", handler.HandlerAdapter(func(ctx context.Context, _ struct{}) (Pong, error) {
		return Pong{Status: "ok"}, nil
	}))

	http.ListenAndServe(":8080", r)
}
Framework

One framework entity is a complete server: a migrated table, REST CRUD, an OpenAPI spec, and MCP tools. Add only what you need from there.

package main

import (
	"database/sql"
	"log"

	"github.com/DonaldMurillo/gofastr/core/schema"
	"github.com/DonaldMurillo/gofastr/framework"
	_ "github.com/DonaldMurillo/gofastr/sqlite/stdlib"
)

func main() {
	db, _ := sql.Open("sqlite3", "app.db")
	app := framework.NewApp(framework.WithDB(db), framework.WithMCP()) // WithMCP serves the tools at /mcp

	// CRUD is auto-on when a DB is set (CRUD *bool: nil = auto).
	app.Entity("posts", framework.EntityConfig{
		Exposure: &framework.ExposureConfig{
			Public: true, // anonymous read AND write; omit it and CRUD requires a session (secure by default)
			MCP:    true, // emit posts_list/get/create/update/delete MCP tools
		},
		Fields: []schema.Field{{Name: "title", Type: schema.String, Required: true}},
	})

	log.Fatal(app.Start(":8080")) // GET/POST /posts, /openapi.json, MCP: all live
}

That's the whole program. No config files, no codegen step, no registration boilerplate. Add entities-as-JSON, batteries, the UI runtime, or the generator when you need them. For how a flat app grows into internal/<domain>/ as boundaries appear, see project structure.

Donald's Way

The full app shape: server-rendered screens with SEO, an owner-scoped entity API, MCP for agents, and login + sessions, in one binary. A screen is Go too: Render returns HTML, and a small JS runtime hydrates it in place, with no React or Vue on the client:

package main

import (
	"database/sql"
	"log"

	"github.com/DonaldMurillo/gofastr/battery/auth"
	"github.com/DonaldMurillo/gofastr/core-ui/app"
	"github.com/DonaldMurillo/gofastr/core-ui/html"
	"github.com/DonaldMurillo/gofastr/core/render"
	"github.com/DonaldMurillo/gofastr/core/schema"
	"github.com/DonaldMurillo/gofastr/framework"
	"github.com/DonaldMurillo/gofastr/framework/uihost"
	_ "github.com/DonaldMurillo/gofastr/sqlite/stdlib"
)

// A screen is plain Go: Render returns server-rendered HTML.
type HomeScreen struct{}

func (s *HomeScreen) ScreenTitle() string { return "Notes" }
func (s *HomeScreen) Render() render.HTML {
	return html.Heading(html.HeadingConfig{Level: 1}, render.Text("My notes"))
}

func main() {
	db, _ := sql.Open("sqlite3", "notes.db")

	// Server-rendered screens. Each also serves an auto llm.md.
	ui := app.NewApp("Notes")
	ui.Register("/", &HomeScreen{}, nil)

	// SEO for those pages.
	host := uihost.New(ui,
		uihost.WithDescription("A tiny notes app."),
		uihost.WithOpenGraph(uihost.OG{Title: "Notes", Type: "website"}),
		uihost.WithSitemap(uihost.SitemapConfig{BaseURL: "https://notes.example"}),
	)

	// MCP for agents.
	fwApp := framework.NewUIHostApp(host,
		framework.WithDB(db),
		framework.WithAPIPrefix("/api"),
		framework.WithMCP(),
	)

	// Scope.OwnerField scopes rows per user: anonymous → 401, cross-user → 404.
	fwApp.Entity("notes", framework.EntityConfig{
		Scope:    &framework.ScopeConfig{OwnerField: "user_id"},
		Exposure: &framework.ExposureConfig{MCP: true},
		Fields:   []schema.Field{{Name: "title", Type: schema.String, Required: true}},
	})

	// Login + sessions.
	authMgr := auth.New(auth.AuthConfig{
		DevMode:      true, // dev only: mints a per-process JWT secret; set JWTSecret in prod
		UserStore:    auth.NewEntityUserStore(db, "auth_users"),
		SessionStore: auth.NewEntitySessionStore(db, "auth_sessions"),
	})
	authMgr.Use(auth.NewCorePlugin())
	if err := authMgr.Init(fwApp); err != nil {
		log.Fatal(err)
	}
	fwApp.Use(auth.SessionMiddleware(authMgr))

	log.Fatal(fwApp.Start(":8080"))
}

GET / is the rendered screen. Anonymous GET /api/notes answers 401: OwnerField scopes rows per user, and auto-CRUD requires a session unless the entity is Public. /auth/register and /auth/login come from the auth battery, and the MCP tools at /mcp respect the same owner scope as the REST API.

Run it from a clone

To work on the framework itself, or run the examples:

git clone https://github.com/DonaldMurillo/gofastr.git
cd gofastr
go test ./...                        # SQLite; the Postgres halves skip without TEST_POSTGRES_DSN
go run ./cmd/gofastr --help          # CLI overview
go run ./examples/blog               # minimal blog with auto-CRUD on SQLite

Postgres setup and the race pass are under Contributing. Linked Git worktrees of the same app each get their own port and database path, so two coding agents can run side by side (isolation).

Updating GoFastr

The module dependency and the installed CLI are versioned independently; keep them on the same release. gofastr upgrade reads your go.mod, lists every migration note between your version and the target (breaking changes are marked in the release notes), and points at the affected lines in your code (--apply runs the steps). Manual steps and the full guide: upgrading, or gofastr docs upgrading.

The code you don't write

The framework emits routes, validation, migrations, pagination, uploads, the spec, and agent tools from one declaration (app.Entity in Go, or an entities: entry in a blueprint). Declarations are optional: core/ routes and hand-written screens run without them. A declaration grows the same way it starts, with fields, enums, relations, and soft delete:

app.Entity("posts", framework.EntityConfig{
    Scope: &framework.ScopeConfig{SoftDelete: true},
    Fields: []schema.Field{
        {Name: "title", Type: schema.String, Required: true},
        {Name: "body", Type: schema.Text},
        {Name: "status", Type: schema.Enum,
            Values: []string{"draft", "published"}, Default: "draft"},
        {Name: "author_id", Type: schema.Relation, To: "users"},
    },
    Exposure: &framework.ExposureConfig{MCP: true},
})
Output Auto-generated
HTTP GET / POST /posts, GET / PUT / PATCH / DELETE /posts/{id}
Batch endpoints POST / PATCH / DELETE /posts/_batch: atomic; one tx for all items
SSE stream GET /posts/_events: entity.created/updated/deleted, scoped per tenant
Filtering ?status=published&views_gte=10&sort=-created_at&page=2
Eager loading ?include=author.profile,comments: flat or nested, validated against the registry
Cursor paging ?cursor=&limit=50: keyset paging (cursor-pagination)
Multipart upload multipart/form-data on Image/File fields → streamed through WithFileStorage
Validation Required, unique, enum, min/max, regex pattern, multi-tenant scope
Migrations Versioned runner with drift + dirty-state guards; declarative incremental generation (migrations)
FK constraints BelongsTo relations emit FOREIGN KEY clauses; AutoMigrate topo-sorts tables
Transactions Create/Update/Delete + hooks share one tx; TxFromContext(ctx) exposes it
OpenAPI 3 /openapi.json plus a spec-viewer page at /api/docs/
MCP posts_list, posts_get, posts_create, posts_update, posts_delete
Soft delete deleted_at column + automatic filter
Multi-tenant tenant_id column + automatic scope from request context
Hooks BeforeCreate, AfterUpdate, etc. for custom behaviour
Custom routes EntityConfig.Endpoints with optional MCP exposure
Client SDKs gofastr generate sdk: a Go module + JS/TS clients, with a live docs site (sdk)
Customer CLI gofastr generate cli: a branded terminal client for your customers, scoped API-token auth

Try all of it against a running server: examples/api-tour is the curl tour, covering eager loading, cursor paging, atomic batch, SSE, uploads, and sparse updates. Hooks run inside the write's transaction (hooks-and-transactions).

The design bets

  • Two layers. A small core/ of stdlib-first primitives sits under an opinionated framework/. Use the framework for the common path; drop to core and write plain net/http when it's in your way. (The one external touchpoint is core/middleware/tracing.go, which pulls in OpenTelemetry; the rest of core/ is stdlib-only.)
  • Server-rendered UI, hydrated in place. Screens are Go: Render returns HTML and the server sends the full page. A small JS runtime attaches to it. In-page changes like sort, paginate, or add-a-row call the server and swap one region, and cross-page navigation swaps content client-side with a route cache, so there are no hard refreshes. No React or Vue on the client, and no router code for you to write.
  • The interactive layer keeps no server state. Sessions are signed tokens, so any replica serves any request. Updates pull first: client signals, then RPC, then polling. SSE push is reserved for presence and collaboration (reactivity.md).
  • Security scopes live in the declaration, fail-closed. owner_field makes auto-CRUD per-user (anonymous → 401, cross-user → 404), access: gates operations behind RBAC permissions (403), multi_tenant scopes by tenant, and gofastr validate flags PII-shaped fields (email, phone, address, …) exposed without any of them. The MCP tools respect the same scopes as the REST routes.
  • You own the output. The generated code is normal Go you read, debug, commit, edit, and compose from your own main. Registration is ordinary Go in the generated files; no reflection discovers your entities, and no platform sits between your binary and your server.
  • Batteries are separate packages. Auth, cache, email, queue, search, storage sit behind narrow interfaces; swap any one without forking.
  • The framework checks whether you're still using it well. gofastr verify runs the 63 rules of the contract catalog (routing, permissions, security, rendering, accessibility) and measures semantic coverage: not "did this line run" but "did a request ever reach this route, did this permission ever get evaluated". Error-severity findings fail the run (--strict makes warnings fail too), with per-line waivers and a baseline mode for existing codebases. See contracts.
  • A blueprint scaffolds the whole app when you want a head start. One gofastr.yml generates the screens and the API in one pass; then it's plain Go you own and edit, and the running app never needs the blueprint again (blueprint tutorial).

The repo in 60 seconds

Directory What it is Depend on it when…
core/ Stdlib-only primitives: router, query, schema, render, mcp, openapi, migrate. Each usable on its own. you want plain Go building blocks, no framework.
framework/ The opinionated entity layer (App, EntityConfig, CRUD, hooks, migrations). A thin facade re-exporting its focused runtime subpackages. you want one declaration → SQL + REST + OpenAPI + MCP.
core-ui/ Server-driven UI runtime: html primitives, patterns, widget islands, signals, the vanilla-JS runtime. Independently usable. you're rendering HTML from Go.
battery/ Opt-in infrastructure: admin, auth, cache, email, semantic, log, notify, print, queue, relay, rtc, search, setup, storage, webhook. Each behind a small interface. you need a real subsystem; import only the ones you use.
cmd/gofastr The CLI: init, generate, pack (lossy app→blueprint snapshot), migrate, build, dev, verify, docs, and more. you're scaffolding, generating, or checking code.
kiln Experimental agent build-mode runtime (mutate an in-memory IR over HTTP). you're driving the app from an agent.
examples/ Runnable reference apps: the meridian blueprint flagship (a SaaS billing console + marketing site), the ecommerce blueprint pipeline, plus blog, api-tour, spa, and the docs site. you want to see it wired end-to-end.

You import framework and the batteries you opt into, not each of its subpackages. The subpackage split is an internal seam (see framework/ARCHITECTURE.md); the public API is framework.X plus the batteries you reach for.

Built with GoFastr

In production:

  • Barcode & QR Code Maker: a live tool, no signup required, to generate and read barcodes and QR codes (QR, EAN-13, UPC-A, Code 128, Data Matrix, and more) as PNG, SVG, or PDF, with CSV/Excel batch export to a ZIP, a REST API, and an MCP server. Built and running on GoFastr.

The framework also runs on itself: examples/site is the docs site and component gallery, examples/meridian is a blueprint-generated SaaS console + marketing site edited by hand ever since, and examples/ecommerce is still owned by the generator and regenerated on every test run. All three import the same framework, core-ui, and batteries a user app does, and each carries an end-to-end suite. External production adopters are the part still ahead of us; see Project status.

Documentation

Every doc is embedded into the gofastr binary: gofastr docs browses them offline, the docs site serves them rendered with live component demos, and the framework_docs_* MCP tools expose them to agents connected to a running app. The docs index is the browsable entry point. Start with:

Project status

GoFastr is pre-1.0 and explicitly not stable. Pin a version (go get …@v0.x.y); a v1.0.0 tag will mark the stability promise.

  • The core/ primitives are usable and tested in isolation.
  • The framework/ entity layer handles SQLite + Postgres CRUD apps today.
  • core-ui/ changes fastest. Its exported APIs follow the same deprecation policy as the rest of the tree: deprecate first, keep the old shape for at least one minor release. Expect that window to be exercised more often here than anywhere else before v1.
  • The CLI binary bundles a pure-Go SQLite driver (modernc.org/sqlite, registered as sqlite3 by gofastr/sqlite/stdlib), so it builds with CGO_ENABLED=0. To run migrations against Postgres, build a custom binary that imports your driver of choice.

Why this exists

This is a personal project first, a way to practice building something large alongside AI. A few things I wanted to dig into:

  • Solidify my web-tech foundations by rebuilding the stack from the socket up, so the fundamentals stop feeling like magic.
  • Attack UI generation from a different angle. My background is in Node; I wanted to see what server-rendered, server-driven UI looks like with the heavy client framework off the table and the markup generated in a compiled language instead.
  • Work in a compiled language, where a compiler catches the mistakes Node surfaces at runtime, in production.
  • Skip the convention-vs-configuration false choice. Your own framework can have opinionated defaults and a hatch down to plain stdlib code in the same app.
  • Build something large, fun, and open source with AI. Most of this repo was written alongside coding agents; the workflow itself is part of the experiment.

Contributing

This repo is a personal research tree at the moment. Issues and PRs are welcome but expect strong opinions about scope: the goal is a framework an AI agent can drive end-to-end, not a kitchen-sink CMS.

Before pushing, the .githooks/pre-push gate re-runs the deterministic CI test sweep (when a commit skipped it), module-integrity checks, and govulncheck. The race pass is separate. Run make test-race for that. Enable hooks once with:

git config core.hooksPath .githooks
Testing against Postgres

The framework's tests fan over both SQLite and Postgres. With Docker running, every dialect-aware test runs on both engines automatically:

make test            # SQLite only, fast
make test-pg         # both dialects against the docker-compose Postgres
make test-pg-env     # both dialects, points at TEST_POSTGRES_DSN
make test-race       # race detector across the whole repo

Each Postgres test gets its own schema for isolation; the container is shared across the whole go test invocation so cold-start is amortised.

License

MIT: free to use, modify, and distribute, including commercially, provided the copyright notice and license text are preserved.

Directories

Path Synopsis
battery
admin
Package admin is the back-office battery for GoFastr apps, stock operator screens on top of the data and controls the framework already exposes.
Package admin is the back-office battery for GoFastr apps, stock operator screens on top of the data and controls the framework already exposes.
auth
Package auth is GoFastr's authentication subsystem.
Package auth is GoFastr's authentication subsystem.
cache
Package cache is part of the GoFastr framework.
Package cache is part of the GoFastr framework.
email
Package email sends transactional email over SMTP and renders it from templates.
Package email sends transactional email over SMTP and renders it from templates.
log
Package log is the GoFastr server-log plugin.
Package log is the GoFastr server-log plugin.
notify
Package notify is a small unified-notifications primitive for GoFastr apps.
Package notify is a small unified-notifications primitive for GoFastr apps.
print
Package print is a GoFastr battery for printable documents.
Package print is a GoFastr battery for printable documents.
queue
Package queue is part of the GoFastr framework.
Package queue is part of the GoFastr framework.
relay
Package relay serves third-party services (analytics vendors, chat widgets, error trackers) first-party: a declarative, hardened same-origin reverse proxy mounted under one path on the host app.
Package relay serves third-party services (analytics vendors, chat widgets, error trackers) first-party: a declarative, hardened same-origin reverse proxy mounted under one path on the host app.
rtc
Package rtc is a WebRTC signaling server: rooms of peers over one core/stream.StateChannel WebSocket per room, addressed relay of offer/answer/ICE frames, ICE server configuration with per-peer time-limited TURN credentials, and cross-replica relay over core/fanout.
Package rtc is a WebRTC signaling server: rooms of peers over one core/stream.StateChannel WebSocket per room, addressed relay of offer/answer/ICE frames, ICE server configuration with per-peer time-limited TURN credentials, and cross-replica relay over core/fanout.
search
Package search provides pluggable search backends for GoFastr.
Package search provides pluggable search backends for GoFastr.
semantic
Package semantic provides a local semantic-search battery for GoFastr.
Package semantic provides a local semantic-search battery for GoFastr.
setup
Package setup provides a first-run setup flow for self-hosted GoFastr apps.
Package setup provides a first-run setup flow for self-hosted GoFastr apps.
storage
Package storage provides file/object storage backends for the upload battery.
Package storage provides file/object storage backends for the upload battery.
webhook
Package webhook is the outbound-webhook battery for GoFastr.
Package webhook is the outbound-webhook battery for GoFastr.
benchmarks
apps/crud command
crud is the typical entity-CRUD shape: one entity backed by SQLite, auto-migrate, full CRUD routes.
crud is the typical entity-CRUD shape: one entity backed by SQLite, auto-migrate, full CRUD routes.
apps/full command
full is a realistic shape with every supported framework surface wired on at once: three related entities with relations, audit log, cron, MCP, the UI host with one screen, file storage, search backend, access control, multi-tenancy, custom endpoints, plugins, and the OpenAPI + Swagger UI surface.
full is a realistic shape with every supported framework surface wired on at once: three related entities with relations, audit log, cron, MCP, the UI host with one screen, file storage, search backend, access control, multi-tenancy, custom endpoints, plugins, and the OpenAPI + Swagger UI surface.
apps/minimal command
minimal is the smallest meaningful GoFastr binary: NewApp + one plaintext route.
minimal is the smallest meaningful GoFastr binary: NewApp + one plaintext route.
cmd
bench-resources command
bench-resources measures binary size, peak RAM during `go build`, and runtime RAM (idle + under load) for the bench apps under benchmarks/apps/ plus cmd/gofastr and cmd/kiln.
bench-resources measures binary size, peak RAM during `go build`, and runtime RAM (idle + under load) for the bench apps under benchmarks/apps/ plus cmd/gofastr and cmd/kiln.
check-csp command
check-csp is a build-time linter that fails when production Go source emits inline <script> blocks.
check-csp is a build-time linter that fails when production Go source emits inline <script> blocks.
check-embed command
Command check-embed is the build-time gate for server actions on embeddable surfaces.
Command check-embed is the build-time gate for server actions on embeddable surfaces.
check-embed/embedcheck
Package embedcheck is the build-time gate for server actions on embeddable surfaces.
Package embedcheck is the build-time gate for server actions on embeddable surfaces.
gofastr command
Package main: `gofastr harness` subcommand.
Package main: `gofastr harness` subcommand.
kiln command
kiln is the Kiln runtime CLI.
kiln is the Kiln runtime CLI.
mutate command
Command mutate breaks the conditional guards in a package one at a time and reports which ones no test notices.
Command mutate breaks the conditional guards in a package one at a time and reports which ones no test notices.
mutate/guardmut
Package guardmut finds the conditional guards in a Go source file and rewrites them so they can never fire, or always fire.
Package guardmut finds the conditional guards in a Go source file and rewrites them so they can never fire, or always fire.
repolint command
vettool command
vettool bundles the repo's custom go/analysis analyzers for `go vet -vettool`.
vettool bundles the repo's custom go/analysis analyzers for `go vet -vettool`.
Package codegen provides YAML-driven code generation primitives for GoFastr.
Package codegen provides YAML-driven code generation primitives for GoFastr.
core
a2a
Package a2a implements the server side of the Agent2Agent protocol v1.0 task exchange over its JSON-RPC binding: SendMessage, SendStreamingMessage, GetTask, ListTasks, CancelTask, SubscribeToTask, the four push-notification-config operations, and GetExtendedAgentCard.
Package a2a implements the server side of the Agent2Agent protocol v1.0 task exchange over its JSON-RPC binding: SendMessage, SendStreamingMessage, GetTask, ListTasks, CancelTask, SubscribeToTask, the four push-notification-config operations, and GetExtendedAgentCard.
acp
Package acp implements the server (agent) side of the Agent Client Protocol v1 (agentclientprotocol.com): a session-based, stdio JSON-RPC 2.0 protocol that lets editors and agent harnesses drive an agent.
Package acp implements the server (agent) side of the Agent Client Protocol v1 (agentclientprotocol.com): a session-based, stdio JSON-RPC 2.0 protocol that lets editors and agent harnesses drive an agent.
backoff
Package backoff holds the retry-delay policies shared by the outbox relay, the queue and webhook batteries, and the log webhook sink.
Package backoff holds the retry-delay policies shared by the outbox relay, the queue and webhook batteries, and the log webhook sink.
config
Package config provides a first-class configuration loader that binds environment variables, config files, and secret sources into typed Go structs with validation.
Package config provides a first-class configuration loader that binds environment variables, config files, and secret sources into typed Go structs with validation.
dotenv
Package dotenv parses .env files into a map and (optionally) applies them to the process environment.
Package dotenv parses .env files into a map and (optionally) applies them to the process environment.
fanout
Package fanout carries real-time messages between replicas.
Package fanout carries real-time messages between replicas.
featureflag
Package featureflag is a minimal feature-flag primitive for GoFastr apps.
Package featureflag is a minimal feature-flag primitive for GoFastr apps.
fuzzy
Package fuzzy holds small string-similarity helpers shared across the codebase.
Package fuzzy holds small string-similarity helpers shared across the codebase.
handler
Package handler is part of the GoFastr framework.
Package handler is part of the GoFastr framework.
i18n
Package i18n is a small internationalization primitive for GoFastr apps: locale negotiation from `Accept-Language`, JSON-backed message catalogs with `{{placeholder}}` interpolation, and CLDR-style plural categories (zero / one / two / few / many / other) with sensible English defaults and a hook for per-locale custom rules.
Package i18n is a small internationalization primitive for GoFastr apps: locale negotiation from `Accept-Language`, JSON-backed message catalogs with `{{placeholder}}` interpolation, and CLDR-style plural categories (zero / one / two / few / many / other) with sensible English defaults and a hook for per-locale custom rules.
jcs
Package jcs implements RFC 8785 (JSON Canonicalization Scheme) using only the Go standard library.
Package jcs implements RFC 8785 (JSON Canonicalization Scheme) using only the Go standard library.
markdown
Package markdown is a small, dependency-free Markdown renderer.
Package markdown is a small, dependency-free Markdown renderer.
mcp
check-csp:ignore-file
check-csp:ignore-file
middleware
Package middleware is part of the GoFastr framework.
Package middleware is part of the GoFastr framework.
migrate
Package migrate is a versioned SQL migration runner with optional per-group migration streams.
Package migrate is a versioned SQL migration runner with optional per-group migration streams.
moduleproto
Package moduleproto implements the wire protocol between the GoFastr host process and an out-of-process third-party module, as specified by issue #37 (design §4).
Package moduleproto implements the wire protocol between the GoFastr host process and an out-of-process third-party module, as specified by issue #37 (design §4).
netguard
Package netguard holds the one definition of "this address is internal" that every outbound-fetch surface checks against.
Package netguard holds the one definition of "this address is internal" that every outbound-fetch surface checks against.
openapi
Package openapi is part of the GoFastr framework.
Package openapi is part of the GoFastr framework.
query
Package query is part of the GoFastr framework.
Package query is part of the GoFastr framework.
render
Package render is part of the GoFastr framework.
Package render is part of the GoFastr framework.
router
Package router is part of the GoFastr framework.
Package router is part of the GoFastr framework.
schema
Package schema is part of the GoFastr framework.
Package schema is part of the GoFastr framework.
static
Package static is part of the GoFastr framework.
Package static is part of the GoFastr framework.
stream
Package stream is part of the GoFastr framework.
Package stream is part of the GoFastr framework.
textsafe
Package textsafe holds the one predicate for the characters that forge, reorder, or hide text: the C1 control block and the zero-width / bidi "invisible" set.
Package textsafe holds the one predicate for the characters that forge, reorder, or hide text: the C1 control block and the zero-width / bidi "invisible" set.
upload
Package upload is part of the GoFastr framework.
Package upload is part of the GoFastr framework.
webbotauth
Package webbotauth verifies inbound Web Bot Auth requests: RFC 9421 HTTP Message Signatures under the profile of draft-meunier-webbotauth-httpsig-protocol-02 (18 August 2026), the IETF Web Bot Auth working-group draft.
Package webbotauth verifies inbound Web Bot Auth requests: RFC 9421 HTTP Message Signatures under the profile of draft-meunier-webbotauth-httpsig-protocol-02 (18 August 2026), the IETF Web Bot Auth working-group draft.
core-ui
app
Package app is the URL → rendered page pipeline for GoFastr UI.
Package app is the URL → rendered page pipeline for GoFastr UI.
app/decide
Package decide provides the constructors for app.Decision values returned from Policy.Decide implementations.
Package decide provides the constructors for app.Decision values returned from Policy.Decide implementations.
check
Package check provides an AST-based linter for .ui.go files.
Package check provides an AST-based linter for .ui.go files.
component
Package component defines the component model for GoFastr's core-ui framework.
Package component defines the component model for GoFastr's core-ui framework.
compute
Package compute registers content-addressed Web Worker and WebAssembly assets for GoFastr applications.
Package compute registers content-addressed Web Worker and WebAssembly assets for GoFastr applications.
di
html
Package html provides semantic, ADA-compliant HTML element primitives for the GoFastr core-ui framework.
Package html provides semantic, ADA-compliant HTML element primitives for the GoFastr core-ui framework.
interactive
Package interactive provides declarative interactivity primitives for GoFastr components.
Package interactive provides declarative interactivity primitives for GoFastr components.
island
Package island is the runtime-side manager for server-driven SSE updates.
Package island is the runtime-side manager for server-driven SSE updates.
node
Package node is the JSON-clean UI element tree, the serializable description of a screen that renders to HTML via core-ui/noderender.
Package node is the JSON-clean UI element tree, the serializable description of a screen that renders to HTML via core-ui/noderender.
patterns/accordion
Package accordion provides disclosure widgets built on the native <details>/<summary> html.
Package accordion provides disclosure widgets built on the native <details>/<summary> html.
patterns/breadcrumbs
Package breadcrumbs renders an ARIA-correct breadcrumb trail.
Package breadcrumbs renders an ARIA-correct breadcrumb trail.
patterns/combobox
Package combobox implements the WAI-ARIA Combobox 1.2 pattern as a server-rendered input that's bound to a debounced RPC dropdown.
Package combobox implements the WAI-ARIA Combobox 1.2 pattern as a server-rendered input that's bound to a debounced RPC dropdown.
patterns/disclosure
Package disclosure renders a single styled <details>/<summary> disclosure section.
Package disclosure renders a single styled <details>/<summary> disclosure section.
patterns/infinitescroll
Package infinitescroll provides a sentinel-based infinite-scroll container that lazily fetches the next page of items via RPC as the user scrolls.
Package infinitescroll provides a sentinel-based infinite-scroll container that lazily fetches the next page of items via RPC as the user scrolls.
patterns/multiselect
Package multiselect renders a checkbox-group inside a disclosure with chip rendering of the selected values above the trigger.
Package multiselect renders a checkbox-group inside a disclosure with chip rendering of the selected values above the trigger.
patterns/nestedlist
Package nestedlist renders recursive <ul>/<ol> hierarchies with optional native <details> collapse on branches.
Package nestedlist renders recursive <ul>/<ol> hierarchies with optional native <details> collapse on branches.
patterns/pagination
Package pagination renders a numeric pagination nav.
Package pagination renders a numeric pagination nav.
patterns/progress
Package progress provides a thin wrapper around the native <progress> element with theme-aware styling.
Package progress provides a thin wrapper around the native <progress> element with theme-aware styling.
patterns/scrollspy
Package scrollspy attaches IntersectionObserver-based section tracking to any list of in-page anchors.
Package scrollspy attaches IntersectionObserver-based section tracking to any list of in-page anchors.
patterns/skeleton
Package skeleton provides shimmer placeholders rendered with pure CSS.
Package skeleton provides shimmer placeholders rendered with pure CSS.
patterns/sortablelist
Package sortablelist renders a reorderable list with HTML5 drag-and-drop plus keyboard fallback (Space to grab, Arrow up/down to move within a column, Arrow left/right to move between columns, Space again to drop, Esc to cancel).
Package sortablelist renders a reorderable list with HTML5 drag-and-drop plus keyboard fallback (Space to grab, Arrow up/down to move within a column, Arrow left/right to move between columns, Space again to drop, Esc to cancel).
patterns/tabs
Package tabs provides a tabbed-content layout with zero JavaScript.
Package tabs provides a tabbed-content layout with zero JavaScript.
patterns/tree
Package tree provides a TreeView component built on the WAI-ARIA tree pattern.
Package tree provides a TreeView component built on the WAI-ARIA tree pattern.
registry
Package registry is the process-global catalog of components whose CSS is shipped as real stylesheets and loaded on demand by the runtime.
Package registry is the process-global catalog of components whose CSS is shipped as real stylesheets and loaded on demand by the runtime.
runtime
Package runtime provides the GoFastr client-side JavaScript runtime as an embedded resource.
Package runtime provides the GoFastr client-side JavaScript runtime as an embedded resource.
runtime/minify
Package minify implements a token-aware JavaScript minifier used to shrink the embedded runtime sources before they're served.
Package minify implements a token-aware JavaScript minifier used to shrink the embedded runtime sources before they're served.
seo
Package seo provides typed Schema.org structs that marshal to the JSON-LD shape Google and other crawlers consume for rich results (FAQ snippets, product cards, breadcrumb trails, article cards).
Package seo provides typed Schema.org structs that marshal to the JSON-LD shape Google and other crawlers consume for rich results (FAQ snippets, product cards, breadcrumb trails, article cards).
store
Package store is a typed, server-declared shared-state primitive for the GoFastr UI.
Package store is a typed, server-declared shared-state primitive for the GoFastr UI.
style
Package style provides the typed design system and CSS builders for the GoFastr core-ui framework.
Package style provides the typed design system and CSS builders for the GoFastr core-ui framework.
uinodev1
Package uinodev1 implements the closed ui.node.v1 wire type and validator for process-isolated third-party modules (design §9, issue #37).
Package uinodev1 implements the closed ui.node.v1 wire type and validator for process-isolated third-party modules (design §9, issue #37).
urlsafe
Package urlsafe holds the one URL-scheme allow-list every surface that renders a caller-supplied URL runs through.
Package urlsafe holds the one URL-scheme allow-list every surface that renders a caller-supplied URL runs through.
widget
Package widget provides the framework's overlay-UI primitive.
Package widget provides the framework's overlay-UI primitive.
widget/preset
Package preset bundles the most common widget surfaces as opinionated builders on top of widget.Definition.
Package preset bundles the most common widget surfaces as opinionated builders on top of widget.Definition.
widget/theme
Package theme provides the framework's default page theme, the visual identity for any app built via core-ui (or its consumers like kiln).
Package theme provides the framework's default page theme, the visual identity for any app built via core-ui (or its consumers like kiln).
evals
internal/childenv
Package childenv decides what environment an agent-driven child process may see.
Package childenv decides what environment an agent-driven child process may see.
examples
api-tour command
Package main is a tour of the v2 API surface added to the framework:
Package main is a tour of the v2 API surface added to the framework:
backoffice command
Command backoffice is a minimal example of the battery/admin entity CRUD admin rendered through a UI host: a few entities, a (demo-grade) login, and admin.New(...) generating the whole back-office with defaults.
Command backoffice is a minimal example of the battery/admin entity CRUD admin rendered through a UI host: a few entities, a (demo-grade) login, and admin.New(...) generating the whole back-office with defaults.
blog command
ecommerce
Package ecommerce is GoFastr's declaration-driven flagship example: a complete storefront: five related entities, screens, navigation, custom endpoints, seed data, and a theme, declared once in gofastr.yml and emitted as runnable Go by the CLI:
Package ecommerce is GoFastr's declaration-driven flagship example: a complete storefront: five related entities, screens, navigation, custom endpoints, seed data, and a theme, declared once in gofastr.yml and emitted as runnable Go by the CLI:
ecommerce/app command
Code generated by gofastr.
Code generated by gofastr.
embed-demo command
Package main demonstrates embeddable surfaces: a GoFastr app handing out a piece of itself to a website it does not control.
Package main demonstrates embeddable surfaces: a GoFastr app handing out a piece of itself to a website it does not control.
meridian command
Package main is Meridian, the GoFastr flagship demo, and the design-system completeness canary (CLAUDE.md hard rule 9).
Package main is Meridian, the GoFastr flagship demo, and the design-system completeness canary (CLAUDE.md hard rule 9).
meridian/cmd/meridian command
meridian is a terminal client for your app's HTTP API, generated by `gofastr generate cli --binary=meridian`.
meridian is a terminal client for your app's HTTP API, generated by `gofastr generate cli --binary=meridian`.
processmodule-demo command
Package main is the processmodule-demo: a minimal but real third-party module that speaks the moduleproto protocol over stdio.
Package main is the processmodule-demo: a minimal but real third-party module that speaks the moduleproto protocol over stdio.
rtc-call command
Package main is the dogfood example for battery/rtc: anonymous users, rooms by name, camera and microphone peer to peer, chat over a negotiated data channel.
Package main is the dogfood example for battery/rtc: anonymous users, rooms by name, camera and microphone peer to peer, chat over a negotiated data channel.
semantic-demo command
Package main is a minimal demonstration of the battery/semantic package.
Package main is a minimal demonstration of the battery/semantic package.
site command
spa command
static-site command
webmcp-remote-assist command
Package main is the reference example for authenticated WebMCP plus WebRTC remote support: one Go binary, one origin, two roles.
Package main is the reference example for authenticated WebMCP plus WebRTC remote support: one Go binary, one origin, two roles.
Package framework is the public surface of the GoFastr framework.
Package framework is the public surface of the GoFastr framework.
agentsinv
Package agentsinv is a process-wide registry of agent-onboarding snippets contributed by batteries and the framework root.
Package agentsinv is a process-wide registry of agent-onboarding snippets contributed by batteries and the framework root.
axecov
Package axecov is the axe-coverage manifest shared between the axe test harness and strict mode.
Package axecov is the axe-coverage manifest shared between the axe test harness and strict mode.
contracts
Package contracts is GoFastr's semantic analysis layer: the rules that say whether a codebase is a *good GoFastr application*, not merely a compiling one.
Package contracts is GoFastr's semantic analysis layer: the rules that say whether a codebase is a *good GoFastr application*, not merely a compiling one.
contracts/analyzers
Package analyzers holds every detector behind `gofastr verify`.
Package analyzers holds every detector behind `gofastr verify`.
datexport
Package datexport is a process-wide registry of data-bearing tables that live OUTSIDE the framework entity registry, the physical tables a battery (auth sessions, the job queue, …) or an app creates with raw DDL.
Package datexport is a process-wide registry of data-bearing tables that live OUTSIDE the framework entity registry, the physical tables a battery (auth sessions, the job queue, …) or an app creates with raw DDL.
db
Package db holds shared low-level database abstractions used across the GoFastr framework subpackages.
Package db holds shared low-level database abstractions used across the GoFastr framework subpackages.
dev
Package dev provides dev-mode-only helpers (livereload, debug surfaces).
Package dev provides dev-mode-only helpers (livereload, debug surfaces).
docs
Package docs ships the framework's user-facing markdown docs as an embedded filesystem.
Package docs ships the framework's user-facing markdown docs as an embedded filesystem.
dsl
embed
Package embed lets a GoFastr app hand out pieces of itself.
Package embed lets a GoFastr app hand out pieces of itself.
experimental/apiversions
Package apiversions provides first-class API versioning built on top of route groups.
Package apiversions provides first-class API versioning built on top of route groups.
experimental/harness
Package harness is part of the GoFastr harness.
Package harness is part of the GoFastr harness.
experimental/harness/client/tui
Package tui is part of the GoFastr harness.
Package tui is part of the GoFastr harness.
experimental/harness/client/web
Package web is part of the GoFastr harness.
Package web is part of the GoFastr harness.
experimental/harness/context
Package context is part of the GoFastr harness.
Package context is part of the GoFastr harness.
experimental/harness/control
Package control is part of the GoFastr harness.
Package control is part of the GoFastr harness.
experimental/harness/control/auth
Package auth implements the capability-token model: claim set, internal JWT-like encoding (no third-party dep), revocation list, and the issuance flow with TTY/notification confirmation.
Package auth implements the capability-token model: claim set, internal JWT-like encoding (no third-party dep), revocation list, and the issuance flow with TTY/notification confirmation.
experimental/harness/control/inproc
Package inproc is part of the GoFastr harness.
Package inproc is part of the GoFastr harness.
experimental/harness/control/mcpserver
Package mcpserver will expose the harness engine as an MCP server.
Package mcpserver will expose the harness engine as an MCP server.
experimental/harness/control/multiplex
Package multiplex is part of the GoFastr harness.
Package multiplex is part of the GoFastr harness.
experimental/harness/control/resources
Package resources is part of the GoFastr harness.
Package resources is part of the GoFastr harness.
experimental/harness/control/rest
Package rest is part of the GoFastr harness.
Package rest is part of the GoFastr harness.
experimental/harness/control/ws
Package ws will implement the WebSocket transport for the control plane.
Package ws will implement the WebSocket transport for the control plane.
experimental/harness/engine
Package engine is part of the GoFastr harness.
Package engine is part of the GoFastr harness.
experimental/harness/hook
Package hook is part of the GoFastr harness.
Package hook is part of the GoFastr harness.
experimental/harness/ids
Package ids is part of the GoFastr harness.
Package ids is part of the GoFastr harness.
experimental/harness/internal/clock
Package clock provides a swap-able clock for tests.
Package clock provides a swap-able clock for tests.
experimental/harness/internal/ulid
Package ulid is part of the GoFastr harness.
Package ulid is part of the GoFastr harness.
experimental/harness/logging
Package logging is part of the GoFastr harness.
Package logging is part of the GoFastr harness.
experimental/harness/mcpclient
Package mcpclient implements the MCP client (consumer side) the harness uses to talk to external MCP servers.
Package mcpclient implements the MCP client (consumer side) the harness uses to talk to external MCP servers.
experimental/harness/memory
Package memory is part of the GoFastr harness.
Package memory is part of the GoFastr harness.
experimental/harness/profile
Package profile is part of the GoFastr harness.
Package profile is part of the GoFastr harness.
experimental/harness/provider
Package provider is part of the GoFastr harness.
Package provider is part of the GoFastr harness.
experimental/harness/provider/credstore
Package credstore implements credential storage.
Package credstore implements credential storage.
experimental/harness/provider/helper
Package helper is part of the GoFastr harness.
Package helper is part of the GoFastr harness.
experimental/harness/provider/internal/openai
Package openai is an internal OpenAI-compatible adapter used by the OpenRouter and ZAI providers (both speak the same wire shape).
Package openai is an internal OpenAI-compatible adapter used by the OpenRouter and ZAI providers (both speak the same wire shape).
experimental/harness/provider/openrouter
Package openrouter is part of the GoFastr harness.
Package openrouter is part of the GoFastr harness.
experimental/harness/provider/zai
Package zai is part of the GoFastr harness.
Package zai is part of the GoFastr harness.
experimental/harness/secrets
Package secrets locates and loads the repo-local .harness-secrets/env file.
Package secrets locates and loads the repo-local .harness-secrets/env file.
experimental/harness/session
Package session is part of the GoFastr harness.
Package session is part of the GoFastr harness.
experimental/harness/session/sqlite
Package sqlite is part of the GoFastr harness.
Package sqlite is part of the GoFastr harness.
experimental/harness/skill
Package skill is part of the GoFastr harness.
Package skill is part of the GoFastr harness.
experimental/harness/skill/skillmd
Package skillmd is part of the GoFastr harness.
Package skillmd is part of the GoFastr harness.
experimental/harness/slash
Package slash is part of the GoFastr harness.
Package slash is part of the GoFastr harness.
experimental/harness/tool
Package tool is part of the GoFastr harness.
Package tool is part of the GoFastr harness.
experimental/harness/tool/builtins
Package builtins is part of the GoFastr harness.
Package builtins is part of the GoFastr harness.
experimental/harness/tool/permission
Package permission is part of the GoFastr harness.
Package permission is part of the GoFastr harness.
experimental/harness/tracing
Package tracing is part of the GoFastr harness.
Package tracing is part of the GoFastr harness.
experimental/webmcp
Package webmcp exposes an app's server-declared tools to in-browser AI agents through the WebMCP proposal (navigator.modelContext).
Package webmcp exposes an app's server-declared tools to in-browser AI agents through the WebMCP proposal (navigator.modelContext).
factory
Package factory provides Rails-style fixture / factory helpers for GoFastr tests and dev-time seeders.
Package factory provides Rails-style fixture / factory helpers for GoFastr tests and dev-time seeders.
fanout
Package fanout provides a Postgres-backed implementation of core/fanout.Fanout using LISTEN/NOTIFY.
Package fanout provides a Postgres-backed implementation of core/fanout.Fanout using LISTEN/NOTIFY.
gallery
Package gallery ships the importable component catalog that powers the /components showcase on the docs site (examples/site) and any other tool that needs to render every design-system component against an arbitrary theme, most notably the theme-configuration tool that will live inside the gofastr CLI binary (cmd/gofastr), which cannot import examples/.
Package gallery ships the importable component catalog that powers the /components showcase on the docs site (examples/site) and any other tool that needs to render every design-system component against an arbitrary theme, most notably the theme-configuration tool that will live inside the gofastr CLI binary (cmd/gofastr), which cannot import examples/.
i18nui
Package i18nui provides translated default strings for framework UI surfaces.
Package i18nui provides translated default strings for framework UI surfaces.
image
Package image is a chainable image pipeline: decode → transform → encode, pure Go with only the standard library and golang.org/x/image as dependencies.
Package image is a chainable image pipeline: decode → transform → encode, pure Go with only the standard library and golang.org/x/image as dependencies.
image/internal/vp8l
Package vp8l implements a pure-Go VP8L (WebP lossless) encoder.
Package vp8l implements a pure-Go VP8L (WebP lossless) encoder.
imagefield
Package imagefield connects the image pipeline to the upload path: it turns a framework/image.VariantSet into the file.ImageDeriver that ProcessFileField and the CRUD upload handler call, so declaring a schema.Image field is what makes uploads produce renditions and a BlurHash, no per-entity upload handler.
Package imagefield connects the image pipeline to the upload path: it turns a framework/image.VariantSet into the file.ImageDeriver that ProcessFileField and the CRUD upload handler call, so declaring a schema.Image field is what makes uploads produce renditions and a BlurHash, no per-entity upload handler.
internal/casing
Package casing holds snake_case <-> camelCase helpers used internally by the GoFastr framework.
Package casing holds snake_case <-> camelCase helpers used internally by the GoFastr framework.
internal/testdb
Package testdb provides shared per-test database helpers used by the framework's internal tests AND by framework_test (external) tests that can't access package-private helpers.
Package testdb provides shared per-test database helpers used by the framework's internal tests AND by framework_test (external) tests that can't access package-private helpers.
isolation
Package isolation resolves worktree-specific local runtime resources.
Package isolation resolves worktree-specific local runtime resources.
lifecycle
Package lifecycle provides a documented, cooperative graceful-shutdown contract for GoFastr applications.
Package lifecycle provides a documented, cooperative graceful-shutdown contract for GoFastr applications.
outbox
Package outbox implements a transactional outbox for reliable event delivery to declared durable consumers.
Package outbox implements a transactional outbox for reliable event delivery to declared durable consumers.
owner
Package owner provides a single seam for "who owns this row" lookups during CRUD operations.
Package owner provides a single seam for "who owns this row" lookups during CRUD operations.
pluginhost
Package pluginhost is the reusable, plugin-agnostic host glue for GoFastr heavy-JS plugins that run inside an opaque-origin sandboxed iframe.
Package pluginhost is the reusable, plugin-agnostic host glue for GoFastr heavy-JS plugins that run inside an opaque-origin sandboxed iframe.
processmoduletest
Package processmoduletest holds the process-module supervisor and gate e2e suites that used to live in the framework root test package.
Package processmoduletest holds the process-module supervisor and gate e2e suites that used to live in the framework root test package.
ratelimit
Package ratelimit is the framework's general-purpose HTTP rate limiter.
Package ratelimit is the framework's general-purpose HTTP rate limiter.
routegroup
Package routegroup provides the App-level route group abstraction.
Package routegroup provides the App-level route group abstraction.
sdk
Package sdk is the shared contract between `gofastr generate sdk` (which emits client SDKs and packs the downloadable artifacts) and the serving side (framework/sdkdocs, which hosts them).
Package sdk is the shared contract between `gofastr generate sdk` (which emits client SDKs and packs the downloadable artifacts) and the serving side (framework/sdkdocs, which hosts them).
sdkdocs
Package sdkdocs serves a public SDK documentation site for a GoFastr app: install guides, a live per-entity API reference, auth and error guides, plus download routes for the pregenerated SDK artifacts that `gofastr generate sdk` emits (see framework/sdk for the shared contract).
Package sdkdocs serves a public SDK documentation site for a GoFastr app: install guides, a live per-entity API reference, auth and error guides, plus download routes for the pregenerated SDK artifacts that `gofastr generate sdk` emits (see framework/sdk for the shared contract).
semcov
Package semcov is the semantic-coverage manifest: a record of what a test run actually exercised, as opposed to which lines it happened to execute.
Package semcov is the semantic-coverage manifest: a record of what a test run actually exercised, as opposed to which lines it happened to execute.
static
Package static implements static-site generation for a framework.App with a UIHost mounted on it.
Package static implements static-site generation for a framework.App with a UIHost mounted on it.
testkit
Package testkit provides PUBLIC test helpers for host apps that use the GoFastr framework.
Package testkit provides PUBLIC test helpers for host apps that use the GoFastr framework.
testkit/axetest
Package axetest is the axe-core accessibility-testing harness for GoFastr apps, host applications and the framework's own chromedp suites alike.
Package axetest is the axe-core accessibility-testing harness for GoFastr apps, host applications and the framework's own chromedp suites alike.
ui
Package ui is the framework's opinionated component layer on top of core-ui.
Package ui is the framework's opinionated component layer on top of core-ui.
ui/resource
Package resource renders CRUD-backed list, detail, and form screens from Config.
Package resource renders CRUD-backed list, detail, and form screens from Config.
ui/theme
Package theme is the canonical home for the framework's visual design system.
Package theme is the canonical home for the framework's visual design system.
uie2e
Package uie2e holds the chromedp browser e2e suite that used to live in the framework root test package.
Package uie2e holds the chromedp browser e2e suite that used to live in the framework root test package.
uihost
Package uihost wires a core-ui application onto a framework.App's router.
Package uihost wires a core-ui application onto a framework.App's router.
uihost/internal/sessiontoken
Package sessiontoken mints and verifies the stateless HMAC-signed tokens that replace the uihost's in-memory session map.
Package sessiontoken mints and verifies the stateless HMAC-signed tokens that replace the uihost's in-memory session map.
uihost/uinoderender
Package uinoderender maps a validated ui.node.v1 tree (github.com/DonaldMurillo/gofastr/core-ui/uinodev1.Tree) to host-owned HTML by composing the framework's design-system primitives: github.com/DonaldMurillo/gofastr/framework/ui and github.com/DonaldMurillo/gofastr/core-ui/html.
Package uinoderender maps a validated ui.node.v1 tree (github.com/DonaldMurillo/gofastr/core-ui/uinodev1.Tree) to host-owned HTML by composing the framework's design-system primitives: github.com/DonaldMurillo/gofastr/framework/ui and github.com/DonaldMurillo/gofastr/core-ui/html.
internal
analyzers/allow
Package allow is the one marked-exception mechanism for the repo analyzers: a diagnostic whose line (or the line right below a stand-alone marker line) carries
Package allow is the one marked-exception mechanism for the repo analyzers: a diagnostic whose line (or the line right below a stand-alone marker line) carries
analyzers/asciifold
Package asciifold catches registry lookups that fold Unicode case.
Package asciifold catches registry lookups that fold Unicode case.
analyzers/callbackunderlock
Package callbackunderlock catches calls through func-typed values while a sync mutex is held.
Package callbackunderlock catches calls through func-typed values while a sync mutex is held.
analyzers/compositekey
The join is recognized through the indirections a real bug wears: a local or struct field bound from it, a one-result helper whose body reduces to returning it (statements that only rebind the helper's parameters in front of the return do not hide it), and the one-arg string-preserving normalizers around it at the sink (strings.ToLower/ToUpper/TrimSpace — the usual key normalizers).
The join is recognized through the indirections a real bug wears: a local or struct field bound from it, a one-result helper whose body reduces to returning it (statements that only rebind the helper's parameters in front of the return do not hide it), and the one-arg string-preserving normalizers around it at the sink (strings.ToLower/ToUpper/TrimSpace — the usual key normalizers).
analyzers/controlbytes
Package controlbytes catches request-derived strings reaching a log, span-attribute, or header sink without a control-byte scrub.
Package controlbytes catches request-derived strings reaching a log, span-attribute, or header sink without a control-byte scrub.
analyzers/credfetch
Package credfetch catches an http.Client with no CheckRedirect used for a credential-bearing fetch.
Package credfetch catches an http.Client with no CheckRedirect used for a credential-bearing fetch.
analyzers/discardeddecode
Package discardeddecode catches a request-shaped parse whose error is thrown away: `_ = json.NewDecoder(r.Body).Decode(&body)`, `_ = json.Unmarshal(b, &v)`, `_ = r.ParseForm()`, and the bare statement spelling that drops the result on the floor.
Package discardeddecode catches a request-shaped parse whose error is thrown away: `_ = json.NewDecoder(r.Body).Decode(&body)`, `_ = json.Unmarshal(b, &v)`, `_ = r.ParseForm()`, and the bare statement spelling that drops the result on the floor.
analyzers/discardederr
Package discardederr catches a multi-value assignment that drops an error on the floor while keeping the values around it: `ch, cancel, _ := m.subscribeImpl(id)`.
Package discardederr catches a multi-value assignment that drops an error on the floor while keeping the values around it: `ch, cancel, _ := m.subscribeImpl(id)`.
analyzers/discardmutator
Package discardmutator catches security-state mutations whose result is discarded right where the handler acknowledges success.
Package discardmutator catches security-state mutations whose result is discarded right where the handler acknowledges success.
analyzers/divlimit
Package divlimit catches integer division and remainder by a caller-supplied pagination-sized value that the function never guards against 0 or 1.
Package divlimit catches integer division and remainder by a caller-supplied pagination-sized value that the function never guards against 0 or 1.
analyzers/emitident
Package emitident catches names formatted into emitted code without an identifier gate.
Package emitident catches names formatted into emitted code without an identifier gate.
analyzers/errleak
Package errleak catches an internal error string being handed to the client on a 5xx response — or, since the 2026-09-07 round, into a JSON-RPC internal-error response.
Package errleak catches an internal error string being handed to the client on a 5xx response — or, since the 2026-09-07 round, into a JSON-RPC internal-error response.
analyzers/fieldtypeswitch
Package fieldtypeswitch makes adding a schema field type a checklist instead of a silent hazard.
Package fieldtypeswitch makes adding a schema field type a checklist instead of a silent hazard.
analyzers/fixedtmp
Package fixedtmp catches a path under the shared temp root whose name is CONSTANT or pid-predictable reaching a create/mkdir/exec or build sink: os.Mkdir / os.MkdirAll / os.Create / os.WriteFile / os.OpenFile(write flags) on it, an exec.Command / exec.CommandContext argument (`go build -o <path>` writes through whatever is at the path; argv[0] runs it), or an exec.Cmd Dir assignment (the child's cwd).
Package fixedtmp catches a path under the shared temp root whose name is CONSTANT or pid-predictable reaching a create/mkdir/exec or build sink: os.Mkdir / os.MkdirAll / os.Create / os.WriteFile / os.OpenFile(write flags) on it, an exec.Command / exec.CommandContext argument (`go build -o <path>` writes through whatever is at the path; argv[0] runs it), or an exec.Cmd Dir assignment (the child's cwd).
analyzers/fmtformat
Package fmtformat catches URL-encoder output (url.Values.Encode, url.QueryEscape, url.PathEscape) becoming part of a fmt format string.
Package fmtformat catches URL-encoder output (url.Values.Encode, url.QueryEscape, url.PathEscape) becoming part of a fmt format string.
analyzers/hygiene
Package hygiene holds the small checks whose whole point is that they currently find nothing.
Package hygiene holds the small checks whose whole point is that they currently find nothing.
analyzers/internal/dominance
Package dominance provides the statement-dominance walk shared by the analyzers under internal/analyzers: which statements and conditions of a function body are guaranteed to execute before a given node.
Package dominance provides the statement-dominance walk shared by the analyzers under internal/analyzers: which statements and conditions of a function body are guaranteed to execute before a given node.
analyzers/internal/pathflow
Package pathflow holds the path-dataflow machinery the root-shaped analyzers (rootwrite, rootread) share: local-binding resolution, the root/base/dir-named root tests, the lexical Join/concat containment shapes — including the one-hop same-package helper that RETURNS a root-joined path — and the EvalSymlinks-on-the-chain judgement that separates the fix posture from a resolution on an unrelated path.
Package pathflow holds the path-dataflow machinery the root-shaped analyzers (rootwrite, rootread) share: local-binding resolution, the root/base/dir-named root tests, the lexical Join/concat containment shapes — including the one-hop same-package helper that RETURNS a root-joined path — and the EvalSymlinks-on-the-chain judgement that separates the fix posture from a resolution on an unrelated path.
analyzers/intwrap
Package intwrap catches the two integer-wrap postures that slip past range checks: unsigned→signed conversion without a bound, and unary negation of MinInt inside an abs.
Package intwrap catches the two integer-wrap postures that slip past range checks: unsigned→signed conversion without a bound, and unary negation of MinInt inside an abs.
analyzers/laxcoerce
Package laxcoerce catches a wrong type masquerading as absence: a comma-ok type assertion on a map[string]any entry whose failure path returns zero values with a nil error — or continues — as though the key had never been sent.
Package laxcoerce catches a wrong type masquerading as absence: a comma-ok type assertion on a map[string]any entry whose failure path returns zero values with a nil error — or continues — as though the key had never been sent.
analyzers/laxenvelope
Package laxenvelope catches a transport that decodes the SAME envelope type lax at one site while the same package — or, since the 2026-09-07 round, ANY package — decodes that type strictly at another.
Package laxenvelope catches a transport that decodes the SAME envelope type lax at one site while the same package — or, since the 2026-09-07 round, ANY package — decodes that type strictly at another.
analyzers/mapwriter
Package mapwriter catches nondeterministic SSR output at its source: ranging over a Go map while writing into an output builder emits attributes/markup in a different order every render.
Package mapwriter catches nondeterministic SSR output at its source: ranging over a Go map while writing into an output builder emits attributes/markup in a different order every render.
analyzers/names
Package names is the dependency-free list of repo analyzer names: the vocabulary of the //gofastr:allow(<name>) marker.
Package names is the dependency-free list of repo analyzer names: the vocabulary of the //gofastr:allow(<name>) marker.
analyzers/negdur
Package negdur catches time.Duration zero-tests that silently fold a NEGATIVE lifetime onto the "zero means default" or "nonzero means expiry" arm.
Package negdur catches time.Duration zero-tests that silently fold a NEGATIVE lifetime onto the "zero means default" or "nonzero means expiry" arm.
analyzers/nonfinite
Package nonfinite catches a strconv.ParseFloat result stored or returned without a NaN/Inf gate.
Package nonfinite catches a strconv.ParseFloat result stored or returned without a NaN/Inf gate.
analyzers/nostore
Package nostore catches a per-caller 2xx response written with no Cache-Control on its path.
Package nostore catches a per-caller 2xx response written with no Cache-Control on its path.
analyzers/nowaitdelay
Package nowaitdelay catches an exec.CommandContext child with captured stdout started with no WaitDelay bound.
Package nowaitdelay catches an exec.CommandContext child with captured stdout started with no WaitDelay bound.
analyzers/recovercallback
Package recovercallback catches registry callbacks invoked with no recover in scope on a dispatch path that has no net.
Package recovercallback catches registry callbacks invoked with no recover in scope on a dispatch path that has no net.
analyzers/recoverlog
Package recoverlog catches a recover() value reaching a log sink without a scrub.
Package recoverlog catches a recover() value reaching a log sink without a scrub.
analyzers/reflectset
Package reflectset catches reflect.Value mutation of a struct field that never passed through CanSet: Set, SetString, SetInt, and the rest of the Set* family panic on values obtained from an unexported field, and the panic fires at injection time, not at declaration time, so a single lowercased tagged field takes down every request.
Package reflectset catches reflect.Value mutation of a struct field that never passed through CanSet: Set, SetString, SetInt, and the rest of the Set* family panic on values obtained from an unexported field, and the panic fires at injection time, not at declaration time, so a single lowercased tagged field takes down every request.
analyzers/reqparamlimit
Package reqparamlimit catches unclamped request-sourced integers flowing into limit/cap-shaped call parameters.
Package reqparamlimit catches unclamped request-sourced integers flowing into limit/cap-shaped call parameters.
analyzers/rootread
Package rootread catches reads whose containment under a root is resolved lexically only — the read twin of rootwrite.
Package rootread catches reads whose containment under a root is resolved lexically only — the read twin of rootwrite.
analyzers/rootwrite
Package rootwrite catches writes whose containment under a root is resolved lexically only: os.WriteFile / os.Create / os.OpenFile(write flag) / os.MkdirAll / os.Remove on a path built under a root — filepath.Join, or a flat `root + "/" + x` concatenation — where the root is a caller-supplied parameter or field — with no filepath.EvalSymlinks on that path's chain — plus the archive twin: zip.Writer entry names assembled from a parameter with no path.Clean on the entry-name chain.
Package rootwrite catches writes whose containment under a root is resolved lexically only: os.WriteFile / os.Create / os.OpenFile(write flag) / os.MkdirAll / os.Remove on a path built under a root — filepath.Join, or a flat `root + "/" + x` concatenation — where the root is a caller-supplied parameter or field — with no filepath.EvalSymlinks on that path's chain — plus the archive twin: zip.Writer entry names assembled from a parameter with no path.Clean on the entry-name chain.
analyzers/secretcompare
Package secretcompare catches a client-supplied credential compared with == or != instead of a constant-time primitive.
Package secretcompare catches a client-supplied credential compared with == or != instead of a constant-time primitive.
analyzers/testgap
Package testgap reports validator enumeration arms that no fixture in the package ever exercises.
Package testgap reports validator enumeration arms that no fixture in the package ever exercises.
analyzers/timestampid
Package timestampid catches an identifier minted from wall-clock time: a time.Now().Unix()/.UnixMilli()/.UnixNano() value formatted into a string (fmt.Sprintf, strconv.FormatInt/FormatUint/Itoa, or + concatenation) and bound to a name ending in id, token, session, key, nonce, secret, or capability.
Package timestampid catches an identifier minted from wall-clock time: a time.Now().Unix()/.UnixMilli()/.UnixNano() value formatted into a string (fmt.Sprintf, strconv.FormatInt/FormatUint/Itoa, or + concatenation) and bound to a name ending in id, token, session, key, nonce, secret, or capability.
analyzers/unboundedbody
Package unboundedbody catches an inbound HTTP request body that is read or decoded without a size cap, so a single request can spend the server's memory.
Package unboundedbody catches an inbound HTTP request body that is read or decoded without a size cap, so a single request can spend the server's memory.
analyzers/unboundedresp
Package unboundedresp catches the unbounded read of an HTTP RESPONSE body: io.ReadAll(resp.Body), or a json/xml/yaml Decoder seated on it, with no io.LimitReader or http.MaxBytesReader anywhere on that body's chain in the function — or one hop away in a same-package helper the body is passed to.
Package unboundedresp catches the unbounded read of an HTTP RESPONSE body: io.ReadAll(resp.Body), or a json/xml/yaml Decoder seated on it, with no io.LimitReader or http.MaxBytesReader anywhere on that body's chain in the function — or one hop away in a same-package helper the body is passed to.
analyzers/unseated
Package unseated catches a long-lived stream surface that admits a connection without any seat acquisition reachable on its open path.
Package unseated catches a long-lived stream surface that admits a connection without any seat acquisition reachable on its open path.
analyzers/worldreadable
Package worldreadable catches files and directories written for state or secrets with group/other permission bits: os.WriteFile / os.Create / os.OpenFile(write flags) / os.Mkdir / os.MkdirAll whose mode is a CONSTANT literal carrying group or other bits (0644, 0755, 0666, 0777; os.Create is umask-default 0666), while this repo's own discipline for that artifact class is owner-only (0600/0700 plus fileperm.Restrict, pinned by battery/log, upload storage, the session sqlite store and DEK, freeze's world.json, and the credstore).
Package worldreadable catches files and directories written for state or secrets with group/other permission bits: os.WriteFile / os.Create / os.OpenFile(write flags) / os.Mkdir / os.MkdirAll whose mode is a CONSTANT literal carrying group or other bits (0644, 0755, 0666, 0777; os.Create is umask-default 0666), while this repo's own discipline for that artifact class is owner-only (0600/0700 plus fileperm.Restrict, pinned by battery/log, upload storage, the session sqlite store and DEK, freeze's world.json, and the credstore).
browserpath
Package browserpath resolves the Chrome/Chromium/Edge executable that chromedp should launch.
Package browserpath resolves the Chrome/Chromium/Edge executable that chromedp should launch.
dsnredact
Package dsnredact strips credentials from database DSNs so the remainder can be logged or committed (host/db name are configuration, not secrets).
Package dsnredact strips credentials from database DSNs so the remainder can be logged or committed (host/db name are configuration, not secrets).
pgtest
Package pgtest provides a shared real-Postgres test harness usable from any package in the module (core/migrate, cmd/gofastr, …) without importing framework/internal/testdb, which is import-restricted to the framework tree.
Package pgtest provides a shared real-Postgres test harness usable from any package in the module (core/migrate, cmd/gofastr, …) without importing framework/internal/testdb, which is import-restricted to the framework tree.
kiln
acp
Package acp adapts Kiln's tool surface to the Agent Client Protocol via core/acp.
Package acp adapts Kiln's tool surface to the Agent Client Protocol via core/acp.
agent
Package agent is Kiln's transport-agnostic LLM driver.
Package agent is Kiln's transport-agnostic LLM driver.
agent/mcp
Package mcp wraps Kiln's tool surface as a Model Context Protocol server.
Package mcp wraps Kiln's tool surface as a Model Context Protocol server.
chat
Package chat installs the in-app Kiln chat panel.
Package chat installs the in-app Kiln chat panel.
db
Package db owns the per-session ephemeral SQLite lifecycle for Kiln.
Package db owns the per-session ephemeral SQLite lifecycle for Kiln.
effect
Package effect runs declarative actions described by world.Action.
Package effect runs declarative actions described by world.Action.
expr
Package expr is Kiln's tiny expression evaluator.
Package expr is Kiln's tiny expression evaluator.
freeze
Package freeze emits canonical source artifacts from a Kiln world so the in-memory build-mode app can graduate to a regular GoFastr project.
Package freeze emits canonical source artifacts from a Kiln world so the in-memory build-mode app can graduate to a regular GoFastr project.
internal/kid
Package kid mints kiln's unpredictable identifiers.
Package kid mints kiln's unpredictable identifiers.
journal
Package journal is the append-only event log that backs every Kiln session.
Package journal is the append-only event log that backs every Kiln session.
live
Package live is the runtime that ties the Kiln components together during a session: it owns the current Session (world + chat + plans), the Journal that persists every edit, the framework.App that serves the live preview, and the SSE broadcaster that notifies the panel.
Package live is the runtime that ties the Kiln components together during a session: it owns the current Session (world + chat + plans), the Journal that persists every edit, the framework.App that serves the live preview, and the SSE broadcaster that notifies the panel.
noderender
Package noderender re-exports the first-party node renderer that now lives in core-ui/noderender.
Package noderender re-exports the first-party node renderer that now lives in core-ui/noderender.
protocol
Package protocol is Kiln's canonical agent tool surface.
Package protocol is Kiln's canonical agent tool surface.
render
Package render bridges the Kiln world IR to a runnable framework.App.
Package render bridges the Kiln world IR to a runnable framework.App.
world
Package world is the JSON-clean intermediate representation of a GoFastr application being built live by an agent inside Kiln.
Package world is the JSON-clean intermediate representation of a GoFastr application being built live by an agent inside Kiln.
sqlite
stdlib
Package stdlib registers modernc.org/sqlite — a pure-Go SQLite — under the conventional "sqlite3" database/sql driver name used by generated apps.
Package stdlib registers modernc.org/sqlite — a pure-Go SQLite — under the conventional "sqlite3" database/sql driver name used by generated apps.
Package stability classifies every package in the module into a support tier and enforces, via [TestEveryPackageIsClassified], that no package ships without an explicit classification.
Package stability classifies every package in the module into a support tier and enforces, via [TestEveryPackageIsClassified], that no package ships without an explicit classification.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL