# smeldr.dev - [trace_lineage: walking a decision back to what it actually rests on - Smeldr](https://smeldr.dev/devlog/trace-lineage): Decisions build on decisions. When an agent doubts something three hops downstream, tracing that doubt back to its… - [Decision authority wasn't missing. It was three unset switches. - Smeldr](https://smeldr.dev/devlog/decision-authority-not-a-missing-feature): Nothing about ratifying or superseding a governance `Decision` required new capability. The role/grant system, the… - [A pattern that looked identical in two places — and worked in only one - Smeldr](https://smeldr.dev/devlog/provenance-actorkind-and-the-wrapped-context): Two call sites, one helper function, the same three-line pattern for recovering an authenticated actor from a… - [Devlog: The PUT That Bypassed Everything (A217) - Smeldr](https://smeldr.dev/devlog/t150-update-handler-state-governance): **Amendment:** A217 **Date:** 2026-07-15 --- We just closed a quiet but significant gap in Smeldr's state governance… - [Closing the orchestration state-validation gap - Smeldr](https://smeldr.dev/devlog/t148-state-validation-gap): **Amendment A216 — T148** When we ran the T147 data migration last week, we discovered that 14 amendments had been… - [Closing the gaps in dynamic content: validation, scheduling, and AI indexing - Smeldr](https://smeldr.dev/devlog/t104-phase-b-dynamic-content-gaps): **Release:** smeldr.dev/core v1.54.0 · Amendment A202 --- When we shipped the dynamic content substrate in v1.41.0… - [Decision Freshness: Scheduled State Re-evaluation in Smeldr v1.47.0 - Smeldr](https://smeldr.dev/devlog/decision-freshness-eval-queue): Smeldr v1.47.0 ships `TransitionTrigger` and `App.DrainEvalQueue` — a lightweight mechanism for scheduling automatic… - [State flow tools land in smeldr.dev/mcp - Smeldr](https://smeldr.dev/devlog/state-flow-mcp-tools): smeldr.dev/mcp v1.24.0 ships three new tools that expose the T23 custom state flow infrastructure to MCP clients. ##… - [Content Relations in MCP: six new tools - Smeldr](https://smeldr.dev/devlog/relation-mcp-tools): The relation graph tools are now wired in `smeldr.dev/mcp`. If your app calls `app.Relations(store)`, six tools become… - [Per-path SEO overrides without touching the content model - Smeldr](https://smeldr.dev/devlog/page-meta-seo-override): # Per-path SEO overrides without touching the content model ## The gap Every content item in Smeldr can implement… - [Renaming the wire without breaking it - Smeldr](https://smeldr.dev/devlog/rename-wire-level): # Renaming the wire without breaking it ## The problem Renaming a project is mostly find-and-replace: the package, the… - [Content Relations, Layer 3: SweepStructural - Smeldr](https://smeldr.dev/devlog/content-relations-layer-3): # Content Relations, Layer 3: SweepStructural The first two posts in this series covered two of the three correctness… - [Content Relations, Layer 2: AfterRelationCascade - Smeldr](https://smeldr.dev/devlog/content-relations-layer-2): # Content Relations, Layer 2: AfterRelationCascade The save-path sync from the first post in this series keeps the… - [Content Relations, Layer 1: the typed edge graph - Smeldr](https://smeldr.dev/devlog/content-relations-layer-1): # Content Relations, Layer 1: the typed edge graph Every content system eventually has to deal with the fact that items… - [No pipeline, no oil spills - Smeldr](https://smeldr.dev/devlog/no-build-pipeline): # No pipeline, no oil spills At some point in the last decade, shipping a web application started requiring a build… - [The AI era needs typed data, states, and relations. CMSes almost got there first. - Smeldr](https://smeldr.dev/devlog/what-is-smeldr): # The AI era needs typed data, states, and relations. CMSes almost got there first. The content management systems of… - [Operator-controlled URLs for runtime content types - Smeldr](https://smeldr.dev/devlog/dynamic-content-url-routing): **Amendment A154 · Smeldr core v1.41.1 · smeldr/mcp v1.21.1** When T104 Inc 2 shipped dynamic content types (A153), the… - [Your content as a block parent: typed schemas for AI agents - Smeldr](https://smeldr.dev/devlog/content-as-block-host): ## The gap v1.31.0 shipped the Smeldr block system: `DynamicNode`, a single composition edge table, 16 rendered block… - [A homepage that shows its own philosophy - Smeldr](https://smeldr.dev/devlog/hero-animation): ## What you see first The old homepage told you what Smeldr is. The new one shows it. Open smeldr.dev and you will see… - [The log capture that deadlocked itself - Smeldr](https://smeldr.dev/devlog/slog-log-reentrancy-trap): We wanted a small, boring feature: let an operator read a running instance's recent error logs when something is wrong —… - [APIOnly() — content types without a public URL - Smeldr](https://smeldr.dev/devlog/api-only-option): **Amendment A102 · Smeldr core v1.24.0** Some content types have no business being on the public web. A `HomePage`… - [Redirects an agent can manage while the server runs - Smeldr](https://smeldr.dev/devlog/redirects): ## The problem Content moves. A post is renamed, a docs page is reorganised, a whole section changes its URL prefix.… - [OAuth 2.1: connect your Smeldr site to ChatGPT and Claude - Smeldr](https://smeldr.dev/devlog/oauth): **smeldr.dev/oauth v0.1.0 · smeldr.dev/mcp v1.11.0** Claude Desktop connects to an MCP server by spawning a local… - [Create new page types without code - Smeldr](https://smeldr.dev/devlog/block-system): ## The problem A Smeldr content type maps a Go struct to a row. That model works well for posts, essays, and doc pages… - [This is Smeldr - Smeldr](https://smeldr.dev/devlog/this-is-smeldr): Smeldr is a content backend with a native AI interface. In fact, every interface. Define your content model. Get typed… - [Give Your AI the Manual - Smeldr](https://smeldr.dev/devlog/forge-skill-public): Your AI does not know Forge. The first time you open a project and ask it to wire a new module, it guesses. It gets the… - [Designing Smeldr Pages with AI - Smeldr](https://smeldr.dev/devlog/ai-design-workflow): You can go from a Go struct to production-ready HTML and CSS in one pass, without writing a line of markup by hand.… - [SingleInstance and Standalone - two routing options that were missing - Smeldr](https://smeldr.dev/devlog/single-instance-standalone): ## The problem Every Forge module registered two routes: a list route and a per-item show route. That worked fine for… - ["The loop: from conversation to scheduled post" - Smeldr](https://smeldr.dev/devlog/the-loop-dev-experience): Every feature in Forge starts the same way: a conversation. Not a ticket. Not a spec document. A conversation with an… - [Who published that? Smeldr now ships an opt-in audit trail - Smeldr](https://smeldr.dev/devlog/audit-trail): Every content platform eventually gets the same question: who changed that, and when? Until now, Forge left that to… - [Multi-agent coordination via content lifecycle - Smeldr](https://smeldr.dev/devlog/forge-agent-orchestration): Most multi-agent frameworks ask you to define the workflow before you run it. In LangGraph, you draw the graph: node A… - [Typed persistent state for AI agents, in Go - Smeldr](https://smeldr.dev/devlog/forge-agent-state-layer): The Go ecosystem for AI agents is young. Google's Agent Development Kit for Go shipped in November 2025. The official… - [forge-agent: scheduled and reactive agent jobs in your Smeldr app - Smeldr](https://smeldr.dev/devlog/forge-agent-flow): Most agent integrations run as external services: a separate process, a hosted platform, a webhook receiver. You… - [DB-driven platform config in forge-social - Smeldr](https://smeldr.dev/devlog/forge-social-platform-config): Connecting forge-social to Mastodon, LinkedIn, or X requires OAuth app credentials from the platform's developer portal.… - [X support in forge-social - Smeldr](https://smeldr.dev/devlog/forge-social-x): forge-social launched with Mastodon, added LinkedIn in v0.2.0, and held off on X until the OAuth story was clear. v0.5.0… - [Media uploads from anywhere - Smeldr](https://smeldr.dev/devlog/media-upload-token): The original `create_file` MCP tool worked by having the agent include the file as base64 in the request body. That… - [Draft preview - Smeldr](https://smeldr.dev/devlog/draft-preview): Until v1.18.0, Forge enforced a hard rule: anything outside Published returns 404. That is the right default. It… - [Set it and forget it: the slot-queue model in forge-social - Smeldr](https://smeldr.dev/devlog/forge-social-slot-queue): forge-social v0.4.0 ships a second scheduling model alongside the existing explicit-timestamp approach. Instead of… - [forge-social's AddRoutes: a concrete example of what the signal bus enables - Smeldr](https://smeldr.dev/devlog/forge-social-add-routes-signal-bus): When Forge publishes a content item, archives one, or deletes one, it fires a signal. That signal is a hook into the… - [forge-social: scheduling social posts from your Smeldr instance - Smeldr](https://smeldr.dev/devlog/forge-social-scheduling): Social publishing is almost always bolted on. Content gets written in the CMS, then someone manually copies it to… - [From webhooks to a signal bus - Smeldr](https://smeldr.dev/devlog/signal-bus-m14): Forge has always fired signals internally. A post publishes, a doc page archives, a story goes live — the database… - [Outbound webhooks and MCP subscriptions - Smeldr](https://smeldr.dev/devlog/outbound-webhooks-and-mcp-subscriptions): Forge's internal Signals were always there. A post publishes, a story archives, a doc page goes live. The Signal fires,… - [First start - Smeldr](https://smeldr.dev/devlog/first-start): Three things need to work before a new Forge instance is usable: the database comes up, the first admin token exists,… - [Iron & Ember - Smeldr](https://smeldr.dev/devlog/iron-and-ember): A name should do work. Iron & Ember does three things at once. Iron is structural - durable, compiled, the material you… - [Two audiences, one architecture - Smeldr](https://smeldr.dev/devlog/dx-and-aix): D1 opened this series with four audiences: browser, API client, AI agent reading, AI agent operating. It is a reasonable… - [Smeldr CLI: terminal access to a running instance - Smeldr](https://smeldr.dev/devlog/forge-cli): forge-mcp gives your AI agent typed tools for content operations. forge-cli gives you the same access from the… - [Typed MCP tools from a Go struct - Smeldr](https://smeldr.dev/devlog/typed-mcp-tools-from-a-struct): [D1](/devlog/four-audiences-one-framework) described the reading layer: the formats that let an AI agent index, fetch,… - [Three lines and your agent handles files - Smeldr](https://smeldr.dev/devlog/forge-media): forge-media is a separate module. Registering it takes three lines: ```go store :=… - [Zero dependencies: what it means and why it matters - Smeldr](https://smeldr.dev/devlog/zero-dependencies): Forge has no third-party Go dependencies. The entire framework runs on the Go standard library. This is a deliberate… - [Template infrastructure: partials, assets, and per-request context - Smeldr](https://smeldr.dev/devlog/template-infrastructure): When you register a module in Forge, your templates need access to shared components -- navbar, footer, head -- and… - [Markdown and trusted HTML in Forge templates - Smeldr](https://smeldr.dev/devlog/markdown-and-html): Forge includes two template functions for rendering content: `forge_markdown` and `forge_html`. They solve different… - [How your AI agent understands your content - Smeldr](https://smeldr.dev/devlog/field-semantics): When an AI agent calls `create_post`, it sees a tool schema. That schema includes field names, types, and validation… - [Four audiences, one framework - Smeldr](https://smeldr.dev/devlog/four-audiences-one-framework): Most frameworks are built for two audiences: a browser that wants HTML, and an API client that wants JSON. The same URL,… - [Anthropic described the right way to build MCP servers. Here's how Smeldr got there first. - Smeldr](https://smeldr.dev/devlog/anthropic-validation): Anthropic published [Building Agents That Reach Production Systems with… - [Provenance: who did what, and why, without touching the audit trail you already have - Smeldr](https://smeldr.dev/devlog/transition-provenance): A design spike two weeks ago named the gap plainly: neither of Smeldr's two existing "who did this" mechanisms can… - [The bug 96% coverage couldn't see: a column type name, not a value - Smeldr](https://smeldr.dev/devlog/webhook-timestamptz-scan-bug): `WebhookStore.List` shipped, worked in every test, worked in the dogfood instance's ad-hoc checks, and would have… - [Reachability: a general bounded graph-traversal primitive - Smeldr](https://smeldr.dev/devlog/reachability-primitive): Two independent design reviews found the same gap three days apart: something in Smeldr's own product design assumed a… - [How Smeldr wires modules in three lines - Smeldr](https://smeldr.dev/devlog/wiring-modules): ## The problem Most Go web frameworks make you wire everything by hand: routes, repositories, feeds, sitemaps,… - [Why Smeldr? - Smeldr](https://smeldr.dev/docs/why-forge): Smeldr is a Go framework for content that needs a lifecycle. You define content types as Go structs; Smeldr generates… - [Content lifecycle - Smeldr](https://smeldr.dev/docs/content-lifecycle): Every content item in Smeldr has a lifecycle. It is not optional, and it cannot be disabled. This is what guarantees… - [Signal bus - Smeldr](https://smeldr.dev/docs/signal-bus): Smeldr fires a signal every time a content item changes state. The signal bus lets your application code subscribe to… - [Outbound webhooks - Smeldr](https://smeldr.dev/docs/webhooks): Outbound webhooks let you notify external services whenever content changes state in Smeldr. Register an HTTPS endpoint… - [Getting Started - Smeldr](https://smeldr.dev/docs/getting-started): Smeldr is a Go web framework built around content modules. Define a struct, embed `smeldr.Node`, and Smeldr wires… - [Deploy & first start - Smeldr](https://smeldr.dev/docs/deploy-and-first-start): You have a compiled Smeldr binary. This guide covers configuration, first start, and getting your CLI ready. ##… - [Core Concepts - Smeldr](https://smeldr.dev/docs/core-concepts): Smeldr has six concepts. Learn them once, apply them everywhere. ``` Node → the base every content type… - [Database - Smeldr](https://smeldr.dev/docs/database): Smeldr accepts any database connection that satisfies the `smeldr.DB` interface — which `*sql.DB` and pgx adapters both… - [Examples - Smeldr](https://smeldr.dev/docs/examples): Three runnable examples are included in the [Smeldr GitHub… - [Everything Smeldr gives you - Smeldr](https://smeldr.dev/docs/feature-list): Complete list of what Smeldr generates and includes automatically. Every item below is active the moment you call… - [Outbound Webhooks - Smeldr](https://smeldr.dev/docs/outbound-webhooks): Outbound webhooks let Smeldr call your URL whenever content changes. When a post is published, updated, archived,… - [Token management - Smeldr](https://smeldr.dev/docs/token-management): `TokenStore` adds server-side named bearer tokens with revocation. When configured, every request validates the token… - [AI readiness - Smeldr](https://smeldr.dev/docs/ai-readiness): Smeldr serves four audiences from the same content model. Two of them are AI systems. This page documents what each… - [Designing with AI - Smeldr](https://smeldr.dev/docs/ai-design): AI design tools such as Claude Design and Google Stitch can produce production-quality HTML and CSS from a written… - [Runtime-defined content types - Smeldr](https://smeldr.dev/docs/runtime-content-types): Smeldr lets an AI agent or operator declare a new content type at runtime — its name, fields, and public URL — without… - [Content Relations - Smeldr](https://smeldr.dev/docs/content-relations): # Content Relations Content Relations gives Smeldr a typed edge graph: a persisted, queryable record of which content… - [MCP tools: Content Relations - Smeldr](https://smeldr.dev/docs/content-relations-mcp): # MCP tools: Content Relations Six MCP tools manage the relation graph. They are available when `app.Relations(store)`… - [SweepScheduler - Smeldr](https://smeldr.dev/docs/sweep-scheduler): # SweepScheduler `SweepScheduler` runs the relation graph's structural sweep on a cron schedule. It is part of… - [MCP: How your AI agent talks to Smeldr - Smeldr](https://smeldr.dev/docs/mcp-overview): Smeldr exposes every content operation as an MCP tool. Your AI agent connects once and can create, update, publish, and… - [smeldr-media - Smeldr](https://smeldr.dev/docs/forge-media): smeldr-media is an optional submodule that adds file upload, storage, and serving to a Smeldr application. AI agents can… - [smeldr-social - Smeldr](https://smeldr.dev/docs/forge-social): `smeldr-social` is a standalone Go module that adds social post scheduling and AI agent routing to any Smeldr… - [Roles and access control - Smeldr](https://smeldr.dev/docs/roles): Smeldr uses a role-based access model. Roles are plain strings stored in tokens and sessions. Their permission level is… - [smeldr-cli - Smeldr](https://smeldr.dev/docs/forge-cli): `forge-cli` is the operator CLI for a running Smeldr instance. It manages content, tokens, and media over HTTP using the… - [MCP Demo - Smeldr](https://smeldr.dev/docs/demo): Watch Claude Desktop create and publish content to smeldr.dev via MCP in real time — Smeldr's AI-first architecture in… - [Block system - Smeldr](https://smeldr.dev/docs/dynamic-content): Smeldr's block system lets you build pages from typed, reusable pieces — without code changes and without redeployment.… - [OAuth 2.1 — connecting ChatGPT and Claude - Smeldr](https://smeldr.dev/docs/oauth): The MCP specification requires OAuth 2.1 for remote connections. `smeldr.dev/oauth` ships a full OAuth 2.1 authorization… - [Redirects - Smeldr](https://smeldr.dev/docs/redirects): Smeldr treats redirects as first-class content. There are two layers: compile-time rules you declare in code, and a… - [Module routing options - Smeldr](https://smeldr.dev/docs/routing-options): Every Smeldr module has a routing mode. The default registers a full HTML surface with a list page and individual item… - [Log capture - Smeldr](https://smeldr.dev/docs/log-capture): `app.CaptureLogs()` installs an in-memory ring buffer for recent log records. The buffer is surfaced at `GET /_logs`… - [Context is shared. Commitment is not. - Smeldr](https://smeldr.dev/thinking/context-is-shared-commitment-is-not): Everyone is talking about context management. RAG pipelines, memory systems, knowledge graphs, long-context windows. The…