Lab

Logá klientov nájdete na domovskej stránke; toto je iná vec. Máme vlastnú infraštruktúru a prevádzkujeme ju s disciplínou firmy, ktorá je desaťkrát väčšia — lebo je to miesto, kde si všetko otestujeme skôr, než by sme vám to navrhli. Každá z týchto vecí beží práve teraz. Nemenujeme „riešenia“, ale konkrétny softvér — všetko, čo je nižšie, si viete dohľadať a porovnať s tým, čo vám ponúka niekto iný.

Vlastný softvér · v ostrej prevádzke

Aplikácie, s ktorými musíme žiť

Situácia

Tri právne subjekty, tri účtovníctva a človek, ktorý každý mesiac prepisuje bankové výpisy do účtovného programu. Banka má API. Nikto ho nepoužíva, lebo open banking sa predáva bankám, nie firmám, ktoré v nich majú účet. Tak vznikla prvá z týchto aplikácií a tak vznikli aj ostatné — z vlastného problému, nie zo zadania. Nikto nám za ne nezaplatil, takže nič sa v nich neurobilo len preto, že to bolo v špecifikácii, a nikto nám ich ani neprevzal, takže sa ich nemáme ako zbaviť. Presne preto sú dobrá referencia: appka, ktorú musíte sami každý deň používať, vám do roka povie pravdu, ktorú by vám zákazník nepovedal nikdy.

Čo sme urobili

Každá z nich stojí na inom probléme a na inom kuse technológie — a všetky sme postavili aj prevádzkujeme sami.

Výsledok

Výpisy už neprepisuje nikto: jeden podpis pokryje celú dávku a koniec mesiaca, ktorý zožral celý večer, je dnes obrazovka, na ktorú sa pozriete. A rovnako ako účtovníctvo bežia aj ostatné. Žiadna z nich nie je prototyp, ktorý by sme niekomu ukazovali a potom vypli — sú to veci, ktoré sami používame, a keď sa pokazia, pokazia sa nám. To je celý rozdiel oproti demu.

Čo je v nich

  • Quvanto

    Účtovníctvo pre tri právne subjekty. FastAPI nad PostgreSQL, výpisy sa čítajú cez pdfplumber, faktúry vznikajú ako PDF cez WeasyPrint aj s by-square QR kódom. Platby odchádzajú buď ako SEPA XML vo formáte pain.001.001.03 na import do internetbankingu, alebo priamo cez platobné API banky, kde sa prístup k účtu aj zadanie platby vybavia jedným overením: celá dávka z jednej obrazovky a s jedným podpisom.

  • OZORApp

    PWA pre tridsaťjeden ľudí na festivale v Maďarsku, kde nie je signál: PHP bez databázy, stav v súboroch a service worker, ktorý appku otvorí aj bez pripojenia. Kto si označí sety, dostane upozornenie, keď sa mu dva prekryjú — aj s tým, o ktoré vystúpenia ide. A porovnanie lineupu s tým, čo naozaj počúva v Spotify — nič sa nepridá samo, len sa to ponúkne.

  • Objatie

    Dvaja partneri si nezávisle nastavia očakávania naprieč témami vzťahu a appka im ich potom odkrýva tému po téme — vždy len to, čo si už odhalili navzájom. Laravel 11 bez build kroku, na dvoch doménach z jedného kódu, dáta v PostgreSQL a celý priebeh sa dá prejsť anonymne, bez účtu. AI komentár k výsledku dostane len názvy osí a hrubé pásmo, nikdy surové odpovede.

  • Inzerátor

    Predáva na Bazoši: nafotíte tovar, model ho rozpozná, cez našu vlastnú vyhľadávaciu službu dohľadá trhovú cenu a napíše slovenský inzerát; vy ho potvrdíte a appka ho zverejní. Model volá tú istú bránu ako všetko ostatné, takže appka nedrží kľúč k žiadnemu poskytovateľovi. A keďže Bazos blokuje IP adresu hostingu, prácu robí démon doma, ktorý nemá otvorený jediný port dovnútra a úlohy si preberá cez notifikáciu z databázy.

  • Health Bro

    FastAPI backend nad PostgreSQL, dostupný len cez VPN. Zbiera dáta z prsteňa a z Garminu a spája ich s tým, čo hodinky nevidia: doplnky, tréningy, laboratórne výsledky, ciele. Z toho skladá stav pripravenosti na dnešok — či ísť naplno, alebo cúvnuť. Testovacieho kódu je zhruba toľko čo produkčného a každé varovanie padá ako chyba.

Čo nás to naučilo

Učili sme sa postupne a každá z nich na inej vrstve.

OZORApp nás naučila, že „offline-first" nie je o vypnutej sieti, ale o sieti, ktorá klame: na maďarskej EDGE sieti sa volanie na server ani nesplnilo, ani neodmietlo — len viselo, takže service worker donekonečna čakal na odpoveď a aplikácia sa nenačítala vôbec, hoci ju mal človek celú v cache. Odvtedy nemáme v žiadnom projekte sieťové volanie bez vlastného timeoutu.

Inzerátor nás naučil čítať prekážku správne: keď WAF na strane Bazosu blokuje IP adresu hostingu, zlá odpoveď je prevŕtať dieru do domácej siete; správna je otočiť smer a nechať démona počúvať na databázovom kanáli.

Health Bro nás naučil, že meno poľa nie je kontrakt — pole s menom, ktoré sľubovalo sedem dní, potichu nosilo päťdesiatdeväť a objem dát posielaných modelu narástol na stotridsať kilobajtov skôr, než si to niekto všimol.

Objatie nás naučilo, že chyba nemusí byť v kóde: deploy nahrával len časť repozitára, takže registrácia, ktorá ležala v nenahranom súbore, fungovala lokálne a v ostrej prevádzke padala na päťstovku.

A účtovníctvo nás naučilo to najdrahšie: kód nikdy nebol to najťažšie. Bankový súhlas expiruje zhruba každý deň, kým prístupový token žije mesiace — token sa teda vesele obnovuje nad súhlasom, ktorý je už mŕtvy, banka vráti chybu, ktorá o súhlase nepovie ani slovo, a vy hľadáte chybu vo svojom kóde. V dokumentácii to nenájdete. Nájdete to večer pred splatnosťou odvodov, keď dávka, ktorá minulý mesiac prešla, zrazu neprejde.

Ako to vyzerá u vás

Koľko hodín mesačne u vás niekto ručne presúva čísla z jedného systému do druhého? Nevideli sme zatiaľ prípad, kde by prekážkou bola technika — vždy to bolo tým, že to nikto nemal ako svoju úlohu. A nepredávame vám hotovú appku: predávame to, že tie svoje musíme sami udržiavať, takže viete, čo dostanete, aj čo sa na tom o rok pokazí. Prvá otázka býva vždy rovnaká a nie je technická: čo z toho, čo dnes niekto robí ručne, sa vôbec oplatí napísať ako softvér? Časť odpovedí býva „nič, kúpte si to".

Ako to vyzerá

Program festivalu s filtrami: pruh dní, zapnutý prepínač „Zo Spotify", filtre podľa typu a scény, pod nimi zoznam vystúpení s notovou značkou.
OZORApp — 385 setov porovnaných s tým, čo naozaj počúvaš. Nota pri interpretovi znamená „toto máš v Spotify". Nič sa nepridá samo, len sa to ponúkne.
Zoznam vystúpení, dva označené hviezdičkou a pri každom upozornenie na kolíziu s konkrétnymi menami interpretov.
OZORApp — kolízie. Hviezdička je „idem"; keď sa dva označené sety časovo prekryjú, appka to napíše rovno do zoznamu a menuje, s čím.
Obrazovka s výsledkom: kruhový ukazovateľ osemdesiatštyri percent zhody pre ukážkovú dvojicu.
Objatie — výsledok porovnania dvojice.
Porovnanie jednotlivých tém: pri každej posuvník a hodnoty oboch partnerov vedľa seba.
Objatie — téma po téme. Odhalí sa vždy len to, čo si obaja navzájom odhalili.

Snímky sú z ukážkových dát, nie z účtov skutočných ľudí.

Oficiálne festivalové appky mám v telefóne aj z Pohody, aj z Grapeu. Po dvoch dňoch ich prestanem otvárať. Túto sme na Ozore otvárali celý týždeň — bola jediná, čo fungovala aj tam, kde nebol signál, a jediná, v ktorej som videla, kam ide zvyšok partie.

Lenka OZORApp · OZORA Festival 2026

Agentizácia · v ostrej prevádzke

Jedna brána, všetky modely, žiadne shadow AI

Situácia

Modely od štyroch rôznych poskytovateľov, niekoľko aplikácií, ktoré ich chcú — a predvolený výsledok: kľúče nakopírované všade, kde bolo treba, žiadny rozpočet, žiadny audit, žiadna predstava o tom, čo odchádza z budovy.

Čo sme urobili

Všetko ide cez LiteLLM. Dvadsať ciest k modelom, kľúče vydané na projekt a viazané na konkrétne modely, rozpočty na projekt, stopa o tom, čo kam odišlo. Lokálne modely bežia na Ollame na vlastnej karte — vrátane bge-m3, ktorý počíta embeddingy pre vyhľadávanie v slovenčine za nejakých stopäťdesiat milisekúnd, takže dokumenty, v ktorých sa hľadá, nikam neodchádzajú. Nad tým agenti, ktorí prácu rovno vykonajú: bežia na pravidelnom rozvrhu, bez dozoru, čítať smú všetko, zapísať až po potvrdení.

Výsledok

Každá aplikácia klope na jedny dvere. Vymeniť poskytovateľa znamená zmeniť konfiguráciu, nie prehrabávať repozitáre. A na otázku „čo sme komu poslali“ existuje odpoveď — presne na tú sa totiž pýta audítor.

Čo nás to naučilo

Skôr než to išlo naostro, dali sme vlastný návrh na adversariálne review štyrom expertom. Našli cestu, ktorou mohol agent vyniesť vlastné prihlasovacie údaje, a overili, že naozaj funguje — v našom nástroji, na ktorý sme sa práve chystali spoľahnúť. Opravili sme to, fix overili a sandbox okolo utiahli: default-deny egress, read-only súborový systém, odobraté právomoci. Poučenie platí všeobecne: allowlist nástrojov, ktorý stráži schopnosť, ale nestráži cestu, je celá trieda zraniteľností. Odvtedy predpokladáme, že každé „prečítaj“ znamená „prečítaj čokoľvek“. Tú dieru u nás nenašiel nikto cudzí. Našli sme ju my, vo vlastnom návrhu, skôr než stihla niečo znamenať.

Ako to vyzerá u vás

Vaši vývojári už teraz lepia kód do chatovacieho okna — len to nevidíte. Jedna brána, kľúče pre každý tím, rozpočty, audit log a citlivá robota pripnutá na model, ktorý zostane vnútri. Prvý krok býva dvojtýždňový audit s písomným verdiktom.

Infraštruktúra · migrácia

Sťahovanie siete za plnej prevádzky

Situácia

Domáci router od operátora, ktorý robil DNS, DHCP aj VPN pre všetko, bez akéhokoľvek prehľadu a bez možnosti čokoľvek segmentovať. Vymeniť ho znamená vymeniť tri služby, na ktorých potichu visí každá ďalšia.

Čo sme urobili

MikroTik RB5009 preberal jednu službu po druhej, každú s cestou späť, počas dvoch dní. Najprv DNS, potom DHCP, potom WireGuard — nikdy naraz. Keď sa na WireGuard presunul posledný klient, starú OpenVPN sme zrušili. WiFi sme skonsolidovali na Omada AP riadené vlastným controllerom a hosťovskú aj IoT prevádzku oddelili do vlastných SSID.

Výsledok

Starý router sme fyzicky odpojili dva dni po spustení nového. Používateľom sme nič neoznamovali, lebo nebolo čo. Stará VPN je preč — nie vypnutá, preč.

Čo nás to naučilo

Nesťahujte DNS, DHCP a VPN naraz. Je to lákavé, lebo je to jeden večer namiesto troch, a je to presne tá cesta, na konci ktorej ladíte resolver cez VPN, ktorá na tom resolveri visí. Poskladajte ich za sebou a starú cestu držte nažive, kým sa nepresunie posledný klient — nie kým si myslíte, že sa presunul. A ešte jedno: keď je router jediný resolver v sieti, je to jediný bod, ktorý zhasne úplne všetko. My na to máme samostatné alert pravidlo, lebo raz nám tichá zmena resolvera odstrihla riadenie domácnosti a hodinu sme hľadali úplne inde.

Ako to vyzerá u vás

Vo firme s dvesto ľuďmi to vyzerá rovnako: riziko nie je v migrácii, ale v závislosti, ktorú si nikto nenakreslil. Skôr než sa niečoho dotkneme, zmapujeme, čo na čom visí, a prechod poskladáme tak, aby sa každý jeden krok dal vrátiť za pár minút.

Monitoring · od nuly

Monitoring, ktorému sa dá veriť o tretej ráno

Situácia

Kopa systémov a žiadna odpoveď na jedinú otázku, na ktorej záleží: beží to celé, a ak nie, čo spadlo prvé?

Čo sme urobili

Prometheus, Grafana a Alertmanager, postavené od nuly. Trinásť zberných úloh, sedemdesiat alert pravidiel, štrnásť dashboardov. Exportéry na všetko vrátane železa: node_exporter, cAdvisor, smartctl na disky, blackbox na sondy, mktxp na router a exportér na WiFi controller. DNS kontrola sa pýta resolvera na reálnu rekurziu, takže prejde len vtedy, keď naozaj odpovie. Alerty sa navzájom tlmia a chodia do Signalu cez vlastný most, takže mŕtvy resolver zavolá raz, nie štyridsaťkrát.

Výsledok

Pod dohľadom je každá služba — vrátane teploty GPU a dní do expirácie certifikátu. A keď niečo spadne, prvý alert pomenuje príčinu; hlásenia o následkoch sa potlačia. A nad všetkým je status stránka, ktorá na otázku „beží to celé?" odpovie za tri sekundy z mobilu, bez prehrabávania sa dashboardmi.

Čo nás to naučilo

Audit, ktorý k tomu patril, odhalil, že časť našich záloh bola len atrapa — spustila sa a neobnovila nič. Prišli sme si na to sami, opravili to a odvtedy testujeme obnovy, nie zálohy. Záloha, ktorú ste nikdy neobnovili, nie je záloha — je to presvedčenie. Nás to poučenie nestálo nič, lebo sme si poň išli. Väčšinou stojí všetko.

Ako to vyzerá u vás

Otázka nie je, či máte Grafanu. Otázka je, či alert o tretej ráno niečo znamená a či ho ešte vôbec niekto číta. Staviame alert pravidlá s tlmením, aby vás jedna mŕtva závislosť nezobudila štyridsaťkrát a nenaučila tím ignorovať všetky.

Zálohy · odmerané

Zálohy, ktoré prežijú aj útočníka s právami roota

Situácia

Zálohy na disku vedľa servera sú zálohy dovtedy, kým niekto nezašifruje aj ten disk. Pravidlo 3-2-1 — tri kópie, dve rôzne médiá, jedna mimo budovy — pozná každý; dodržané ho vidno málokedy, lebo tá jedna mimo budovy znamená buď mesačný účet u cloudu, alebo krabicu u niekoho, komu musíte veriť.

Čo sme urobili

Offsite prijímač je jednodoskový ARM počítač s externým diskom, fyzicky v inom meste, dosiahnuteľný výhradne cez WireGuard. Beží na ňom rest-server v režime append-only a restic šifruje ešte u klienta — takže ten vzdialený disk je z pohľadu dôvernosti hlúpe úložisko a heslo k repozitáru je jediné, čo treba chrániť. Desať pravidelných jobov, GFS retencia, a každý z nich má vlastné alert pravidlo v Prometheu.

Výsledok

Append-only znamená, že kompromitovaný zdrojový server nevie prepísať ani zmazať históriu záloh. Môže pridať nové dáta. K starým sa už nedostane. Prune beží z tretieho stroja v krátkom okne, takže právo mazať existuje pár minút denne a nie je na tom stroji, na ktorý sa útočí.

Čo nás to naučilo

Merali sme, lebo sme si mysleli, že nočný beh je pomalý kvôli linke. Nebol. Deväť desatín nočného behu je skenovanie miliónov nezmenených súborov na zdroji; samotný prenos je zlomok, lebo hore ide rádovo gigabajt zmien. Keby sme neboli merali, boli by sme mesiac ladili prijímač, ktorý sa nudí. Druhá vec je rovnako dôležitá: táto zostava prežije kompromitáciu jadra siete, ale neprežije kompromitáciu stroja, z ktorého sa zálohy riadia. Hranicu systému treba napísať rovnako presne ako jeho schopnosti, inak si ju čitateľ domyslí väčšiu, než je.

Ako to vyzerá u vás

Dve otázky, na ktorých sa to láme, a ani jedna nie je o softvéri: kedy ste naposledy skutočne obnovili súbor zo zálohy, a vie váš zálohovací systém prežiť útočníka, ktorý získa práva na zálohovanom stroji? Ak je odpoveď na prvú „nepamätám sa“, druhú už netreba riešiť.

Začnite hodinou

Žiadna prezentácia, žiadne úvodné analýzy, žiadna faktúra. Jedna hodina a rovná odpoveď: toto by sme spravili, toľko to stojí — alebo na toto nás nepotrebujete.

Ozvite sa