$ ./blog.sh add
Jeden záběr, padesát sedm vteřin, bez komentáře a bez střihů. Telefon se skládací klávesnicí a ./blog.sh běžící přes SSH na obrazovce za ním.
Co sleduješ:
Jeden záběr, padesát sedm vteřin, bez komentáře a bez střihů. Telefon se skládací klávesnicí a ./blog.sh běžící přes SSH na obrazovce za ním.
Co sleduješ:
./blog.sh nepotřebuje žádné gemy. Tady je ta jedna hvězdička u té věty, protože tvrzení bez své výjimky za moc nestojí.
Napřed tvrzení: nula gemů, nula balíčků z npm, žádný Bundler, žádný lockfile, žádná složka node_modules potichu tloustnoucí ve tmě. Ruby 2.7 nebo novější a bash. Naklonuj a běží.
Dva volitelné widgety postranního panelu – Pixelfed a obecné RSS – rozebírají XML pomocí rexml. To je výchozí gem: přichází přibalený s každou normální instalací Ruby, takže pro většinu lidí tvrzení platí, jak je napsáno. Ale některé linuxové distribuce Ruby rozdělují do balíčků a výchozí gemy dávají do samostatného.
Takže: když ty dva widgety zapneš na Ruby z distribučního balíčku a sestavení si stěžuje na rexml, jsi ta hvězdička. Dvě cesty ven – nainstalovat balíček své distribuce, něco jako ruby-rexml, nebo gem install rexml. Tak či tak je to jeden balíček, jednou, a jen když ty widgety vůbec používáš.
To je celá funkce: nasazení předpokládá, že velká změna je chyba, dokud neřekneš jinak.
Každé nasazení si vede manifest – SHA-256, velikost a mtime každého nahraného souboru. Další nasazení se proti němu porovná a sáhne jen na to, co se skutečně změnilo. Rychlé, nudné, správné.
Zajímavá část je to, co se stane, než se cokoli nahraje. Když počet souborů od posledního nasazení klesl o víc než 20 %, celé se to zastaví. Tohle je skutečný výstup z tohoto webu – na minutu jsem odstavil polovinu složek sestavení z dohledu a požádal o nasazení:
Čtení příspěvku: 0,005 $ za zdroj. Vytvoření příspěvku: 0,015 $ za požadavek – 0,200 $, když nese URL. Bezplatný veřejný přístup ke čtení: žádný.— ceník X API pay-per-use, docs.x.com, ověřeno v červenci 2026
Dvě sítě jsou v. Dvě nejsou – a tady je celá úvaha, protože „rozhodli jsme se proti" není důvod.
./blog.sh oznamuje každý publikovaný příspěvek na Mastodonu nebo Bluesky a odpovědi na to oznámení se stávají komentáři příspěvku. Aby to fungovalo, potřebuje engine od sítě dvě věci: způsob, jak přispět, a způsob, jak prohlížeč přečte veřejné vlákno. Levně, ideálně zdarma, navždy – protože osobní blog je projekt na desítky let s rozpočtem koníčku.
Podívej se na ten ceník znovu. Oznámit příspěvek s odkazem stojí skutečné peníze. Načíst vlákno odpovědí – což se děje pokaždé, když kdokoli sroluje ke komentářům – stojí skutečné peníze, za každé čtení, navždy. Na osobním blogu je to předplatné vlastní sekce komentářů, účtované podle zvědavosti tvých čtenářů.
Na cenové rozhodnutí neexistuje inženýrská odpověď. Takže: ne.
Seznam funkcí ti řekne, čím nástroj chce být. Tohle je ten druhý seznam.
$EDITOR sis konfiguroval léta; nebudu s ním soupeřit v textareaNezaškrtnutá políčka, jak je vykreslují vlastní seznamy úkolů enginu. Tak už zůstanou.
Jediný způsob, jak přispět do ./blog.sh bez napsání jediného řádku Ruby, je přeložit ho – a je to jeden soubor YAML.
Všechno, co čtenář vidí – navigace, data, nadpisy archivu, pole hledání, výzva ke komentářům – pochází ze souboru lokalizace. Celý návod bydlí tady:
docs/localization.md – přidání jazyka do ./blog.sh
Tři věci to dělají opravdu snadným:
en.yml, přejmenuješ ho, přeložíš hodnoty. Žádné šablony se nedotkneš, žádné Ruby nečteš.en.yml. Ten tvůj může růst tempem, jaké ti dovolí víkendy.Angličtina, čeština a němčina už jsou v. Ten tvůj by byl čtvrtý.
Počítadla hvězdiček, boostů a odpovědí hned pod titulkem tohoto příspěvku patří tootu, ne tomuto webu. A komentáře na konci této stránky jsou odpovědi na ten toot. To je celý systém – tady je, jak funguje.
Když je příspěvek publikován, engine ho oznámí na Mastodonu nebo Bluesky – jedna síť na web, nikdy obě; sestavení odmítne konfiguraci se dvěma, protože komentáře bydlí přesně na jednom místě. Odpovědi na to oznámení jsou komentáře: tvůj prohlížeč načte vlákno rovnou z veřejného API sítě, bez přihlášení, bez klíče, bez prostředníka. Počítadla pod titulkem jsou táž čísla, přečtená z téhož tootu.
Žádná databáze komentářů – nic k migraci, k zálohování ani k moderování ve dvě ráno. Žádný filtr spamu, protože síť už jeden má a je lépe financovaný než ten můj. Počet komentářů je prostě počet odpovědí. A moderace je moderace tvé instance: blokování, ztlumení a nahlášení fungují přesně tam, kde se rozhovor skutečně děje.
Tady jsou tři řádky Markdownu a tady je, jak vypadá soubor na disku poté, co je uložíš.
Co napíšeš:
Příspěvky jsou **soubory**. Sestavení je cyklus přes složku.
Žádný třetí krok není.
Co dopadne na disk, jeden soubor JSON na příspěvek:
Tohle není univerzální engine a předstírat opak by ti promarnilo odpoledne.
./blog.sh vznikl kolem přesně jednoho nasazení: jeden autor, jeden archiv, terminál a komentáře na Fediverse. To je obvykle část, kterou projekt schovává na stránce „o nás". Radši s tím začnu, protože je to zároveň vysvětlení všeho vyhraněného na tomto nástroji. Univerzální generátor vyřeší obecný případ a pak nechá tebe nakonfigurovat si cestu zpět k tomu tvému konkrétnímu. Tenhle engine u konkrétního případu začal a nikdy ho neopustil.
Takže tady je poctivá tabulka:
| ./blog.sh | Hugo | Jekyll | Ghost | WordPress | |
|---|---|---|---|---|---|
| Databáze | žádná | žádná | žádná | nutná | nutná |
| Závislosti | Ruby stdlib* | jedna binárka | ekosystém gemů | Node + MySQL | PHP + MySQL |
| Komentáře | Fediverse, vestavěné | vlastní | vlastní | nativní + členové | nativní + pluginy |
| Nasazení | 6 backendů, s pojistkami | vlastní | vlastní | je to server | je to server |
| Více autorů | ne | ano | ano | ano | ano |
| Pluginy / ekosystém | ne, záměrně | obrovský | obrovský | dobrý | nepřekonatelný |
| Velikost komunity | obyvatel: 1 | ohromná | velká | velká | třetina webu |
| Sestavení 10 000 příspěvků | pomalejší | vteřiny, vyhrává snadno | pomalé | – | – |
| Newsletter | ne | ne | ne | ano, nativní | přes pluginy |
./blog.sh je blogovací systém, který se spouští z terminálu. Příspěvky jsou soubory, web je výsledek sestavení a komentáře žijí na Fediversu — v celé té větě nikde není databáze.
Tři věci ho odlišují od ostatních pěti set generátorů statických stránek:
tar, historie je git, odchod je smyčka for.