← Все кейсы

Флагман · личный продукт

MedLog

medlog-chi.vercel.app ↗

Живой privacy-first PWA: семья ведёт визиты, лекарства и анализы локально, без облака.

Детали проекта

Цифра
61/100 · UX-аудит по WCAG 2.2 на старте
Роль
Одна, от идеи до прода
Формат
PWA, local-first
Платформа
Веб / iPhone-first
Статус
Живой прод
«Обзор»: просрочено, ближайшее, назначения по семье
Визиты: поиск по врачу, специальности, диагнозу

Что было плохо

Семьи теряют медицинскую историю, а пациенты на сложных схемах забывают, что и когда принимали.

Выписки в Google Drive, анализы в почте, заметки педиатра в WhatsApp. Когда врач спрашивает дату последнего анализа, ответ приходится собирать по трём сервисам. Бабушка забывает, приняла ли таблетку.

Существующие сервисы (СберЗдоровье, Яндекс Здоровье) это маркетплейсы клиник, а не личный архив: требуют аккаунт и собирают данные. Личного, приватного, локального инструмента нет.

Точка отсчёта: UX-аудит по WCAG 2.2

61/100 AA− · 7 критичных ошибок · 12 предупреждений

Аудит вскрыл провалы контраста на стекле, невидимый focus-ring, отсутствие alt-текстов и «тихое» закрытие форм без обратной связи. Это стало триггером редизайна.

Тестирование

Тестировщик испугался потерять данные, хотя бэкап уже был

Напоминание о копии переехало на главный экран: появляется, когда есть записи и давно не было бэкапа, скачивание в одно нажатие. Сделано в тот же день, дата и источник видны в истории.

Полный разбор

Процесс

«Если я сейчас очищу браузер, то потеряю свой профиль навсегда?» Вопрос первого стороннего пользователя, 25 июня, зафиксирован в истории репозитория. Механизм резервной копии на тот момент существовал, но жил в настройках, и человек его не нашёл.

Гипотеза

В local-first продукте данные живут только на устройстве, поэтому заметность бэкапа это вопрос доверия, а не удобства. Возможность, которую пользователь не нашёл, для него не существует.

Чем заплатила

Бэкап остался ручным: о нём нужно вспомнить и нажать. Мультидевайса нет, облачная синхронизация вынесена в роадмап отдельным решением.

«Обзор»: просрочено, ближайшее, назначения по семье

Тестирование

Поле даты пропускало год 275760

Один общий валидатор дат и возраста с границами 0..150 лет вместо четырёх локальных копий, подсказка «Проверьте год» прямо у поля. Закреплено тестом.

Полный разбор

Процесс

Тестировщик прислал скриншот: возраст отображался как «−273735 лет». Стандартное поле даты не ограничивает год, и абсурдное значение спокойно уходило в записи.

Гипотеза

Предотвращение ошибки сильнее её исправления (эвристика Нильсена №5). Одна проверка вместо четырёх значит, что правило нельзя забыть в новом месте.

Чем заплатила

Жёсткие границы отсекают экзотику: дату старше 150 лет не ввести даже нарочно. Для семейного медицинского журнала это осознанное ограничение.

«Добавить»: визит, лекарство, анализ, напоминание

Проектирование

Подпись «· это я» оказалась лишней

Убрала подпись из шапки. Бейдж роли остался в списке семьи, где он действительно различает людей.

Полный разбор

Процесс

В переключателе профиля рядом с именем стояло «· это я». Тестировщик заметил: смысл дублируется, а сама форма читается как калька с англоязычных интерфейсов, где принято писать (You).

Гипотеза

Локализация это норма языка, а не перевод. Убрать шум из самого частого контрола важнее, чем продублировать очевидное.

Чем заплатила

В шапке стало на один сигнал меньше: свой профиль опознаётся только по имени и аватару.

Остальные решения

Показать карту врачу, не отдавая её серверу

было: Первый вариант шеринга шёл через API: медданные покидали устройство и проходили через инфраструктуру, пусть и зашифрованными.

Бэкенд с аккаунтами был проще, я его отклонила

было: Классическое решение семейного доступа: сервер, аккаунты, синхронизация. Проще по продукту, привычнее пользователю, мультидевайс из коробки.

Кабинет владельца: править продукт без разработчика и без сервера

было: Тексты онбординга, справочники и цены Pro жили в коде: любая правка значила «просить разработчика». Для продукта, который я передаю в самостоятельную жизнь, это тупик.

Продуктовая рамка и артефакты: для тех, кто глубже

North Star

Семья ведёт историю и не теряет её

прокси: доля семей с ≥3 записями и активных на 4-й неделе

1 Активация

Довести до первой ценности.

Воронка onboarding_completed → first_record_created

Рычаг: онбординг и пустые состояния

2 Доверие и удержание

Данные живут только на устройстве: их нельзя потерять.

Доля с актуальным бэкапом · возвраты

Рычаг: напоминание о копии на главной (решение #1)

3 Момент истины

Единственная встреча продукта с внешним человеком, врачом.

Успех сценария «показать карту» + время на задачу

Рычаг: QR из hash-фрагмента (решение #4)

Замеры спроектированы (события в вайтлисте телеметрии, включаются по согласию), но ещё не сняты; это план проверки, а не выдуманные цифры.

1 Триггер
Действие
Назначили приём или ребёнок заболел.
Боль
История разбросана по Drive, почте и WhatsApp.
Решение
Быстрый ввод визита с главного экрана.
Метрика
first_record_created
2 Запись
Действие
Фиксирую визит, лекарства, анализы.
Боль
Формы принимают мусор: год 275760, возраст −273735.
Решение
Один валидатор дат 0..150 с подсказкой. (решение #2)
Метрика
доля записей без ошибок ввода
3 Между визитами
Действие
Приёмы по расписанию, бабушка забывает таблетку.
Боль
Забытый приём ломает схему лечения.
Решение
Чек-лист «Сегодня» и напоминания.
Метрика
доля отмеченных приёмов
4 Момент истины
Действие
Врач спрашивает историю.
Боль
Собрать по трём сервисам; медданные не должны утечь.
Решение
QR из hash-фрагмента, сервер не видит данные. (решение #4)
Метрика
успех шеринга + время на задачу
5 После
Действие
Чищу браузер или меняю телефон.
Боль
Local-first: данные только на устройстве, легко потерять.
Решение
Напоминание о бэкапе на главной. (решение #1)
Метрика
доля с актуальным бэкапом · возвраты

Дизайн-система в Figma

Запись кита из Figma: скоро

Результат

1 день

От вопроса тестировщика «очищу браузер и потеряю всё?» до напоминания о бэкапе на главной. Дата и источник зафиксированы в истории репозитория 25 июня.

61/100

Стартовый аудит WCAG 2.2: 7 критичных ошибок стали планом редизайна. В текущей сборке проверены язык страницы и офлайн-режим; полный повторный прогон аудита впереди.

Живой прод

PWA работает офлайн, ставится на экран, freemium-монетизация заложена. Аналитика в проде пока не подключена: метрики активации спроектированы, но не замерены (см. «Как пойму, что это работает»).

Целевая метрика: доля успешных прохождений сценария «поделиться картой с родственником» и время на задачу. Именно этот сценарий выбран потому, что страница просмотра по ссылке это единственное место, где историю читает внешний человек: врач или родственник. Там «семья не потеряла историю» проверяется объективно, а не со слов.

Что бы сделала иначе

Зафиксировала бы дизайн-направление раньше: продукт прошёл три визуальные эпохи (mint, минимализм, «Кобальт на бумаге»), и каждая стоила переписывания токенов.

Провела бы юзабилити-тест до редизайна, а не после, чтобы приоритизировать правки данными, а не только аудитом.

Как я работала с Claude

Как я работала с Claude От вопроса тестировщика «очищу браузер и потеряю всё?» до фикса напоминания о бэкапе: 1 день (25 июня, история репозитория).

Ускорил

Правки из UX-аудита (контраст, focus-ring, alt-тексты, валидацию дат) и миграцию токенов между тремя визуальными эпохами прошла за дни: рутину рефакторинга вела в паре с Claude.

Позволил

Соло довела продукт до 300+ юнит-тестов и двух сквозных и собственного local-first слоя без бэкенда: объём, недоступный дизайнеру в одиночку без AI.

Осталось за мной

Продуктовые решения и гейты держала сама: отклонила серверный бэкенд с аккаунтами (ломает privacy), выбрала QR из hash-фрагмента (RFC 3986), зафиксировала границы валидатора дат 0..150.