toa://toacms
One CMS, four modules, one API key.
Overview
cms is the writing surface for the whole ecosystem. It began as toa://blog; in August 2026 toa://comments, toa://contact and toa://ratings moved in as modules of the same application — one login, one admin, one API key per site, and a database per module so they stay out of each other’s way. Content lives once and comes out over a clean, versioned REST API: markdown in, structured JSON out. Each site is its own tenant, Postgres row-level security keeps them isolated, and API keys carry per-module scopes — the key that accepts a comment cannot publish a news post. Sign-in is single sign-on via toa://auth.
Features
Four modules, one app
Blog, comments, contact and ratings share one login, one admin and one API key — they used to be four separate applications on four subdomains.
A database per module
Core tenancy plus one database each for blog, comments, contact and ratings. A module cannot read another's tables, so a fault stays where it started.
Headless via API
Every module reads and writes over the same versioned REST API, with a per-site RSS feed and sitemap.xml. Your site owns its layout; the CMS owns the data.
Module-scoped API keys
A key carries scopes like blog:read or contact:write, so the key a public form holds to accept a message cannot publish a post.
Multi-site, multi-editor
Owners invite editors per site; Postgres row-level security keeps each site's content fully isolated across all four modules.
Draft, schedule & publish
Draft → published in one flip, or schedule a post and a worker publishes it for you. Every edit is snapshotted and one-click restorable.
Media library
Per-site image library — upload, auto-convert to WebP, organise by category and reuse across posts.
Built for automation
n8n and external tools read and publish programmatically with their own narrowly-scoped keys; a deploy webhook rebuilds the consuming site on publish.
API
Self-hosted World of Warcraft character tracker. Manage your roster, item levels, and Best-in-Slot gear progress across every character.