<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  
  <title>Štěpán&#39;s Blog [CS/EN]</title>
  <subtitle>English and czech posts from my blog</subtitle>
  <link href="https://stepanzak.cc/all.xml" rel="self" />
  <link href="https://stepanzak.cc/" />
  <updated>2026-07-22T22:00:00Z</updated>
  <id>https://stepanzak.cc/</id>
  <author>
    <name>Štěpán Žák</name>
  </author>
  <entry>
    <title>ZSH startup command</title>
    <link href="https://stepanzak.cc/blog/zsh-startup-command/" />
    <updated>2026-07-22T22:00:00Z</updated>
    <id>https://stepanzak.cc/blog/zsh-startup-command/</id>
    <content type="html">&lt;p&gt;This is a quick tutorial on how to launch ZSH with a command already running, and drop to shell once it exits.&lt;/p&gt;
&lt;p&gt;It can be any command, but I&#39;m gonna use &lt;code&gt;yazi&lt;/code&gt; - a terminal file manager - as an example.&lt;/p&gt;
&lt;p&gt;The classic way would be &lt;code&gt;zsh -c &amp;quot;yazi&amp;quot;&lt;/code&gt;. This works, but the problem is that when you quit yazi, ZSH terminates. I want to drop to ZSH after I quit.&lt;/p&gt;
&lt;p&gt;Another issue is that the command cannot be an alias. I have an &lt;code&gt;yy&lt;/code&gt; alias for yazi. When I run &lt;code&gt;yy&lt;/code&gt;, navigate to some directory, and then quit, ZSH changes directory to that one. This can&#39;t be done without an alias.&lt;/p&gt;
&lt;p&gt;More promising method is this one:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--nozle&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;yazi; setopt zle&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It should drop to shell, and you could even use the &lt;code&gt;yy&lt;/code&gt; alias.&lt;/p&gt;
&lt;p&gt;This solution doesn&#39;t work for me though, giving me &lt;code&gt;stty&lt;/code&gt; errors.
After some debugging, I figured out it&#39;s caused by my prompt - OhMyPosh.&lt;/p&gt;
&lt;p&gt;I would like a solution independent on whatever is in my &lt;code&gt;.zshrc&lt;/code&gt; - be it prompt or whatever else.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;To the final solution then...&lt;/p&gt;
&lt;p&gt;Add this to the end of your &lt;code&gt;.zshrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; ZSH_RUN_TMP
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ZSH_RUN_TMP&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ZSH_RUN&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; ZSH_RUN
&lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$ZSH_RUN_TMP&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can then launch ZSH with your new &lt;code&gt;ZSH_RUN&lt;/code&gt; env:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ZSH_RUN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yy&quot;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It works great. &lt;code&gt;yy&lt;/code&gt; is an alias, and changing directory as described above works as well.&lt;/p&gt;
&lt;p&gt;The second &lt;code&gt;ZSH_RUN_TMP&lt;/code&gt; variable fuckery is there so new shells launched from this one don&#39;t inherit your &lt;code&gt;ZSH_RUN&lt;/code&gt;. Otherwise if you ran&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ZSH_RUN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;nvim&quot;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and then opened a new terminal from &lt;strong&gt;inside&lt;/strong&gt; neovim, it would open a nested neovim session. Yikes.&lt;/p&gt;
&lt;h2&gt;Real use case&lt;/h2&gt;
&lt;p&gt;I use &lt;code&gt;foot&lt;/code&gt; as my terminal emulator. Foot can launch any shell or command like this:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;foot &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# or&lt;/span&gt;
foot &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# or&lt;/span&gt;
foot yazi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Well, now I have a keybind to execute this command:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;ZSH_RUN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yy&quot;&lt;/span&gt; foot &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It opens foot with yazi running, but I can exit yazi in any directory and drop to ZSH in it.&lt;/p&gt;
&lt;h2&gt;Source&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://superuser.com/questions/91881/invoke-zsh-having-it-run-a-command-and-then-enter-interactive-mode-instead-of&quot;&gt;https://superuser.com/questions/91881/invoke-zsh-having-it-run-a-command-and-then-enter-interactive-mode-instead-of&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Namely &lt;a href=&quot;https://superuser.com/a/790681&quot;&gt;this comment&lt;/a&gt;, but improved.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Danuše Nerudová je ještě horší</title>
    <link href="https://stepanzak.cc/blog/danuse-nerudova-je-jeste-horsi/" />
    <updated>2026-07-04T22:00:00Z</updated>
    <id>https://stepanzak.cc/blog/danuse-nerudova-je-jeste-horsi/</id>
    <content type="html">&lt;p&gt;Druhého července vyšel na deníku Alarm tento komentář:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://denikalarm.cz/2026/07/lidska-dustojnost-vymenou-za-lajky-jak-nerudova-pise-o-afghankach-zatimco-hlasuje-pro-snazsi-deportace/&quot;&gt;&lt;em&gt;Lidská důstojnost výměnou za lajky. Jak Nerudová píše o Afghánkách, zatímco hlasuje pro snazší deportace&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/smassalema/&quot; title=&quot;@smassalema na instagramu&quot;&gt;Sufian Massalema&lt;/a&gt; v něm kritizuje pokrytecký a koloniální performativní feminismus Danuše Nerudové, europoslankyně za STAN.&lt;/p&gt;
&lt;p&gt;Jsem rád, že o chování této političky někdo píše.
Některé informace mi v komentáři chybí, a proto jsem se je rozhodl napsat sem. Je to tedy takové doplnění, a doporučuji si nejdříve přečíst článek na Alarmu.&lt;/p&gt;
&lt;h2&gt;Lhaní o vraždě 120 dětí&lt;/h2&gt;
&lt;p&gt;28. února &lt;a href=&quot;https://en.wikipedia.org/wiki/2026_Minab_school_attack&quot;&gt;zasáhla&lt;/a&gt; základní školu v Íránském Minábu armáda USA přesně naváděnou raketou, a vzápětí alespoň jednou další. V rámci ilegální války rozpoutané Izraelem a Spojenými státy tak během chvilky přišlo o život 156 nevinných lidí, z toho 120 dětí.&lt;/p&gt;
&lt;p&gt;O tři dny později naše královna liberálního feminismu &lt;a href=&quot;https://www.instagram.com/p/DVaytiuiAPM/?hl=en&amp;amp;img_index=1&quot;&gt;zveřejnila&lt;/a&gt; na Instagramu příspěvek, v němž oslavuje fakt, že na Írán útočí v kokpitech stíhaček i ženy.&lt;/p&gt;
&lt;p&gt;V Izraeli se na ně samozřejmě vztahuje i trest vězení za odmítnutí služby v &amp;quot;nejmorálnější armádě světa&amp;quot;. Vskutku feministický ráj...&lt;/p&gt;
&lt;p&gt;V textu na Alarmu se ohledně zmíněného příspěvku píše toto:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Uveďme, že při posledním konfliktu mezi Íránem, USA a Izraelem bylo spojeneckými údery zavražděno na 1 700 íránských civilistů, včetně 120 íránských žaček při útoku na dívčí školu v Minábu, ke kterému došlo tři dny před zmíněným příspěvkem. &lt;strong&gt;O jejich osudu se ale z profilu Nerudové nic nedozvíme.&lt;/strong&gt; Jde o selektivní soucit nesouvisející s tím, zda dané ženy a dívky skutečně trpí, nebo ne. Jeho podmínkou je vizuální podobnost – ať už barvou kůže, oblékáním, vírou nebo zvyky.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Skutečnost je ale bohužel o něco nechutnější. Danuše Nerudová totiž hned několik komentujících osočila ze sdílení &lt;em&gt;dezinfa&lt;/em&gt; potom, co poukázali na nevkusnot její adorace členek zodpovědných armád.&lt;/p&gt;
&lt;p&gt;Tato &lt;em&gt;dezinformace&lt;/em&gt; spočívá v tom, že podle Nerudové za útokem na onu základní školu ve skutečnosti stály Íránské revoluční gardy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783200613/nerudova_dezinfo2.jpg&quot; alt=&quot;Instagram komentář od @adam_hadraba:
Opravdu obhajujete ILEGÁLNÍ VÁLKU?
Historicky USA zahajuje války na blízkém
východě jako taktiku odvádění pozornosti
od domácích problémů a nikdy nepřinesly
žádné straně dobro. V sedmdesátých letech
to byl Vietnam, později Afgánistán, Sýrie,
Irak a teď Irán. Afganistan náš měl
přesvědčit o tom, že USA vůbec nejde o
výhru, ale jenom kalí vodu. Nemůže jim
přece jít o iranské ženy, když jeden z prvních
útoků byl na DÍVČÍ ŠKOLU🤡 Měl jsem k vám
respekt, ale tímhle jste ho u mě ztratila,
myslel jsem, že jste lepší💔
Odpověd od @danusenerudova (Author příspěvku):
@adam_hadraba Sdilite tu dezinfo. To
byl útok islámských gard. Nikoliv Izraele nebo USA.&quot; height=&quot;320&quot;&gt;
&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783200613/nerudova_dezinfo1.png&quot; alt=&quot;@nejaka paja:
A proto israHell a USA střílí po ženských
školách, aby osvobodili íránské ženy?
@danusenerudova:
@nejaka_paja Sdilite ti dezinfo. Byl to
útok islámských gard, nikoliv Israele
nebo USA.&quot; height=&quot;200&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Věřím v poctivost, dobře odvedenou práci a pravdomluvnost.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;https://www.danusenerudova.cz/o-mne/&quot;&gt;Nerudová na svém webu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lživé komentáře napsala poměrně krátce po tragédii, kdy ještě nebylo dostupných tolik informací, i když trocha vyhledávání by ji už v té chvíli mohla přimět s vyjádřením minimálně chvíli počkat.&lt;/p&gt;
&lt;p&gt;Mnohem ostudnější je ovšem fakt, že po několika měsících a nespočtu komentářů žádajících omluvu se europoslankyně a &lt;a href=&quot;https://www.europarl.europa.eu/meps/cs/256847/DANUSE_NERUDOVA/home&quot;&gt;členka Delegace pro vztahy s Íránem&lt;/a&gt; nejenom neomluvila, ale ani se neobtěžovala své dezinformační komentáře smazat. Zároveň ale i po několika týdnech stále lajkovala nové komentáře které ji podporovaly - je tedy jasné, že upozornění na svůj omyl musela zaznamenat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/DVaytiuiAPM?comment_id=18128373637544210&quot;&gt;Odkaz na komentář z druhého snímku obrazovky&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;warning&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-alert-triangle&quot;&gt;&lt;path d=&quot;m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 9v4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 17h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Upozornění&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;V prohlížeči odkaz otevře pouze instagramový příspěvek.
Pro zobrazení konkrétního komentáře musí být otevřen v mobilní aplikaci Instagramu.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Je poměrně fascinující, jak dokáže podobný druh propagandy hezky popsat, když se odehrává v konextu ruské invaze na Ukrajinu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;...a najednou ti normální lidi, kteří si to čtou, začínají vlastně pochybovat o tom,
jestli to chápou správně, jestli ten jejich názor je jakoby OK,
když je tam někdo, který vlastně tvrdí,
&lt;strong&gt;že přece ta Ukrajina střílí ty rakety na to Rusko&lt;/strong&gt;.
Pokud vlastně někdo na to rezignuje a nemoderuje ten
obsah na těch sociálních sítích, tak se mu vlastně stane to,
že jednak přispívá k tvorbě toho narativu,
a k tomu, že ti lidé to začínají považovat za mainstreamovej názor.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;https://youtu.be/xEbzs6dtM5Y?t=267&quot;&gt;Nerudová v rozhovoru s Petrem Ludwigem v čase 4:27&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rozdíl je možná ten, že tvrzení že &lt;em&gt;Írán střílí rakety na Írán&lt;/em&gt; je poněkud absurdnější.&lt;/p&gt;
&lt;p&gt;Asi není překvapivé, že &lt;em&gt;šokující&lt;/em&gt; odhalení skutečného viníka masakru její názory na tuto či jiné agrese USA ani Izraele nezměnilo.&lt;/p&gt;
&lt;h2&gt;Komentářové sekce&lt;/h2&gt;
&lt;p&gt;Článek z Alarmu Danuši Nerudovou obviňuje z toho, že její boj za rovnost je jen performativní:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;... Dokazuje tím, že když přijde na lámání chleba, nedokáže se postavit za nic, k čemu se ve veřejné debatě tak intenzivně hlásí, a její boj za rovné postavení zpravidla končí u přidávání fotek ze Shutterstocku na instagramový feed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Co mi v textu chybí je fakt, že Nerudová nejenže ve skutečnosti nebojuje proti nenávisti, ale sama ji přímo toleruje a podporuje. To potom především rasismem a islamofobií, která je v přímém rozporu s deklarovanou starostí o afghánské či jiné muslimské ženy, o jejichž kultuře si zřejmě myslí, že se &lt;em&gt;rozšiřuje jako mor&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;V předposlední citaci paní Nerudová mluví o důležitosti moderace na sociálních sítích.
Škoda, že tuto myšlenku ani v nejmenším neuvádí do praxe. Konkrétně komentářové sekce jejích příspěvků souvisejících s islámem jsou rasismem přímo zamořené.&lt;/p&gt;
&lt;p&gt;Komentáře si však zjevně pečlivě čte. Často odpovídá i na ty přidané dlouho po zveřejnění příspěvku, nebo rozdává srdíčka v diskuzích pod komentáři čítajících desítky odpovědí. A jaké komentáře že to lajkuje?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783200613/nerudova_rasistka.png&quot; alt=&quot;@marektorcik:
Dobrý den, @danusenerudova, a proto jste
hlasovala s krajní pravicí pro zákon, který
efektivně mmj. ženám, které jste tu využila
pro PR, ale také dětem a celým rodinám ztíží
útěk právě z oblastí, kde nemají práva nebo
tam jsou v nebezpečí? Nebo jak tomu
rozumět?
@janbenesjb:
@marektorcik Hlasovala proto, aby se
tahle kultura v Evropě nerozširovala jako
mor, tak jako je tomu v západní Evropě. Lajknuto Danuší Nerudovou.&quot; width=&quot;400&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783208588/IMG_20260705_014036.jpg&quot; alt=&quot;@umyvadlo90:
Tohle je reálný islam👏 Není úžasné, že
mnoho takto smýšlejících můžeme potkat už
hned za hranicemi 👌 (lajknuto Danuší Nerudovou.)&quot; width=&quot;450&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jestli omezování práv žen je ten &lt;em&gt;reálný&lt;/em&gt; islám, jsou také zákazy potratů &lt;em&gt;reálné&lt;/em&gt; křesťanství? Otázka pro paní členku evropské frakce Křeťanských demokratů...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783208588/IMG_20260705_014128.jpg&quot; alt=&quot;@tomas.kaj:
Vy jste je zatim podporila oslavou vra zdeni
deti. Ze se nestydite!
@ondrej.trojan:
@Btomas.kaj ? 😂😂 (lajknuto Danuší Nerudovou.)
@tomas.kaj:
@gondrej.trojan podivejte se na jeji post,
kde oslavuje ze zeny vybombardovali
divci zakladku. A jeste pak siri dezinfo.
Fakt odporne. Tehle osobe nejde o
prava zen
@petrbacik:
@tomas.kaj nemyslím si že by to někdo
oslavoval 😳 jak taková oslava podle vás
vypadá u lidí ze střední Evropy? když
nám je líto zabít i mouchu? (lajknuto Danuší Nerudovou.)&quot; width=&quot;450&quot;&gt;&lt;/p&gt;
&lt;p&gt;Tady už víme, že Danuše Nerudová musela přesně vědět o čem @tomas.kaj mluví. Raději se ale rozhodla lajkovat nechápavé komentáře.&lt;/p&gt;
&lt;h2&gt;Proč řešit zrovna ji&lt;/h2&gt;
&lt;p&gt;Vyvstává otázka, proč během současného vzestupu fašismu doma i v zahraničí řešit nějakou rasistickou liberální demokratku, jejíž názory a činy jsou stále jen zlomek toho co předvádí naše současná vláda nebo některé jiné opoziční strany.&lt;/p&gt;
&lt;p&gt;Pro mě osobně je Nerudová důležitá, protože v mém okolí je vnímána jako inteligentní zástupkyně rozumu, progresivních a lidských hodnot. To samé platí pro celé hnutí STAN, o kterém by se hodilo napsat celý další text.&lt;/p&gt;
&lt;p&gt;Mezitím je ale tak zaneprázděná papouškováním krajní pravice, že když se před třemi týdny skupina senátorů &lt;a href=&quot;https://denikalarm.cz/2026/06/o-zmene-pohlavi-by-rozhodoval-soud-senatori-predkladaji-transfobni-novelu-debatu-s-odborniky-odmitli/&quot;&gt;pokusila&lt;/a&gt; prosadit novelu zákona drasticky omezující práva trans lidí, Nerudové to nestálo ani za zmínku.
Kromě senátorů za ODS, TOP 09 a KDU-ČSL se přitom za návrh &lt;a href=&quot;https://www.idnes.cz/zpravy/domaci/navrh-zakona-zmena-pohlavi-tranzice-ludkova-senat.A260617_172929_domaci_tty&quot;&gt;hlasitě zasazoval&lt;/a&gt; také &lt;a href=&quot;https://cs.wikipedia.org/wiki/Michael_Canov&quot;&gt;Michael Canov&lt;/a&gt; - první místopředseda hnutí Starostové pro Liberecký kraj, který byl do senátu zvolen &lt;a href=&quot;https://web.archive.org/web/20160220103542/http://www.starostove-nezavisli.cz/info-a-media/tiskove-zpravy-3/stan-do-senatu-budou-kandidovat-starostove-fiser-z-tabora-a-canov-z-chrastavy.html&quot;&gt;s podporou hnutí STAN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Na jejím Instagramu a Twitteru ve stejné době místo toho nalezneme kritiku vlády nebo odvážné prohlášení, že &lt;em&gt;&amp;quot;Nosit stejné oblečení pořád dokola není ostuda&amp;quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Její boj za lidská práva je tak zjevně omezen pouze na ta práva, která chtějí omezovat její političní oponenti.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783208588/IMG_20260705_014110.jpg&quot; alt=&quot;@danusenerudova:
@tomasbuzalka Dobrý den, ja ma
porušování lidských práv budu
upozorňovat vždy, kdekoliv jsou
porušována. To je totiž to, co nás dělá
lidmi.&quot; width=&quot;500&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Závěr&lt;/h2&gt;
&lt;p&gt;Danuše Nerudová není proti ultrapravicové propagandě imunní o nic víc než kdokoli z nás. Její &lt;a href=&quot;https://www.novinky.cz/clanek/internet-a-pc-proti-plosnemu-smirovani-jsou-uz-jen-ctyri-staty-chat-control-vetsina-eu-vita-40552343&quot;&gt;lobotomické argumentování&lt;/a&gt; podpory masového špehování občanů EU ukazuje, že je schopná ovlivnit životy stovek milionů lidí, aniž by vůbec chápala, o čem hlasuje.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783267842/ac7c045f-4630-4b9f-8665-88af28d05f5c.png&quot; alt=&quot;@danusenerudova on Twitter
Replying to @FilipVI_
As Face ID pro iphone jste ok? A s bank ID? Toje taky špehování? Máte opravdu
velmi laciné argumenty.
3:32 PM + Nov 27, 2025 - 219.4K Views&quot; width=&quot;500&quot;&gt;&lt;/p&gt;
&lt;p&gt;Můžeme se tedy divit, že uvěří lžím genocidního Izraele, nebo neustále omýlaným narativům evropských fašistů?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Revoluce bude queer a feministická. Ale vkládání nadějí do Danuše Nerudové a jí podobných nás k ní ani nepřiblíží.&lt;/p&gt;
&lt;p&gt;Děkuji za přečtení, a budu rád pokud se o své názory podělíte v komenáři pod článkem.&lt;/p&gt;
&lt;h2&gt;Bonus&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1783208588/IMG_20260705_014053.jpg&quot; alt=&quot;@pepa.palicka:
Prosím ať ČR udělá expedici do Afghánistánu
které povedou naše krásné,vzdělané a
chytré ženy. Musíme naučit Afghánistán že
naše demokracie a naše vnímání práva žen je
to NEJLEPŠÍ co je může potkat. Popřípadě se
můžeme domluvit s Afganci ať nám pošle své
muže aby se u nás naučili toleranci. Musí si
uvědomit že u nás netolerance nebude
tolerována. AŤ ŽIJÍ ŽENY! ✌️♥️🫶🇨🇿🏳‍🌈🏳‍⚧ (lajknuto Danuší Nerudovou.)&quot;&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How I build a website for Frank</title>
    <link href="https://stepanzak.cc/blog/frantuv-web/" />
    <updated>2026-06-21T22:00:00Z</updated>
    <id>https://stepanzak.cc/blog/frantuv-web/</id>
    <content type="html">&lt;p&gt;My friend &lt;a href=&quot;https://instagram.com/franklys.t&quot;&gt;Frank&lt;/a&gt; is a digital artist. He uses Blender to create renders and animations, and they are pretty fucking cool.&lt;/p&gt;
&lt;p&gt;When I saw one of his instagram posts, I wanted to see all of the stuff he created so far.
I clicked on his profile, just to find out the only place I can see it all besides instagram is &lt;strong&gt;Pinterest&lt;/strong&gt;. &lt;span class=&quot;_shaking-text&quot;&gt;The horror!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1771094695/pinterest_login_page.jpg&quot; alt=&quot;Phone screenshot of Pinterest forcing me to log in to view content&quot; title=&quot;holy enshittification&quot; width=&quot;150&quot;&gt;&lt;/p&gt;
&lt;p&gt;And I thought websites were invented to be viewed. Smh my head 🙄&lt;/p&gt;
&lt;p&gt;Well, this is why I, the great friend I am, decided to make him a &lt;strong&gt;real&lt;/strong&gt; website. And hoping he won&#39;t refuse this unsolicited gift of mine, I started building.&lt;/p&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;note&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-pencil&quot;&gt;&lt;path d=&quot;M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m15 5 4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Note&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;Technical details follow. &lt;a href=&quot;https://stepanzak.cc/blog/frantuv-web/#final-result&quot;&gt;Skip to the final result&lt;/a&gt; if you don&#39;t care.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;How I did it&lt;/h2&gt;
&lt;p&gt;I used the &lt;a href=&quot;https://www.11ty.dev&quot;&gt;Eleventy&lt;/a&gt; static site generator, as that&#39;s also what &lt;a href=&quot;https://stepanzak.cc/colophon&quot;&gt;powers this website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you have no idea what a static site generator is, you should probably skip this part.&lt;/p&gt;
&lt;h3&gt;The landing page&lt;/h3&gt;
&lt;p&gt;I didn&#39;t want anything special. Just a nice view of all the artworks. Basically Pinterest without all the Pinterest bullshit.&lt;/p&gt;
&lt;p&gt;First, I needed to add Frank&#39;s art. I could do it in many ways, but I wanted it to be relatively easy so he can do it himself when he creates something new. Luckily, Frank is friends with computers. He even uses EndeavourOS Linux (Arch, btw).&lt;/p&gt;
&lt;p&gt;I decided to use &lt;a href=&quot;https://cloudinary.com&quot;&gt;Cloudinary&lt;/a&gt; CDN to host the images and videos.&lt;/p&gt;
&lt;p&gt;I created a new file &lt;code&gt;content/_data/art-pieces.json&lt;/code&gt;. It looks like this:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Terry the Terrier&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2025-11-07&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;desc&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Render of my animatronic Terry. My gf picked this name&quot;&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;alt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Animatronic Render&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;cloudinaryId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;animatronic6_u2yxwe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;736&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1308&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding a new art goes like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upload it to Cloudinary&lt;/li&gt;
&lt;li&gt;Copy it&#39;s ID from cloudinary&lt;/li&gt;
&lt;li&gt;Create a new object in the json file&lt;/li&gt;
&lt;li&gt;Set cloudinaryId to the ID&lt;/li&gt;
&lt;li&gt;Set title, date, desc, type (image|video) and alt text&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;add-dimensions.js&lt;/code&gt; script to automatically add width and height.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Data from any json file inside the &lt;code&gt;_data/&lt;/code&gt; directory is accesible in all templates thanks to Eleventy.&lt;/p&gt;
&lt;p&gt;I used the &lt;a href=&quot;https://masonry.desandro.com/&quot;&gt;Masonry Layout library&lt;/a&gt; to implement a similar column layout as Pinterest does. The Masonry layout is &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Grid_layout/Masonry_layout&quot;&gt;coming to CSS natively&lt;/a&gt;, but is not yet supported by any major browser.&lt;/p&gt;
&lt;p&gt;Adding all the images from the json file was pretty trivial afterwards:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;image-grid&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; piece &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; art&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;pieces &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;grid-piece&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; cloudinaryImg piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cloudinaryId &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;alt&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;230&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;grid-piece__title&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(OK the real code is actually much more complex but this is how it works.)&lt;/p&gt;
&lt;p&gt;As you can see, our json data are accesible in the &lt;code&gt;art-pieces&lt;/code&gt; object. &lt;code&gt;cloudinaryImg&lt;/code&gt; is an ELeventy shortcode that takes the Cloudinary ID and returns an URL to the file.&lt;/p&gt;
&lt;p&gt;What immediately bugged me was the layout changes. My internet speed is quite bad, and every time one of the images finally loaded, the whole layout shifted.&lt;/p&gt;
&lt;p&gt;To solve that, the browser needs to know the dimensions of the images and videos when the library assembles them into the masonry layout - that is right after the page is loaded.
Easiest way to do so is just to add &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; keys inside &lt;code&gt;art-pieces.json&lt;/code&gt;.
Doing it manually would be really annoying though, so I wrote a small (78 lines) script that fetches the resources from Cloudinary and adds the dimensions automatically.&lt;/p&gt;
&lt;p&gt;I then added some more things like video duration and autoplay on mouse hover.&lt;/p&gt;
&lt;p&gt;Every art piece got wrapped in&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/art/&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;slug&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which creates a valid url from it&#39;s title.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1782415726/main-page-frantuvweb.png&quot; alt=&quot;Pinterest-like grid of various pictures and videos with titles&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next step was creating a page for each art piece.&lt;/p&gt;
&lt;h3&gt;Individual art pages&lt;/h3&gt;
&lt;p&gt;Eleventy has this awesome feature called &lt;a href=&quot;https://www.11ty.dev/docs/pagination/&quot;&gt;Pagination&lt;/a&gt;.
That was the hardest part to wrap my head around, but I eventually did.&lt;/p&gt;
&lt;p&gt;I&#39;ll show you how it works.&lt;/p&gt;
&lt;p&gt;Frontmatter in &lt;code&gt;art-piece.liqid&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;art-pieces&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;piece&quot;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/art/{{ piece.title | slug }}/&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This iterates over &lt;code&gt;art-pieces&lt;/code&gt;, and for each key it applies this template.
You can see that the value of &lt;code&gt;permalink&lt;/code&gt; key is actually also a template.
Due to that, the pagination creates a different page for each key.
And the permalink is created the same way as the links on the main page are.&lt;/p&gt;
&lt;p&gt;Inside this paginated template, I can then use the &lt;code&gt;piece&lt;/code&gt; object that refers to the current art piece form &lt;code&gt;art-pieces.json&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;art-section&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; cloudinaryImg piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cloudinaryId &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt;piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;alt&lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;info-section&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token object&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; piece&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;desc &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;div class=&quot;callout&quot; data-callout=&quot;note&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
&lt;div class=&quot;callout-title-icon&quot;&gt;
&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-pencil&quot;&gt;&lt;path d=&quot;M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m15 5 4 4&quot;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-title-inner&quot;&gt;Note&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;This is, again, heavily simplified to be easier to understand.
For example, there&#39;s no handling of videos in this example.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Another nice thing about Eleventy pagination is that you get &lt;em&gt;previous&lt;/em&gt; and &lt;em&gt;next&lt;/em&gt; links for free:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; pagination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;previous &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; pagination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;previous &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; pagination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;next &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; pagination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;next &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Art piece pages ended up looking like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1782415885/frantuvweb-singleview.png&quot; alt=&quot;Video with title, date, description and Previous/Next buttons&quot; width=&quot;250&quot;&gt;&lt;/p&gt;
&lt;p&gt;Since it&#39;s a static website, comments have to be added using some third-party service.
I decided to leave that on Frank.&lt;/p&gt;
&lt;p&gt;I polished the website, added styles, meta tags, 404 page, and other uninteresting stuff.&lt;/p&gt;
&lt;h3&gt;Deployment&lt;/h3&gt;
&lt;p&gt;While I hate GitHub and use it only when really necessary, I still decided to go with it.&lt;/p&gt;
&lt;p&gt;Firstly, it&#39;s super easy to enable static site hosting on any repo, which then gets it&#39;s own &lt;code&gt;.github.io&lt;/code&gt; domain. GitHub actions can build the Eleventy website on each commit.&lt;/p&gt;
&lt;p&gt;Secondly, Frank can edit the json file directly from the web interface, and he&#39;s already familiar with GitHub.&lt;/p&gt;
&lt;p&gt;He doesn&#39;t have to care about the underlying technology at all. He uploads his art to Cloudinary, adds it into the json file from his browser without ever touching git, and the website magically updates.&lt;/p&gt;
&lt;p&gt;If you want to look at the source code, the whole repo is &lt;a href=&quot;https://github.com/franklyst/frankweb&quot;&gt;here&lt;/a&gt;. Leave a star while you&#39;re at it ;)&lt;/p&gt;
&lt;h2&gt;Final result&lt;/h2&gt;
&lt;p&gt;👉👉👉&lt;strong&gt;Visit the website &lt;a href=&quot;https://franklyst.github.io/frankweb/&quot;&gt;HERE&lt;/a&gt;!&lt;/strong&gt; 👈👈👈&lt;/p&gt;
&lt;p&gt;Or, if you are &lt;em&gt;really&lt;/em&gt; lazy, here&#39;s an embedded iframe:&lt;/p&gt;
&lt;iframe src=&quot;https://franklyst.github.io/frankweb/&quot; width=&quot;100%&quot; height=&quot;1000&quot; style=&quot;zoom: 0.6&quot; loading=&quot;lazy&quot;&gt;
&lt;/iframe&gt;</content>
  </entry>
  <entry>
    <title>Všechny .cz domény s jedním znakem</title>
    <link href="https://stepanzak.cc/blog/vsechny-jednoznake-cz-domeny/" />
    <updated>2026-04-15T22:00:00Z</updated>
    <id>https://stepanzak.cc/blog/vsechny-jednoznake-cz-domeny/</id>
    <content type="html">&lt;p&gt;Správce .cz domény &lt;a href=&quot;https://nic.cz&quot;&gt;CZ.NIC&lt;/a&gt; nepovoluje unicode znaky v názvech domén.
To znamená, že může existovat jen několik málo domén, které mají pouze jeden znak.
Jsou to písmena a-z a čísla 0-9. 36 domén. Samotná pomlčka totiž není povolená.
Nepřekvapivě jsou všechny zaregistrované.
Překvapivě jen pár z nich opravdu slouží jako plnohodnotné webové domény.&lt;/p&gt;
&lt;h2&gt;Jen zaregistrované&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;d.cz&lt;/code&gt;, &lt;code&gt;o.cz&lt;/code&gt;, &lt;code&gt;w.cz&lt;/code&gt;, &lt;code&gt;x.cz&lt;/code&gt; a &lt;code&gt;8.cz&lt;/code&gt; jsou sice zaregistrované, ale není na nich žádná webová stránka.&lt;/p&gt;
&lt;h2&gt;Přesměrování&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;a.cz&lt;/code&gt;, &lt;code&gt;c.cz&lt;/code&gt;, &lt;code&gt;i.cz&lt;/code&gt;, &lt;code&gt;l.cz&lt;/code&gt;, &lt;code&gt;n.cz&lt;/code&gt;, &lt;code&gt;r.cz&lt;/code&gt;, &lt;code&gt;t.cz&lt;/code&gt;, &lt;code&gt;u.cz&lt;/code&gt;, &lt;code&gt;v.cz&lt;/code&gt;, &lt;code&gt;0.cz&lt;/code&gt;, &lt;code&gt;3.cz&lt;/code&gt;, &lt;code&gt;5.cz&lt;/code&gt; a &lt;code&gt;6.cz&lt;/code&gt;
přesměrovávají většinou na nesouvisející stránky, nebo přímo škodlivé reklamy.
Tři z nich vedou na &lt;code&gt;zonky.cz&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362182/ucz.png&quot; alt=&quot;reklama na u.cz&quot;&gt;&lt;/p&gt;
&lt;p&gt;Ne všechna přesměrování jsou ale náhodná:
Přes &lt;code&gt;n.cz&lt;/code&gt; se dostanete na Deník N, přes &lt;code&gt;t.cz&lt;/code&gt; na web T-Mobile, a &lt;code&gt;i.cz&lt;/code&gt; vede na &lt;code&gt;iczgroup.cz&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Nefunkční&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;m.cz&lt;/code&gt;, &lt;code&gt;s.cz&lt;/code&gt;, &lt;code&gt;z.cz&lt;/code&gt;, &lt;code&gt;2.cz&lt;/code&gt; i &lt;code&gt;4.cz&lt;/code&gt; jsou nefunkční.
Error 403, chyba hostingu, prázdné stránky, nebo nekonečné načítání.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362182/2cz.png&quot; alt=&quot;Error na stránce 2.cz: Not Found on Accelerator. Description: Your request on the specified host was not found. Check the location and try again. &quot;&gt;&lt;/p&gt;
&lt;h2&gt;Funkční&lt;/h2&gt;
&lt;p&gt;Zbývá tedy 13 domén. Tři z nich jsou těžko zařaditelné: &lt;code&gt;k.cz&lt;/code&gt;, &lt;code&gt;p.cz&lt;/code&gt; a &lt;code&gt;y.cz&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://k.cz&quot;&gt;k.cz&lt;/a&gt; pouze vypíše vaši IP adresu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362183/kcz.png&quot; alt=&quot;web k.cz je prázdná stránka s textem: &amp;quot;IP adresa:&amp;quot; a mojí ip adresou&quot;&gt;
Vyhledávač také indexuje subdoménu &lt;code&gt;d.k.cz&lt;/code&gt;, na které jsou hostované nějaké ISO soubory Windowsů 🤔&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362183/dkcz.png&quot; alt=&quot;výsledky DuckDuckGo vyhledávání z domény d.k.cz: ISO Windows 10, Windows 2012 a MS SQL 2008&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://p.cz&quot;&gt;p.cz&lt;/a&gt; obsahuje jen dva odstavce textu:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tady býval projekt Kočky-online.cz, který pomáhal hledat domov kočkám bez domova.&lt;/p&gt;
&lt;p&gt;Před 20 lety jeden z uživatelů použíl obrázek licencovaný agenturou Reuters, bez písemného svolení této instituce. Na přetahování s právníky nemáme čas ani energii, proto stránky končí.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362182/pcz.png&quot; alt=&quot;screenshot webu p.cz s předchozím textem&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://y.cz&quot;&gt;y.cz&lt;/a&gt; má s &lt;code&gt;p.cz&lt;/code&gt; dost společného. Také jde o oznámení o konci existence, a dokonce i ze stejné éry:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Flash news (07.01.2007):&lt;/em&gt; Vyvoj MailForwu uz je nekolik let zastaven, a vzhledem k pokroku na poli mobilnich zarizeni (permanentni GPRS pripojeni, atd.), bude zrejme vyvoj novejsich verzi tohoto programu, jehoz hlavni naplni bylo rozdelovani doslych mailu do kratkych SMS zprav, jiz zbytecne. &lt;em&gt;(...)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dekuji vam za vasi dlouholetou prizen,
Lukas Horalek.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362182/ycz.png&quot; alt=&quot;screenshot webu y.cz s předchozím textem&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Běžné webové stránky&lt;/h2&gt;
&lt;p&gt;Posledních 10 domén jsou konečně to, co si člověk běžně představí pod pojmem „Webové Stránky“:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://b.cz&quot;&gt;b.cz&lt;/a&gt; - Firma BusinessFactory&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://e.cz&quot;&gt;e.cz&lt;/a&gt; - Firma Plynoservis liberec&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://f.cz&quot;&gt;f.cz&lt;/a&gt; - Mastodon server&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://g.cz&quot;&gt;g.cz&lt;/a&gt; - Magazín G&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://h.cz&quot;&gt;h.cz&lt;/a&gt; - Web o pořízení vlastního bydlení (H jako hypotéky)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://j.cz&quot;&gt;j.cz&lt;/a&gt; - Jabber (XMPP) instance&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://q.cz&quot;&gt;q.cz&lt;/a&gt; - Firma Quantcom&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://1.cz&quot;&gt;1.cz&lt;/a&gt; - jakási prastará domovská stránka&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://7.cz&quot;&gt;7.cz&lt;/a&gt; - Skupina Sev.en&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://9.cz&quot;&gt;9.cz&lt;/a&gt; - Kalkulačka povinného ručení a pojištění&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zajímavé mi přijdou &lt;code&gt;f.cz&lt;/code&gt;, &lt;code&gt;j.cz&lt;/code&gt; a &lt;code&gt;1.cz&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;f.cz&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;f.cz&lt;/code&gt; je server mikroblogovací sociální sítě Mastodon, a i já zde mám &lt;a href=&quot;https://f.cz/@stepan&quot;&gt;účet&lt;/a&gt;.
Je to síť podobná Twitteru, Threads, nebo Bluesky.
Rozdíl je v tom, že Mastodon je decentralizovaný.&lt;/p&gt;
&lt;p&gt;To znamená, že kdokoliv může provozovat svůj server, a takových serverů jsou tisíce -
&lt;code&gt;f.cz&lt;/code&gt; je jen jedním z nich.
Když si založíte účet na jednom ze serverů, můžete interagovat i s lidmi na ostatních serverech. Na většině je ale jen poměrně málo lidí, a tak si je můžou dovolit spravovat a moderovat nadšenci.&lt;/p&gt;
&lt;p&gt;Servery jsou dost malé na to, aby je jejich admini zvládli moderovat. Když je nějaký moderovaný špatně, ostatní se od něj můžou odstříhnout. Pokud chcete naprostou svobodu slova, můžete se připojit na server bez cenzury a moderace. Jen počítejte s tím, že většina ostatních serverů se s tím vaším nebude bavit, a vy neuvidíte jejich uživatele.&lt;/p&gt;
&lt;p&gt;Mastodon má spoustu dalších výhod - každý server může mít vlastní sadu emoji které můžete používat, a může si nastavit vlastní limity délky příspěvků (&lt;code&gt;f.cz&lt;/code&gt; má 2000).&lt;/p&gt;
&lt;p&gt;V něčem se podobá starému Twitteru z doby před tím, než se zaplnil nacisty a dětskou pornografií.
To hlavně absencí algoritmu - vaše timeline jsou příspěvky lidí co sledujete, nebo které boostnuli (boost je jako retweet na twitteru). Také můžete sledovat hashtagy. Narozdíl od Twitteru nepožaduje Mastodon přihlášení, pokud nechcete postovat.&lt;/p&gt;
&lt;p&gt;Hlavní nevýhodou je, že zatím má poměrně málo uživatelů - obzvlášť v Česku. Rozhodně ale doporučuji Mastodon zkusit - můžete si založit účet rovnou na &lt;code&gt;f.cz&lt;/code&gt;, nebo si &lt;a href=&quot;https://joinmastodon.org/&quot;&gt;vybrat jiný server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: tento post není sponzorovaný žádným Mastodon serverem, i když přiznávám, že mě doména f.cz inspirovala k jeho napsání&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362182/fcz.png&quot; alt=&quot;f.cz - vskutečnosti fedivesmír :-)&quot;&gt;&lt;/p&gt;
&lt;h3&gt;j.cz&lt;/h3&gt;
&lt;p&gt;Server komunikační sítě Jabber (XMPP). Tu nepoužívám, ale kdybych si chtěl někde založit účet, asi by to bylo zde. Kdo by nechtěl mít adresu s jediným písmenem v doméně?&lt;/p&gt;
&lt;h3&gt;1.cz&lt;/h3&gt;
&lt;p&gt;Stránka &lt;code&gt;1.cz&lt;/code&gt; má už zřejmě svoji slávu za sebou. Vypadá to, že sloužila jako &lt;em&gt;domovská stránka&lt;/em&gt;, která se otevře vždy při spuštění prohlížeče. Má počasí, &amp;quot;užitečné&amp;quot; odkazy, e-mail a vyhledávání.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1776362182/1cz.png&quot; alt=&quot;právě popsaná stránka 1.cz&quot;&gt;&lt;/p&gt;
&lt;p&gt;Počasí kupodivu funguje, většina odkazů ale ne. E-mail vyžaduje přihlášení.&lt;/p&gt;
&lt;p&gt;Vyhledávání má logo Seznam.cz, a tak jsem čekal, že zkrátka otevře Seznam vyhledávání v nové kartě.
Ve skutečnosti se však výsledky zobrazí přímo na &lt;code&gt;1.cz&lt;/code&gt;. Teda, zobrazily by se, kdyby vyhledávání fungovalo.&lt;/p&gt;
&lt;h2&gt;Statistiky&lt;/h2&gt;
&lt;p&gt;Nejstarší doména je &lt;code&gt;b.cz&lt;/code&gt;, registrovaná 1. 12. 1997.
Nejmladší naopak &lt;code&gt;l.cz&lt;/code&gt;, registrovaná 24. 11. 2004.
Rok s nejvíce registracemi jednoznakých domén byl 1998, kdy jich bylo registrováno 15.&lt;/p&gt;
&lt;h2&gt;Závěr&lt;/h2&gt;
&lt;p&gt;Překvapilo mě, jak malá část těchto domén se opravdu používá.&lt;/p&gt;
&lt;p&gt;Když se nad tím ale víc zamyslím, asi to dává smysl.
Jedno písmeno se zapamatuje hůř, než krátké slovo, které má s obsahem webu nějakou souvislost.
Vyslovení domény také není tak jednoduché:
třeba nahlas vyslovené &lt;code&gt;m.cz&lt;/code&gt; zní stejně jako &lt;code&gt;em.cz&lt;/code&gt;.
A pokaždé upozorňovat že je to opravdu jen písmeno &lt;code&gt;m&lt;/code&gt; tak trochu kazí tu výhodu krátké domény.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Controlling a phone camera with a remote</title>
    <link href="https://stepanzak.cc/blog/phone-camera-remote-control/" />
    <updated>2026-02-13T23:00:00Z</updated>
    <id>https://stepanzak.cc/blog/phone-camera-remote-control/</id>
    <content type="html">&lt;p&gt;My grandpa asked me to help with a seemingly simple thing recently: he wanted to put his phone somewhere and then start/stop video recording with a remote he bought. The remote has two buttons: volume up and volume down.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1771094695/ResizedImage_2026-02-14_19-42-07_8296_1.jpg&quot; alt=&quot;Small remote control with two buttons&quot; width=&quot;150&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;He has a Samsung phone, and Samsung&#39;s camera app, like most others, can be controlled with volume buttons.&lt;/p&gt;
&lt;p&gt;The issue is, they both do the same thing. You can start recording with either button, and the same goes for stopping recording.
He doesn&#39;t want to always keep the state of the phone in his head. If he forgot, he could think he is starting recording while he would, in fact, stop it.&lt;/p&gt;
&lt;p&gt;The solution is theoretically simple - make one of the buttons only start and the other only stop the recording. How do I do that, though?&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;The solution was an app called &lt;a href=&quot;https://github.com/keymapperorg/KeyMapper&quot;&gt;KeyMapper&lt;/a&gt;, available on the Play Store and F-Droid. As the name suggests, it remaps keys. What surprised me was that it can tell the difference between the volume buttons on the phone and on the remote. Another great feature is remapping only for a specified app, Samsung Camera in this case.&lt;/p&gt;
&lt;p&gt;But what do you remap the buttons to to only start or stop recording? Well, here comes the best ability of KeyMapper - you can record yourself clicking on any button on your screen, and it will remember which button it was. &amp;quot;Start Recording&amp;quot;, in my case. Then, you just bind the remote&#39;s key to click on this very button. If there&#39;s no &amp;quot;Start Recording&amp;quot; button, as the camera is currently recording, nothing happens. Exactly what my grandpa wanted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dt4tzhayc/image/upload/v1771094695/Screenshot_20260214-193008.png&quot; alt=&quot;KeyMapper screenshot. Group named Camera Remote. Trigger: Volume up (Any device) Actions: Tap: Start video. Trigger: Volume down (Any device): Actions: Tap: Stop video&quot; width=&quot;250&quot;&gt;&lt;/p&gt;
&lt;h2&gt;One Last Improvement&lt;/h2&gt;
&lt;p&gt;Remote controlling works like a charm, but there&#39;s an issue. The screen goes off when it&#39;s not recording after a while. And if you set the screen timeout to a really long time (although I&#39;m not sure what the maximum allowed is), the screen is going to drain the battery.&lt;/p&gt;
&lt;p&gt;If you are on Samsung, like my grandpa is, there&#39;s an app from Samsung for you. It&#39;s called Battery Guardian, from the &lt;em&gt;Good Guardians&lt;/em&gt; suite, and it has a little side feature that we&#39;re going to use:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Screen Curtain is a new feature that allows you to maintain application running status while the screen is turned off. Use Screen Curtain to minimize battery consumption and heat generation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Install Battery Guardian from the &lt;a href=&quot;http://apps.samsung.com/appquery/appDetail.as?appId=com.samsung.android.statsd&quot;&gt;Galaxy Store&lt;/a&gt;, or sideload from &lt;a href=&quot;https://www.apkmirror.com/apk/samsung-electronics-co-ltd/battery-guardian/&quot;&gt;APKMirror&lt;/a&gt; if you are in unsupported country. Enable Screen Curtain. It&#39;s just a few clicks, but &lt;a href=&quot;https://us.community.samsung.com/t5/Tips/One-UI-6-New-Feature-Screen-Curtain/td-p/2673709&quot;&gt;here&#39;s a guide&lt;/a&gt;.
When you start it from the quick panel button, your screen will go almost dark. Any app running will continue to run underneath, and the remote control will continue to work with our remaps. It also disables the screen timeout.&lt;/p&gt;
&lt;p&gt;If you don&#39;t have a Samsung phone, you&#39;ll have to find an alternative. Just be carefull what you install, since it will for sure require the accessibility permission, which is a dangerous one.&lt;/p&gt;
&lt;p&gt;Thanks for reading, I hope I helped you :)&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Leaving rooted Android</title>
    <link href="https://stepanzak.cc/blog/leaving-rooted-android/" />
    <updated>2025-11-23T23:00:00Z</updated>
    <id>https://stepanzak.cc/blog/leaving-rooted-android/</id>
    <content type="html">&lt;p&gt;I&#39;ve got a new phone - a Pixel 7 Pro that someone broke, my grandpa bought cheaply and repaired. First thing I did was to install &lt;a href=&quot;https://grapheneos.org&quot;&gt;GrapheneOS&lt;/a&gt;. The biggest change about that switch is that GrapheneOS doesn&#39;t provide root access, and &lt;a href=&quot;https://www.reddit.com/r/GrapheneOS/comments/13264di/comment/ji54e19/&quot;&gt;apparently for a good reason&lt;/a&gt;.
In this blog post, I&#39;ll list every single tool I use that uses root privileges, to see what am I going to lose by switching to a non-rooted system.&lt;/p&gt;
&lt;h2&gt;KernelSU modules&lt;/h2&gt;
&lt;p&gt;There are two main ways of utilizing root access: Modules and Superuser apps.&lt;/p&gt;
&lt;p&gt;Superuser apps are regular android apps that you grant root access. Some of them require root access for a few features but work without it. Like a file manager that can browse restricted parts of the filesystem if granted root access.&lt;/p&gt;
&lt;p&gt;Root modules, on the other hand, are scripts specific to the root method you use - &lt;a href=&quot;https://github.com/KernelSU-Next/KernelSU-Next&quot;&gt;KernelSU Next&lt;/a&gt; in my case (but most people know &lt;a href=&quot;https://github.com/topjohnwu/Magisk&quot;&gt;Magisk&lt;/a&gt;). They usually do some deeper system changes, and aren&#39;t expected to have an UI (but some of them do).
Here are the modules I have installed at the time of preparing to switch to the new phone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JamesDSP Manager
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/james34602/JamesDSPManager&quot;&gt;https://github.com/james34602/JamesDSPManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Advanced audio processing engine&lt;/li&gt;
&lt;li&gt;I used it as an equalizer.&lt;/li&gt;
&lt;li&gt;Overkill running in background.&lt;/li&gt;
&lt;li&gt;I don&#39;t have great headphones and lossless music streaming, didn&#39;t notice a difference really.&lt;/li&gt;
&lt;li&gt;It broke and I didn&#39;t bother fixing it.&lt;/li&gt;
&lt;li&gt;there&#39;s a &lt;a href=&quot;https://github.com/ThePBone/RootlessJamesDSP&quot;&gt;rootless version&lt;/a&gt; with some limitations that are not dealbreakers for me&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ReZygisk
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PerformanC/ReZygisk&quot;&gt;https://github.com/PerformanC/ReZygisk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Required mainly for LSPosed to work (see &lt;a href=&quot;https://stepanzak.cc/blog/leaving-rooted-android/#lsposed-modules&quot;&gt;LSPosed modules&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RVX YT Music, Youtube RVX LITE
&lt;ul&gt;
&lt;li&gt;RVX stands for &lt;a href=&quot;https://github.com/inotia00/revanced-patches&quot;&gt;ReVanced Extended&lt;/a&gt;, which is a modified version of the &lt;a href=&quot;https://revanced.app&quot;&gt;ReVanced&lt;/a&gt; patches.&lt;/li&gt;
&lt;li&gt;These allow you to patch various applications (YouTube and YouTube Music for me) to remove ads, unlock premium features and add various enhancements.&lt;/li&gt;
&lt;li&gt;I use root modules distributed through Telegram channel not affiliated with ReVanced or Revanced Extended 💀&lt;/li&gt;
&lt;li&gt;I use these just for the convenience, I can just compile ReVanced (Extended) APKs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WiFi Password Viewer for MMRL
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mmrl.dev/repository/grdoglgmr/mmrl_wpd&quot;&gt;https://mmrl.dev/repository/grdoglgmr/mmrl_wpd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cool but I never actually used it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zygisk - LSPosed
&lt;ul&gt;
&lt;li&gt;See &lt;a href=&quot;https://stepanzak.cc/blog/leaving-rooted-android/#lsposed-modules&quot;&gt;LSPosed modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tricky Store OSS, PlayIntegrityFix-NEXT
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/EricInacio01/PlayIntegrityFix-NEXT&quot;&gt;https://github.com/EricInacio01/PlayIntegrityFix-NEXT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/beakthoven/TrickyStoreOSS/releases&quot;&gt;https://github.com/beakthoven/TrickyStoreOSS/releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;For Play Integrity, doesn&#39;t even work half the time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AshLooper - Boot Loop protection
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RipperHybrid/AshLooper&quot;&gt;https://github.com/RipperHybrid/AshLooper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Disables root modules on bootloop - I won&#39;t need it when I won&#39;t have any root modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lightweight Exynos Undervolter (LEU)
&lt;ul&gt;
&lt;li&gt;It&#39;s supposed to improve battery life by &lt;a href=&quot;https://en.wikipedia.org/wiki/Dynamic_voltage_scaling#Undervolting&quot;&gt;undervolting&lt;/a&gt; the CPU.&lt;/li&gt;
&lt;li&gt;Only works on Samsung (Exynos chip).&lt;/li&gt;
&lt;li&gt;Didn&#39;t notice any difference using it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zygisk - Sui
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RikkaApps/Sui&quot;&gt;https://github.com/RikkaApps/Sui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Like Shizuku but for giving root access&lt;/li&gt;
&lt;li&gt;Unmaintained, stopped displaying the list of apps 💀 (so I can&#39;t check or revoke their privileges)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow! It looks like I could do just fine without those modules. The only issue could be LSPosed, so let&#39;s see what do I use that for.&lt;/p&gt;
&lt;h2&gt;LSPosed modules&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/JingMatrix/LSPosed&quot;&gt;LSPosed&lt;/a&gt; (JingMatrix&#39;s fork) is a modern reimplementation of the Xposed framework. &lt;em&gt;Xposed is a framework for modules that can change the behavior of the system and apps without touching any APKs.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For example: the ReVanced apps are traditionally modified by applying patches and compiling new patched APKs. LSPosed module could apply those same patches to regular apps installed from the Play Store, while not modyfiing them permanently. It can also hook multiple apps, for general patches like blocking screenshot detection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free Notifications
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/binarynoise/XposedModulets&quot;&gt;https://github.com/binarynoise/XposedModulets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Being able to disable some annoying persistent system notifications is great in theory.&lt;/li&gt;
&lt;li&gt;I remember using it only once, so not a big deal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hide My Applist
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Dr-TSNG/Hide-My-Applist&quot;&gt;https://github.com/Dr-TSNG/Hide-My-Applist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Never needed it for any app, actually broke my banking app.&lt;/li&gt;
&lt;li&gt;Another app that went closed-source.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NoStorageRestrict
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Xposed-Modules-Repo/com.github.dan.nostoragerestrict&quot;&gt;https://github.com/Xposed-Modules-Repo/com.github.dan.nostoragerestrict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Another nice freedom to have, but I&#39;ve never used it.&lt;/li&gt;
&lt;li&gt;The restrictions might be there for a reason actually.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AlternativeUnlockXposed
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/leohearts/AlternativeUnlockXposed&quot;&gt;https://github.com/leohearts/AlternativeUnlockXposed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playing rickroll when &lt;em&gt;12345678&lt;/em&gt; password is entered is funny for like a week.&lt;/li&gt;
&lt;li&gt;I disabled it soon (LSPosed modules of course eat some battery).&lt;/li&gt;
&lt;li&gt;GrapheneOS has &lt;a href=&quot;https://grapheneos.org/features#duress&quot;&gt;it&#39;s own feature&lt;/a&gt; for duress password that wipes the device instead of unlocking it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CaptureSposed
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/99keshav99/CaptureSposed&quot;&gt;https://github.com/99keshav99/CaptureSposed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;This might be the most useful module from the list, but I personally never needed it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;XPL-EX
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/0bbedCode/XPL-EX&quot;&gt;https://github.com/0bbedCode/XPL-EX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Never bothered to learn how to use it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;InstaEclipse
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ReSo7200/InstaEclipse&quot;&gt;https://github.com/ReSo7200/InstaEclipse&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Patches Instagram to remove ADs, disable reels, and add some privacy enhancements.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I need this.&lt;/li&gt;
&lt;li&gt;I hope I&#39;ll be able to make regular APKs with &lt;a href=&quot;https://github.com/JingMatrix/LSPatch&quot;&gt;LSPatch&lt;/a&gt; (JingMatrix&#39;s fork). &lt;strong&gt;EDIT:&lt;/strong&gt; Wile it&#39;s &lt;a href=&quot;https://github.com/ReSo7200/InstaEclipse/issues/100&quot;&gt;not possible&lt;/a&gt; to patch standalone Instagram APK with InstaEclipse embedded, it works with non-root LSPatch manager.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Re:Telegram
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Sakion-Team/Re-Telegram&quot;&gt;https://github.com/Sakion-Team/Re-Telegram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Useful, but I don&#39;t use Telegram that much.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lucky Patcher
&lt;ul&gt;
&lt;li&gt;see Lucky Patcher in &lt;a href=&quot;https://stepanzak.cc/blog/leaving-rooted-android/#apps-with-superuser-rights&quot;&gt;Apps with Superuser rights&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Apps with Superuser rights&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Shizuku
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RikkaApps/Shizuku&quot;&gt;https://github.com/RikkaApps/Shizuku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allows you to share &lt;a href=&quot;https://en.wikipedia.org/wiki/Android_Debug_Bridge&quot;&gt;ADB&lt;/a&gt; access with apps.&lt;/li&gt;
&lt;li&gt;ADB allows you to do some restricted stuff on Android, not as much as root though.&lt;/li&gt;
&lt;li&gt;Can be used without root, setting it up is annoying every time you need to use it.&lt;/li&gt;
&lt;li&gt;OK for something like &lt;em&gt;SD Maid SE&lt;/em&gt;, not for long running apps in the background, or things you need to do fast at the moment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Android USB Script, USB HID Client
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Netdex/android-usb-script&quot;&gt;https://github.com/Netdex/android-usb-script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Arian04/android-hid-client&quot;&gt;https://github.com/Arian04/android-hid-client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Neither works on the kernel I used.&lt;/li&gt;
&lt;li&gt;Mostly a gimmick, not really that useful.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;App Manager
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MuntashirAkon/AppManager&quot;&gt;https://github.com/MuntashirAkon/AppManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;So many features
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;displays running apps&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;app backup (with data)&lt;/li&gt;
&lt;li&gt;app usage&lt;/li&gt;
&lt;li&gt;also has a debloater&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Very impressive app!&lt;/li&gt;
&lt;li&gt;10x better than the app manager in system settings.&lt;/li&gt;
&lt;li&gt;I will miss this app :(&lt;/li&gt;
&lt;li&gt;Some features will work without root, but probably not the most useful ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FindMyDevice
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gitlab.com/fmd-foss/fmd-android&quot;&gt;https://gitlab.com/fmd-foss/fmd-android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Most of the functionality should be grantable without root.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Material Files
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zhanghai/MaterialFiles&quot;&gt;https://github.com/zhanghai/MaterialFiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My favorite file manager, even without root.&lt;/li&gt;
&lt;li&gt;With root, it can access all files on device (like files in app storage)&lt;/li&gt;
&lt;li&gt;Sometimes very useful:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://f.cz/@stepan/114145042723916307&quot;&gt;https://f.cz/@stepan/114145042723916307&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SD Maid SE
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/d4rken-org/sdmaid-se&quot;&gt;https://github.com/d4rken-org/sdmaid-se&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I use it only once in a while.&lt;/li&gt;
&lt;li&gt;Most advanced features can be enabled with Shizuku, no problem since I don&#39;t need to run it often.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tasker
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tasker.joaoapps.com/&quot;&gt;https://tasker.joaoapps.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Some features won&#39;t work (quite a lot)&lt;/li&gt;
&lt;li&gt;It&#39;s a paid app. I bought it two years ago, and created like 2 tasks.&lt;/li&gt;
&lt;li&gt;One of those apps that feel extremely useful, but you don&#39;t really use them that much.&lt;/li&gt;
&lt;li&gt;One less app to run in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Termux
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/termux/termux-app&quot;&gt;https://github.com/termux/termux-app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Theoretically can do &lt;a href=&quot;https://ivonblog.com/en-us/posts/termux-chroot-ubuntu/&quot;&gt;full linux distro chroot&lt;/a&gt; with root.
&lt;ul&gt;
&lt;li&gt;Full linux distro doesn&#39;t really bring much advantage over normal termux - In which I have tmux, neovim, python, node, even Zola SSG so I can live preview my website changes.&lt;/li&gt;
&lt;li&gt;Running full linux distro is harsh on system resources, eats up disk space, and drains battery. Total overkill.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lucky Patcher
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://luckypatchers.com/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Russian closed source app to patch apps and games, mainly to unlock paid content and get free coins/gems/whatever.&lt;/li&gt;
&lt;li&gt;Security concerns&lt;/li&gt;
&lt;li&gt;Unstable&lt;/li&gt;
&lt;li&gt;I&#39;m richer, so I don&#39;t need to crack apps that often.
&lt;ul&gt;
&lt;li&gt;I mean I&#39;m not rich, but I can pay $4 for a good app.&lt;/li&gt;
&lt;li&gt;Many apps can&#39;t be cracked anymore, LuckyPatcher&#39;s best years are over anyway.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Classic Power Menu
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KieronQuinn/ClassicPowerMenu&quot;&gt;https://github.com/KieronQuinn/ClassicPowerMenu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cool but I don&#39;t really use it.&lt;/li&gt;
&lt;li&gt;Takes a bit too long to run the first time after reboot, which is most of the time I open the power menu.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MMRL, WebUI X
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DerGoogler/MMRL&quot;&gt;https://github.com/DerGoogler/MMRL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mmrl.dev/guide/webuix/&quot;&gt;https://mmrl.dev/guide/webuix/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Only useful with root.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Shizuku (Sui) enabled apps&lt;/h2&gt;
&lt;p&gt;Shizuku grants ADB, whether Sui grants root acces.
In reality, most apps that use Sui can also use Shizuku, usually for the exact same features.&lt;/p&gt;
&lt;h3&gt;Will work with Shizuku&lt;/h3&gt;
&lt;p&gt;(They need it for one-time setup, or something I do once in a while)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lemmy Redirect, Mastodon Redirect, PeerTube Redirect
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zacharee/MastodonRedirect&quot;&gt;https://github.com/zacharee/MastodonRedirect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;One-time setup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Install with Options
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zacharee/InstallWithOptions&quot;&gt;https://github.com/zacharee/InstallWithOptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I use it only once in a while.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Canta
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/samolego/Canta&quot;&gt;https://github.com/samolego/Canta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debloating is not needed on GrapheneOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;aShell You
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DP-Hridayan/aShellYou&quot;&gt;https://github.com/DP-Hridayan/aShellYou&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I don&#39;t need to run adb commands often.&lt;/li&gt;
&lt;li&gt;It&#39;s usually used for granting some unusual permission. (WRITE_SECURE_SETTINGS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SaverTuner
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codeberg.org/s1m/savertuner&quot;&gt;https://codeberg.org/s1m/savertuner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Needs the WRITE_SECURE_SETTINGS permission.&lt;/li&gt;
&lt;li&gt;One-time setup.&lt;/li&gt;
&lt;li&gt;The Pixel 7 Pro has a pretty good battery life with GrapheneOS, so it&#39;s default power saving mode will probably be enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Used Shizuku for installing apps without user confirmation&lt;/h3&gt;
&lt;p&gt;On newer android versions, you only have to confirm once for each app (store), and that gives the store permanent permission to update that app. Thus there&#39;s no need for root for installing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bunny Manager
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bunny-mod/BunnyManager&quot;&gt;https://github.com/bunny-mod/BunnyManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Also unmaintained.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Aurora Store
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gitlab.com/AuroraOSS/AuroraStore&quot;&gt;https://gitlab.com/AuroraOSS/AuroraStore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Droid-ify
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Droid-ify/client&quot;&gt;https://github.com/Droid-ify/client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Obtainium
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ImranR98/Obtainium&quot;&gt;https://github.com/ImranR98/Obtainium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Didn&#39;t &lt;strong&gt;actually&lt;/strong&gt; use them&lt;/h3&gt;
&lt;p&gt;These are interesting, because when I first rooted my phone, I was really excited about them. Before that, I&#39;ve always stumbled upon them in some F-Droid repo, and thought how great it would be if I had root and could use them. Well, turns out they aren&#39;t so useful as they seem, and I stopped using most of these apps shortly after I installed them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SystemUI Tuner
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zacharee/Tweaker&quot;&gt;https://github.com/zacharee/Tweaker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LogFox
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/F0x1d/LogFox&quot;&gt;https://github.com/F0x1d/LogFox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Geto
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JackEblan/Geto&quot;&gt;https://github.com/JackEblan/Geto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Extinguish
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Moderpach/Extinguish&quot;&gt;https://github.com/Moderpach/Extinguish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Blocker
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lihenggui/blocker&quot;&gt;https://github.com/lihenggui/blocker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I was not careful and managed to break QR code payment in my banking app for a few months with the help of this app.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Smartspacer
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/KieronQuinn/Smartspacer&quot;&gt;https://github.com/KieronQuinn/Smartspacer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Will miss&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hail
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aistra0528/Hail&quot;&gt;https://github.com/aistra0528/Hail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Freezes apps.&lt;/li&gt;
&lt;li&gt;I use it to freeze proprietary apps that I unfortunately need every so often.
I don&#39;t want them to have any chance to run unless I specifically start them - that&#39;s why I freeze them with Hail.
&lt;ul&gt;
&lt;li&gt;Google Maps&lt;/li&gt;
&lt;li&gt;Google Home (for Chromecast)&lt;/li&gt;
&lt;li&gt;Google (for Lens)&lt;/li&gt;
&lt;li&gt;Spotify (for &lt;a href=&quot;https://support.spotify.com/us/article/jam/&quot;&gt;Jam&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Before you lecture me on how I shouldn&#39;t use these apps at all&lt;/em&gt;:
Especially in the case of Maps and Lens, there are emergency situations where getting somewhere quickly (a hospital, a pharmacy), or identifying some object quickly (unknown pills that your child swallowed) is infinitely more important than privacy. With Hail, it&#39;s like if the apps were uninstalled when they are frozen, but I can still launch them immediately.&lt;/li&gt;
&lt;li&gt;I freeze and unfreeze often, so starting Shizuku every time is not an option.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;alternatives:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Hail could be used with Device Admin / &lt;a href=&quot;https://github.com/iamr0s/Dhizuku&quot;&gt;Dhizuku&lt;/a&gt;, but with some &lt;a href=&quot;https://github.com/GrapheneOS/os-issue-tracker/issues/5710#issuecomment-3250128973&quot;&gt;annoying side effects&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codeberg.org/raiiware/ForceStopHelper&quot;&gt;Force Stop Helper&lt;/a&gt; is an app list that allows pinning apps to the top, indicates if an app is disabled, and when you click on the app, it takes you to it&#39;s system settings. You can open Force Stop Helper, and disable/enable any app with two clicks.&lt;/li&gt;
&lt;li&gt;Based on GrapheneOS&#39;s response in &lt;a href=&quot;https://discuss.grapheneos.org/d/1173-taskmanager-real-killing-of-processes&quot;&gt;this thread&lt;/a&gt;, I understand that freezing apps might be completely unnecessary, and I can just forbid them running in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As I&#39;m finishing this blog post, I&#39;ve been using the new Pixel 7 Pro with GrapheneOS for more than two months. I don&#39;t really miss the features I lost with giving up root access, which was very counterintuitive for me, given the amount of them that I used. What&#39;s maybe more surprising is that I miss some non-root features much more - features that I didn&#39;t even know were Samsung-specific. Given enough caffeine, I&#39;ll try to write a blog post about that. Some day...&lt;/p&gt;
&lt;p&gt;Thank you for reading! I don&#39;t have a comment system on my website yet, but &lt;a href=&quot;https://f.cz/@stepan/115605548632900402&quot;&gt;here&#39;s a link to a Mastodon post where you can comment&lt;/a&gt;. Feel free to comment any corrections, recommendations, or just thoughts that crossed your mind while reading this.&lt;/p&gt;
&lt;p&gt;I also &lt;a href=&quot;https://lemmy.cafe/post/27405118?scrollToComments=true&quot;&gt;posted a link on Lemmy&lt;/a&gt;, and there are some very interesting comments and discussion.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Bots I&#39;ve met on the Fediverse</title>
    <link href="https://stepanzak.cc/blog/fediverse-bots/" />
    <updated>2025-02-26T23:00:00Z</updated>
    <id>https://stepanzak.cc/blog/fediverse-bots/</id>
    <content type="html">&lt;p&gt;Wandering around in &lt;a href=&quot;https://jointhefediverse.net/&quot;&gt;the Fediverse&lt;/a&gt;, every once in a while I run into a bot.
It might be weird or ordinary, boring or exciting, interesting or completely absurd.
Here, I want to share those I&#39;m always excited to see again,
and thus think they are worth sharing.&lt;/p&gt;
&lt;h2&gt;I Hope This Email Finds You&lt;/h2&gt;
&lt;p&gt;First bot on this list is also my favorite. I&#39;ll let it introduce itself:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Posts (...) completions to the sentence &amp;quot;I hope this email finds you.&amp;quot;
All content is sourced from Google Books,
based on searches for phrases that start with &amp;quot;finds you.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty simple, right?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/thisemailfindsyou.jpg&quot; alt=&quot;A screenshot of post by &amp;quot;I Hope This Email Finds You&amp;quot; (@thisemailfindsyou@mastodon.social) with the text &amp;quot;I hope this email finds you unprepared while cross-country skiing.&amp;quot;&quot;&gt;
Every time I&#39;m writing an e-mail, I have the urge to use one of this bot&#39;s creations.&lt;/p&gt;
&lt;p&gt;I find it incredible how amusing a bot posting literal nonsense can be,
especially in an AI age where an LLM can spit out hundreds of sentences like this
in a few seconds.
That wouldn&#39;t be so funny though, would it?&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to show Mastodon feed&lt;/summary&gt;
&lt;p&gt;Most recent posts of &lt;a href=&quot;https://mastodon.social/@thisemailfindsyou&quot;&gt;@thisemailfindsyou@mastodon.social&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mastodon-feed me__1&quot;&gt;
    &lt;style&gt;
      .me__1 {
        max-width: 35rem;
        /*center*/
        margin: auto;
        overflow: auto;
      }
    &lt;/style&gt;
  &lt;script&gt;
    window.addEventListener(&quot;load&quot;, () =&gt; {
      const mastoTimeline_YMP4XodCfN = new MastodonTimeline.Init({
      mtContainerId: &quot;mt-container-YMP4XodCfN&quot;,
      instanceUrl: &quot;https://mastodon.social&quot;,
      timelineType: &quot;profile&quot;, 
       userId: &quot;112343635227295007&quot;, 
       profileName: &quot;thisemailfindsyou&quot;, 

      
      
       hideReplies: true, 
       hideUnlisted: true, 
       hideReblog: true, 
      
      
      
      
      
      
      
        });
      })
  &lt;/script&gt;
  &lt;div id=&quot;mt-container-YMP4XodCfN&quot; class=&quot;mt-container&quot;&gt;
    &lt;div class=&quot;mt-body&quot; role=&quot;feed&quot;&gt;
      &lt;div class=&quot;mt-loading-spinner&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;How to do anything&lt;/h2&gt;
&lt;p&gt;This bot is similar to the previous one in its dadaist nature.
It mixes up random &lt;a href=&quot;https://www.wikihow.com&quot;&gt;wikiHow&lt;/a&gt; article headings and illustrations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/wikihow.jpg&quot; alt=&quot;A screenshot of post by &amp;quot;how to do anything&amp;quot; (@wikihow@mastodon.social) with the text &amp;quot;How to Choose the Right Man to Marry&amp;quot; and an image of a bird feeder. There&#39;s a mark saying that it&#39;s 1.5m (5 ft) above the ground.&quot;&gt;&lt;/p&gt;
&lt;p&gt;Whether you try to find sense it its cryptic advice, or just go for a laugh,
I&#39;m sure it will be glad to see someone listening to what it has to say.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to show Mastodon feed&lt;/summary&gt;
&lt;p&gt;Most recent posts of &lt;a href=&quot;https://mastodon.social/@wikihow&quot;&gt;@wikihow@mastodon.social&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mastodon-feed me__2&quot;&gt;
    &lt;style&gt;
      .me__2 {
        max-width: 35rem;
        /*center*/
        margin: auto;
        overflow: auto;
      }
    &lt;/style&gt;
  &lt;script&gt;
    window.addEventListener(&quot;load&quot;, () =&gt; {
      const mastoTimeline_0kj8HhQSbE = new MastodonTimeline.Init({
      mtContainerId: &quot;mt-container-0kj8HhQSbE&quot;,
      instanceUrl: &quot;https://mastodon.social&quot;,
      timelineType: &quot;profile&quot;, 
       userId: &quot;417391&quot;, 
       profileName: &quot;wikihow&quot;, 

      
      
       hideReplies: true, 
       hideUnlisted: true, 
       hideReblog: true, 
      
      
      
      
      
      
      
        });
      })
  &lt;/script&gt;
  &lt;div id=&quot;mt-container-0kj8HhQSbE&quot; class=&quot;mt-container&quot;&gt;
    &lt;div class=&quot;mt-body&quot; role=&quot;feed&quot;&gt;
      &lt;div class=&quot;mt-loading-spinner&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;As the Film Ends&lt;/h2&gt;
&lt;p&gt;Have you ever opened a random book from your grandma&#39;s bookshelf and read the last page,
or last sentence of it?
There&#39;s something exciting about it, even when you have no idea about the context.
Maybe because of it.&lt;/p&gt;
&lt;p&gt;If you did, you and this bot are gonna love each other!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/movieending.jpg&quot; alt=&quot;A screenshot of post by &amp;quot;As the Film Ends&amp;quot; (@endingsummary@mastodon.social) with the text &amp;quot;El Mariachi then gives his share of the cash to his home village before walking into the sunset.&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Its father &lt;a href=&quot;http://vectorpoem.com/bots/#plotbot&quot;&gt;explains&lt;/a&gt; its inner workings well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most Wikipedia pages for a given film provide at least a brief plot synopsis.
Using the sum total of all film pages on Wikipedia as a corpus,
this bot picks a random film and posts the final sentence from its plot summary.
Spoilers are definitely possible, but given the depth of the corpus
it&#39;ll usually be a film you&#39;ve never heard of.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;summary&gt;Click to show Mastodon feed&lt;/summary&gt;
&lt;p&gt;Most recent posts of &lt;a href=&quot;https://mastodon.social/@endingsummary&quot;&gt;@endingsummary@mastodon.social&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mastodon-feed me__3&quot;&gt;
    &lt;style&gt;
      .me__3 {
        max-width: 35rem;
        /*center*/
        margin: auto;
        overflow: auto;
      }
    &lt;/style&gt;
  &lt;script&gt;
    window.addEventListener(&quot;load&quot;, () =&gt; {
      const mastoTimeline_bMcUe1JuVN = new MastodonTimeline.Init({
      mtContainerId: &quot;mt-container-bMcUe1JuVN&quot;,
      instanceUrl: &quot;https://mastodon.social&quot;,
      timelineType: &quot;profile&quot;, 
       userId: &quot;403977&quot;, 
       profileName: &quot;endingsummary&quot;, 

      
      
       hideReplies: true, 
       hideUnlisted: true, 
       hideReblog: true, 
      
      
      
      
      
      
      
        });
      })
  &lt;/script&gt;
  &lt;div id=&quot;mt-container-bMcUe1JuVN&quot; class=&quot;mt-container&quot;&gt;
    &lt;div class=&quot;mt-body&quot; role=&quot;feed&quot;&gt;
      &lt;div class=&quot;mt-loading-spinner&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;transect575&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/transect575.png&quot; alt=&quot;A screenshot of post by transect575 with a three line haiku
&amp;quot;missing lower half (newline)
may be humpback whale , breaching (newline)
update conditions&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bots.converged.yt/@transect575&quot;&gt;transect575&lt;/a&gt; is another bot whose introduction I&#39;ll &lt;a href=&quot;https://converged.yt/bots/#transect575&quot;&gt;leave to its creator&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I worked for REDACTED GOVERNMENT AGENCY I saw a lot of aerial survey data
from people looking for whales in the sea.
Usually this includes useful information like the number of animals,
whether they are juvenile or adult and weather conditions.
They also usually included a comment field.
So I scraped that out and this bot makes haikus from it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Its home is a &lt;a href=&quot;https://gotosocial.org/&quot;&gt;GoToSocial&lt;/a&gt; instance, so I can&#39;t embed its posts here
as easily as those of bots living on Mastodon.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bots.converged.yt/@transect575&quot;&gt;Click here&lt;/a&gt; to view transect575&#39;s haikus&lt;/p&gt;
&lt;h2&gt;You Can&#39;t Spell&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/youcantspell.jpg&quot; alt=&quot;A screenshot of post by &amp;quot;You Can&#39;t Spell&amp;quot; (@cantspell@mastodon.social) with the text &amp;quot;You can&#39;t spell artificial intelligence without lie certificating&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This bot is only six days old when I&#39;m writing this,
but it already managed to say smarter things than
lot of adults I know have ever said.
Did you know that you can&#39;t spell &lt;em&gt;warm-hearted&lt;/em&gt; without &lt;em&gt;meth award&lt;/em&gt;?&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to show Mastodon feed&lt;/summary&gt;
&lt;p&gt;Most recent posts of &lt;a href=&quot;https://mastodon.social/@cantspell&quot;&gt;@cantspell@mastodon.social&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mastodon-feed me__4&quot;&gt;
    &lt;style&gt;
      .me__4 {
        max-width: 35rem;
        /*center*/
        margin: auto;
        overflow: auto;
      }
    &lt;/style&gt;
  &lt;script&gt;
    window.addEventListener(&quot;load&quot;, () =&gt; {
      const mastoTimeline_w7J7fEIUoa = new MastodonTimeline.Init({
      mtContainerId: &quot;mt-container-w7J7fEIUoa&quot;,
      instanceUrl: &quot;https://mastodon.social&quot;,
      timelineType: &quot;profile&quot;, 
       userId: &quot;114039513726375451&quot;, 
       profileName: &quot;cantspell&quot;, 

      
      
       hideReplies: true, 
       hideUnlisted: true, 
       hideReblog: true, 
      
      
      
      
      
      
      
        });
      })
  &lt;/script&gt;
  &lt;div id=&quot;mt-container-w7J7fEIUoa&quot; class=&quot;mt-container&quot;&gt;
    &lt;div class=&quot;mt-body&quot; role=&quot;feed&quot;&gt;
      &lt;div class=&quot;mt-loading-spinner&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;Shakespearean Insult Bot&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/shakespeareinsult.jpg&quot; alt=&quot;A screenshot of post by &amp;quot;Shakespearean Insult Bot&amp;quot; (@shakespearean_Insults@beige.party) with the text &amp;quot;You degenerate, fat-kidneyed, onion-eyed, scut!&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nothing much to say about the &lt;em&gt;Shakespearean Insult Bot&lt;/em&gt;,
who walks around the Fediverse and insults whoever crosses its path.
Its unloved (those not starred/boosted/commented) insults are deleted after two weeks,
which is a pretty clever feature that the &lt;em&gt;How to do anything&lt;/em&gt; bot could borrow.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to show Mastodon feed&lt;/summary&gt;
&lt;p&gt;Most recent posts of &lt;a href=&quot;https://beige.party/@shakespearean_Insults&quot;&gt;@shakespearean_Insults@beige.party&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mastodon-feed me__5&quot;&gt;
    &lt;style&gt;
      .me__5 {
        max-width: 35rem;
        /*center*/
        margin: auto;
        overflow: auto;
      }
    &lt;/style&gt;
  &lt;script&gt;
    window.addEventListener(&quot;load&quot;, () =&gt; {
      const mastoTimeline_zCnE2hNhid = new MastodonTimeline.Init({
      mtContainerId: &quot;mt-container-zCnE2hNhid&quot;,
      instanceUrl: &quot;https://beige.party&quot;,
      timelineType: &quot;profile&quot;, 
       userId: &quot;113725385831519563&quot;, 
       profileName: &quot;shakespearean_Insults&quot;, 

      
      
       hideReplies: true, 
       hideUnlisted: true, 
       hideReblog: true, 
      
      
      
      
      
      
      
        });
      })
  &lt;/script&gt;
  &lt;div id=&quot;mt-container-zCnE2hNhid&quot; class=&quot;mt-container&quot;&gt;
    &lt;div class=&quot;mt-body&quot; role=&quot;feed&quot;&gt;
      &lt;div class=&quot;mt-loading-spinner&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2&gt;SimCity2000 Traffic Helicopter&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://stepanzak.cc/blog/fediverse-bots/simcity.jpg&quot; alt=&quot;A screenshot of post by &amp;quot;SimCity2000 Traffic Helicopter&amp;quot; (@sc2000@mastodon.social) with an image of a Sim City 2000 city and the text &amp;quot;1.5 MIL! June 24, 3963&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Last bot on this list is a bit different than the rest.
It&#39;s not funny nor nonsensical, but deserves its place more than any other.&lt;/p&gt;
&lt;p&gt;Another project of &lt;a href=&quot;https://mastodon.social/@jplebreton&quot;&gt;@jplebreton@mastodon.social&lt;/a&gt;,
creator of the &lt;em&gt;As the Film Ends&lt;/em&gt; bot,
&lt;em&gt;SimCity2000 Traffic Helicopter&lt;/em&gt; &lt;a href=&quot;http://vectorpoem.com/bots/#sc2000bot&quot;&gt;flies above user-created cities and posts a random glimpse of a cityscape.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Beautiful!&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to show Mastodon feed&lt;/summary&gt;
&lt;p&gt;Most recent posts of &lt;a href=&quot;https://mastodon.social/@sc2000&quot;&gt;@sc2000@mastodon.social&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mastodon-feed me__6&quot;&gt;
    &lt;style&gt;
      .me__6 {
        max-width: 35rem;
        /*center*/
        margin: auto;
        overflow: auto;
      }
    &lt;/style&gt;
  &lt;script&gt;
    window.addEventListener(&quot;load&quot;, () =&gt; {
      const mastoTimeline_5VLKN1znZs = new MastodonTimeline.Init({
      mtContainerId: &quot;mt-container-5VLKN1znZs&quot;,
      instanceUrl: &quot;https://mastodon.social&quot;,
      timelineType: &quot;profile&quot;, 
       userId: &quot;113429291225946141&quot;, 
       profileName: &quot;sc2000&quot;, 

      
      
       hideReplies: true, 
       hideUnlisted: true, 
       hideReblog: true, 
      
      
      
      
      
      
      
        });
      })
  &lt;/script&gt;
  &lt;div id=&quot;mt-container-5VLKN1znZs&quot; class=&quot;mt-container&quot;&gt;
    &lt;div class=&quot;mt-body&quot; role=&quot;feed&quot;&gt;
      &lt;div class=&quot;mt-loading-spinner&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/details&gt;
</content>
  </entry>
</feed>