Polaris CMS · v1 in preparation
A blog CMS your agents can publish to.
Polaris adds a /studio editor, a small JSON API and the SEO plumbing to an Astro or Next.js site. Posts, images and backups live in one PostgreSQL database. No separate CMS server, no storage bucket.
Open source under MIT. Public release on GitHub and npm in preparation. See the roadmap.
01 · Write
An editor that checks the SEO while you type.
Markdown with write, split and preview modes. The preview runs the same renderer as the live post. Beside it, 11 on-page checks turn into a score out of 100.
- Tables, footnotes, figures with captions, highlighted code
```chartblocks rendered as SVG charts with a data table- Raw HTML dropped, so agent-written text stays safe
- Internal-link suggestions, a link manager and a cluster graph
- Focus keyword in the SEO title (passes)
- Focus keyword in the meta description (passes)
- Focus keyword in the URL slug (passes)
- Focus keyword in the first paragraph (passes)
- Focus keyword in a subheading (H2/H3) (fails)
- Keyword density 0.5% to 2.5% (passes)
- At least 600 words (passes)
- SEO title 60 characters or fewer (passes)
- Meta description 50 to 160 characters (passes)
- At least one internal link (fails)
- At least one image with alt text (passes)
02 · Publish
Scheduled posts go live on time. No cron job.
-
Scheduling without cron
Every public query checks the publish time itself, so a scheduled post appears at its minute even if no job runs.
-
Two languages, paired
In the newest version, posts carry a language and a translation key, and
hreflangappears only once the translation is live. -
Media in Postgres
Uploads become WebP and are served from
/media/…with a one-year immutable cache. No bucket to set up. -
Backups on every save
The previous version is kept on every save and delete, a full snapshot is taken daily, and the Studio restores either.
03 · Automate
Seven actions and an upload. That's the API.
Agents and scripts use Bearer keys created in the Studio. Keys are stored hashed and can't create or revoke other keys. A repeated create with the same slug is refused, so a retry never makes a duplicate.
list- live posts as internal-link targets
list-all- every post, drafts too, without the body
get- one full post
save- create, or replace when id is set
set-status- draft, scheduled or published
delete- with a backup taken first
recompute-scores- rerun the SEO checks
KEY=… # Studio → API Keys
# 1. Upload an image: stored as WebP in Postgres
curl -s -X POST https://example.com/api/cms/upload \
-H "Authorization: Bearer $KEY" \
-F "file=@chart.png" -F "alt=Organic clicks per month"
# → {"url":"/media/<id>/chart.webp", …}
# 2. Save a post, scheduled for Friday morning
curl -s -X POST https://example.com/api/cms/posts \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"action":"save","post":{
"title":"How we cut LCP to 0.8 s",
"focusKeyword":"cut lcp",
"content":"## The budget\n\n…",
"featuredImage":"/media/<id>/chart.webp",
"status":"scheduled",
"publishedAt":"2026-11-20T08:00:00+01:00"}}'
# → {"ok":true,"id":12,"url":"/blog/how-we-cut-lcp-to-0-8-s/","seoScore":73, …} 04 · Get found
The SEO plumbing comes with it.
- RSS per language
- Live sitemap
- Share images per post
- JSON-LD
- hreflang for live translations
- IndexNow ping on publish
- Search Console URL checks
- Thin listings kept noindex
05 · Own it
Your site, your database, your server.
-
One database
PostgreSQL 16+. Migrations run on start. A database backup is a backup of everything, images included.
-
One container
nginx serves the static pages, Node renders the blog, the Studio and the API. Docker-friendly, port 80, a health check.
-
Strict CSP
The newest version runs the Studio under
script-src 'self'; style-src 'self'with no inline exceptions. -
MIT licensed
Use it, change it, ship it in client work. The public repository and npm packages are in preparation.
In production
Runs six sites.
Polaris started inside PolishPal, was ported to Astro and Next.js, and now publishes every newer site Scentro has built.
Built by Scentro
Made by the studio that runs it.
Scentro builds content websites and web apps around real data, and publishes them with Polaris. Read the story of the CMS on scentro.pl/polaris, or see the rest of the work at scentro.pl.