Baby Monitor Timmy nastao je iz jednostavne ideje: monitora za bebe koji poštuje privatnost u domu. Bez snimki u oblaku i bez nepotrebnog slanja podataka iz dječje sobe. Ono što mnogi ne vide jest da Timmy razvijam samostalno u Zürichu, a GitHub Copilot moj je vrlo brzi programerski partner.
Suradnja čovjeka i AI-ja
Podjela je jasna: ja definiram značajke, postavljam prioritete i donosim arhitekturne odluke. Copilot pomaže u implementaciji: pisanju koda, dodavanju testova, pronalaženju uzroka grešaka i pripremi izdanja.
Moj tipičan sprint otprilike izgleda ovako:
- Opis značajke: Opisujem što značajka treba raditi, uključujući rubne slučajeve i ograničenja.
- Implementacija: Copilot predlaže kôd i prati postojeće konvencije projekta.
- Testiranje: Automatizirani end-to-end testovi rade na dva emulatora i provjeravaju stvarnu vezu između djetetova i roditeljskog uređaja.
- Distribucija: Kad testovi prođu, pripremaju se verzije aplikacije za Android i iOS za odgovarajuće trgovine i kanale za testiranje.
Ovaj se ciklus ponavlja za nove značajke i ispravke grešaka. Ne pišem svaku liniju sâm, ali odlučujem što se izrađuje, zašto se izrađuje i odgovara li prijedlog Timmyju.
Od koncepta do WebRTC-a
Središnji tehnički zadatak od početka je bio jasan: zvuk i video u stvarnom vremenu između dvaju telefona. WebRTC je bio očit izbor, no integracija s Flutterom nije jednostavna: ICE kandidati, SDP pregovaranje, rezervna veza putem TURN-a i DataChannel kanali moraju djelovati zajedno pravilnim redoslijedom.
Copilot mi je pomogao povezati te dijelove korak po korak: postaviti peer vezu, zadržati ispravan redoslijed ključnih koraka (DataChannel prije ponude, onTrack prije setRemoteDescription) i signalizaciju smjestiti u Firebase Firestore. Svaki je dio morao raditi na dva emulatora prije nego što sam nastavio dalje.
Sigurno uparivanje uz ECDH
Među najvažnijim značajkama bio je siguran sustav uparivanja. Dva uređaja moraju uspostaviti međusobno povjerenje bez oslanjanja na središnji poslužitelj koji jamči za njihov identitet. Rješenje je razmjena ključeva ECDH P-256 putem Firebasea, u kombinaciji s vizualnim brojem za provjeru (SAS) koji otkriva napade posrednika.
Copilot je pomogao implementirati cijeli kriptografski postupak: generiranje ključeva, razmjenu javnih ključeva, izvođenje zajedničke tajne, izračun SAS-a i šifriranje svih kasnijih signalizacijskih podataka algoritmom AES-256-GCM. Ključ za uparivanje ne šaljem pozadinskom sustavu; samo se njegov kriptografski sažetak SHA-256 upotrebljava kao identifikator dokumenta u Firestoreu.
Sigurnosna revizija: pronalaženje i otklanjanje ranjivosti
Razvoj uz pomoć AI-ja za mene nije samo brže tipkanje. Pomaže i u sustavnom traženju grešaka. U fokusiranom sprintu sigurnosne revizije Copilot je analizirao bazu koda i pronašao šest problema koje sam morao ispraviti:
- Nedostatak provjere valjanosti ulaznih signalizacijskih podataka
- Moguća stanja utrke pri obradi ICE kandidata
- Podaci iz zastarjelih sesija koji se nisu pravilno uklanjali
- Preširoko postavljena sigurnosna pravila Firestorea
- Nije razmotrena potreba za prikvačivanjem certifikata
- Nedovoljno rukovanje pogreškama u postupku dohvaćanja vjerodajnica za TURN
Svih šest problema ispravljeno je u istom sprintu. Tu je Copilot snažan: čita mnogo datoteka, uspoređuje obrasce i označava mjesta koja trebam pažljivije provjeriti.
Iterativni sprintovi: kako se aplikacija razvijala
Timmy se razvijao kroz brze, ali jasno omeđene sprintove. Neke od prekretnica bile su:
- v1.8: Potpuno redizajnirano uparivanje — kod od 4 znaka + ECDH P-256 preko Firebasea zamijenili su stari pristup s izravnim ključem.
- v1.10: Sprint za jačanje sigurnosti — revizija i uklanjanje šest ranjivosti.
- v1.11: Tamni način rada na svim zaslonima, plus početna stranica i blog koji upravo čitate.
- v1.12: Veliko preuređenje roditeljskog zaslona, način noćnog vida i otkrivanje pokreta analizom kadrova kamere.
Svaki sprint slijedi isti osnovni obrazac: opiši cilj, pregledaj prijedloge, automatski testiraj, zatim pošalji testerima.
E2E testiranje na više uređaja
Monitor za bebe ne može se pravilno testirati na samo jednom uređaju. Trebaju mi jedan uređaj postavljen uz dijete i jedan roditeljski uređaj. Projekt je počeo s dva Android emulatora koja rade istodobno, a taj se postupak sada nadopunjuje lokalnim provjerama u simulatoru iOS-a i na stvarnim uređajima. Automatizirana skripta za testiranje Androida i dalje:
- Instalira aplikaciju na oba emulatora
- Prolazi kroz uparivanje na oba uređaja
- Provjerava uspostavljaju li se audio i video veze
- Testira govor pritiskom na gumb, upravljanje kamerom i druge značajke
Budući da oba emulatora dijele istu IP adresu (10.0.2.15), izravna veza između ravnopravnih uređaja putem STUN-a nije moguća. Svako testiranje mora proći kroz Cloudflareov relejni poslužitelj TURN. To je nezgodno, ali korisno: svaki se put testira najsloženiji način povezivanja.
Što sam naučio
Izrada potpune aplikacije uz AI programerskog partnera naučila me nekoliko stvari:
- Arhitektura je važnija nego ikad. Jasne konvencije i dobro dokumentirana baza koda pomažu AI-ju da predlaže dosljedan kôd. Nejasnoće brzo postaju skupe.
- Testiranje je obvezno. Kôd koji generira AI treba jednako rigorozno testirati kao i kôd koji pišu ljudi. Automatizirani E2E testovi otkrili su probleme koje bi bilo lako propustiti pri ručnom testiranju.
- Čovjek zadržava nadzor. Za svaku arhitekturnu odluku, svaki sigurnosni kompromis i svaku odluku o opsegu proizvoda odgovoran sam ja. AI ubrzava implementaciju, ali ne može zamijeniti prosudbu.
- Brzina omogućuje kvalitetu. Budući da se značajke isporučuju za nekoliko sati umjesto dana, ostaje više iteracija za dotjerivanje i ispravljanje grešaka. Brzo ne znači automatski i dobro.
Pogled unaprijed
Baby Monitor Timmy nastavlja se razvijati. Izdanje za iOS uskoro stiže; nakon toga slijede dodatne senzorske značajke i kontinuirano jačanje sigurnosti. Postupak ostaje sličan: ja određujem smjer i granice, a Copilot pomaže u brzoj implementaciji i provjeri.
Sigurnosno važni sastavni dijelovi sada se nalaze unutar jasno definiranih granica u javnom repozitoriju baby-monitor-timmy-core. Ondje su dokumentirane i arhitekturne odluke o uparivanju, signalizaciji i backend sučeljima.