Baby Monitor Timmy begyndte med en enkel idé: en babyalarm, der respekterer privatlivet derhjemme. Ingen optagelser i skyen, ingen unødvendige dataveje ud af børneværelset. Det, mange ikke ser, er, at jeg bygger Timmy som soloprojekt i Zürich, og GitHub Copilot er min meget hurtige programmeringsmakker.
Samarbejdet mellem menneske og AI
Fordelingen er klar: Jeg definerer funktioner, sætter prioriteter og træffer arkitekturbeslutninger. Copilot hjælper med implementeringen: at skrive kode, tilføje tests, indkredse fejl og forberede udgivelsestrin.
En typisk sprint ser cirka sådan ud for mig:
- Funktionsbeskrivelse: Jeg beskriver, hvad funktionen skal gøre, inklusive særlige tilfælde og begrænsninger.
- Implementering: Copilot foreslår kode og følger projektets eksisterende konventioner.
- Test: Automatiserede end-to-end-tests kører på to emulatorer og kontrollerer den reelle forbindelse mellem baby- og forældreenheden.
- Distribution: Når testene består, klargøres Android- og iOS-builds til de rette appbutikker og testspor.
Denne cyklus gentages for funktioner og fejlrettelser. Jeg skriver ikke hver eneste linje selv, men jeg beslutter hvad der bliver bygget, hvorfor det bliver bygget, og om et forslag passer til Timmy.
Fra koncept til WebRTC
Den centrale tekniske opgave var klar fra starten: lyd og video i realtid mellem to telefoner. WebRTC var det oplagte valg, men integration med Flutter er ikke ligetil: ICE-kandidater, SDP-forhandling, TURN-fallback og DataChannels skal fungere sammen i den rigtige rækkefølge.
Copilot hjalp mig med at samle de dele trin for trin: opsætte peer-forbindelsen, holde den kritiske rækkefølge korrekt (DataChannel før offer, onTrack før setRemoteDescription) og lægge signalering på Firebase Firestore. Hver del skulle køre på to emulatorer, før jeg gik videre.
Sikker parring med ECDH
En af de mest kritiske funktioner var det sikre parringssystem. To enheder skal kunne oprette gensidig tillid uden at være afhængige af, at en central server bekræfter deres identitet. Løsningen: en ECDH P-256-nøgleudveksling over Firebase kombineret med et visuelt bekræftelsesnummer (SAS), der opdager man-in-the-middle-angreb.
Copilot hjalp med at implementere den kryptografiske kæde: nøglegenerering, udveksling af offentlige nøgler, udledning af en fælles hemmelighed, SAS-beregning og AES-256-GCM-kryptering af alle efterfølgende signaleringsdata. Jeg sender ikke parringsnøglen til backend; kun dens SHA-256-hash bruges som id for Firestore-dokumentet.
Sikkerhedsaudit: Find og ret sårbarheder
AI-assisteret udvikling er ikke kun hurtigere tastning for mig. Det hjælper også med systematisk fejljagt. I en fokuseret sprint med sikkerhedsaudit analyserede Copilot kodebasen og fandt seks problemer som jeg skulle rette:
- Manglende inputvalidering af signaleringsdata
- Mulige race conditions i håndteringen af ICE-kandidater
- Forældede sessionsdata, der ikke blev ryddet op korrekt
- Firestore-sikkerhedsregler, der var for lempelige
- Manglende overvejelser om certifikat-pinning
- Utilstrækkelig fejlhåndtering i TURN-legitimationsflowet
Alle seks blev rettet i samme sprint. Her er Copilot stærk: at læse mange filer, sammenligne mønstre og markere steder, jeg skal undersøge nærmere.
Iterative sprints: Sådan udviklede appen sig
Timmy voksede gennem hurtige, men tydeligt afgrænsede sprints. Nogle milepæle:
- v1.8: Komplet redesign af parring — 4-tegnskode + ECDH P-256 over Firebase erstattede den gamle tilgang med direkte nøgle.
- v1.10: Sprint med sikkerhedsforbedringer — audit- og rettelsescyklussen for de seks sårbarheder.
- v1.11: Mørk tilstand på alle skærme samt forsiden og bloggen, du læser lige nu.
- v1.12: Stor opdatering af forældreskærmen, nattesynstilstand og bevægelsesregistrering via analyse af kamerabilleder.
Hver sprint følger det samme grundmønster: Beskriv målet, gennemgå forslag, test automatisk, og send derefter til testere.
E2E-test på tværs af enheder
Du kan ikke teste en babyalarm ordentligt på én enhed. Jeg har brug for én babyenhed og én forældreenhed. Projektet begyndte med to Android-emulatorer, der kørte samtidig, og supplerer nu dette forløb med lokale iOS-simulatortests og tests på rigtige enheder. Det automatiserede Android-testscript gør stadig følgende:
- Installerer appen på begge emulatorer
- Går gennem parringen på begge enheder
- Kontrollerer, at lyd- og videoforbindelser bliver oprettet
- Tester push-to-talk, kamerastyring og andre funktioner
Da begge emulatorer deler den samme IP-adresse (10.0.2.15), er en direkte peer-to-peer-forbindelse via STUN umulig. Hver testkørsel skal gå gennem Cloudflares TURN-relæ. Det er irriterende, men nyttigt: Den mest komplicerede forbindelsesvej bliver testet hver gang.
Hvad jeg lærte
At bygge en komplet app med en AI-programmeringsmakker har lært mig nogle ting:
- Arkitektur betyder mere end nogensinde. Klare konventioner og en veldokumenteret kodebase hjælper AI'en med at foreslå ensartet kode. Tvetydighed bliver hurtigt dyr.
- Test er ikke til forhandling. AI-genereret kode kræver samme grundige test som menneskeskrevet kode. Automatiserede E2E-tests fangede problemer, som let kunne være overset manuelt.
- Mennesket er stadig med i processen. Alle arkitekturbeslutninger, alle sikkerheds- afvejninger og alle produktgrænser ligger stadig hos mig. AI gør implementeringen hurtigere, men erstatter ikke dømmekraft.
- Hastighed muliggør kvalitet. Fordi funktioner udgives på timer i stedet for dage, er der flere iterationer tilbage til finpudsning og fejlrettelser. Hurtigt betyder ikke automatisk godt.
Fremadrettet
Baby Monitor Timmy udvikler sig fortsat. iOS-udgivelsen er tæt på; derefter kommer flere sensorfunktioner og løbende sikkerhedsforbedringer. Arbejdsgangen forbliver den samme: Jeg sætter retning og grænser, og Copilot hjælper med at implementere og tjekke hurtigt.
De sikkerhedsrelevante byggesten er nu klart afgrænset i det offentligt tilgængelige kodearkiv baby-monitor-timmy-core. Det er også her, arkitekturbeslutningerne om parring, signalering og backendgrænseflader er dokumenteret.