Skip to content
Open source Apache-2.0. See what's new

Get cited by AI. Skip the plugin pile.

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.

  • Go
  • Postgres 16
  • WebAssembly · Extism
  • MCP
  • JSON-LD
  • Apache-2.0

Server

curl -fsSL https://hatamoto.dev/install.sh | sudo sh

On 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 up

On 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.

Hatamoto AI analytics overview: 46,191 AI fetches in 30 days, a fetches and visits chart, a Needs attention row with spoofed fetches and failing paths, and the top agents

Already in core

Twenty-four plugins, twenty-four update cycles. Or one binary.

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.

Elementorv3.2 → 3.3YoastlicenceWP RocketupdateRedirectionv2.9 → 3.0Gravity FormsrenewWordfenceupdateACFv6.1 → 6.2WPGraphQLupdateRedispatchTwo Factor2FALink WhisperlinkingDuplicate PostupdateSite Kittag managerWP Maintenancemaint. modeWP WebhooksupdateUpdraftPlusbackupsComplianzcookie bannerImagifyWebP · AVIFFileBirdmedia foldersBetter Searchsearch-replaceWP All ImportCSV importWP Mail SMTPemail logPublishPressunpublishPopular Postsmost viewed 24 vendors · 24 update cycles · 24 settings screens hata·moto one binary · one update builderSEOpage cacheredirectsformssecurityfieldsAPI2FAlinkingduplicatetagsmaintenancewebhooksbackupsMCPconsentWebP·AVIFmediafind/replaceCSVemail logschedulingpopular signed · rolls back on failure

See the plugin-by-plugin comparison

  • 01

    One Go binary

    The site, admin, REST API and MCP server run as one Go binary on one port. No PHP, no Node, no build step.

    hatamoto serve
  • 02

    Postgres, nothing else

    All content, settings and analytics live in Postgres. Migrations are embedded and run on boot.

    postgres
  • 03

    WASM plugin sandbox

    Plugins are WebAssembly, run inside the process with memory and time limits and only the permissions you tick.

    extism · wazero
  • 04

    Server-side AI analytics

    Every 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 page
  • 05

    MCP server built in

    Agents connect at /mcp with a scoped key and go through the same services as the admin: validation, hooks, cache, audit.

    /mcp · REST · CLI
  • 06

    Signed, reversible updates

    Releases are signed and ship on canary, edge and stable. If the site fails its health check, the previous version comes back.

    canary · edge · stable

From a live Hatamoto site, last 30 days

Google Analytics showed zero of these.

How AI analytics works
  • 46,191AI fetches across 16 of 19 known agents
  • 3,301spoofed fetches from bots pretending to be ClaudeBot, GPTBot and others
  • 11,456error responses served to AI crawlers, with the failing paths listed
  • 863published pages no AI has fetched yet, so none can be cited

How Hatamoto thinks about content

Schema first. Entity first. Locale first.

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.

Illustration: an example content type and entity CONTENT TYPEService nametext area_servedplace price_frommoney faqlist typeschema.org/Serviceurl/services/{slug} defines ENTITY · ONE RECORDEmergency plumbing area_servedMelbourne price_from$149 call-out localeen statuspublished PAGE/services/emergency-plumbing JSON-LD"@type": "Service" SITEMAP<loc>…/emergency-plumbing</loc> LLMS.TXT[Service]: 12 entities MCPentities.get → same record translation group en/services/emergency-plumbing fr/fr/services/plomberie-urgence ja/ja/services/kinkyu-haikan hreflanghreflang
  • Schema

    Define it once

    Build a content type in the admin: typed fields, a schema.org type and a URL pattern. No ACF, no custom code.

    entity_schemas
  • Entity

    Write it once

    The page, JSON-LD, sitemap entry, llms.txt line and MCP response all come from the same record and change together.

    Accept: application/ld+json
  • Locale

    Translate it properly

    Every entity carries a BCP 47 locale. Translations share a group, so hreflang and the language switcher come for free.

    /fr/{pattern}
  • License

    Apache-2.0

    Use it for clients, fork it, sell it. hatamoto.dev runs the same code you download. There is no paid edition.

  • Privacy

    Zero telemetry

    One update check, and you can turn it off. Analytics are daily counts in your own Postgres.

  • Extend

    Plugins in any language

    Write them with the Go SDK, or in any language with an Extism PDK.

From the blog

Notes from building it.

All posts

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 Chavda3 min read

Ajay Chavda

Publish it yourself, or hand it to your agents.

Open source, one Go binary and Postgres. Install it in a few minutes.

Server

curl -fsSL https://hatamoto.dev/install.sh | sudo sh

On 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 up

On 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.

Get startedView on GitHub