The floor
Twelve primitives. Stdlib only. Works standalone.
query mcp schema migrate
render stream openapi
static upload
GoFastr is a Go full-stack framework. You wire your app in Go like you'd wire net/http — declare your domain and get screens, REST endpoints, MCP tools, an OpenAPI spec, SQL migrations, and a typed query builder, all on disk in plain Go you can read and step through.
The same surface is wired for AI agents from day one. Every entity ships with an MCP tool surface; Kiln (experimental) is a separate binary that lets an agent author your app in chat while you watch the code change.
package mainimport ( "github.com/DonaldMurillo/gofastr/framework" "github.com/DonaldMurillo/gofastr/battery/auth" f "github.com/DonaldMurillo/gofastr/framework/field")func main() { app := framework.New(framework.Config{ Name: "blog", DB: framework.SQLite("./blog.db"), }) app.Use(auth.Memory()) // swap for auth.Postgres() in prod // One call. Generates SQL, REST, MCP, OpenAPI, Go types. app.Entity("posts", framework.Entity{ Fields: framework.Fields{ "title": f.String().Required(), "slug": f.Slug().From("title"), "body": f.Markdown(), "status": f.Enum("draft", "published").Default("draft"), }, Timestamps: true, Expose: framework.Expose{REST: true, MCP: true}, }) app.Serve(":8080")}
A gofastr.yml blueprint declares your entities and the screens that render them — list tables, forms, detail pages, charts, a marketing site. gofastr generate writes owned Go you read and edit. Not a CRUD scaffold.
app: name: Meridianentities: - name: customers fields: - name: name type: string required: true - name: plan type: enum values: [free, pro, enterprise] - name: mrr type: decimal - name: status type: enum values: [active, churned]screens: - name: customers route: /customers body: - kind: page_header props: title: Customers - kind: entity_list entity: customers create: true fields: [name, plan, mrr, status]
gofastr.yml is the on-ramp, not a runtime lock-in — after generating, the Go is canonical and you can delete it. → See the Meridian blueprint
| Name | Plan | MRR | Status |
|---|---|---|---|
| Acme Corp | pro | $1,240 | active |
| Globex | enterprise | $8,900 | active |
| Initech | free | $0 | churned |
| Umbrella | pro | $2,150 | active |
/customers — generated, server-rendered, owned Go you can edit.
Output lands on disk under gen/ as regular Go and SQL. There is no reflection at runtime; if something the framework does feels like magic, open the generated file and read it.
up/down SQL emitted as plain files.migrations/GET POST /postsposts_list, posts_get, posts_create, posts_update, posts_delete. Same auth + access rules as REST.core/mcp/api/docs./openapi.jsonposts.Query(ctx).Where(posts.Status.Eq("published")).List(20). No reflection, no interface{}.gen/entities/posts.goBeforeCreate, AfterUpdate, BeforeDelete — your code runs in the parent transaction.framework/hookAdmin: true to enable./admin/postscore/ is stdlib-only Go primitives. framework/ is the opinionated entity layer composed on top. If the framework is in your way, you drop down to core — the imports change, your code doesn't.
Twelve primitives. Stdlib only. Works standalone.
The opinionated entity system, composed on top of core. ~25 packages.
One interface per concern. In-memory dev driver, production driver behind the same shape. Swap without forking.
Server-driven. Signals + HTML primitives + islands + SSE. ~10 KB gz vanilla JS. No React.
Same database, same routes, same files on disk. The MCP tool surface is just the REST surface in a different shape. Destructive changes require an approved plan; the agent cannot drop your tables without you clicking approve.
For each entity you declare, the framework registers MCP tools that map 1:1 to your REST surface. An agent connects to /mcp and calls them with the same auth context a human would have over HTTP.
posts_list — same access rules as GET /postsposts_create — same validators, same hooksposts_update, posts_delete — same audit logExpose.MCP.Tools: []string{"list","get"}Kiln mounts a floating chat panel on the running app. The agent calls a typed tool surface (add_entity, add_field, propose_plan, …). Plans render as diffs you approve. The journal is committable.
Clone the one that looks like your problem; swap the entity declarations.
The flagship. A billing console + marketing site + auth + admin, generated from one gofastr.yml with writable add/edit/delete screens.
cd examples/meridian && go run .examples/blogUsers, posts, comments. Three entities. The smallest end-to-end example — start here.
cd examples/blog && go run .examples/siteThe site you're reading — every framework/ui + core-ui primitive showcased one page each, plus the docs, SEO, wizard, and print demos.
cd examples/site && go run .examples/api-tourEvery REST endpoint as a chapter. Each chapter has a live curl example you run from the page.
cd examples/api-tour && go run .examples/embed-demoA markdown corpus indexed locally via battery/embed. No external API key, ~180 LoC total.
cd examples/embed-demo && go run .examples/spaFor teams who already have a client app. Shows the framework is happy to just be your typed API.
cd examples/spa && go run .examples/static-siteSame renderer, no server. gofastr build emits a CDN-friendly bundle.
cd examples/static-site && gofastr buildAPIs change between commits. core-ui/ is the active research frontier. The journal is open; rough edges are visible by design. We say no to things — you should know what we're saying no to.
core/ any timeframework/entity ABIQ3 '26core-ui 1.0Q4 '26