Developers
A CMS you can read, script and extend.
Ask any page for its JSON-LD, drive the site from an agent or the API, and write plugins in Go that run in a sandbox.
func init() {
guest.OnAction(sdk.EntityPublished, func(ev sdk.EntityEvent) error {
guest.Log(guest.LogInfo, "published "+ev.Slug)
return nil
})
}
//go:wasmexport on_entity_published
func onEntityPublished() int32 { return guest.Run(sdk.EntityPublished.Export()) }
Extending most CMSs means running other people's code with full access.
A plugin that can read your database and write your files is a risk you take on trust. Hatamoto plugins run in a sandbox and change content through runs and changesets.
What you get
-
Go plugins in a sandbox
Plugins compile to WASM and call the site only through the host functions their manifest allows.
Plugin overview -
Hooks for content events
React to entity.created, entity.updated and entity.published, or filter data such as JSON-LD before it is rendered.
-
JSON-LD on request
Send Accept: application/ld+json to a page and get its structured data as JSON.
-
MCP and a REST API
The same site is open to agents over MCP and to your code over the API, with scoped keys.
MCP reference -
Changes you can review
Plugins that write content do it through runs and changesets, not straight into the live site.
-
Apache 2.0
The core is open source under the Apache 2.0 licence.
Under the hood
-
Single Go binary
The server, admin and updater ship together, next to PostgreSQL.
-
Plugin SDK below 1.0
The core is at version 1.0. The plugin SDK is still below 1.0, so its API can change between releases.
-
Isolated plugin storage
Each plugin gets its own database role, with no access to core tables or to other plugins.