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á
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.