O potrebe šifrovanej komunikácie a šifrovaných komunikátoroch som už písal. Zameriaval som sa však na komunikáciu medzi ľuďmi – či už písomnú, hlasovú, video alebo skupinovú. Pre mňa zaujímavou témou je však aj komunikácia medzi počítačom a človekom – konkrétne mnou. Už kedysi, keď som sa venoval správe systémov som potreboval dostávať upozornenia o tom, že sa niečo pokazilo.
Teraz na to používam jednoduchý systém, ktorý je optimalizovaný na to, aby bežal aj na malých zariadeniach (routroch, NAS) a nepotreboval zložitú infraštruktúru. Vytvoril som si systém signal-monitoring, ktorý túto úlohu zvláda pre mňa dostatočne.
Ostáva doriešiť otázku ako jednoducho a spoľahlivo doručiť notifikácie, keď skript príde na to, že niečo vypadlo.
Okrem toho často riešim problém, že spustím nejaký dlhší proces (často lokálna inferencia pomocou AI) a idem robiť niečo iné. Rád by som sa buď dozvedel, že proces skončil alebo ideálne rovno získal výstup (napríklad vo formáte markdown).
Na riešenie oboch týchto problémov máme viacero možností.
Dnes na to primárne používam White Noise a sekundárne SimpleX. Rovnaký kanál používam aj na komunikáciu s mojím agentom Hermes.
Signal
Signal vieme používať pomocou nástroja signal-cli. Ten som pôvodne aj používal v monitorovacom skripte, preto sa volá signal-monitoring. Má však viacero praktických problémov.
Prvým problémom je, že signal-cli je v Jave a aj napriek snom autorov Javy táto jednoducho nebeží všade. Aspoň nie až tak ľahko. Nakoniec sa mi ale signal-cli podarilo rozbehať všade, vrátane OpenWRT routra, takže tento problém som nejak prekonal.
Druhým problémom je nutnosť vytvárať účty a teda nutnosť existencie telefónneho čísla. To som vyriešil tiež, ale teraz sa musím starať o anonymné predplatené SIM karty, ktoré by ideálne nemali expirovať, čo predplatené SIMky väčšinou robia ak ich pravidelne nedobíjame.
Tretím problémom, kvôli ktorému som sa začal pozerať po alternatívach je, že anti-spam riešenie Signalu je CAPTCHA – a na to sa z pohľadu skriptu nemôžem spoľahnúť. Je pravda, že na notifikácie som CAPTCHA zatiaľ nepotreboval, ale túto situáciu by som nevedel automatizovane vyriešiť.
Matrix / Element / matrix-commander
Ďalšou možnosťou, ktorú som skúsil, je použiť matrix-commander a komunikačnú sieť Matrix. Nevýhodou je nutnosť vytvárať účty na Matrix serveroch a prípadne potreba bežať vlastný server. Infraštruktúra taktiež závisí od konkrétnych Matrix serverov.
Aj napriek tomu táto možnosť prakticky funguje veľmi dobre. Len vytváranie účtov je nepohodlné. Ak mám len jeden router, NAS, server, notebook, tak musím mať štyri rôzne účty, ktoré musia mať nejaké heslá, niekde sa registrovať, mať kľúče a komunikovať s mojimi zariadeniami.
Matrix má svoje problémy so synchronizáciou šifrovacích kľúčov, aj keď v tomto konkrétnom use-case sa zatiaľ neprejavili.
Nevýhoda je potreba Pythonu, ale ten mám všade, aj na routri, takže sa prakticky neprejavila.
Telegram
Lol
LXMF
LXMF je šifrovaný komunikačný protokol siete Reticulum. Pridal som ho najmä ako proof of concept, ale napríklad notifikácia o tom, že mi vypadol internet mi vie prísť po lokálnej sieti (vďaka mesh vlastnostiam siete Reticulum). Na notifikácie napríklad o teplote, stave stodoly a podobne je fajn aj to, že správu dokážem poslať cez LoRA rádio na pomerne veľkú vzdialenosť.
Jeden z fun projektov, ktorý som chcel týmto protokolom zrealizovať je notifikátor o tom, že mi prišla do schránky fyzická pošta. Mikro zariadenie na baterke s Lora modulom a detektorom pohybu a prípadne malou kamerkou.
Správy prichádzajú do komunikačného nástroja ako Meshchat alebo Sideband na mobile. Ak mám cestou dobre poprepájané nody, tak si správa nájde cestičku aj pri výpadku infraštruktúry.
Nevýhoda je potreba Pythonu, ale ten mám všade, aj na routri, takže sa prakticky neprejavila. A nemám pre to až taký use-case. Radšej by som mal nejaký messenger, ktorý používam na dennodennú komunikáciu, aby som si problém s nefunkčnosťou všimol včas – napríklad tým ako LXMF funguje je potrebné appku spustiť, keďže push notifikácie nemusia prísť.
Správy posielam jednoduchým Python skriptom.
Nostr
Nostr je na toto použitie relatívne fajn, aj keď stále je otázna spoľahlivosť a stabilita relays. Push notifikácie zatiaľ nie sú až také spoľahlivé. Na druhej strane nie je potrebné až tak vytvárať účty (stačí kľúčový pár), správy môžete redundantne doručiť na pár relays.
Nevýhoda je absencia súkromia, metadáta (kto, kedy a komu písal) sú viditeľné každému na relayoch. Sú novšie štandardy na správy, ale tie nie sú až také voľne rozšírené.
Čisto prakticky – Nostr správy si väčšinou nájdem keď sa pozriem do záložky so správami, nie ako notifikáciu.
O Reticulum a Nostr som nahral aj dva podcasty: Internet je pokazený, opravme ho – obchod s pozornosťou, nešifrovanie, centralizácia, identita, Internet je pokazený, opravme ho – Nostr, sieťové identity, aplikácie, value4value
White Noise
White Noise je messenger nad Nostr a šifrovaním skupín MLS. Účet je Nostr kľúč, takže sa k nemu dá ľahko pripojiť skript alebo agent s vlastnou identitou. Viac o ňom píšem v prehľade šifrovaných komunikátorov.
Na posielanie správ z programov slúži lokálny konektor wn-agent z Marmot Development Kit. Beží na stroji, má vlastnú Nostr identitu a je členom skupiny, v ktorej som aj ja. Na komunikáciu s ním mám malý nástroj wn-notify (jeden Python súbor bez závislostí), cez ktorý sú dostupné príkazy wn-msg, wn-stdin a wn-file:
wn-msg "backup finished on $(hostname)"
make test 2>&1 | tail -n 20 | wn-stdin
wn-file ./report.pdf "Nightly report"
Správu zadáte ako argument alebo cez stdin, súbor pošle wn-file s voliteľným popisom. Príkaz skončí, až keď konektor potvrdí, že správa odišla na relays (to ešte neznamená, že ju niekto prečítal). Ak potvrdenie nepríde, vypíše idempotency kľúč a rovnaký príkaz sa dá zopakovať bez toho, aby prišla správa dvakrát. Nemusím teda posielať nič do pozadia, ako pri SimpleX. Skupinu mám prednastavenú, takže z cronu alebo skriptu stačí napísať wn-msg.
Nevýhoda je viac príprav než pri SimpleX: musí bežať wn-agent a treba mu vytvoriť identitu aj skupinu. White Noise navyše zatiaľ nemá synchronizáciu viacerých zariadení.
Cez rovnaký konektor sa do White Noise pripája aj agent Hermes, s ktorým takto komunikujem. Správy z programov a rozhovor s agentom mi preto chodia na jedno miesto.
Third Ear
Písať agentovi na telefóne je pomalé, tak som si vyrobil Third Ear, hlasový klient pre White Noise na Android. Nahráva z telefónu, bluetooth slúchadiel, načúvacích prístrojov s LE Audio alebo z auta. Prepis sa robí priamo v telefóne a prepis alebo zvuk sa pošle do skupiny vo White Noise. Odpoveď agenta si môžem nechať prečítať nahlas. Aplikácia je zadarmo a open source (GPLv3), nájdete ju na Zapstore.
Third Ear plne podporuje slovenčinu, rozhranie aj rozpoznávanie reči. Prepis robí aplikácia Offline Speech to Text (OSTT), ktorá beží na zariadení a nepotrebuje internet.
SimpleX
Na posielanie správ cez SimpleX existuje CLI klient. Výhodou je, že nie je nutné vytvárať žiadne účty. Spustíte klienta, napíšete „meno“ a pripojíte sa do skupiny pomocou invite odkazu. Správy posielam priamo do skupiny, kde mám moje mobilné zariadenia aj laptop.
Nevýhodou je, že ak sa správa nepošle do času, kým program skončí, SimpleX negarantuje doručenie. Beh programu sa dá predĺžiť (parametrom -t), ale ani doručenie za 10 sekúnd nemusí stačiť, obzvlášť ak sa jedná o súbor. Preto je možno dobré nechať program bežať dlhšie (aj minútu) a len ho poslať do pozadia.
Ak sa správa nestihne odoslať, odošle sa pri opätovnom spustení klienta, keďže sa pred odoslaním ukladá do lokálnej databázy.
Keďže pre komunikáciu je vždy potrebné vytvoriť obvod a explicitne prijať každú žiadosť o pripojenie, SimpleX nerieši nijak spam, teda nehrozí ani CAPTCHA. Nie je zároveň nutné sa starať o kľúče, e-mailové adresy a účty. Pri písaní tohto článku som si nakoniec vybral práve SimpleX (so zálohou cez Matrix pre naozaj dôležité notifikácie). Dnes je u mňa druhý, hneď za White Noise.
Na svojich mašinách mám aj aliasy simplex-msg a simplex-file:
export SIMPLEX_DESTINATION="#monitoring"
function simplex-msg { (simplex-chat -t 20 -e "${SIMPLEX_DESTINATION} $*" >/dev/null &) ; }
function simplex-file { (simplex-chat -t 20 -e "/f ${SIMPLEX_DESTINATION} $*" > /dev/null &) ; }
Tieto mi dovolia poslať zo skriptu správu alebo súbor, bez ohľadu na to, na ktorom serveri alebo počítači som. Nemusím riešiť adresáta (alebo názov skupiny), toto mám všetko už prednastavené.
Simplex-chat u mňa vyhral po tom, ako začali publikovať skompilované binárky pre command-line rozhranie. Nevýhodou totiž je, že nie je až také jednoduché tento nástroj skompilovať. A bohužiaľ sa nenechádza v homebrew, takže ho z času na čas bude treba manuálne updatnuť (áno, homebrew používam ako používateľ – nie pod rootom – aj na Linuxe).
Na zálohy používam mimochodom restic, ktorý je tiež jedna samostatne stojaca binárka (aj keď ju používam občas aj s rclone, ktorý podporuje pcloud backend).
Záver
Hľadal som jednoduchý portabilný messenger, ktorý funguje z command-line, čo najjednoduchšie a bez potreby vytvárania účtov, registrácie, či prípadnej CAPTCHA. A ideálne bez toho, aby som musel bežať akúkoľvek server infraštruktúru, či inštalovať nejaké krkolomné frameworky (cieľ je, aby to fungovalo aj na čo najmenej výkonnom zariadení).
SimpleX má svoje muchy, preto sa naň nespolieham stopercentne. Je to ale dobrý kompromis medzi jednoduchosťou používania (bez registrácií, jedna jednoduchá binárka, žiadna infraštruktúra) a bezpečnosťou so súkromím (šifrovanie, ochrana metadát). Primárne však dnes používam White Noise. Používam ho aj na komunikáciu s agentom Hermes, takže spĺňa aj moju požiadavku na messenger, ktorý už aj tak používam.
Možnosť je aj používať ntfy, čo je nástroj presne určený na to, čo chcem. Má ale niekoľko nevýhod, napríklad horšie súkromie (prípadne nutnosť self-hostovať backend – čo keď vypadne ten?). Vadí mi však aj to, že je to samostatná aplikácia, chcel by som používať messenger, ktorý už aj tak na niečo používam, aby sa mi nestalo, že ho niekde zabudnem nainštalovať alebo spustiť.
