Baby Monitor Timmy vznikl z jednoduché myšlenky: dětská chůvička, která respektuje soukromí doma. Žádné nahrávky v cloudu, žádné zbytečné přenosy dat z dětského pokoje. Co mnoho lidí nevidí: Timmy vyvíjím sám v Curychu a GitHub Copilot je můj velmi rychlý programátorský parťák.
Spolupráce člověka a AI
Rozdělení rolí je jasné: definuji funkce, určuji priority a rozhoduji o architektuře. Copilot pomáhá s implementací: píše kód, přidává testy, zužuje okruh možných chyb a připravuje kroky pro vydání.
Můj typický sprint zhruba vypadá takto:
- Popis funkce: Popíšu, co má funkce dělat, včetně okrajových případů a omezení.
- Implementace: Copilot navrhuje kód a drží se zavedených pravidel projektu.
- Testování: Automatizované end-to-end testy běží na dvou emulátorech a ověřují skutečné spojení mezi zařízením dítěte a rodiče.
- Distribuce: Když testy projdou, připraví se verze pro Android a iOS do správných obchodů a testovacích kanálů.
Tento cyklus se opakuje u nových funkcí i oprav chyb. Nepíšu každý řádek sám, ale rozhoduji co se bude vyvíjet, proč se to vyvíjí a zda daný návrh pro Timmy dává smysl.
Od nápadu k WebRTC
Hlavní technický úkol byl od začátku jasný: zvuk a video v reálném čase mezi dvěma telefony. WebRTC byla jasná volba, ale jeho integrace s Flutterem není jednoduchá: kandidáti ICE, vyjednávání SDP, záložní TURN a DataChannely musí fungovat společně ve správném pořadí.
Copilot mi pomohl tyto části postupně propojit: nastavit peer connection, zachovat správné kritické pořadí (DataChannel před offer, onTrack před setRemoteDescription) a umístit signalizaci do Firebase Firestore. Každá část musela fungovat na dvou emulátorech, než jsem pokračoval dál.
Bezpečné párování pomocí ECDH
Jednou z nejdůležitějších funkcí byl systém bezpečného párování. Dvě zařízení si potřebují vzájemně vytvořit důvěru, aniž by se spoléhala na centrální server, který potvrzuje jejich identitu. Řešení: výměna klíčů ECDH P-256 přes Firebase v kombinaci s vizuálním ověřovacím číslem (SAS), které odhalí útoky typu man-in-the-middle.
Copilot pomohl implementovat kryptografický řetězec: generování klíčů, výměnu veřejných klíčů, odvození sdíleného tajemství, výpočet SAS a šifrování AES-256-GCM pro všechna následná signalizační data. Párovací klíč neposílám na backend; jako identifikátor dokumentu Firestore se používá jen jeho hash SHA-256.
Bezpečnostní audit: hledání a oprava zranitelností
Vývoj s pomocí AI pro mě neznamená jen rychlejší psaní. Pomáhá také se systematickým hledáním chyb. Během zaměřeného sprintu bezpečnostního auditu Copilot analyzoval kódovou základnu a našel šest problémů které jsem potřeboval opravit:
- Chybějící ověřování vstupů u signalizačních dat
- Možné souběžné konflikty při zpracování kandidátů ICE
- Zastaralá data relace, která se správně neodstraňovala
- Příliš benevolentní bezpečnostní pravidla Firestore
- Chybějící zohlednění připnutí certifikátu (certificate pinning)
- Nedostatečné zpracování chyb při práci s přihlašovacími údaji TURN
Všech šest problémů se opravilo ve stejném sprintu. Právě tady je Copilot silný: čte mnoho souborů, porovnává vzorce a označuje místa, která musím podrobněji prověřit.
Iterativní sprinty: jak se aplikace vyvíjela
Timmy rostl v rychlých, ale jasně vymezených sprintech. Některé milníky:
- v1.8: Kompletní přepracování párování — 4znakový kód + ECDH P-256 přes Firebase nahradily původní přístup s přímým klíčem.
- v1.10: Sprint zaměřený na posílení zabezpečení — audit šesti zranitelností a jejich oprava.
- v1.11: Tmavý režim na všech obrazovkách a také domovská stránka a blog, který právě čtete.
- v1.12: Velké přepracování rodičovské obrazovky, režim nočního vidění a detekce pohybu pomocí analýzy snímků z kamery.
Každý sprint má stejný základní postup: popsat cíl, zkontrolovat návrhy, automaticky otestovat a pak předat testerům.
E2E testování napříč zařízeními
Dětskou chůvičku nelze pořádně otestovat na jednom zařízení. Potřebuji jedno zařízení pro dítě a jedno pro rodiče. Projekt začal se dvěma současně běžícími emulátory Androidu a nyní tento proces doplňují kontroly v místním simulátoru iOS a na skutečných zařízeních. Automatizovaný testovací skript pro Android stále:
- Nainstaluje aplikaci na oba emulátory
- Provede procesem párování na obou zařízeních
- Ověří navázání zvukového a obrazového spojení
- Testuje push-to-talk, ovládání kamery a další funkce
Protože oba emulátory sdílejí stejnou IP adresu (10.0.2.15), není přímé peer-to-peer spojení přes STUN možné. Každý test musí projít přes relé Cloudflare TURN. Je to nepříjemné, ale užitečné: při každém spuštění se testuje nejsložitější cesta připojení.
Co jsem se naučil
Vývoj kompletní aplikace s programátorským parťákem AI mě naučil několik věcí:
- Architektura je důležitější než kdy dřív. Jasná pravidla a dobře zdokumentovaná kódová základna pomáhají AI navrhovat konzistentní kód. Nejasnosti se rychle prodraží.
- Testování není volitelné. Kód vytvořený AI potřebuje stejně důkladné testování jako kód napsaný člověkem. Automatizované E2E testy zachytily problémy, které by při ručním testování šlo snadno přehlédnout.
- Člověk zůstává součástí procesu. Každé rozhodnutí o architektuře, každý bezpečnostní kompromis i hranice produktu zůstávají na mně. AI urychluje implementaci, ale nenahrazuje úsudek.
- Rychlost umožňuje kvalitu. Protože se funkce dostanou ven za hodiny místo dnů, zbývá více iterací na doladění a opravy chyb. Rychlost sama o sobě neznamená kvalitu.
Co dál
Baby Monitor Timmy se dál vyvíjí. Vydání pro iOS je blízko; poté přijdou další funkce se senzory a průběžné posilování zabezpečení. Postup zůstává podobný: já určuji směr a hranice, Copilot pomáhá s rychlou implementací a kontrolou.
Bezpečnostně důležité stavební bloky jsou nyní jasně oddělené a nacházejí se ve veřejném repozitáři baby-monitor-timmy-core. Tam jsou také zdokumentována architektonická rozhodnutí týkající se párování, signalizace a rozhraní backendu.