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.

  1. 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
  2. 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.

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

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

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

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

  7. 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" } }
  8. 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.

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

Lista artykułów w Polaris CMS: cztery opublikowane wpisy po angielsku i po polsku, każdy z oceną SEO 100, językiem, adresem, powiązanym tłumaczeniem, statusem, kategorią i datą.
Artykuły: oba języki na jednej liście, z oceną SEO, statusem i tłumaczeniem każdego wpisu.
Edytor Polaris CMS w widoku podzielonym: Markdown po lewej, podgląd na żywo w typografii strony po prawej, a obok ustawienia języka, tłumaczenia i publikacji.
Edytor w widoku podzielonym, z językiem, tłumaczeniem i harmonogramem obok tekstu.
Panel SEO w edytorze: fraza kluczowa, opis meta, ocena 100 przy 11 z 11 spełnionych kontroli, podgląd wyniku wyszukiwania i lista kontroli.
Panel SEO: jedenaście kontroli liczonych w trakcie pisania.
Biblioteka mediów Polaris CMS: pole do przesyłania plików i siatka obrazów WebP, każdy z rozmiarem, wpisem, w którym jest użyty, i przyciskami do skopiowania adresu albo kodu Markdown.
Biblioteka mediów: każdy obraz zamieniony na WebP i zapisany razem ze stroną.

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.