./blog.sh

./blog.sh — minimalistický blogovací systém

./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:

  • Žádná databáze. Jeden příspěvek je jeden soubor JSON. Záloha je tar, historie je git, odchod je smyčka for.
  • Žádné závislosti. Standardní knihovna Ruby a bash. Žádné gemy, žádné npm, žádný lockfile. Stačí naklonovat a spustit.
  • Žádný systém komentářů. Každý příspěvek se ohlásí na Mastodonu nebo Bluesky; odpovědi na to oznámení jsou komentáře, které tvůj prohlížeč načítá z veřejného API.
Číst dál

Stavba archivu

Steven D. Brewer bloguje od roku 2002: PHPWiki, pak Drupal, pak WordPress. Když Drupal 7 došel na konec životnosti, hledal pro čtyřiadvacet let příspěvků místo, které nebude vyžadovat údržbu, a dal je na blog.sh: archive.bierfaristo.com, kde už jsou příspěvky z Drupalu i feed z Twitteru a kousky starého blogu Esperanto-USA vytažené z Wayback Machine.

Stojí za přečtení, pokud hledáš archiv, který má přežít software, ve kterém vznikl.

#blogsh #archive #drupal

Stránka, kterou cizí člověk otevře první

Sobota, LinuxDays v Praze, stánek přátel z OSCloudu – Mastodon, Pixelfed, PeerTube, Matrix, služby pro lidi, kteří chtějí mít svá data tam, kde na ně vidí. Celý den za jedním stolem a ani jedna přednáška. Tento engine tam byl poprvé naživo: na letáku a v hovoru pokaždé, když se řeč o Fediverse stočila k otázce „a kde bych psal?"

Čtyři pole na jednom A4

Leták je jeden list. Čtyři pole – psaní, stěhování, nasazení, web – a v každém výřez z terminálu a QR kód. Žádný z kódů nevede na stránku vyrobenou pro tu akci. Každý otevírá štítkovou stránku, kterou tento web už měl: /tag/authoring, /tag/migration, /tag/deploy, /tag/appearance. Vlastní archiv webu, seřazený podle toho, na co se u stánku lidé ptají, byl přistávací stránkou. Nic, co by den po akci zastaralo, se pro ni nestavělo.

Číst dál

Kam až to může narůst

Je poctivá otázka, než nástroji svěříš dvacet let psaní: v jakém bodě ho přestane být příjemné používat? Měřeno tady v srpnu, na archivu 6 639 příspěvků, byla upřímná odpověď pokrčení rameny: přidání jednoho příspěvku stálo celý archiv – osmačtyřicet sekund od stisknutí klávesy Enter do chvíle, kdy web běžel – protože každá stránka, která se o příspěvku byť jen zmiňovala, se musela vyrobit znovu, ať se změnila, nebo ne.

To už upřímná odpověď není. Od 1.6 si sestavení vede záznam o tom, co do každé stránky vstoupilo, a znovu vyrábí jen ty, jejichž záznam už nesedí. Archiv pod tím je tentýž, na kterém se to v srpnu měřilo, o sedm příspěvků těžší: teď 6 646, a engine o tři vydání dál, na 1.9.

Na co čekáš dnes

Publikace příspěvku s dnešním datem na tomtéž archivu: šestnáct sekund sestavení, dvě nahrávání – kde bylo osmačtyřicet. Sestavení už nesahá na stránky, které to nepotřebovaly, takže velikost archivu přestala být tím, z čeho se čekání skládalo.

Kde se velikost stále ukazuje

Číst dál

./blog.sh: blogovací engine, kterému stačí terminál

./blog.sh na Root.cz, mými slovy a česky: proč text i obrázky patří na vlastní disk, co je sestavení a kde může výsledek bydlet, jak komentáře jedou po Fediverse a proč dvaadvacet importérů čte export, ne API. A rovnou i to, pro koho engine není: pro víc autorů, pro webovou administraci, pro pluginy.

Číst dál

./blog.sh na LinuxDays 2026

O tomto víkendu, v sobotu 3. a neděli 4. října, proběhnou v Praze na FIT ČVUT v Dejvicích již tradiční LinuxDays 2026. Vstup je volný.

V sobotu budu celý den na stánku mých přátel z OSCloudu. Jestli si chceš o ./blog.sh popovídat, zeptat se, jak to či ono funguje, zjistit, jestli by unesl tvůj blog, nebo mi říct, o co jsi zakopl, je to příležitost probrat to tváří v tvář, a ne v issues na GitHubu.

Nic zásadního si nechystej. Stačí otázka — nebo blog, který se chystáš přestěhovat. Vše ostatní si řekneme na LinuxDays 2026.

Program a jak se tam dostat: linuxdays.cz/2026

#blogsh #LinuxDays

Všechno ostatní v 1.9

Pět příspěvků pokrylo to, o čem 1.9 je: příspěvek ve dvou jazycích, web v jazyce stránky, co leží v cíli nasazení před prvním nasazením, hosting, který umí jen FTP a jednu zkratku v telefonu místo dvou. Tenhle je zbytek, v pořadí, v jakém ho provozovatel potká. Většina z něj přišla od dvou lidí, kteří 1.9 nainstalovali od nuly a upgradovali kopii webu o 6 600 příspěvcích, přesně podle dokumentace.

Číst dál

Jedna zkratka místo dvou

Poslat příspěvek z iPhonu chtělo až do 1.9 dvě zkratky: jednu, která převezme soubory z panelu sdílení, a druhou, která otevře spojení přes SSH. Napsáno ve vlaku prošlo obě. Teď je to jedna zkratka, importovaná místo stavěná, a běží i na Macu.

Číst dál

Hosting, který umí jen FTP

Sdílený hosting často přichází s adresářem, přihlášením přes FTP a ničím dalším – bez SSH, bez rsync, bez gitu. Pro blog.sh to stačilo odjakživa; dokumentace to jen do 1.9 neříkala. Cesta vede přes backend rclone, protože rclone umí FTP jako jeden ze svých mnoha vzdálených cílů.

Číst dál

Před prvním nasazením

Někdo stěhuje blog z WordPressu na blog.sh a nechává si stejný hosting, stejný adresář i stejnou adresu. Sestavení je hotové, první nasazení projde bez jediné chyby – a úvodní stránka je pořád ta stará. Při nahrávání se nic nepokazilo. Starý web jen nikdo neodstranil a hosting mu dává přednost.

Číst dál

Web mluví jazykem stránky

Někdo přeloží své příspěvky, otevře českou polovinu webu – a menu pořád říká Writing, patička Links a na každé pilulce stojí anglický štítek. Příspěvky byly vždycky jen polovina toho, co čtenář čte. Zbytek je to, co web říká sám o sobě, a v 1.9 to má jazyk taky.

Číst dál

Dva jazyky, jeden web

Někdo píše česky a část lidí, kteří by ho četli, česky neumí. Obvyklá odpověď je druhý blog – druhý archiv, druhá sada štítků, druhý feed – a do roka se ty dva rozejdou: příspěvek opravený v jednom a ve druhém ne, štítek přejmenovaný jen na jedné straně, čtenář, který přepne jazyk a ocitne se jinde, než čekal. blog.sh 1.9 odpovídá jinak: jeden web a druhý jazyk vedle něj.

Číst dál

./blog.sh 1.9

./blog.sh 1.9 je venku — vydání na GitHubu.

Vydání o publikování ve více jazycích. Vyjmenuješ je v site.locales a příspěvek si nechá jedno datum, jednu sadu štítků a jednu sérii, s textem pro každý jazyk, který napíšeš přes ./blog.sh translate. Vlastní jazyk webu zůstává v kořeni, každý další dostane svůj a jedno sestavení udělá všechny. Banner, menu, patička i štítky mluví každým jazykem taky; příspěvek, který nikdo nepřeložil, se ukáže i tak a odkáže na jedinou kopii, která existuje. Tenhle web tak běží anglicky a česky už od doby, kdy bylo vydání konceptem.

Kolem toho první hodina: dva lidé nainstalovali 1.9 od nuly a upgradovali kopii webu o 6 600 příspěvcích, přesně podle dokumentace, a všechno, o co zakopli, je opravené. Esc nikdy nic neudělá, instalační průvodce mluví tvým jazykem od první obrazovky a nevezme příklad ze šablony jako jméno tvého webu, vlastnosti konceptu ukážou, kde si ho přečíst — i s QR kódem pro telefon — a doctor --online se teď zeptá cíle nasazení, co mu v kořeni leží navíc.

Číst dál

Co žádné sestavení nevrátí

Notebook doslouží, nebo se server buduje znovu od nuly, a otázka, na které skutečně záleží, je užší, než zní. Ne „jak to zálohovat" – „které z těchto souborů po mně engine opravdu potřebuje chránit, protože nic jiného tady je znovu nevyrobí."

Většina instalace tuto podmínku nesplňuje. Engine sám je git klon; stáhni ho znovu a je to tentýž engine. Všechno, co sestavení zapisuje, se vrátí jedním sestavením, pokud zbylo to ostatní.

Instinkt velí zálohovat samotný web – složku, kterou prohlížeč skutečně vidí. To je přesně ta jediná věc, kterou tento seznam vynechává. public.nosync, vlastní výstup sestavení, je stejně postradatelný jako engine, který ho vytvořil: jedno sestavení ho zopakuje bajt po bajtu, takže držet jeho kopii by znamenalo ukládat tutéž informaci dvakrát pod dvěma jmény a omylem věřit té starší.

Co zbývá, když odložíme engine i web, který sestavuje, je krátký seznam.

Co je skutečně nenahraditelné

Nejdřív samotné příspěvky – jediná položka celého seznamu, kterou žádné sestavení, nový klon ani nové nasazení nevrátí za žádných okolností.

Číst dál