Moving Hatamoto Go CMS to encoding/json/v2
Hatamoto's backend now runs on Go's encoding/json/v2, and a new v1 import fails the checks. Empty lists come back as [], requests are stricter, and webhook and plugin bytes are unchanged.
Ajay Chavda
An open-source CMS written in Go. One binary runs your site, admin, API and MCP server next to Postgres. Plugins run in a WebAssembly sandbox (Extism), AI crawlers are counted on the server, and signed updates roll themselves back.
Server
curl -fsSL https://hatamoto.dev/install.sh | sudo shOn a fresh Linux VPS: installs Postgres, Hatamoto under systemd and Caddy with automatic HTTPS, then turns on nightly backups and signed updates.
Docker
git clone https://github.com/Zen-Labs-Corp/hatamoto && cd hatamoto && docker compose upOn your laptop: Postgres and Hatamoto start, secrets are generated, migrations run.
Your agent
Install Hatamoto, the open-source CMS, on this machine with Docker. Follow https://hatamoto.dev/docs/getting-started/install-docker and give me the admin address when it is running.Paste into any coding agent with shell access to your machine.
Already in core
The builder, SEO, cache, forms, redirects, security, 2FA, backups, cookie consent, WebP images, media folders, find and replace, CSV import, an email log and more ship in core and update together.
The site, admin, REST API and MCP server run as one Go binary on one port. No PHP, no Node, no build step.
hatamoto serveAll content, settings and analytics live in Postgres. Migrations are embedded and run on boot.
postgresPlugins are WebAssembly, run inside the process with memory and time limits and only the permissions you tick.
extism · wazeroEvery crawler fetch is logged as it is served and checked against published IP ranges and reverse DNS. No script on the page.
no script on the pageAgents connect at /mcp with a scoped key and go through the same services as the admin: validation, hooks, cache, audit.
/mcp · REST · CLIReleases are signed and ship on canary, edge and stable. If the site fails its health check, the previous version comes back.
canary · edge · stableFrom a live Hatamoto site, last 30 days
How Hatamoto thinks about content
Every page is a typed record before it is HTML. Search engines, answer engines and AI agents all read from that one record, in every language, so they can never disagree.
Build a content type in the admin: typed fields, a schema.org type and a URL pattern. No ACF, no custom code.
entity_schemasThe page, JSON-LD, sitemap entry, llms.txt line and MCP response all come from the same record and change together.
Accept: application/ld+jsonEvery entity carries a BCP 47 locale. Translations share a group, so hreflang and the language switcher come for free.
/fr/{pattern}Why teams switch
Your analytics can't see AI crawlers. Hatamoto counts every fetch on the server and flags the fakes.
AI analyticsEach site gets a private admin address. Everything scanners try is a plain 404.
SecuritySigned releases are checked after install and roll back on their own if the site fails its health check.
Auto-updatesBuilder, SEO, cache, forms, redirects, security, consent and backups are in core.
Replace your plugin stackAgents draft through the same rules as your team, with scoped keys and a full audit log.
AI agents & MCPScan, import, audit every old address, then cut over.
Move from WordPressUse it for clients, fork it, sell it. hatamoto.dev runs the same code you download. There is no paid edition.
One update check, and you can turn it off. Analytics are daily counts in your own Postgres.
Write them with the Go SDK, or in any language with an Extism PDK.
From the blog
Hatamoto's backend now runs on Go's encoding/json/v2, and a new v1 import fails the checks. Empty lists come back as [], requests are stricter, and webhook and plugin bytes are unchanged.
Ajay Chavda
A WordPress plugin is PHP in core's process with the whole database. A Hatamoto plugin runs in a WASM sandbox and writes content only through a changeset the owner or a standing approval publishes.
Ajay Chavda
When I was in my late teens, a free Ubuntu CD arrived in the mail and changed my life. That is why Hatamoto stays on Apache 2.0, free to use, modify and redistribute.
Ajay Chavda
Open source, one Go binary and Postgres. Install it in a few minutes.
Server
curl -fsSL https://hatamoto.dev/install.sh | sudo shOn a fresh Linux VPS: installs Postgres, Hatamoto under systemd and Caddy with automatic HTTPS, then turns on nightly backups and signed updates.
Docker
git clone https://github.com/Zen-Labs-Corp/hatamoto && cd hatamoto && docker compose upOn your laptop: Postgres and Hatamoto start, secrets are generated, migrations run.
Your agent
Install Hatamoto, the open-source CMS, on this machine with Docker. Follow https://hatamoto.dev/docs/getting-started/install-docker and give me the admin address when it is running.Paste into any coding agent with shell access to your machine.