Живой privacy-first PWA: семья ведёт визиты, лекарства и анализы локально, без облака.
Детали проекта
- Цифра
- 61/100 · UX-аудит по WCAG 2.2 на старте
- Роль
- Одна, от идеи до прода
- Формат
- PWA, local-first
- Платформа
- Веб / iPhone-first
- Статус
- Живой прод
Главное за 30 секунд
Что было плохо
Семьи теряют медицинскую историю, а пациенты на сложных схемах забывают, что и когда принимали.
Выписки в Google Drive, анализы в почте, заметки педиатра в WhatsApp. Когда врач спрашивает дату последнего анализа, ответ приходится собирать по трём сервисам. Бабушка забывает, приняла ли таблетку.
Существующие сервисы (СберЗдоровье, Яндекс Здоровье) это маркетплейсы клиник, а не личный архив: требуют аккаунт и собирают данные. Личного, приватного, локального инструмента нет.
Точка отсчёта: UX-аудит по WCAG 2.2
Аудит вскрыл провалы контраста на стекле, невидимый focus-ring, отсутствие alt-текстов и «тихое» закрытие форм без обратной связи. Это стало триггером редизайна.
Тестирование
Тестировщик испугался потерять данные, хотя бэкап уже был
Напоминание о копии переехало на главный экран: появляется, когда есть записи и давно не было бэкапа, скачивание в одно нажатие. Сделано в тот же день, дата и источник видны в истории.
Полный разбор
Процесс
«Если я сейчас очищу браузер, то потеряю свой профиль навсегда?» Вопрос первого стороннего пользователя, 25 июня, зафиксирован в истории репозитория. Механизм резервной копии на тот момент существовал, но жил в настройках, и человек его не нашёл.
Гипотеза
В local-first продукте данные живут только на устройстве, поэтому заметность бэкапа это вопрос доверия, а не удобства. Возможность, которую пользователь не нашёл, для него не существует.
Чем заплатила
Бэкап остался ручным: о нём нужно вспомнить и нажать. Мультидевайса нет, облачная синхронизация вынесена в роадмап отдельным решением.
Тестирование
Поле даты пропускало год 275760
Один общий валидатор дат и возраста с границами 0..150 лет вместо четырёх локальных копий, подсказка «Проверьте год» прямо у поля. Закреплено тестом.
Полный разбор
Процесс
Тестировщик прислал скриншот: возраст отображался как «−273735 лет». Стандартное поле даты не ограничивает год, и абсурдное значение спокойно уходило в записи.
Гипотеза
Предотвращение ошибки сильнее её исправления (эвристика Нильсена №5). Одна проверка вместо четырёх значит, что правило нельзя забыть в новом месте.
Чем заплатила
Жёсткие границы отсекают экзотику: дату старше 150 лет не ввести даже нарочно. Для семейного медицинского журнала это осознанное ограничение.
Проектирование
Подпись «· это я» оказалась лишней
Убрала подпись из шапки. Бейдж роли остался в списке семьи, где он действительно различает людей.
Полный разбор
Процесс
В переключателе профиля рядом с именем стояло «· это я». Тестировщик заметил: смысл дублируется, а сама форма читается как калька с англоязычных интерфейсов, где принято писать (You).
Гипотеза
Локализация это норма языка, а не перевод. Убрать шум из самого частого контрола важнее, чем продублировать очевидное.
Чем заплатила
В шапке стало на один сигнал меньше: свой профиль опознаётся только по имени и аватару.
Остальные решения
Показать карту врачу, не отдавая её серверу
было: Первый вариант шеринга шёл через API: медданные покидали устройство и проходили через инфраструктуру, пусть и зашифрованными.
Бэкенд с аккаунтами был проще, я его отклонила
было: Классическое решение семейного доступа: сервер, аккаунты, синхронизация. Проще по продукту, привычнее пользователю, мультидевайс из коробки.
Кабинет владельца: править продукт без разработчика и без сервера
было: Тексты онбординга, справочники и цены Pro жили в коде: любая правка значила «просить разработчика». Для продукта, который я передаю в самостоятельную жизнь, это тупик.
Продуктовая рамка и артефакты: для тех, кто глубже
North Star
Семья ведёт историю и не теряет её
прокси: доля семей с ≥3 записями и активных на 4-й неделе
Довести до первой ценности.
Воронка onboarding_completed → first_record_created
Рычаг: онбординг и пустые состояния
Данные живут только на устройстве: их нельзя потерять.
Доля с актуальным бэкапом · возвраты
Рычаг: напоминание о копии на главной (решение #1)
Единственная встреча продукта с внешним человеком, врачом.
Успех сценария «показать карту» + время на задачу
Рычаг: QR из hash-фрагмента (решение #4)
Замеры спроектированы (события в вайтлисте телеметрии, включаются по согласию), но ещё не сняты; это план проверки, а не выдуманные цифры.
- Действие
- Назначили приём или ребёнок заболел.
- Боль
- История разбросана по Drive, почте и WhatsApp.
- Решение
- Быстрый ввод визита с главного экрана.
- Метрика
- first_record_created
- Действие
- Фиксирую визит, лекарства, анализы.
- Боль
- Формы принимают мусор: год 275760, возраст −273735.
- Решение
- Один валидатор дат 0..150 с подсказкой. (решение #2)
- Метрика
- доля записей без ошибок ввода
- Действие
- Приёмы по расписанию, бабушка забывает таблетку.
- Боль
- Забытый приём ломает схему лечения.
- Решение
- Чек-лист «Сегодня» и напоминания.
- Метрика
- доля отмеченных приёмов
- Действие
- Врач спрашивает историю.
- Боль
- Собрать по трём сервисам; медданные не должны утечь.
- Решение
- QR из hash-фрагмента, сервер не видит данные. (решение #4)
- Метрика
- успех шеринга + время на задачу
- Действие
- Чищу браузер или меняю телефон.
- Боль
- Local-first: данные только на устройстве, легко потерять.
- Решение
- Напоминание о бэкапе на главной. (решение #1)
- Метрика
- доля с актуальным бэкапом · возвраты
Дизайн-система в Figma
Результат
1 день
От вопроса тестировщика «очищу браузер и потеряю всё?» до напоминания о бэкапе на главной. Дата и источник зафиксированы в истории репозитория 25 июня.
61/100
Стартовый аудит WCAG 2.2: 7 критичных ошибок стали планом редизайна. В текущей сборке проверены язык страницы и офлайн-режим; полный повторный прогон аудита впереди.
Живой прод
PWA работает офлайн, ставится на экран, freemium-монетизация заложена. Аналитика в проде пока не подключена: метрики активации спроектированы, но не замерены (см. «Как пойму, что это работает»).
Целевая метрика: доля успешных прохождений сценария «поделиться картой с родственником» и время на задачу. Именно этот сценарий выбран потому, что страница просмотра по ссылке это единственное место, где историю читает внешний человек: врач или родственник. Там «семья не потеряла историю» проверяется объективно, а не со слов.
Что бы сделала иначе
Зафиксировала бы дизайн-направление раньше: продукт прошёл три визуальные эпохи (mint, минимализм, «Кобальт на бумаге»), и каждая стоила переписывания токенов.
Провела бы юзабилити-тест до редизайна, а не после, чтобы приоритизировать правки данными, а не только аудитом.
Как я работала с Claude
Ускорил
Правки из UX-аудита (контраст, focus-ring, alt-тексты, валидацию дат) и миграцию токенов между тремя визуальными эпохами прошла за дни: рутину рефакторинга вела в паре с Claude.
Позволил
Соло довела продукт до 300+ юнит-тестов и двух сквозных и собственного local-first слоя без бэкенда: объём, недоступный дизайнеру в одиночку без AI.
Осталось за мной
Продуктовые решения и гейты держала сама: отклонила серверный бэкенд с аккаунтами (ломает privacy), выбрала QR из hash-фрагмента (RFC 3986), зафиксировала границы валидатора дат 0..150.