Jesteśmy z Tytanu Kuba Kołaciński
Czytelnia · Warsztat

Wydałem książkę bez wydawcy. Cała infrastruktura mieści się w jednym folderze

Jak zbudowałem wydawnictwo w jednym folderze: jedno źródło dla wszystkich formatów, zero trackerów, 200 złotych rocznie — i trzy rzeczy, które się po drodze zepsuły.

Kuba Kołaciński · 21 sierpnia 2026

Wydałem książkę bez wydawcy, bez agencji i bez budżetu. Po partyzancku. Całą infrastrukturę zbudowałem sam, z Claude Code: landing page, czytnik online, generowanie EPUB-a, skład pod PDF, sitemapę, metadane, dane strukturalne.

Ten tekst jest o rzemiośle: o tym, co trzeba było zbudować, żeby książka w ogóle mogła wyjść, i o tym, gdzie ta metoda pęka.

01 · Zasady

Najpierw zasady, potem kod

Pierwszy plik w tym projekcie był konstytucją dla modelu — CLAUDE.md. Kilkanaście linijek, które model czyta przed każdą sesją.

Najważniejsza z nich jest zakazem:

Pliki ksiazka_rozdzialy/*.md to tekst książki. Nie edytuj ich, nie przepisuj, nie „poprawiaj" prozy, nie zmieniaj interpunkcji autora. Reader je tylko renderuje.

Wszystko inne wynika z tego jednego akapitu. Model, który dostaje dostęp do repozytorium z prozą, będzie chciał tę prozę ulepszyć. Wygładzi zdanie, doda przecinek, „naprawi" celowe powtórzenie. Zrobi to w dobrej wierze i zrobi to cicho, w środku commita, który miał dotyczyć CSS-a.

Więc kolejność jest odwrotna od intuicyjnej: najpierw definiujesz, czego AI nie wolno tknąć. Potem mówisz, co ma zbudować.

W tym samym pliku siedzą moje decyzje, których model nie ma prawa renegocjować: mobile-first, UI po polsku, zero popupów, zero trackerów reklamowych, zero bramek e-mailowych, zero paywalla. I kolejność rozdziałów — dwanaście nazw w jednej linijce, z dopiskiem „nie zmieniać". Bo raz zmienił.

02 · Podział pracy

Dwa czaty, które o sobie nie wiedzą

Pracuję w dwóch osobnych sesjach i pilnuję, żeby się nie mieszały.

Pierwsza zajmuje się wyłącznie frontendem — layout, style, czytnik, landing page. Nie ma prawa dotknąć rozdziałów.

Druga zajmuje się wyłącznie tekstem — przecinki (mam z tym problem), bibliografia. Nie ma prawa dotknąć plików .astro.

Niestety model, który przez godzinę walczył z siatką CSS, wchodzi w tryb „poprawiam wszystko, co widzę". Jeśli w tym stanie otworzy rozdział, żeby sprawdzić, jak się renderuje motto — wyjdzie z niego z trzema „ulepszeniami" prozy, o które nie prosiłem.

03 · Jedno źródło

Jedno źródło, wszystkie formaty

Dwanaście plików markdown. To jest cała książka i cała baza danych tego projektu.

ksiazka_rozdzialy/01_wstep.md … 12_przyszlosc.md
        ↓
        ├─→ czytnik online (Astro renderuje ze źródła)
        ├─→ KSIAZKA_calosc.md (skrypt składa automatycznie)
        │        ├─→ EPUB (pandoc)
        │        └─→ DOCX → ręczny eksport do PDF
        ├─→ llms.txt + llms-full.txt
        └─→ sitemap, metadane, dane strukturalne

Poprawiam literówkę w pliku. Jedno polecenie przebudowuje resztę.

Ale nie zaprojektowałem tego tak od początku. Przez pierwsze tygodnie miałem dwie kopie tekstu: rozdziały i plik zbiorczy do generowania EPUB-a. Trzymałem je w zgodzie ręcznie.

11 lipca zgubiłem przez to motto WSTĘPU. Cytat z Luthena Raela — zdanie, wokół którego zbudowana jest cała książka — istniał w jednej kopii i został skasowany jako „duplikat", bo w drugiej kopii siedział w złym miejscu.

Skrypt składający całość automatycznie napisałem następnego dnia, i w jego nagłówku do dziś stoi opis tego, co się stało. Nauka na błędach — tak wygląda większość moich dobrych decyzji w tym projekcie.

Ilość pracy, którą zdejmuje jedna decyzja „to jest jedyne źródło prawdy", jest trudna do oszacowania. Automatyzuję, kiedy muszę ręcznie zrobić coś po raz dziesiąty — albo kiedy stracę fragment tekstu.

04 · Stos

Stos: nudny z premedytacją

Astro. Na wyjściu statyczny HTML. Bez CMS-a, bez bazy danych, bez backendu, bez niczego, co działa w czasie rzeczywistym.

Deploy jest najmniej efektowną częścią tej układanki. Nie mam konta na GitHubie, więc zbudowany folder wgrywam ręcznie, przez FTP, na zwykły hosting współdzielony. Konfiguracja pod automatyczny deploy leży w repozytorium gotowa i czeka na wieczór, w którym mi się zechce pracować. W tekstach o „nowoczesnym stacku" ostatni etap zwykle znika — a to zwykle on kosztuje najwięcej klikania.

Podobnie z PDF-em: skrypt składa DOCX-a, a plik do pobrania eksportuję z Worda ręcznie. Próbowałem to zautomatyzować i nie wyszło — złożenie PDF-a o przyzwoitej typografii okazało się jedną z tych rzeczy, z którymi model sobie nie poradził. Zostało po staremu: Word, eksport, wgranie pliku.

Statyczny HTML wciąż wygrywa przy długim tekście. Ładuje się natychmiast, działa na wszystkim, nie ma jak się zepsuć w środku nocy i przeczyta go każdy — łącznie z modelami językowymi. Zrobiłem też llms.txt, a obok drugi plik z pełną treścią książki, choć żaden dostawca nie potwierdził, że z tego korzysta. Zajęło minutę. Czemu nie.

Ciekawostka: książka ma trzy numery ISBN — po jednym na format. EPUB ma swój, PDF ma swój, HTML (online) ma swój. Formalnie to trzy różne wydania tej samej książki, każde z osobną tożsamością w katalogach.

ISBN można pozyskać za darmo. Zarejestrowałem się na stronie e-isbn.pl, wypełniłem formularz, wydrukowałem w publicznej drukarce (Kaufland), podpisałem, wysłałem skan. Po kilku dniach miałem kody gotowe do rejestracji w bazie Biblioteki Narodowej.

05 · Widoczność

Żeby ktokolwiek to znalazł

Napisanie książki i wystawienie jej w internecie to dwie osobne rzeczy. Trzecia to sprawienie, żeby ktokolwiek na nią trafił.

Sitemapa generowana automatycznie przy każdym buildzie. robots.txt. Dane strukturalne — schema.org/Book z numerem ISBN, żeby wyszukiwarka widziała jedną książkę, a nie zbiór przypadkowych adresów. Sensowne tytuły i opisy. Karta Open Graph, żeby link wklejony na Messengerze pokazywał okładkę.

Potem zakładasz konta: Google Search Console i Bing Webmaster Tools. Zgłaszasz sitemapę, prosisz o indeksację, czekasz.

Podpiąłem też IndexNow — protokół, którym powiadamia się Bing i Yandex o nowych adresach od razu, zamiast czekać, aż robot sam się zjawi. Skrypt czyta żywą sitemapę i wysyła z niej wszystkie adresy. Google w tym nie uczestniczy, więc tam zostaje ręczne „poproś o zaindeksowanie" w Search Console. Uruchamiam to zawsze po wgraniu plików na serwer, bo IndexNow weryfikuje klucz pod jego publicznym adresem — przed wgraniem weryfikacja się nie uda.

Zabawne, że mimo tego natychmiastowego kanału na Bing czekałem najdłużej.

Sprawdzałem też coś, na co nie ma jeszcze narzędzi: czy modele językowe wiedzą, że ta książka istnieje. Zadawałem im pytania o tytuł i o autora, i patrzyłem, co odpowiadają. Dla części osób to jest dzisiaj pierwsza wyszukiwarka, a nikt nie daje do tego panelu w rodzaju Search Console. Zostaje pytać i sprawdzać.

Najbardziej pomogło jednak coś, co z technikaliami nie ma nic wspólnego: strona książki na LubimyCzytać. Serwis z ugruntowaną pozycją w wyszukiwarce podlinkował moją domenę i to zrobiło więcej niż wszystkie zabiegi opisane wyżej razem wzięte. Wniosek dla każdego, kto wydaje samodzielnie: zanim zaczniesz dłubać w metadanych, załóż profil tam, gdzie czytelnicy już szukają książek.

Jeśli czytałaś albo czytałeś „Jesteśmy z Tytanu" — zostaw proszę ocenę albo kilka zdań recenzji: lubimyczytac.pl/ksiazka/jestesmy-z-tytanu. Przy takiej książce to jedyny mechanizm dystrybucji, jaki mam.

06 · Dane

Zero trackerów

Nie ma banera zgody, bo nie ma na co się zgadzać. Nie ma polityki cookies, bo nie ma cookies. Wyświetlenia zliczam w Umami — anonimowo, bez ciasteczek, bez profilowania, bez odsprzedawania czegokolwiek dalej.

To była najtańsza decyzja w całym projekcie. Zdjęła najwięcej pracy. Każdy tracker to jest integracja, zgoda, baner, polityka, i pytanie „co my właściwie z tymi danymi robimy". Zero trackerów to jest brak wszystkich tych rzeczy.

Umami zbiera dane — adres strony, referrer, kraj, przeglądarkę. Nie zbiera ich w sposób, który pozwala kogokolwiek rozpoznać, i nie używa ciasteczek. Ale „bez ciasteczek" to nie to samo co „bez danych" i pisanie inaczej byłoby kłamstwem.

07 · Budżet

Dwieście złotych rocznie

Nie chciałem, żeby ta książka była towarem. Trudno napisać trzydzieści tysięcy słów o tym, jak kapitalizm zamienia bunt w produkt, a potem wystawić ten tekst na półkę z ceną na okładce.

Druk i dystrybucja własnym sumptem przekraczają moje kompetencje. Zostawała umowa z wydawcą — czyli oddanie części decyzji o książce komuś, kto musi na niej zarobić, żeby ta umowa w ogóle miała sens. Rozumiem tę logikę i nie mam do niej pretensji. Zależy mi po prostu na czymś innym: żeby ten głos dotarł jak najszerzej, bez bramki na wejściu.

Więc książka jest darmowa, na licencji CC BY-NC-ND — wolno ją czytać, pobierać i rozdawać dalej, nie wolno jej sprzedawać ani przerabiać. Czytasz online albo pobierasz EPUB-a. Bez paywalla, bez „zapisz się, żeby pobrać", bez wersji premium.

Cała ta operacja kosztuje mnie około 200 złotych rocznie — domena i hosting w pakiecie, który odpowiada moim potrzebom. To jest pełny budżet tego wydawnictwa.

Ta liczba tłumaczy wszystko inne. Przy dwustu złotych rocznie nie potrzebuję modelu biznesowego. Nie muszę optymalizować konwersji, budować lejka ani odsprzedawać uwagi czytelnika komukolwiek. Koszt jest na tyle niski, że wypada poza rachunek — i właśnie dlatego stać mnie na wszystkie decyzje opisane wyżej. Zero trackerów jest tanie, kiedy nie masz nic do sfinansowania.

Zostawiłem obok miejsce na podziękowanie. Suppi — jednorazowo, „postaw kawę". Patronite — cyklicznie, dla tych, którzy chcą wesprzeć kolejne projekty. Bez progów, bez treści zamkniętych za wpłatą, bez licznika zbiórki na stronie. Jeśli uzbiera się na hosting, świetnie.

Jedną rzecz zbieram: adresy e-mail. Opcjonalnie, dla chętnych. Postawiłem newsletter na MailerLite, z szablonem i stroną podziękowania za zapis. Robię to z tego samego powodu, dla którego strona jest statyczna — baza kontaktów należy do mnie. Zasięg na cudzej platformie jest wypożyczony i można go zabrać jedną aktualizacją algorytmu. Lista adresów zostaje ze mną niezależnie od tego, co się stanie z platformami.

08 · Usterki

„Wyzwania"

Rzeczy, których nie zobaczysz na LinkedIn w postach o „vibe-codingu".

Najwięcej szkód narobił mój własny plik z zasadami.

W CLAUDE.md — tym samym pliku, od którego zaczyna się cały ten projekt — przez kilka tygodni stało zdanie: „auto-deploy z commita". Kiedyś tak to planowałem. W rzeczywistości nie mam nawet repozytorium git. Buduję stronę lokalnie i wgrywam folder przez FTP, ręcznie, jak w 2009 roku.

Model nie ma jak tego wiedzieć. Czyta zasady, ufa im i buduje na nich wszystko, co robi dalej. Kiedy zbierałem materiał do tego tekstu, podał mi „auto-deploy z commita" jako fakt o mojej własnej infrastrukturze. Wyłapałem to tylko dlatego, że akurat ten krok wykonuję ręcznie przy każdej zmianie.

Drugi przypadek kosztował więcej. W zasadach stało, że plik zbiorczy „służy tylko do generowania epuba". Prawda — ale brakowało zdania najważniejszego: że ten plik jest generowany skryptem. Przez całą sesję redakcyjną model sumiennie przepisywał do niego każdą poprawkę z rozdziałów. Kilkadziesiąt edycji, wszystkie do pliku, który przy najbliższym buildzie i tak powstaje od zera.

Wychodzi na to, że nieaktualny plik z zasadami jest gorszy niż jego brak. Brak zmusza model do zajrzenia do kodu. Nieaktualny daje mu fałszywą pewność i zdejmuje potrzebę sprawdzania. Zmyślenia modelu wyłapuję bez trudu, bo brzmią podejrzanie. Zdanie napisane moją własną ręką pół roku temu nie brzmi podejrzanie wcale.

Od tamtej pory traktuję ten plik jak kod: ma opisywać stan faktyczny, nie zamiary, i podlega przeglądowi tak samo jak reszta.

Model psuje pliki, kiedy pozwolisz mu na skróty. W trakcie zamiany dywizów na półpauzy model użył jednolinijkowca w perlu zamiast normalnej edycji. Efekt: podwójnie zakodowany UTF-8 w dwóch plikach — pięć linii w każdym, myślnik zamieniony w krzaki. Diagnoza zajęła dwadzieścia minut, naprawa pięć. Wniosek: na prozie nie używa się wyrażeń regularnych po całym pliku. Edytuje się konkretne miejsca, jedno po drugim.

Model przycina z pewnością siebie, której nie ma pokrycia. Przy redakcji model kilka razy zaproponował mi wycięcie akapitu, który wyglądał na powtórzenie, a w rzeczywistości był drugim ogniwem motywu ciągnącego się przez pięć rozdziałów. Za każdym razem brzmiało to przekonująco. Za każdym razem musiałem powiedzieć „nie". Model nie jest artystą. Model nie cierpi, nie marzy, nie lęka się. Model nie czuje tekstu tak, jak czuje go człowiek.

09 · Bilans

Czego AI nie zrobiło

Nie napisało książki.

Napisało kod, wychwyciło kilkaset literówek i brakujących przecinków, sprawdziło bibliografię, wytknęło mi cztery sprzeczności chronologiczne, których sam bym nie zauważył, i raz uratowało mnie przed zdaniem, w którym przypisałem orzeczenie Trybunału Konstytucyjnego partii politycznej. To jest dobry korektor i bardzo słaby autor — przynajmniej dla tego materiału.

I ważne: znam HTML, komputery są moją pasją od dziecka, a ostatnie lata przepracowałem w marketingu cyfrowym. Bez tego zaplecza nie wszedłbym w rolę nadzorcy dla modelu, który regularnie gubi się w niuansach. Trzeba wiedzieć, kiedy powiedzieć „nie" — a żeby wiedzieć, trzeba rozumieć, co się właśnie proponuje.

10 · Zamknięcie

Wszystko na włosku

Cała ta infrastruktura powstała w kilkanaście wieczorów. Książka powstawała latami.

Do samego końca pytanie było jedno: czy skończę pisać. Kocham przelewać myśli w tekst, ale to jest mój debiut — więc sporo lęków, sporo wątpliwości, sporo wieczorów, w których byłem przekonany, że to za mało powie i za słabo uderzy.

Napisałem tę książkę z pasji, o tematach, które mnie palą. A świadomość, że mogę ją wydać sam, z zacisza domowego komputera, bez proszenia kogokolwiek o zgodę — wzmocniła mnie bardziej niż jakiekolwiek narzędzie.

Książka „Jesteśmy z Tytanu" jest darmowa. Czytaj online albo pobierz: jestesmyztytanu.pl

Dalej w tym temacie

To jest wycinek. Całość jest w książce.

„Jesteśmy z Tytanu" — darmowa, bez wydawcy, do przeczytania w dwa wieczory. Czytelnia rośnie obok niej; jeśli chcesz, żeby rosła dalej, możesz wesprzeć projekt.