<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title># notACMS</title>
        <link>https://notacms.holas.pl/pl/</link>
        <description><![CDATA[AI-friendly static site generator. Zero database. Pure Markdown.]]></description>
        <language>pl</language>
        <atom:link href="https://notacms.holas.pl/pl/feed/" rel="self" type="application/rss+xml"/>
                <lastBuildDate>Fri, 24 Apr 2026 00:00:00 +0000</lastBuildDate>
                        <item>
            <title><![CDATA[notACMS 1.1.0 — Minimalny rdzeń, motyw demo, wybierz swój]]></title>
            <link>https://notacms.holas.pl/pl/wpisy/release-1-1-0/</link>
            <guid isPermaLink="true">https://notacms.holas.pl/pl/wpisy/release-1-1-0/</guid>
                        <pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate>
                        <description><![CDATA[Dwa motywy, jeden wybór przy pierwszym buildzie Najważniejsza zmiana w 1.1.0: notACMS wysyła teraz dwa motywy w pakiecie, a ty wybierasz jeden już przy pierwszym buildzie: ./notACMS deploy --demo # domyślny — projekt amber-phosphor, który widzisz tutaj ./notACMS deploy --bare # minimalny wireframe: fonty systemowe, jasny tryb, ~200 linii CSS ddev build obsługuje te same flagi. Cokolwiek wybierzesz…]]></description>
            <content:encoded><![CDATA[<h2>Dwa motywy, jeden wybór przy pierwszym buildzie<a id="dwa-motywy-jeden-wybór-przy-pierwszym-buildzie" href="#dwa-motywy-jeden-wybór-przy-pierwszym-buildzie" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>Najważniejsza zmiana w 1.1.0: notACMS wysyła teraz dwa motywy w pakiecie, a ty wybierasz jeden już przy pierwszym buildzie:</p>
<pre><code class="language-bash">./notACMS deploy --demo    # domyślny — projekt amber-phosphor, który widzisz tutaj
./notACMS deploy --bare    # minimalny wireframe: fonty systemowe, jasny tryb, ~200 linii CSS
</code></pre>
<p><code>ddev build</code> obsługuje te same flagi. Cokolwiek wybierzesz, działa każda funkcja: treści wielojęzyczne, blog, RSS, sitemap, wyszukiwarka, formularz kontaktowy, obrazy z wariantami responsywnymi, czas czytania, wskaźnik postępu czytania. Różnica leży jedynie w wyglądzie — i, co najważniejsze, w tym, ile dziedziczysz, zanim zaczniesz dopasowywać.</p>
<h3>Minimalny rdzeń<a id="minimalny-rdzeń" href="#minimalny-rdzeń" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Rdzeń w <code>templates/</code>, <code>assets/</code>, <code>translations/</code> jest teraz wireframem. Został świadomie zminimalizowany, żeby nadpisanie pojedynczego bloku nie ciągnęło za sobą języka wizualnego, z którym musiałbyś walczyć. Jeśli budujesz projekt szyty na miarę, startuj z bare i od pierwszego dnia kontrolujesz cały wygląd.</p>
<h3>Motyw demo<a id="motyw-demo" href="#motyw-demo" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Demo żyje w <code>docs/demo/</code> i kopiowane jest do <code>local/</code>, kiedy wybierzesz <code>--demo</code>. To pełny projekt amber-phosphor, który właśnie czytasz — ciemny tryb, overlay wyszukiwania, sidebar dokumentacji, przełącznik motywu, wszystko razem. Startuj stąd, jeśli chcesz dopracowany projekt już dziś i planujesz dopracowywać, a nie przebudowywać.</p>
<h2>System nadpisań <code>local/</code><a id="system-nadpisań-local" href="#system-nadpisań-local" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>Oba motywy korzystają z tego samego mechanizmu: każdy plik w <code>local/</code> ma pierwszeństwo przed odpowiadającą mu ścieżką w rdzeniu.</p>
<table>
<thead>
<tr>
<th>Warstwa</th>
<th>Lokalizacja nadpisania</th>
<th>Resolver</th>
</tr>
</thead>
<tbody>
<tr>
<td>Szablony Twig</td>
<td><code>local/templates/*.html.twig</code></td>
<td>Kernel Symfony</td>
</tr>
<tr>
<td>Entrypoint SCSS</td>
<td><code>local/assets/styles/app_local.scss</code></td>
<td>Sass-bundle</td>
</tr>
<tr>
<td>Entrypoint JS</td>
<td><code>local/assets/app.js</code></td>
<td>Importmapa AssetMappera</td>
</tr>
<tr>
<td>Tłumaczenia</td>
<td><code>local/translations/messages.*.yaml</code></td>
<td>Translator Symfony</td>
</tr>
<tr>
<td>Treści</td>
<td><code>local/content/**</code></td>
<td>Parametr <code>notacms_content</code></td>
</tr>
<tr>
<td>Snippety Nginx</td>
<td><code>local/docker/nginx/*.conf</code></td>
<td>Entrypoint kontenera</td>
</tr>
</tbody>
</table>
<p>Rdzeń nie jest nigdy edytowany. <code>git pull</code> pozostaje czysty. Personalizacje żyją w repozytorium twojej strony, nie w forku tego repo.</p>
<h2>Aktualizacja z 1.0.0<a id="aktualizacja-z-100" href="#aktualizacja-z-100" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>Jeśli używałeś 1.0.0 i chcesz, żeby twoja strona wyglądała dokładnie jak wcześniej, pakiet kompatybilności to jedna linijka:</p>
<pre><code class="language-bash">cp -r docs/customization/old-template/. local/
ddev build
</code></pre>
<p>To wrzuca kompletny motyw sprzed 1.1.0 — szablony, SCSS, fonty, obrazy, tłumaczenia — do <code>local/</code>. Twoja strona renderuje się dokładnie jak przedtem. Później możesz selektywnie usuwać pliki z <code>local/</code>, w miarę jak adaptujesz nowe elementy projektu.</p>
<p>Faktyczne breaking changes, które cię dotkną, jeśli dostosowywałeś stary rdzeń:</p>
<ul>
<li><strong>Zmiana nazwy entrypointa SCSS</strong>: <code>local/assets/styles/local.scss</code> → <code>local/assets/styles/app_local.scss</code>. Zmień nazwę pliku i zaktualizuj import w <code>local/assets/app.js</code>.</li>
<li><strong>Zmienne SCSS kolorów w rdzeniu zastąpione CSS custom properties</strong>: <code>$color-body</code> → <code>var(--text)</code>, <code>$color-link</code> → <code>var(--accent)</code> itd. Pełna mapa w <a rel="nofollow noopener noreferrer" target="_blank" href="https://github.com/holas1337/notACMS/blob/main/UPGRADE-1.1.md">UPGRADE-1.1.md</a>.</li>
<li><strong>Klucze tłumaczeń usunięte</strong> z rdzenia (nadal obecne w motywie demo): <code>header.tagline</code>, <code>nav.projects</code>, <code>nav.search</code>, <code>blog.published_on</code>, <code>blog.comments_disabled</code>. Jeśli twoje szablony wołają <code>'...'|trans</code> na tych kluczach, zaktualizuj je.</li>
<li><strong>Katalog <code>docs/examples/</code> usunięty</strong>: przydatne części trafiły do <code>docs/customization/old-template/</code>; przykłady nadpisań ad hoc zostały wyparte przez model bare/demo.</li>
</ul>
<p>Zobacz <a rel="nofollow noopener noreferrer" target="_blank" href="https://github.com/holas1337/notACMS/blob/main/UPGRADE-1.1.md">UPGRADE-1.1.md</a> po pełną listę ze snippetami przed/po.</p>
<h2>Co jeszcze nowego w 1.1.0<a id="co-jeszcze-nowego-w-110" href="#co-jeszcze-nowego-w-110" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<ul>
<li><strong>Czas czytania</strong> i <strong>wskaźnik postępu czytania</strong> na wpisach, dokumentacji i releasach.</li>
<li><strong>Przełącznik języka</strong> jako rozszerzenie Twiga (<code>lang_switch_urls</code>) z poprawnymi łańcuchami fallbacków dla archiwów, list z paginacją i stron głównych.</li>
<li><strong>Zajawki wpisów usuwają kotwice nagłówków</strong> — żadnych zbłąkanych <code>#</code> na kartach list.</li>
<li><strong>Szkielet suite testów</strong> w <code>tests/Unit/</code>, <code>tests/Integration/</code>, <code>tests/Fixtures/</code> z początkowym pokryciem i komendą <code>test</code> uruchamianą z hosta.</li>
<li><strong>Skille agenta AI</strong> w <code>.claude/skills/</code> do pracy nad repo: dodawanie locali, sprawdzanie alignmentu dokumentacji, site-sweepy, tłumaczenia i generowanie przewodników aktualizacji.</li>
</ul>
<h2>Pełny changelog<a id="pełny-changelog" href="#pełny-changelog" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>Każda zmiana ze swoją kategorią: <a rel="nofollow noopener noreferrer" target="_blank" href="https://github.com/holas1337/notACMS/blob/main/CHANGELOG.md#110---2026-04-24">CHANGELOG.md</a>.</p>
]]></content:encoded>
                                    <category><![CDATA[releases]]></category>
                                    <category><![CDATA[release]]></category>
                        <category><![CDATA[announcement]]></category>
                    </item>
                <item>
            <title><![CDATA[notACMS v1.0.0]]></title>
            <link>https://notacms.holas.pl/pl/wpisy/release-1-0-0/</link>
            <guid isPermaLink="true">https://notacms.holas.pl/pl/wpisy/release-1-0-0/</guid>
                        <pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate>
                        <description><![CDATA[Co zawiera v1.0.0 Po kilku miesiącach wewnętrznego użytkowania w projektach osobistych, oznaczam pierwsze stabilne wydanie. Podstawowy zestaw funkcji jest wystarczająco solidny, aby budować prawdziwe strony. Pipeline treści Pipeline treści to serce notACMS. Odczytuje katalog local/content/, parsuje frontmatter i jedną komendą generuje kompletną stronę statyczną. Treść Markdown z frontmatter YAML R…]]></description>
            <content:encoded><![CDATA[<h2>Co zawiera v1.0.0<a id="co-zawiera-v100" href="#co-zawiera-v100" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>Po kilku miesiącach wewnętrznego użytkowania w projektach osobistych, oznaczam pierwsze stabilne wydanie. Podstawowy zestaw funkcji jest wystarczająco solidny, aby budować prawdziwe strony.</p>
<h3>Pipeline treści<a id="pipeline-treści" href="#pipeline-treści" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Pipeline treści to serce notACMS. Odczytuje katalog <code>local/content/</code>, parsuje frontmatter i jedną komendą generuje kompletną stronę statyczną.</p>
<ul>
<li>Treść Markdown z frontmatter YAML</li>
<li>Renderowanie CommonMark z permalinkami nagłówków</li>
<li>Generowanie excerptów z treści prozatorskich</li>
<li>Obliczanie czasu czytania</li>
</ul>
<h3>Wielojęzyczny routing<a id="wielojęzyczny-routing" href="#wielojęzyczny-routing" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Lokale są definiowane w <code>_site.yaml</code>. Każdy lokal otrzymuje własną przestrzeń URL, z opcjonalnymi nadpisaniami ścieżek w <code>_routes.yaml</code>. Tagi hreflang są generowane automatycznie.</p>
<pre><code class="language-yaml">locales:
  en:
    label: &quot;English&quot;
    date_format: &quot;M d, Y&quot;
  pl:
    label: &quot;Polski&quot;
    date_format: &quot;d.m.Y&quot;
</code></pre>
<h3>Wyszukiwarka Pagefind<a id="wyszukiwarka-pagefind" href="#wyszukiwarka-pagefind" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Pełnotekstowe wyszukiwanie jest wbudowane w wynik statyczny przez Pagefind. Komenda budowania automatycznie generuje indeks wyszukiwania. Brak zewnętrznego API, brak wyszukiwania po stronie serwera — tylko statyczny indeks działający offline.</p>
<h3>Przetwarzanie obrazów<a id="przetwarzanie-obrazów" href="#przetwarzanie-obrazów" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Obrazy przechowywane obok treści są przetwarzane podczas budowania. notACMS generuje warianty WebP w wielu szerokościach, automatycznie aktualizuje atrybuty <code>src</code> o responsywne <code>srcset</code> i obsługuje mapowanie ścieżek między katalogami treści i wynikowym.</p>
<h3>Środowisko lokalne DDEV<a id="środowisko-lokalne-ddev" href="#środowisko-lokalne-ddev" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h3>
<p>Środowisko deweloperskie jest w pełni skonteneryzowane z DDEV. <code>ddev start</code> daje PHP 8.5, Nginx i wszystkie narzędzia budowania. <code>ddev build</code> produkuje wynik statyczny. <code>ddev code-check</code> uruchamia PHPStan i PHP CS Fixer.</p>
<h2>Przełomowe zmiany<a id="przełomowe-zmiany" href="#przełomowe-zmiany" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>To pierwsze stabilne wydanie. Jeśli używałeś wersji sprzed 1.0, sprawdź schemat <code>_site.yaml</code> — klucz <code>social</code> zmienił się z listy na mapę.</p>
<h2>Aktualizacja<a id="aktualizacja" href="#aktualizacja" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<pre><code class="language-bash">git pull
ddev composer install
ddev build
</code></pre>
<h2>Co dalej<a id="co-dalej" href="#co-dalej" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>v1.1.0 skupi się na systemie designu i dokumentacji. Ta strona — zbudowana z notACMS — stanie się oficjalną dokumentacją i referencją designu.</p>
]]></content:encoded>
                                    <category><![CDATA[releases]]></category>
                                    <category><![CDATA[release]]></category>
                        <category><![CDATA[announcement]]></category>
                    </item>
                <item>
            <title><![CDATA[Dlaczego zbudowałem notACMS]]></title>
            <link>https://notacms.holas.pl/pl/wpisy/the-idea/</link>
            <guid isPermaLink="true">https://notacms.holas.pl/pl/wpisy/the-idea/</guid>
                        <pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate>
                        <description><![CDATA[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…]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Dłuższa historia w tle na moim osobistym blogu: <a rel="nofollow noopener noreferrer" target="_blank" href="https://holas.pl/blog/why-i-left-wordpress/">I left WordPress</a>.</p>
</blockquote>
<h2>Problem, na który wciąż trafiałem<a id="problem-na-który-wciąż-trafiałem" href="#problem-na-który-wciąż-trafiałem" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>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.</p>
<p>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.</p>
<p>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?</p>
<h2>Decyzja o braku bazy danych<a id="decyzja-o-braku-bazy-danych" href="#decyzja-o-braku-bazy-danych" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>Pierwsza rzecz, którą postanowiłem: żadnej bazy danych. Nie „baza danych opcjonalnie&quot; — żadnej bazy danych w ogóle. Treść żyje w plikach. Proces budowania odczytuje pliki. Wynik to pliki.</p>
<p>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.</p>
<p>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.</p>
<h2>AI-friendly z założenia<a id="ai-friendly-z-założenia" href="#ai-friendly-z-założenia" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>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.</p>
<p>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.</p>
<p>To nie jest funkcja dodana po fakcie. To powód, dla którego system jest zaprojektowany w taki sposób.</p>
<h2>Fundament Symfony<a id="fundament-symfony" href="#fundament-symfony" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>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.</p>
<p>Model treści to interesująca część. System routingu odczytuje <code>_routes.yaml</code> 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.</p>
<h2>Co dalej<a id="co-dalej" href="#co-dalej" class="heading-anchor" aria-hidden="true" title="Permalink">#</a></h2>
<p>To pierwsze wydanie to działający fundament. Rzeczy, które chcę zbudować:</p>
<ul>
<li>Integracja wyszukiwarki Pagefind (w v1.0.0)</li>
<li>Lepszy pipeline obrazów z generowaniem WebP</li>
<li>Pełniejsze wsparcie wielojęzyczne</li>
<li>Właściwa strona Design Reference (tym staje się ta strona)</li>
</ul>
<p>Repozytorium jest publiczne. Jeśli chcesz śledzić postępy lub wnieść wkład, link jest w stopce.</p>
]]></content:encoded>
                                    <category><![CDATA[releases]]></category>
                                    <category><![CDATA[announcement]]></category>
                        <category><![CDATA[open-source]]></category>
                    </item>
            </channel>
</rss>
