CMS open source dla Astro i Next.js
Polaris CMS
Mój własny CMS, wbudowany w stronę: piszesz w dwóch językach, widzisz ocenę SEO każdego wpisu na bieżąco, planujesz publikację, a agenci AI publikują według tych samych zasad.
Status Open source na licencji MIT. Publiczne wydanie na GitHubie i w npm jest w przygotowaniu.
W skrócie
Polaris CMS to system treści, na którym prowadzę własne serwisy. To nie jest usługa w chmurze: działa wewnątrz aplikacji Astro albo Next.js, trzyma wpisy i obrazy w bazie PostgreSQL serwisu i dodaje panel pod adresem /studio.
Zaczął się jako edytor bloga w PolishPal i stamtąd ma nazwę. Przy kolejnych serwisach zamiast gotowego CMS-u w chmurze powstały jego wersje dla Astro i Next.js, a dziś działa na sześciu stronach: PolishPal, PlantAlong, Olfaria, Grzybolog, Yolkday i na tej.
Powód był prosty: zasady SEO, harmonogram publikacji i API dla moich agentów AI mają być tuż obok treści, pod tą samą ścisłą polityką bezpieczeństwa co reszta strony, a dane w zwykłym Postgresie, który da się przenieść gdziekolwiek.
Co jest w środku
Wszystko poniżej działa już dziś na tej stronie i na pięciu produktach z moich realizacji.
-
Edytor z oceną SEO na żywo
Markdown w trybach pisania, podziału i podglądu; podgląd korzysta z tego samego renderera i arkusza stylów co strona. Tabele, przypisy, kolorowanie kodu, ilustracje z podpisami i wykresy rysowane jako SVG z liczbami w tabeli danych. Jedenaście kontroli działa w trakcie pisania, a ocena to odsetek spełnionych:
- Fraza kluczowa w tytule SEO
- Fraza kluczowa w opisie meta
- Fraza kluczowa w adresie (slugu)
- Fraza kluczowa w pierwszym akapicie
- Fraza kluczowa w śródtytule (H2 albo H3)
- Gęstość frazy od 0,5% do 2,5%
- Co najmniej 600 słów
- Tytuł SEO do 60 znaków
- Opis meta od 50 do 160 znaków
- Co najmniej jeden link wewnętrzny
- Co najmniej jeden obraz z tekstem alternatywnym
-
Harmonogram bez crona
Wpis jest szkicem, zaplanowanym albo opublikowanym. Zaplanowany wpis sam pojawia się o swojej godzinie: strony publiczne traktują go wtedy jako opublikowany, a okresowe porządki zmieniają jego status i wysyłają powiadomienie IndexNow.
-
Dwa języki w parach
Każdy wpis ma swój język. Tłumaczenie wybiera się w edytorze albo przesyła przez API jako translationOf, a hreflang łączy obie wersje dopiero wtedy, gdy obie są opublikowane.
-
Media w bazie danych
Przesłane pliki zamieniają się w WebP o szerokości do 1600 px (SVG w bezstratny WebP) i trafiają do PostgreSQL. Strona serwuje je spod /media/ z niezmiennym cache, więc nie trzeba utrzymywać osobnego magazynu plików.
-
Narzędzia do linków
Link Genius w trakcie pisania podpowiada linki wewnętrzne w języku wpisu. Menedżer linków, graf filarów i klastrów oraz audyt osieroconych stron i zepsutych linków pokazują cały serwis naraz.
-
Zaplecze SEO
RSS dla każdego języka, mapa witryny aktualna na bieżąco, generowane obrazy do udostępniania, JSON-LD, powiadomienia IndexNow przy publikacji i sprawdzanie adresów w Google Search Console z poziomu panelu, gdy jest skonfigurowane konto usługi.
-
Kopie zapasowe i przywracanie
Każdy zapis i każde usunięcie zachowuje poprzednią wersję, codziennie powstaje pełna kopia, a każdą kopię można pobrać jako JSON albo przywrócić na miejscu.
-
API dla agentów AI
Klucze tworzy się w panelu, przechowywane są tylko jako skrót, a klucz nie może tworzyć ani unieważniać innych kluczy. Agenci pobierają, zapisują, planują i usuwają wpisy oraz wgrywają obrazy, a to, co napiszą, dostaje tę samą ocenę SEO co wpis człowieka. Akcje: list, list-all, get, save, set-status, delete, recompute-scores, a do obrazów POST /api/cms/upload.
POST /api/cms/posts Authorization: Bearer $KEY { "action": "save", "post": { "lang": "pl", "title": "…", "content": "## …", "status": "scheduled", "publishedAt": "2026-12-01T08:00:00Z" } } -
Bezpiecznie, pod ścisłym CSP
Logowanie z limitem prób i podpisanym ciasteczkiem sesji. Panel działa pod polityką Content Security Policy bez skryptów i stylów inline, także na tej stronie, a szkice nigdy nie są publiczne.
-
Prosty stos
Astro albo Next.js, React 19 w panelu, Drizzle ORM i PostgreSQL 16 lub nowszy. Migracje uruchamiają się przy starcie aplikacji, a całość działa wszędzie tam, gdzie Node, w Dockerze albo bez niego. Zestawy startowe dodają opcjonalne moduły: komentarze z moderacją i miejsca na reklamy.
Panel od środka
Zrzuty z panelu tej strony, z prawdziwymi wpisami z tego bloga.
Wraz z v1
Instalacja
Publiczne wydanie będzie się instalować jak każdy pakiet npm. Te polecenia są zaplanowane na v1 i jeszcze nie działają; do tego czasu Polaris CMS wdrażam w ramach projektu strony.
-
Nowa strona
Starter Astro albo Next.js z wbudowanym Polaris CMS.
npm create polaris-cms@latest moja-strona -
Istniejąca strona w Astro
Jedna integracja dodaje /studio, trasy API i migracje bazy danych.
npm install polaris-cms # astro.config integrations: [polaris()] -
Istniejąca strona w Next.js
Instalacja pakietu i jeden plik trasy, który eksportuje jego handlery.
npm install polaris-cms
Wraz z v1 Aktualizacje przez npm update. Wymaga PostgreSQL, działa wszędzie tam, gdzie Node, a w zestawie będzie przepis na Dockera.
Chcesz Polaris CMS na swojej stronie?
Dokumentacja i informacje o wydaniach będą na stronie projektu. Jeśli potrzebujesz go przed publicznym wydaniem, napisz: wdrażam go w ramach budowy strony albo bloga.