Blog

Hoe ik Baby Monitor Timmy bouw met GitHub Copilot

AI helpt me sneller werken. De verantwoordelijkheid voor Timmy blijft bij mij.

Baby Monitor Timmy begon met een eenvoudig idee: een babyfoon die de privacy thuis respecteert. Geen opnamen in de cloud, geen onnodige datastromen vanuit de babykamer. Wat veel mensen niet zien: ik bouw Timmy in mijn eentje in Zürich, en GitHub Copilot is mijn razendsnelle programmeermaatje.

De samenwerking tussen mens en AI

De verdeling is duidelijk: ik bepaal de functies, stel de prioriteiten en neem architectuurbeslissingen. Copilot helpt bij de uitvoering: code schrijven, tests toevoegen, bugs opsporen en releasestappen voorbereiden.

Een typische sprint ziet er voor mij ongeveer zo uit:

  1. Functiebeschrijving: Ik beschrijf wat de functie moet doen, inclusief uitzonderlijke gevallen en beperkingen.
  2. Implementatie: Copilot stelt code voor en volgt de bestaande conventies van het project.
  3. Testen: Geautomatiseerde end-to-endtests draaien op twee emulators en controleren de daadwerkelijke verbinding tussen het baby- en ouderapparaat.
  4. Distributie: Als de tests slagen, worden de Android- en iOS-builds klaargemaakt voor de juiste appstore- en testkanalen.

Deze cyclus herhaalt zich voor functies en bugfixes. Ik schrijf niet elke regel zelf, maar ik bepaal wat er wordt gebouwd, waarom het wordt gebouwd en of een voorstel bij Timmy past.

Van concept naar WebRTC

De centrale technische taak was vanaf het begin duidelijk: realtime audio en video tussen twee telefoons. WebRTC lag voor de hand, maar de integratie met Flutter is niet eenvoudig: ICE-candidates, SDP-onderhandeling, TURN-fallback en DataChannels moeten in de juiste volgorde samenwerken.

Copilot hielp me die onderdelen stap voor stap samen te brengen: de peerverbinding opzetten, de cruciale volgorde correct houden (DataChannel vóór offer, onTrack vóór setRemoteDescription) en signaling via Firebase Firestore regelen. Elk onderdeel moest op twee emulators draaien voordat ik verderging.

Veilig koppelen met ECDH

Een van de meest kritieke functies was het veilige koppelsysteem. Twee apparaten moeten wederzijds vertrouwen opbouwen zonder afhankelijk te zijn van een centrale server die hun identiteit bevestigt. De oplossing: een ECDH P-256-sleuteluitwisseling via Firebase, gecombineerd met een visueel verificatienummer (SAS) dat man-in-the-middleaanvallen detecteert.

Copilot hielp bij het implementeren van de cryptografische keten: sleutelgeneratie, uitwisseling van openbare sleutels, het afleiden van het gedeelde geheim, SAS-berekening en AES-256-GCM-versleuteling voor alle latere signalinggegevens. Ik stuur de koppelingssleutel niet naar de backend; alleen de SHA-256-hash ervan wordt gebruikt als ID van een Firestore-document.

Beveiligingsaudit: kwetsbaarheden vinden en oplossen

AI-ondersteunde ontwikkeling betekent voor mij niet alleen sneller typen. Het helpt ook bij het systematisch zoeken naar bugs. Tijdens een gerichte sprint voor een beveiligingsaudit analyseerde Copilot de codebase en vond zes problemen die ik moest oplossen:

Alle zes zijn in dezelfde sprint opgelost. Hier is Copilot sterk in: veel bestanden lezen, patronen vergelijken en plekken markeren die ik nauwkeuriger moet bekijken.

Iteratieve sprints: hoe de app zich ontwikkelde

Timmy groeide via snelle, maar duidelijk afgebakende sprints. Een paar mijlpalen:

Elke sprint volgt hetzelfde basispatroon: doel beschrijven, voorstellen beoordelen, automatisch testen en daarna naar testers sturen.

E2E-testen op meerdere apparaten

Je kunt een babyfoon niet goed testen op één apparaat. Ik heb één babyapparaat en één ouderapparaat nodig. Het project begon met twee Android-emulators die tegelijk draaiden. Inmiddels wordt die cyclus aangevuld met controles in de lokale iOS-simulator en op echte apparaten. Het geautomatiseerde Android-testscript doet nog steeds het volgende:

  1. Installeert de app op beide emulators
  2. Doorloopt het koppelen op beide apparaten
  3. Controleert of audio- en videoverbindingen tot stand komen
  4. Test push-to-talk, camerabediening en andere functies

Omdat beide emulators hetzelfde IP-adres delen (10.0.2.15), is een directe peer-to-peerverbinding via STUN onmogelijk. Elke testrun moet via de TURN-relay van Cloudflare lopen. Dat is vervelend, maar nuttig: zo wordt het ingewikkeldste verbindingspad elke keer getest.

Wat ik heb geleerd

Een complete app bouwen met een AI-programmeermaatje heeft me een paar dingen geleerd:

Vooruitblik

Baby Monitor Timmy blijft zich ontwikkelen. De iOS-release is dichtbij; daarna volgen extra sensorfuncties en wordt de beveiliging voortdurend verder aangescherpt. De werkwijze blijft vergelijkbaar: ik bepaal de richting en de grenzen, en Copilot helpt bij een snelle uitvoering en controle.

De beveiligingsrelevante bouwstenen zijn nu duidelijk afgebakend ondergebracht in de openbare repository baby-monitor-timmy-core. Daar zijn ook de architectuurbeslissingen over koppeling, signaling en backendinterfaces gedocumenteerd.


Meer artikelen