Блог

Как я создаю Baby Monitor Timmy с GitHub Copilot

ИИ помогает мне двигаться быстрее. Но ответственность за Timmy всё равно остаётся на мне.

Проект Baby Monitor Timmy начался с простой идеи: создать радионяню, которая сохраняет конфиденциальность в доме. Никаких облачных записей и никаких лишних путей передачи данных за пределы детской. Мало кто знает, что я разрабатываю Timmy один, в Цюрихе, а GitHub Copilot — мой очень быстрый напарник по программированию.

Как мы работаем: человек и ИИ

Роли распределены чётко: я определяю функции, расставляю приоритеты и принимаю архитектурные решения. Copilot помогает с реализацией: пишет код, добавляет тесты, помогает локализовать ошибки и подготовить этапы выпуска.

Обычно мой спринт выглядит примерно так:

  1. Описание функции: Я описываю, как должна работать функция, включая нестандартные случаи и ограничения.
  2. Реализация: Copilot предлагает код и следует уже принятым в проекте правилам.
  3. Тестирование: Автоматические end-to-end тесты запускаются на двух эмуляторах и проверяют реальное соединение между устройствами ребёнка и родителя.
  4. Публикация: Когда тесты проходят, сборки Android и iOS готовятся для нужных магазинов и каналов тестирования.

Этот цикл повторяется для новых функций и исправлений. Я не пишу каждую строку сам, но решаю, что именно реализовать, зачем это нужно и подходит ли предложение для Timmy.

От идеи до WebRTC

Главная техническая задача с самого начала была понятна: передавать аудио и видео между двумя телефонами в реальном времени. WebRTC был очевидным выбором, но интегрировать его с Flutter непросто: ICE-кандидаты, согласование SDP, резервное подключение через TURN и DataChannels должны срабатывать в правильном порядке.

Copilot помог мне шаг за шагом связать эти части: настроить одноранговое соединение, соблюсти критически важный порядок (DataChannel до offer, onTrack до setRemoteDescription) и реализовать сигналинг через Firebase Firestore. Каждая часть должна была заработать на двух эмуляторах, прежде чем я двигался дальше.

Безопасное сопряжение с ECDH

Одной из самых важных функций была система безопасного сопряжения. Два устройства должны установить взаимное доверие, не полагаясь на центральный сервер, который подтверждал бы их подлинность. Решением стал обмен ключами ECDH P-256 через Firebase в сочетании с визуальным проверочным числом (SAS), позволяющим выявлять атаки «человек посередине».

Copilot помог реализовать всю криптографическую цепочку: генерацию ключей, обмен открытыми ключами, выработку общего секрета, вычисление SAS и шифрование всех последующих данных сигналинга с помощью AES-256-GCM. Я не отправляю ключ сопряжения на сервер: в качестве идентификатора документа Firestore используется только его хеш SHA-256.

Аудит безопасности: поиск и исправление уязвимостей

Разработка с ИИ для меня — это не только более быстрый набор кода. Она также помогает системно искать ошибки. В рамках отдельного спринта по аудиту безопасности Copilot проанализировал кодовую базу и нашёл шесть проблем, которые мне нужно было исправить:

Все шесть проблем были исправлены в том же спринте. В этом Copilot особенно силён: он читает множество файлов, сопоставляет повторяющиеся подходы и отмечает места, которые мне нужно изучить внимательнее.

Итеративные спринты: как развивалось приложение

Timmy развивался в быстрых, но чётко ограниченных спринтах. Вот несколько этапов:

Каждый спринт строится по одной схеме: описать цель, проверить предложения, автоматически протестировать, затем отправить тестировщикам.

E2E-тестирование на разных устройствах

Невозможно как следует протестировать радионяню на одном устройстве. Нужны устройство ребёнка и устройство родителя. Сначала в проекте одновременно использовались два эмулятора Android, а теперь этот цикл дополнен проверками в локальном симуляторе iOS и на реальных устройствах. Автоматизированный тестовый скрипт для Android по-прежнему:

  1. Устанавливает приложение на оба эмулятора
  2. Проходит сопряжение на обоих устройствах
  3. Проверяет установление аудио- и видеосоединения
  4. Тестирует push-to-talk, управление камерой и другие функции

Поскольку оба эмулятора используют один IP-адрес (10.0.2.15), прямое одноранговое соединение через STUN невозможно. Каждый запуск тестов должен проходить через ретранслятор Cloudflare TURN. Это неудобно, но полезно: при каждом тесте проверяется самый сложный путь соединения.

Чему я научился

Создание полноценного приложения с ИИ-напарником по программированию многому меня научило:

Что дальше

Baby Monitor Timmy продолжает развиваться. Релиз для iOS уже близко; затем появятся дополнительные возможности на основе датчиков и продолжится усиление безопасности. Рабочий процесс останется прежним: я задаю направление и границы, а Copilot помогает быстро реализовывать и проверять решения.

Компоненты, связанные с безопасностью, теперь чётко обособлены в публичном репозитории baby-monitor-timmy-core. Там же задокументированы архитектурные решения по сопряжению, сигналингу и интерфейсам бэкенда.


Другие статьи