gofastr

module
v0.3.0 Latest Latest
Warning

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

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

README

GoFastr

A Go full-stack framework for the AI era. Declare your entities once, get a working app: typed CRUD, migrations, OpenAPI, MCP tools, and a server-driven UI runtime.

GoFastr is an experimental framework that treats AI agents as first-class authors of web applications. You describe your domain in JSON or Go, and the framework generates everything around it — database schema, REST endpoints, OpenAPI spec, MCP tool surface, and admin-grade UI primitives — without giving up database/sql, net/http, or compile-time safety.

Status: early / v0.x — MIT-licensed and usable, but the API may change between releases, so pin a version (go get …@v0.x.y). A v1.0.0 tag will mark the stability promise. Ship at your own risk until then.

The promise: opinionated input, boring output, small runtime, easy escape hatches. You write a typed declaration; the framework emits plain Go you can read, debug, and step through — then gets out of the way. It's a code- generation platform for CRUD-heavy and AI-authored apps, not a universal framework that owns your control flow. When it's in your way, drop to core/ and write net/http.

A corollary for the AI era: an agent generating the code is a reason for the output to be more inspectable, not less. Generated code is normal Go on disk — no reflection injection, no hidden registries, no runtime mutation.


Why

Most Go web frameworks assume a human will hand-write every route, query, validator, migration, and form. AI agents already generate this code — but no framework treats their output as the canonical source. GoFastr inverts that:

  • One declaration, many surfaces. A single entities/posts.json produces a SQL table, REST routes, OpenAPI ops, a typed Go model, and five MCP tools (posts_list, posts_get, posts_create, posts_update, posts_delete).
  • No reflection magic. Generated code lives in gen/entities/ and is normal Go you can read, debug, and edit.
  • Two-layer architecture. A small core/ of stdlib-first primitives sits under an opinionated framework/. Drop down to core when the framework is in your way. (The one external touchpoint is core/middleware/tracing.go, which pulls in OpenTelemetry; the rest of core/ is stdlib-only.)
  • Batteries included, not embedded. Auth, cache, email, queue, search, storage are independent packages behind narrow interfaces — swap any one without forking.

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 ~25 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, embed, log, notify, print, queue, search, storage, webhook. Each behind a small interface. you need a real subsystem; import only the ones you use.
cmd/gofastr The CLI — init, generate, migrate, dev, docs. you're scaffolding or generating 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 (blog, api-tour, spa, the docs site). you want to see it wired end-to-end.

You import framework and the batteries you opt into — not 17 packages. The subpackage split is an internal seam (see framework/ARCHITECTURE.md); the public surface is framework.X plus the batteries you reach for.

Quickstart

Requires Go 1.26+.

The smallest app. One 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/mattn/go-sqlite3"
)

func main() {
	db, _ := sql.Open("sqlite3", "app.db")
	app := framework.NewApp(framework.WithDB(db))

	// CRUD is auto-on when a DB is set (CRUD *bool: nil = auto).
	app.Entity("posts", framework.EntityConfig{
		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 — and nothing you didn't ask for. Reach for entities-as-JSON, batteries, the UI runtime, or the generator only when a real need shows up. For how a flat app grows into internal/<domain>/ as boundaries appear, see project structure — structure follows the app, not the other way around.

Install the CLIs straight from GitHub:

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

Or clone for development on the framework itself:

git clone https://github.com/DonaldMurillo/gofastr.git
cd gofastr
go test ./...                        # everything green on a fresh clone
go run ./cmd/gofastr -- help         # CLI overview
go run ./examples/blog               # minimal blog with auto-CRUD on SQLite

Linked Git worktrees automatically get isolated local ports and database paths when isolation is enabled in gofastr.yml; see framework/docs/content/isolation.md.

Open http://localhost:8080, then try:

curl http://localhost:8080/posts
curl http://localhost:8080/posts/search?q=gofastr
# /openapi.json is auth-gated by default (it enumerates every route).
# Browse it via Swagger UI at /api/docs/, or expose the raw spec with
# framework.WithPublicOpenAPI() and then:
curl http://localhost:8080/openapi.json | jq .info     # auto-generated spec
Declare an entity (JSON)
// examples/blog/entities/posts.json
{
  "name": "posts",
  "soft_delete": true,
  "fields": [
    { "name": "title",  "type": "string", "required": true },
    { "name": "body",   "type": "text" },
    { "name": "status", "type": "enum", "values": ["draft", "published"], "default": "draft" },
    { "name": "author_id", "type": "relation", "to": "users" }
  ],
  "crud": true,
  "mcp": true
}

Then either load at runtime:

app := framework.NewApp(framework.WithDB(db))
_ = app.EntitiesFromDir("entities")    // CRUD + OpenAPI + MCP wired automatically
log.Fatal(app.Start(":8080"))

…or generate Go code:

go run ./cmd/gofastr generate          # writes gen/entities/{register,models}.go
Declare an entity (Go)
app.Entity("posts", framework.EntityConfig{
    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"},
    },
    MCP: true,
})

Both forms produce the exact same routes, OpenAPI, and MCP tools.

What you get from one entity declaration

Surface Auto-generated
HTTP GET / POST /posts, GET / PUT / 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 by EntityConfig.CursorField (defaults to PK)
Multipart upload multipart/form-data on Image/File fields → streamed through WithFileStorage
Validation Required, unique, enum, min/max, regex pattern, multi-tenant scope
Migrations Production-hardened versioned runner — advisory-lock serialization, checksum-drift + dirty-state guards, NoTransaction escape hatch, reversible down; declarative incremental generation; real-Postgres tested
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 and Swagger UI at /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
Walkthrough: the v2 read/write surface

Every endpoint below is auto-generated from a registered entity. There's a runnable demo in examples/api-tour that exercises all of it end-to-end against SQLite.

# Eager-load a relation graph in one round trip (no N+1):
curl 'http://localhost:8080/posts/p1?include=author.profile,comments'

# Cursor pagination — opt in by sending the cursor key (even empty):
curl 'http://localhost:8080/posts?cursor=&limit=20'
# → {"data":[…], "cursor":"<opaque>", "hasMore":true}
curl 'http://localhost:8080/posts?cursor=<opaque>&limit=20'

# Atomic batch — all items succeed or none do:
curl -X POST http://localhost:8080/posts/_batch -d '{"items":[
  {"title":"A"}, {"title":"B"}, {"title":"C"}
]}'
# → {"committed":true, "results":[{"index":0,"data":{…}}, …]}

# Server-sent events for entity lifecycle:
curl -N http://localhost:8080/posts/_events
# event: entity.created
# data: {"type":"entity.created","data":{"entity":"posts","record":{…}}}

# Multipart upload to an Image field:
curl -X POST http://localhost:8080/users \
  -F 'name=Carol' -F 'avatar=@/path/photo.png'

Hooks now run inside the same transaction as the write:

app.HookRegistry("posts").RegisterHook(framework.AfterCreate,
  func(ctx context.Context, data any) error {
    tx, _ := framework.TxFromContext(ctx)        // *sql.Tx — atomic with the parent INSERT
    _, err := tx.ExecContext(ctx, "INSERT INTO audit_log …")
    return err
  })

If the hook errors, the parent write is rolled back.

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 via testcontainers (Docker)
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.

Surfaces

core/ — eighteen stdlib-first primitives

config, dotenv, featureflag, handler, i18n, markdown, mcp, middleware, migrate, openapi, query, render, router, schema, static, stream, upload, yaml. Each is independently usable; the framework just composes them. All are stdlib-only except core/middleware/tracing.go (OpenTelemetry).

framework/ — opinionated entity layer

framework.App, EntityConfig, JSON declarations, CrudHandler, Hooks, query DSL (posts.where(status="published").order(created_at DESC).limit(10)), MCP CRUD wiring, OpenAPI synthesis.

core-ui/ — server-driven UI runtime

A separate, independently usable system for rendering interactive UIs from Go: signals, HTML primitives (core-ui/html), composed UI patterns (core-ui/patterns), server-side islands, dev server with SSE hot-reload, a static-site compiler, a linter, and a vanilla-JS runtime. See examples/site for an app that exercises every feature — including the 10 framework/ui primitives, modal/drawer/popover/toast widgets, and CRUD-by-island patterns.

battery/ — pluggable infrastructure

admin, auth, cache, email, embed, log, notify, print, queue, search, storage, webhook. Each behind a small interface with at least one in-memory implementation suitable for tests and small examples; production swaps in Redis, S3, Postgres FTS, etc. (battery/admin is the auto-generated back-office; battery/experimental is internal and not part of the supported surface.)

battery/embed is the local semantic-search battery: in-process vector index with brute-force cosine, optional hybrid keyword fusion, MMR diversity, snapshot/WAL persistence, fsnotify-free polling watcher, and a Kiln agent context hook. See framework/docs/content/embed.md.

cmd/gofastr — CLI
gofastr init <name>                 Scaffold a new project (UI + entities + migrations + git + AI-agent onboarding)
gofastr docs                        Browse/search embedded framework docs (no internet needed)
gofastr docs <topic>                Read a specific doc topic
gofastr docs --grep <term>          Search across every doc topic
gofastr agents sync                 Refresh AGENTS.md and agents/ detail files
gofastr theme init                  Scaffold a typed theme/theme.go you own
gofastr generate                    Generate Go from entities/*.json
gofastr generate entity post t:s    Scaffold a single entity in code
gofastr build                       Generate then go build
gofastr dev                         Start dev server with hot-reload
gofastr migrate up | down | status  Run versioned migrations (advisory-locked, checksum + dirty-state guarded)
gofastr migrate up --create-db      Create the target database first if it doesn't exist
gofastr migrate generate <name>     Diff entities vs the committed snapshot → numbered reversible SQL
gofastr migrate diff [--apply]      Declarative schema diff against a live DB (opt-in apply)
gofastr migrate force <version>     Reconcile a dirty/baselined migration
gofastr test                        Run project tests
gofastr embed index <path>          Index a project for semantic search
gofastr embed watch <path>          Index + poll-watch for changes
gofastr embed query "<text>"        Top-K semantic hits as JSON

### `kiln/` — agent-driven build-mode runtime

Build a GoFastr app live by chatting with a coding agent (Claude Code, pi, Codex, …). The agent drives Kiln's typed tool surface; the world IR mutates; the running app re-renders; the schema migrates — all in-process. Freeze the journal when done to emit canonical `entities/*.json` and graduate to regular Go source you commit.

```bash
go install ./cmd/kiln

kiln serve --agent claude-code    # auto-uses ~/.claude/.credentials.json
kiln serve --agent pi             # uses pi's installed config
kiln serve --agent auto           # picks the first installed CLI on PATH
kiln serve --agent "<freeform>"   # any command you want; prompt is appended

kiln mcp   --no-http              # MCP over stdio (subprocess harnesses)
kiln acp   --no-http              # ACP over stdio
kiln freeze --dir build/          # journal → build/entities/*.json + world.json
How it works

kiln serve runs an HTTP server (panel + SSE + REST tool dispatch + MCP at /mcp) and a floating chat widget that auto-mounts on every URL. When --agent <name> is set, kiln subscribes to its own SSE bus: every chat_user event spawns the configured CLI as a subprocess with KILN_URL injected. The CLI reads ~/.claude/skills/kiln/SKILL.md (auto-installed), sees $KILN_URL, and drives the build with curl against HTTP. Stdout is journaled as chat_assistant so the panel renders the reply.

Bring-your-own auth. Kiln does not manage credentials. Each adapter spawns its CLI which manages its own login (claude reads ~/.claude/.credentials.json, pi reads its own config, etc.). Adding a new agent is a one-entry change in cmd/kiln/adapters.go.

Safety: plan-gated destructive ops

Destructive tools (delete_entity, delete_field, delete_page, delete_hook, delete_route) are enforced at the protocol layer:

  1. Agent calls propose_plan listing each destructive op in targets:

    { "plan_id": "p1", "steps": ["drop posts"], "targets": [{"op":"delete_entity","name":"posts"}] }
    
  2. The panel renders a plan card with Approve / Reject buttons.

  3. After Approve, the agent retries the destructive call with plan_id set.

Without an approved plan whose Targets list matches, delete_* returns {"ok":false,"kind":"needs_plan"}. Each (plan, target) is single-use; reuse needs a new plan.

Wire into Claude Code as an MCP server
{
  "mcpServers": {
    "kiln": { "command": "kiln", "args": ["mcp", "--no-http"] }
  }
}
Or hit the HTTP API directly
kiln serve --agent none &   # binds loopback 127.0.0.1:8765 by default; the
                            # tool API is unauthenticated — pass --addr 0.0.0.0:8765
                            # only if you deliberately want it reachable off-host
curl -X POST http://localhost:8765/kiln/tool/add_entity \
  -H 'Content-Type: application/json' \
  -d '{"entity":{"name":"posts","fields":[{"name":"title","type":"string","required":true}]}}'
curl http://localhost:8765/posts          # CRUD live
curl http://localhost:8765/kiln/world     # current IR
Tool surface

world_get, set_app_config, add_entity, update_entity, delete_entity, add_field, delete_field, add_page, delete_page, add_hook, delete_hook, add_route, delete_route, add_seed, propose_plan, approve_plan, reject_plan, undo, chat. See kiln/protocol/descriptors.go for full JSON schemas.

Repository layout

core/        stdlib-first primitives (router, query, mcp, openapi, …)
framework/   entity system, app wiring, declarations, query DSL, hooks
core-ui/     server-driven UI runtime (signals, components, islands)
kiln/       agent-driven build-mode runtime + chat panel + MCP/ACP servers
battery/     pluggable infra (admin, auth, cache, email, embed, log, notify, print, queue, search, storage, webhook)
cmd/gofastr/ CLI: generate, build, migrate
cmd/kiln/   CLI: serve, mcp, acp
docs/        feature docs (entity declarations, migrations, query DSL, …)
examples/    site (SSR + 10 UI primitives), blog (JSON-declared entities), api-tour (cursor/include/batch/SSE/uploads), backoffice (entity admin), embed-demo, spa (Vue+API), static-site
ROADMAP.md   forward-looking proposals not yet built

Documentation

Project status

GoFastr is pre-1.0 and explicitly not stable:

  • The core/ primitives are usable and tested in isolation.
  • The framework/ entity layer is solid for SQLite + Postgres CRUD apps.
  • core-ui/ is the active research frontier — APIs change between commits.
  • The CLI binary blank-imports only github.com/mattn/go-sqlite3. To run migrations against Postgres, build a custom binary that imports your driver of choice.

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 runs go test -race -count=1 ./... and govulncheck. Enable hooks once with:

git config core.hooksPath .githooks

License

GoFastr is released under the MIT License — free to use, modify, and distribute, including in commercial and closed-source projects, provided the copyright notice and license text are preserved. The software is provided "as is", without warranty; see LICENSE for the full terms.

Directories

Path Synopsis
battery
admin
Package admin is a small read-only admin battery for GoFastr apps — stock screens on top of the data the framework already collects: queue jobs (when battery/queue is wired) and the audit log (when framework.WithAuditLog is set).
Package admin is a small read-only admin battery for GoFastr apps — stock screens on top of the data the framework already collects: queue jobs (when battery/queue is wired) and the audit log (when framework.WithAuditLog is set).
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 is part of the GoFastr framework.
Package email is part of the GoFastr framework.
embed
Package embed provides a local semantic-search battery for GoFastr.
Package embed provides a local semantic-search battery for GoFastr.
experimental/redisflags
Package redisflags provides a Redis-backed feature flag store for the core/featureflag evaluator.
Package redisflags provides a Redis-backed feature flag store for the core/featureflag evaluator.
experimental/redisidempotency
Package redisidempotency provides a Redis-backed store for the idempotency middleware.
Package redisidempotency provides a Redis-backed store for the idempotency middleware.
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.
print/chromepdf
Package chromepdf is the headless-Chromium PDF backend for the github.com/DonaldMurillo/gofastr/battery/print battery.
Package chromepdf is the headless-Chromium PDF backend for the github.com/DonaldMurillo/gofastr/battery/print battery.
queue
Package queue is part of the GoFastr framework.
Package queue is part of the GoFastr framework.
search
Package search provides pluggable search backends for GoFastr.
Package search provides pluggable search backends for GoFastr.
storage
Package storage is part of the GoFastr framework.
Package storage is part of the GoFastr framework.
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.
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.
repolint command
Package codegen provides YAML-driven code generation primitives for GoFastr.
Package codegen provides YAML-driven code generation primitives for GoFastr.
core
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.
featureflag
Package featureflag is a minimal feature-flag primitive for GoFastr apps.
Package featureflag is a minimal feature-flag primitive for GoFastr apps.
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.
markdown
Package markdown is a small, dependency-free Markdown renderer.
Package markdown is a small, dependency-free Markdown renderer.
mcp
Package mcp is part of the GoFastr framework.
Package mcp is part of the GoFastr framework.
middleware
Package middleware is part of the GoFastr framework.
Package middleware is part of the GoFastr framework.
migrate
Package migrate is part of the GoFastr framework.
Package migrate is part of the GoFastr framework.
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.
upload
Package upload is part of the GoFastr framework.
Package upload is part of the GoFastr framework.
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.
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 provides a server-driven island architecture using SSE.
Package island provides a server-driven island architecture using SSE.
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, 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, 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.
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).
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
embed-demo command
Package main is a minimal demonstration of the battery/embed package.
Package main is a minimal demonstration of the battery/embed package.
site command
spa command
static-site command
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.
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
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.
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.
harness
Package harness is part of the GoFastr harness.
Package harness is part of the GoFastr harness.
harness/client
Package client is part of the GoFastr harness.
Package client is part of the GoFastr harness.
harness/client/tui
Package tui is part of the GoFastr harness.
Package tui is part of the GoFastr harness.
harness/client/web
Package web is part of the GoFastr harness.
Package web is part of the GoFastr harness.
harness/context
Package context is part of the GoFastr harness.
Package context is part of the GoFastr harness.
harness/control
Package control is part of the GoFastr harness.
Package control is part of the GoFastr harness.
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.
harness/control/conformance
Package conformance is the cross-transport parity test framework.
Package conformance is the cross-transport parity test framework.
harness/control/inproc
Package inproc is part of the GoFastr harness.
Package inproc is part of the GoFastr harness.
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.
harness/control/multiplex
Package multiplex is part of the GoFastr harness.
Package multiplex is part of the GoFastr harness.
harness/control/resources
Package resources is part of the GoFastr harness.
Package resources is part of the GoFastr harness.
harness/control/rest
Package rest is part of the GoFastr harness.
Package rest is part of the GoFastr harness.
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.
harness/engine
Package engine is part of the GoFastr harness.
Package engine is part of the GoFastr harness.
harness/hook
Package hook is part of the GoFastr harness.
Package hook is part of the GoFastr harness.
harness/ids
Package ids is part of the GoFastr harness.
Package ids is part of the GoFastr harness.
harness/internal/clock
Package clock provides a swap-able clock for tests.
Package clock provides a swap-able clock for tests.
harness/internal/ulid
Package ulid is part of the GoFastr harness.
Package ulid is part of the GoFastr harness.
harness/logging
Package logging is part of the GoFastr harness.
Package logging is part of the GoFastr harness.
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.
harness/memory
Package memory is part of the GoFastr harness.
Package memory is part of the GoFastr harness.
harness/plugin
Package plugin is part of the GoFastr harness.
Package plugin is part of the GoFastr harness.
harness/profile
Package profile is part of the GoFastr harness.
Package profile is part of the GoFastr harness.
harness/provider
Package provider is part of the GoFastr harness.
Package provider is part of the GoFastr harness.
harness/provider/copilot
Package copilot implements the GitHub Copilot Provider.
Package copilot implements the GitHub Copilot Provider.
harness/provider/credstore
Package credstore implements credential storage.
Package credstore implements credential storage.
harness/provider/failover
Package failover composes a chain of Providers with a circuit-breaker per upstream.
Package failover composes a chain of Providers with a circuit-breaker per upstream.
harness/provider/helper
Package helper is part of the GoFastr harness.
Package helper is part of the GoFastr harness.
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).
harness/provider/openrouter
Package openrouter is part of the GoFastr harness.
Package openrouter is part of the GoFastr harness.
harness/provider/routing
Package routing will implement RoutingProvider: a Provider that composes {router, executors[]} so a single turn can use a cheap model for routing and an expensive model for execution.
Package routing will implement RoutingProvider: a Provider that composes {router, executors[]} so a single turn can use a cheap model for routing and an expensive model for execution.
harness/provider/zai
Package zai is part of the GoFastr harness.
Package zai is part of the GoFastr harness.
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.
harness/session
Package session is part of the GoFastr harness.
Package session is part of the GoFastr harness.
harness/session/sqlite
Package sqlite is part of the GoFastr harness.
Package sqlite is part of the GoFastr harness.
harness/skill
Package skill is part of the GoFastr harness.
Package skill is part of the GoFastr harness.
harness/skill/skillmd
Package skillmd is part of the GoFastr harness.
Package skillmd is part of the GoFastr harness.
harness/slash
Package slash is part of the GoFastr harness.
Package slash is part of the GoFastr harness.
harness/tool
Package tool is part of the GoFastr harness.
Package tool is part of the GoFastr harness.
harness/tool/builtins
Package builtins is part of the GoFastr harness.
Package builtins is part of the GoFastr harness.
harness/tool/pack
Package pack is part of the GoFastr harness.
Package pack is part of the GoFastr harness.
harness/tool/permission
Package permission is part of the GoFastr harness.
Package permission is part of the GoFastr harness.
harness/tracing
Package tracing is part of the GoFastr harness.
Package tracing is part of the GoFastr harness.
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.
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.
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.
routegroup
Package routegroup provides the App-level route group abstraction.
Package routegroup provides the App-level route group abstraction.
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.
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/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.
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.
internal
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
agent
Package agent is Kiln's transport-agnostic LLM driver.
Package agent is Kiln's transport-agnostic LLM driver.
agent/acp
Package acp adapts Kiln to the Agent Client Protocol so external agent harnesses (Codex, Copilot, Pi, Claude Code) can drive Kiln as an attached agent server.
Package acp adapts Kiln to the Agent Client Protocol so external agent harnesses (Codex, Copilot, Pi, Claude Code) can drive Kiln as an attached agent server.
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.
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.
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.
Package sqlite provides a pure-Go SQLite implementation with zero external dependencies.
Package sqlite provides a pure-Go SQLite implementation with zero external dependencies.

Jump to

Keyboard shortcuts

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