Dlaczego zbudowałem notACMS

Geneza notACMS — dlaczego kolejny generator stron statycznych, filozofia AI-friendly i decyzja o braku bazy danych.

Dłuższa historia w tle na moim osobistym blogu: I left WordPress.

Problem, na który wciąż trafiałem

Każdy projekt PHP, nad którym pracowałem, w końcu potrzebował strony internetowej. Dokumentacja, landing page, blog — to co zwykle. I za każdym razem, gdy sięgałem po narzędzie, lądowałem w tym samym miejscu: narzędzie, które chciało, żebym myślał jak ono, a nie jak programista PHP.

Hugo jest szybki, ale jego język szablonów jest obcy. Jekyll wymaga Ruby. WordPress ma zły kształt dla treści statycznych. Next.js jest potężny, ale zamienia problem z publikowaniem Markdown w problem z bundlerem JavaScript.

Wciąż myślałem: znam już Symfony. Znam już Twig. Mam już Composer. Dlaczego muszę uczyć się nowego ekosystemu tylko po to, żeby opublikować tekst?

Decyzja o braku bazy danych

Pierwsza rzecz, którą postanowiłem: żadnej bazy danych. Nie „baza danych opcjonalnie" — żadnej bazy danych w ogóle. Treść żyje w plikach. Proces budowania odczytuje pliki. Wynik to pliki.

To wymusza pewną dyscyplinę. Struktura treści musi być jawna i przewidywalna. Nie ma zapytania do bazy, po które można sięgnąć, gdy chce się znaleźć powiązane wpisy lub wygenerować mapę strony. Wszystko musi być wyprowadzalne z drzewa plików.

To ograniczenie okazało się właściwym wyborem. Sprawia, że system jest łatwy do rozumienia, łatwy do backupowania i trywialnie łatwy dla narzędzi AI.

AI-friendly z założenia

Zacząłem poważnie o tym myśleć, gdy zacząłem używać LLM w codziennej pracy. Proszenie AI o pomoc przy generowaniu treści, tłumaczeniu stron czy walidacji schematów YAML jest proste, gdy format to zwykły tekst.

W przypadku CMS-a opartego na bazie danych trzeba by wyjaśniać schemat, pisać SQL, zarządzać migracjami. Z notACMS przekazujesz AI katalog plików Markdown i może ona bezpośrednio odczytywać, generować i edytować treści — bo format to po prostu tekst.

To nie jest funkcja dodana po fakcie. To powód, dla którego system jest zaprojektowany w taki sposób.

Fundament Symfony

Zbudowałem notACMS na Symfony 7 z tego samego powodu, dla którego używam Symfony do wszystkiego innego: jest jawny, typowany i dobrze udokumentowany. Kontener DI, komendy konsolowe, Twig — to wszystko standardowy Symfony. W infrastrukturze nie ma nic nowatorskiego.

Model treści to interesująca część. System routingu odczytuje _routes.yaml i generuje trasy Symfony z drzewa treści. Komenda budowania renderuje każdą trasę i zapisuje statyczny HTML. Warstwa serwisów jest cienka i wymienialna.

Co dalej

To pierwsze wydanie to działający fundament. Rzeczy, które chcę zbudować:

  • Integracja wyszukiwarki Pagefind (w v1.0.0)
  • Lepszy pipeline obrazów z generowaniem WebP
  • Pełniejsze wsparcie wielojęzyczne
  • Właściwa strona Design Reference (tym staje się ta strona)

Repozytorium jest publiczne. Jeśli chcesz śledzić postępy lub wnieść wkład, link jest w stopce.