PRD — stimmt's: Mobile Parent-School Signature Platform
Вердикт: GO Продукт: stimmt's (от нем. stimmt's? — «верно?», разговорное подтверждение) Стадия: Pre-MVP Рынок: Schule + Musikschule, DACH Основатель: Соло, €0, IT=0, Lehrer + Musiker, pAss-инфраструктура, Claude Code
1. Product Overview
Проблема
В немецких школах родители подписывают десятки документов в год: разрешения на экскурсии, согласия на фото, Kenntnisnahmen оценок, Elternbrief-ответы, Anmeldeformulare. Текущий процесс:
- Lehrer печатает Elternbrief (2-5 страниц на ребенка)
- Раздаёт 28 детям в классе
- Дети несут домой (теряют по дороге — каждый пятый документ)
- Родитель читает, подписывает ручкой
- Ребёнок несёт обратно (теряет, мнёт, забывает)
- Lehrer проверяет, сортирует, подшивает в Ordner
- Кто не принёс — Lehrer напоминает (устно, через ребёнка, через Elternabend)
- К концу недели: 22/28 подписей собрано, 6 родителей «забыли», 2 документа потеряны безвозвратно
Масштаб: 32 400 школ в DACH × в среднем 8 Elternbriefe в месяц на класс × 28 учеников = ~87 млн подписей в год только в общеобразовательных школах. С Musikschulen (934 VdM + частные) и Kita — более 187 млн подписей в год.
Корневая боль: процесс держится на бумаге, детях-курьерах и ручном контроле Lehrer. Нет ни статуса в реальном времени, ни аудит-следа, ни доказательства, КТО именно подписал.
Решение
Lehrer создаёт Elternbrief в веб-интерфейсе → система генерирует QR-код → Lehrer печатает документ с QR-кодом → раздаёт детям → родитель сканирует QR телефоном → открывается PWA (без установки приложения, без аккаунта) → родитель читает документ → Face ID/Touch ID/PIN → подпись пальцем на экране → школа получает подписанный PDF с аудит-следом.
Ключевой принцип: Datenschutz через data minimization. Подпись родителя — только на устройстве. Сервер не хранит ни биометрических данных, ни приватных ключей. Никаких аккаунтов для родителей. Никаких устанавливаемых приложений.
Ценностное предложение
| Для кого | Ценность |
|---|---|
| Lehrer | Нет chasing paper. Статус в реальном времени. Напоминание в 1 клик. Автоматическая подшивка. |
| Eltern | Нет установки. Нет аккаунта. Подпись за 30 секунд с телефона. В любое время, в любом месте. |
| Schulleitung | Цифровой аудит-след. DSGVO-совместимость. Нет бумажных Ordner. |
| Musikschule | Цифровая Anmeldung. Отслеживание статуса. Профессиональный имидж. |
Уникальные преимущества перед конкурентами
| Конкурент | Требует аккаунт родителей | Требует установку | Хранение подписи на сервере | Цена для школы |
|---|---|---|---|---|
| Untis-Messenger | Да | Да | Да | Высокая |
| SchoolFox | Да | Да | Да | Средняя |
| IServ | Да | Нет (Web) | Да | Высокая |
| stimmt's | Нет | Нет (PWA) | Нет (только на устройстве) | Низкая |
North Star Metric
Weekly Signed Documents per School (WSDpS) — количество подписанных документов в неделю на одну школу.
- Отражает и adoption (сколько учителей используют), и engagement (сколько Elternbriefe отправляется), и completion (сколько подписывается)
- Растёт только если продукт реально используется и заменяет бумагу
- Легко измеряется на уровне системы
- Коррелирует с retention: школа с WSDpS > 20 не уйдёт обратно на бумагу
2. User Personas
Persona 1: Anna — Lehrerin, 42 года
Контекст: Klassenlehrerin, 5. Klasse Gymnasium, Sachsen. 28 учеников. ~8 Elternbriefe в месяц. Школьный iPad (WiFi) + личный iPhone. Уровень тех-готовности: средний (WhatsApp, Online-Banking, Schulportal — умеет, остальное — «keine Zeit»).
Текущий процесс: Печатает Elternbrief в Lehrerzimmer → раздаёт детям → через 3 дня проверяет, кто принёс → записывает в Notizbuch → устно напоминает «непринёсшим» → через неделю звонит родителям → подшивает в Ordner. На Elternabend-Vorbereitung тратит 2-3 часа только на отслеживание подтверждений.
Боли: - «Дети теряют документы. Каждый. Раз.» - «Я не знаю, кто прочитал, а кто просто подписал не глядя» - «Родители говорят "не видели", а я не могу доказать» - «После каникул половина класса не помнит про Elternbrief»
Мотивация: Меньше бумажной работы → больше времени на Unterricht. Меньше конфликтов с родителями. Профессиональный инструмент, а не «я-в-Excel».
Сценарий использования: Утром перед Unterricht создаёт Elternbrief за 2 минуты. После обеда проверяет статус: 15/28 подписано. Жмёт «Erinnern» — система отправляет напоминание. К вечеру 25/28. Остальным трём — личное сообщение через Schul-App. На Elternabend — распечатка аудит-трейла: кто когда подписал.
Persona 2: Eltern (3 сегмента)
2a. Sven — 38 лет, IT-специалист, Vater
Контекст: Двое детей (8 и 11 лет), iPhone 15 Pro, digital native. Жена тоже в IT. Оба работают полный день.
Ожидания: «Почему я до сих пор подписываю бумажки ручкой в 2026 году?» Хочет: открыл → прочитал → Face ID → готово. 30 секунд.
Барьеры: Нетерпимость к багам. Если PWA зависнет при загрузке — уходит и забывает. Datenschutz-параноик: будет проверять, куда уходят данные.
MVP-стратегия: Идеальный early adopter. Даст честный фидбек. Расскажет другим родителям на Elternabend.
2b. Claudia — 45 лет, Bürokauffrau, Mutter
Контекст: Один ребёнок (10 лет), Samsung Galaxy A54 (Android), пользуется приложениями (Banking, Amazon, WhatsApp), но к новому относится с подозрением. «А это sicher? А куда идёт моя подпись?»
Ожидания: Чёткая инструкция. Видимое подтверждение, ЧТО именно она подписывает. Возможность увеличить текст (очки для чтения). Понятный статус: «подписано — Schule получила».
Барьеры: Если процесс занимает больше 2 минут — откладывает телефон «на потом». Если непонятно, какой документ подписывает — не подпишет. Нужен крупный шрифт, контрастный дизайн.
MVP-стратегия: Основной сегмент. Тестировать понятность интерфейса. Минимизировать шаги. Явно показывать: «Документ: Разрешение на экскурсию в Zoo Leipzig. 2 страницы. Отправлен: Frau Hoffmann, 15.03.2026.»
2c. Herr Weber — 68 лет, Rentner, Opa
Контекст: Воспитывает внука (12 лет), смартфон есть (сын дал старый iPhone SE), но пользуется только телефоном и WhatsApp. Не знает, что такое Face ID. PIN на телефоне помнит с трудом.
Ожидания: «А можно просто бумажку?» Если процесс требует больше одного нажатия — не справится.
Барьеры: Не поймёт, что такое QR-код. Не сможет нарисовать подпись пальцем. Забудет PIN. Не прочитает мелкий текст.
MVP-стратегия: НЕ целевая персона для MVP. Для этого сегмента — fallback: Lehrer печатает бумажную версию без QR-кода (традиционный способ). Не пытаемся оцифровать 100% родителей в MVP. Достаточно 80% (Sven + Claudia).
Persona 3: Markus — Musikschulleiter, 52 года
Контекст: Руководит Musikschule с 300 учениками и 15 преподавателями. Член VdM. Использует Windows-ноутбук + iPhone. Тех-готовность: средняя (Excel, E-Mail, банковское ПО — умеет, остальное — «ich bin Musiker, kein IT-ler»).
Текущий процесс: Каждый семестр — 300 Anmeldeformulare. Родители скачивают PDF с сайта, печатают, заполняют, подписывают, сканируют, отправляют по email. Musikschulleiter вручную проверяет каждое, заносит в Excel, отслеживает неполные. Администратор тратит 20 часов в семестр только на обработку Anmeldungen.
Боли: - «Родители заполняют форму от руки — почерк нечитаемый» - «Вечно не хватает подписи на letzten Seite» - «В Excel ошибки — трудно отследить, кто оплатил, а кто только записался» - «Формы теряются в email — приходится переспрашивать»
Мотивация: Профессиональный имидж («современная Musikschule»). Меньше административной работы. Цифровой процесс вместо бумажного хаоса.
Сценарий использования: Создаёт Anmeldeformular из шаблона → система генерирует QR-код → размещает на сайте и в Elternbrief → родитель заполняет форму + подписывает → Musikschule видит: кто заполнил, кто оплатил, кто в waiting list.
Persona 4: Bettina — Schulleiterin, 55 лет
Контекст: Leiterin Grundschule, Bayern. 250 учеников, 20 Lehrer. Ответственна за Datenschutz-compliance. Годовой бюджет школы: регулируется Schulträger (коммуна). Lehrer-бюджет (Klassenkasse): ~€200-400/класс/год — Lehrer распоряжаются самостоятельно.
Боли: - «Datenschutzbeauftragter требует аудит-след для Elternbriefe — у нас его нет» - «Бумажные Ordner занимают шкаф — 10 лет хранения по закону» - «При проверке не можем доказать, что родитель именно этот документ подписал» - «Lehrer жалуются на бумажную работу — тратят на неё Unterrichtszeit»
Мотивация: DSGVO-compliance. Entlastung für Lehrer (разгрузка учителей). Профессиональный имидж школы. Не хочет трогать Schulträger-бюджет — предпочитает решение, оплачиваемое из Lehrer-бюджета.
Бюджетная стратегия: Пилот оплачивается из Klassenkasse конкретного Lehrer (€0-50). При расширении на всю школу — из Schulbudget или Elternspende. Schulträger не вовлекается на старте.
Persona 5: Karsten — Administrator (опционально, Post-MVP)
Контекст: Schulträger-IT-Mitarbeiter или внешний администратор для нескольких Musikschulen. Управляет учётными записями Lehrer, шаблонами документов, выгрузкой для аудита.
MVP: Административных функций нет. Lehrer = сам себе администратор.
3. Core User Flows
Flow A: Lehrer создаёт Elternbrief
[Lehrer Web Dashboard]
│
├─ 1. Авторизация: magic link на email → клик → сессия (7 дней)
│
├─ 2. Dashboard: список активных Elternbriefe + статус каждого
│
├─ 3. Кнопка «+ Neuer Elternbrief»
│ │
│ ├─ 3a. Ввод: Titel (обязательно), Beschreibung (опционально)
│ ├─ 3b. Выбор типа: Elternbrief / Einwilligung / Kenntnisnahme / Sonstiges
│ ├─ 3c. Выбор класса/классов (из списка, созданного Lehrer ранее)
│ ├─ 3d. Загрузка PDF (до 10 MB, до 20 стр.) — Lehrer печатает из Word/Canva как PDF и загружает
│ │ ИЛИ: ввод текста во встроенный редактор → live-превью PDF
│ ├─ 3e. Дедлайн (дата), опционально
│ └─ 3f. Кнопка «Elternbrief erstellen»
│
├─ 4. Система генерирует:
│ ├─ Уникальный document_id (UUID v4)
│ ├─ Signing URL: https://stimmts.app/s/{document_id}/{recipient_token}
│ ├─ QR-код (PNG, 300 DPI) — кодирует signing URL
│ └─ Печатный PDF: оригинальный документ + QR-код в верхнем правом углу каждой страницы + информация о документе в футере
│
├─ 5. Lehrer скачивает печатный PDF → печатает → раздаёт детям
│
└─ 6. Dashboard обновляется: документ «aktiv», счётчик «0 von 28 unterschrieben»
Детали реализации:
- Каждый recipient (родитель) получает свой уникальный recipient_token. Один QR-код = один родитель. Это гарантирует, что подпись привязана к конкретному Eltern-контакту.
- Печатный PDF содержит 1 QR-код на страницу — если документ из 3 страниц, все 3 содержат QR.
- QR-код ведёт на URL вида https://stimmts.app/s/a1b2c3d4/e5f6g7h8 — никаких параметров в URL, раскрывающих личность.
Flow B: Родитель подписывает через PWA
[Родитель получает бумажный Elternbrief с QR-кодом]
│
├─ 1. Открывает камеру телефона → направляет на QR-код
│ ├─ iOS: камера распознаёт QR → баннер «Open in Browser» → тап
│ └─ Android: камера распознаёт QR → диалог «Open link» → тап
│
├─ 2. PWA открывается в браузере (https://stimmts.app/s/{doc_id}/{token})
│ │
│ ├─ 2a. Загрузка: спиннер (≤2 сек)
│ ├─ 2b. Проверка токена: валиден? документ активен? не просрочен?
│ │ └─ Если ошибка → экран «Dieser Elternbrief ist nicht mehr gültig»
│ │
│ └─ 2c. Экран «Dokument ansehen»
│ ├─ Заголовок: «Einwilligung Klassenfahrt Leipzig»
│ ├─ Мета: «Von: Frau Hoffmann, Klasse 5a | 3 Seiten»
│ ├─ Встроенный просмотрщик PDF (рендеринг через pdf.js или нативный <embed>)
│ │ ├─ Скролл, зум (pinch)
│ │ └─ Кнопка «Vollbild» (полный экран)
│ └─ Кнопка «Unterschreiben» (фиксирована внизу)
│
├─ 3. Родитель читает документ → жмёт «Unterschreiben»
│
├─ 4. Система запрашивает подтверждение личности:
│ │
│ ├─ 4a. WebAuthn-диалог:
│ │ ├─ iOS: системный диалог Face ID / Touch ID
│ │ ├─ Android: системный диалог Fingerprint / Face Unlock / PIN
│ │ └─ Desktop (fallback): PIN / Windows Hello
│ │
│ ├─ 4b. WebAuthn успешен → platform authenticator возвращает assertion
│ │ └─ Если неуспешен (нет биометрии, отказ) → повторный запрос (до 3 попыток)
│ │
│ └─ 4c. После успешной аутентификации:
│ ├─ Система сохраняет: credential_id, timestamp, auth_method
│ └─ Переход к экрану подписи
│
├─ 5. Экран «Unterschreiben»
│ │
│ ├─ 5a. Заголовок: «Bitte unterschreiben Sie»
│ ├─ 5b. Подтверждение: «Ich bestätige, dass ich das Dokument gelesen habe und zustimme»
│ ├─ 5c. Signature Pad:
│ │ ├─ Canvas (ширина экрана × 200px высота)
│ │ ├─ Рисование пальцем (touch events) или стилусом
│ │ ├─ Кнопка «Löschen» (стереть) — под canvas
│ │ └─ Placeholder-текст внутри canvas: «Hier unterschreiben»
│ ├─ 5d. Имя родителя (optional, auto-fill если Lehrer указал):
│ │ └─ Текстовое поле: «Ihr Name (zur Identifikation)»
│ └─ 5e. Кнопка «Verbindlich unterschreiben»
│
├─ 6. Обработка подписания (клиентская сторона):
│ │
│ ├─ 6a. PWA формирует signing_payload:
│ │ ├─ document_id
│ │ ├─ recipient_token
│ │ ├─ visual_signature (SVG/PNG — подпись с canvas)
│ │ ├─ signer_name (если введён)
│ │ ├─ webauthn_assertion (подписанный challenge)
│ │ ├─ device_info: user_agent, platform, screen_resolution, language
│ │ └─ client_timestamp
│ │
│ ├─ 6b. Отправка на сервер: POST /api/sign
│ │
│ └─ 6c. Серверная обработка:
│ ├─ Верификация recipient_token (одноразовый? срок действия?)
│ ├─ Верификация WebAuthn assertion
│ ├─ Встраивание visual_signature в PDF (pdf-lib, серверная сторона)
│ ├─ Добавление аудит-трейла в метаданные PDF
│ ├─ Сохранение подписанного PDF в Storage
│ ├─ Обновление статуса DocumentRecipient → «signed»
│ └─ Удаление visual_signature из памяти сервера
│
└─ 7. Экран подтверждения:
├─ Иконка: checkmark (зелёная)
├─ Текст: «Vielen Dank! Die Schule wurde benachrichtigt.»
├─ Детали: «Dokument: Einwilligung Klassenfahrt Leipzig | Unterschrieben am: 15.03.2026, 19:23 Uhr»
└─ Кнопка «Schliessen» → вкладка браузера закрывается (window.close() или инструкция)
Важные UX-детали: - Шаги 2→3→4→5→7: минимум экранов, каждый экран — одно действие - Если родитель закрыл браузер на шаге 2 (посмотрел, не подписал) → при повторном сканировании QR возвращается на шаг 2 (статус «angesehen, noch nicht unterschrieben») - Если родитель уже подписал → при повторном сканировании: «Sie haben dieses Dokument bereits unterschrieben. Vielen Dank!» - Если дедлайн прошёл → «Die Frist für diesen Elternbrief ist abgelaufen. Bitte kontaktieren Sie die Schule.»
Flow C: Musikschulleiter создаёт Anmeldeformular
[Musikschulleiter Web Dashboard]
│
├─ 1. Авторизация: email magic link
│
├─ 2. Выбор шаблона: «Anmeldeformular Musikschule» (предварительно настроенный)
│ └─ Шаблон содержит поля:
│ ├─ Schüler: Vorname, Nachname, Geburtsdatum
│ ├─ Eltern: Name, E-Mail, Telefon
│ ├─ Unterricht: Instrument, Kursart (Einzel/Gruppe), Lehrkraft
│ └─ Vertrag: Laufzeit, Zahlungsweise
│
├─ 3. Musikschulleiter:
│ ├─ Выбирает активные поля из шаблона
│ ├─ Настраивает опции (список инструментов, список Lehrer)
│ └─ Генерирует форму
│
├─ 4. Система генерирует:
│ ├─ Уникальная ссылка на форму: https://stimmts.app/f/{form_id}
│ └─ QR-код → размещается на сайте Musikschule, в Elternbrief, на Infotag-плакатах
│
├─ 5. Родитель сканирует QR → PWA с формой:
│ ├─ Заполняет поля формы
│ ├─ Подписывает (шаги 4-6 из Flow B)
│ └─ Получает подтверждение
│
└─ 6. Musikschulleiter видит в Dashboard:
├─ Список всех Anmeldungen: статус (ausstehend/ausgefüllt/unterschrieben)
├─ Фильтр по инструменту, Lehrer
├─ Экспорт в CSV для Excel
└─ Скачивание подписанного PDF
Flow D: Lehrer проверяет статус и отправляет напоминание
[Lehrer открывает Dashboard]
│
├─ 1. Список активных Elternbriefe:
│ ├─ Карточка документа: Titel, Klasse, дедлайн, progress bar
│ ├─ «Einwilligung Klassenfahrt — 22/28 unterschrieben — Frist: 20.03.»
│ └─ Цветовая индикация: зелёный (>80%), жёлтый (50-80%), красный (<50%)
│
├─ 2. Lehrer кликает на документ → детальный вид:
│ │
│ ├─ 2a. Список родителей со статусом:
│ │ ├─ Зелёный кружок: «Unterschrieben — 15.03. 19:23»
│ │ ├─ Жёлтый кружок: «Angesehen — 16.03. 08:15» (открыл, не подписал)
│ │ ├─ Серый кружок: «Nicht geöffnet»
│ │ └─ Красный: «Abgelehnt» (если родитель явно отказался)
│ │
│ ├─ 2b. Кнопка «Alle erinnern» (напомнить всем неподписавшим)
│ │ └─ Отправляет push/SMS/email всем со статусом «nicht geöffnet» и «angesehen»
│ │
│ ├─ 2c. Индивидуальные действия на каждого родителя:
│ │ ├─ «Erinnern» — одноразовое напоминание
│ │ └─ «Als Papier markieren» — для родителей без смартфона (fallback)
│ │
│ └─ 2d. Кнопка «Alle unterschriebenen herunterladen» → ZIP всех подписанных PDF
│
└─ 3. После дедлайна:
├─ Автоматическая email-сводка Lehrer: «Elternbrief X: 26/28 unterschrieben»
└─ Неподписавшие выделены красным → Lehrer действует вручную
Механика напоминания: - MVP: напоминание = Lehrer получает текст для копирования и отправляет через существующий канал (WhatsApp-группа класса, Schul-App, E-Mail) - Post-MVP: автоматическая отправка email/SMS неподписавшим родителям (требуется хранение контакта)
4. Functional Specification (MVP)
4.1. Lehrer Web Dashboard
Экран: Авторизация
┌─────────────────────────────────┐
│ stimmt's │
│ │
│ [E-Mail-Adresse eingeben] │
│ │
│ [Magic Link senden] │
│ │
│ Nach dem Klick: │
│ «Link wurde gesendet. │
│ Bitte prüfen Sie Ihr │
│ E-Mail-Postfach.» │
└─────────────────────────────────┘
- Метод: Passwordless magic link (Supabase Auth)
- Email: Содержит ссылку «Anmelden» → клик → Lehrer в дашборде
- Сессия: 7 дней, затем перелогин
- Безопасность: Ссылка одноразовая, срок действия 15 минут
- MVP: Только Email. Post-MVP: Google/Microsoft SSO для школ с Workspace/365.
Экран: Dashboard (главный)
┌──────────────────────────────────────────────────┐
│ stimmt's [LH] Abmelden │
│──────────────────────────────────────────────────│
│ Grundschule Am Park — Frau Hoffmann │
│ │
│ [+ Neuer Elternbrief] │
│ │
│ Aktive Elternbriefe: │
│ ┌──────────────────────────────────────────────┐│
│ │ Einwilligung Klassenfahrt Leipzig 22/28 ││
│ │ Klasse 5a — Frist: 20.03.2026 ████░░ ││
│ └──────────────────────────────────────────────┘│
│ ┌──────────────────────────────────────────────┐│
│ │ Kenntnisnahme Notenschutz 18/28 ││
│ │ Klasse 5a — Frist: 25.03.2026 ███░░░ ││
│ └──────────────────────────────────────────────┘│
│ ┌──────────────────────────────────────────────┐│
│ │ Fotoerlaubnis Schulfest 30/30 ││
│ │ Klasse 5a — Abgeschlossen █████ ││
│ └──────────────────────────────────────────────┘│
│ │
│ Abgeschlossene (7) [Ausklappen] │
└──────────────────────────────────────────────────┘
Экран: Elternbrief erstellen
┌──────────────────────────────────────────────────┐
│ ← Zurück Neuer Elternbrief │
│──────────────────────────────────────────────────│
│ Titel * │
│ [Einwilligung Klassenfahrt Leipzig ]│
│ │
│ Beschreibung │
│ [Sehr geehrte Eltern, ... ]│
│ │
│ Typ │
│ [Einwilligung ▾] │
│ │
│ Klasse(n) * │
│ [☑ Klasse 5a (28 Schüler)] │
│ [☐ Klasse 7b (24 Schüler)] │
│ │
│ Dokument * │
│ [PDF hochladen (max. 10 MB)] │
│ — oder — │
│ [Text eingeben → als PDF generieren] │
│ │
│ Frist (optional) │
│ [20.03.2026] │
│ │
│ [← Abbrechen] [Elternbrief erstellen →] │
└──────────────────────────────────────────────────┘
Поведения: - При загрузке PDF: валидация формата, размера, числа страниц. Ошибка: «PDF ist zu gross (max. 10 MB)» или «PDF hat zu viele Seiten (max. 20)» - При выборе нескольких классов: для каждого класса генерируется отдельный список получателей - При создании: Lehrer видит превью печатного PDF с QR-кодом → может скачать или сразу печатать - После создания: невозможно изменить документ (immutable record). Можно только закрыть (статус → «geschlossen»)
Экран: Детальный статус Elternbrief
┌──────────────────────────────────────────────────┐
│ ← Dashboard Einwilligung Klassenfahrt Leipzig│
│──────────────────────────────────────────────────│
│ Status: Aktiv — 22/28 unterschrieben │
│ Frist: 20.03.2026 (noch 4 Tage) │
│ │
│ [Alle erinnern (6)] [Alle PDFs herunterladen] │
│ │
│ Unterschrieben (22): [Ausklappen ▾] │
│ ┌──────────────────────────────────────────────┐│
│ │ ✓ Max Mustermann 15.03. 19:23 ││
│ │ ✓ Laura Schmidt 15.03. 20:01 ││
│ │ ... ││
│ └──────────────────────────────────────────────┘│
│ │
│ Angesehen, nicht unterschrieben (3): │
│ ┌──────────────────────────────────────────────┐│
│ │ ◉ Tim Becker [Erinnern] [Papier] ││
│ │ ◉ Sarah Müller [Erinnern] [Papier] ││
│ │ ◉ Jan Schulz [Erinnern] [Papier] ││
│ └──────────────────────────────────────────────┘│
│ │
│ Nicht geöffnet (3): │
│ ┌──────────────────────────────────────────────┐│
│ │ ○ Anna Wagner [Erinnern] [Papier] ││
│ │ ○ Paul Fischer [Erinnern] [Papier] ││
│ │ ○ Mia Bauer [Erinnern] [Papier] ││
│ └──────────────────────────────────────────────┘│
└──────────────────────────────────────────────────┘
Действия: - «Alle erinnern»: показывает модальное окно с текстом напоминания, Lehrer копирует и отправляет - Индивидуальное «Erinnern»: то же для одного родителя - «Als Papier markieren»: переводит статус в «Papier-Rücklauf» (родитель без смартфона). Убирает из счётчика цифровых подписей. Lehrer получает напоминание собрать бумажную подпись. - Скачивание: индивидуальный PDF или ZIP всех подписанных
Экран: Klassenverwaltung (управление классами)
┌──────────────────────────────────────────────────┐
│ Einstellungen → Klassen │
│──────────────────────────────────────────────────│
│ [Neue Klasse] │
│ │
│ Klasse 5a (28 Schüler) [Bearbeiten] │
│ Klasse 7b (24 Schüler) [Bearbeiten] │
│ │
│ ── Klasse 5a bearbeiten ── │
│ Name: [5a] │
│ │
│ Schülerliste: │
│ ┌──────────────────────────────────────────┐ │
│ │ Kind: Max Eltern: m.mustermann@.. ✕│ │
│ │ Kind: Laura Eltern: l.schmidt@.. ✕│ │
│ │ ... │ │
│ └──────────────────────────────────────────┘ │
│ │
│ [+ Schüler hinzufügen] │
│ ┌─ Neuer Schüler ──────────────────────────┐ │
│ │ Kind Vorname: [Max ] │ │
│ │ Eltern E-Mail:[m.mustermann@email.de] │ │
│ │ │ │
│ │ [Hinzufügen] │ │
│ └───────────────────────────────────────────┘ │
│ │
│ [Speichern] │
└──────────────────────────────────────────────────┘
MVP-ограничение: Добавление учеников — вручную по одному. Нет CSV-импорта. Нет интеграции с Schulverwaltungssystemen. Lehrer вводит: имя ребёнка + email родителя.
4.2. Parent PWA
PWA-страницы (роутинг)
| Маршрут | Экран | Описание |
|---|---|---|
/s/{doc_id}/{token} |
Документ | Просмотр PDF + кнопка «Unterschreiben» |
/s/{doc_id}/{token}/sign |
Подпись | WebAuthn + Signature Pad |
/s/{doc_id}/{token}/done |
Подтверждение | Success screen |
/f/{form_id} |
Форма (Musikschule) | Заполнение полей + подпись |
/e/{error_code} |
Ошибка | Невалидная ссылка, истёкший документ |
Экран: Документ (Landing)
┌──────────────────────────────────┐
│ stimmt's │
│──────────────────────────────────│
│ │
│ Einwilligung Klassenfahrt │
│ Leipzig │
│ │
│ Von: Frau Hoffmann, Klasse 5a │
│ 3 Seiten — Frist: 20.03.2026 │
│ │
│ ┌──────────────────────────┐ │
│ │ │ │
│ │ [PDF Preview / Viewer] │ │
│ │ │ │
│ │ Скролл, зум (pinch) │ │
│ │ │ │
│ └──────────────────────────┘ │
│ │
│ ┌──────────────────────────┐ │
│ │ Unterschreiben │ │
│ └──────────────────────────┘ │
└──────────────────────────────────┘
- PDF-просмотрщик: <iframe> с src=document_url#view=FitH или библиотека pdf.js
- Кнопка фиксирована внизу (sticky bottom), всегда видна
- Текст кнопки меняется в зависимости от статуса: «Unterschreiben» (не подписан) / «Bereits unterschrieben» (уже подписал) / «Abgelaufen» (просрочен)
Экран: Подпись (Signature)
┌──────────────────────────────────┐
│ ← Zurück Unterschreiben │
│──────────────────────────────────│
│ │
│ Bitte bestätigen Sie Ihre │
│ Identität: │
│ │
│ ┌──────────────────────────┐ │
│ │ 🔒 Face ID / Touch ID │ │
│ │ Bitte authentifizieren │ │
│ │ Sie sich │ │
│ └──────────────────────────┘ │
│ │
│ [WebAuthn-диалог — системный] │
│ │
│ ── после подтверждения ── │
│ │
│ Bitte unterschreiben Sie: │
│ │
│ ┌──────────────────────────┐ │
│ │ │ │
│ │ Hier unterschreiben │ │
│ │ │ │
│ └──────────────────────────┘ │
│ [Löschen] │
│ │
│ Ihr Name: │
│ [Max Mustermann ] │
│ │
│ ☐ Ich habe das Dokument │
│ gelesen und stimme zu │
│ │
│ ┌──────────────────────────┐ │
│ │ Verbindlich │ │
│ │ unterschreiben │ │
│ └──────────────────────────┘ │
└──────────────────────────────────┘
Поведения: - WebAuthn-промпт: системный диалог браузера/ОС (не кастомный). Если браузер не поддерживает WebAuthn → fallback: ввод имени + галочка (менее безопасный режим, документируется в аудит-трейле) - Signature Canvas: - Отслеживание touchstart/touchmove/touchend - Минимальная длина подписи: 10 пикселей (защита от случайного тапа) - Если подпись пустая → валидационная ошибка «Bitte unterschreiben Sie» - Кнопка «Verbindlich unterschreiben»: активна только когда подпись не пуста И галочка подтверждения отмечена - После отправки: индикатор загрузки → success screen
Экран: Подтверждение
┌──────────────────────────────────┐
│ stimmt's │
│──────────────────────────────────│
│ │
│ ✓ (зелёный) │
│ │
│ Vielen Dank! │
│ │
│ Das Dokument wurde │
│ unterschrieben. │
│ Die Schule wurde benachrichtigt.│
│ │
│ Dokument: │
│ Einwilligung Klassenfahrt │
│ Leipzig │
│ │
│ Unterschrieben am: │
│ 15.03.2026, 19:23 Uhr │
│ │
│ ┌──────────────────────────┐ │
│ │ Fenster schliessen │ │
│ └──────────────────────────┘ │
└──────────────────────────────────┘
Экран: Ошибка
┌──────────────────────────────────┐
│ stimmt's │
│──────────────────────────────────│
│ │
│ ✕ │
│ │
│ Dieser Elternbrief ist │
│ nicht mehr gültig. │
│ │
│ Mögliche Gründe: │
│ • Die Frist ist abgelaufen │
│ • Der Elternbrief wurde │
│ zurückgezogen │
│ • Der Link ist ungültig │
│ │
│ Bitte kontaktieren Sie die │
│ Schule. │
└──────────────────────────────────┘
- Варианты ошибок: expired, revoked, invalid_token, already_signed, server_error
- Каждая ошибка — свой понятный текст на немецком
PWA-технические характеристики
| Характеристика | Значение |
|---|---|
| Фреймворк | React (Vite) + TypeScript |
| PWA | Service Worker (Workbox), manifest.json |
| Установка | НЕТ — намеренно не предлагаем установку. Родитель не должен устанавливать приложение. PWA-возможности используются для кэширования и производительности, но без баннера «Zum Home-Bildschirm hinzufügen» |
| Оффлайн | НЕТ в MVP — подписание требует серверного соединения |
| WebAuthn | @simplewebauthn/browser (клиентская библиотека) |
| QR-чтение | Через нативную камеру ОС (не встроенный сканер в PWA). Камера распознаёт QR → передаёт URL браузеру |
| PDF-просмотр | pdf.js или нативный <iframe src="...pdf"> |
| Signature Pad | Canvas API + touch events, экспорт в PNG (300 DPI, прозрачный фон) |
| Совместимость | iOS Safari 16+, Android Chrome 110+, Desktop Chrome/Firefox/Edge (для тестирования) |
4.3. Обработка документов (серверная сторона)
Генерация печатного PDF с QR-кодом
Вход: оригинальный PDF (Lehrer) + signing_urls (для каждого родителя)
│
├─ 1. Для каждого родителя:
│ ├─ Сгенерировать QR-код: PNG, 300 DPI, размер 25×25 мм на печати
│ ├─ Встроить QR-код в правый верхний угол каждой страницы PDF
│ ├─ Добавить футер: «Elternbrief — stimmt's — ID: {doc_id} — Bitte scannen Sie den QR-Code»
│ └─ Сохранить персональный PDF в Storage
│
└─ 2. Вернуть Lehrer ZIP всех PDF или единый PDF (на выбор)
Технология: pdf-lib (Node.js / browser) — модификация PDF без серверного PDF-движка. QR-код генерируется через qrcode (npm).
Встраивание подписи в PDF
Вход: оригинальный PDF + visual_signature (PNG) + signing_metadata
│
├─ 1. Открыть PDF через pdf-lib
├─ 2. Добавить visual_signature:
│ ├─ Позиция: последняя страница, нижняя треть, по центру
│ ├─ Размер: 200×80px (масштабируется под PDF)
│ └─ Render: PNG с прозрачностью → embedPng()
├─ 3. Добавить текстовый блок с метаданными:
│ ├─ «Unterschrieben am: 15.03.2026, 19:23 Uhr»
│ ├─ «Methode: Face ID (Apple iPhone 15 Pro)»
│ ├─ «Dokument-ID: a1b2c3d4»
│ └─ «Geprüft durch: stimmt's WebAuthn-Verfahren»
├─ 4. Встроить аудит-трейл в XMP-метаданные PDF (PAdES-подход)
├─ 5. Сохранить подписанный PDF → Storage
└─ 6. Удалить visual_signature PNG из памяти/временного хранилища
Аудит-трейл (SigningRecord)
Для каждого подписания создаётся запись:
| Поле | Тип | Описание |
|---|---|---|
| id | UUID | Уникальный идентификатор |
| document_recipient_id | FK | Связь с получателем |
| event_type | enum | opened / viewed / signed / declined |
| timestamp | timestamptz | Серверное время события |
| device_platform | string | iOS / Android / Windows / macOS |
| device_browser | string | Safari 18 / Chrome 130 |
| device_screen | string | «390×844 @3x» |
| auth_method | string | faceid / touchid / pin / none |
| credential_id | string | WebAuthn credential ID (первые 12 символов + хеш) |
| signature_hash | string | SHA-256(visual_signature PNG) |
| ip_hash | string | SHA-256(IP) — хранится 30 дней, затем null |
| user_agent_hash | string | SHA-256(User-Agent) |
Принципы: - Append-only: записи не редактируются, не удаляются - Хеш-цепочка: каждая запись содержит SHA-256(предыдущая_запись || текущая_запись) - Purge: IP-хеши автоматически обнуляются через 30 дней - Экспорт: Lehrer может скачать полный аудит-трейл как часть ZIP-архива
4.4. Модуль Musikschule
Шаблоны форм (FormTemplate)
Lehrer/Musikschulleiter может создать шаблон формы один раз и переиспользовать:
FormTemplate:
- id
- school_id
- name: «Anmeldeformular Musikschule 2026/27»
- fields: [
{key: "schueler_vorname", label: "Vorname des Schülers", type: "text", required: true},
{key: "schueler_nachname", label: "Nachname des Schülers", type: "text", required: true},
{key: "geburtsdatum", label: "Geburtsdatum", type: "date", required: true},
{key: "instrument", label: "Instrument", type: "select", options: ["Klavier","Gitarre","Geige",...]},
{key: "kursart", label: "Kursart", type: "select", options: ["Einzel","Gruppe","Online"]},
{key: "eltern_name", label: "Name Erziehungsberechtigte/r", type: "text", required: true},
{key: "eltern_email", label: "E-Mail", type: "email", required: true},
{key: "eltern_telefon", label: "Telefon", type: "tel", required: false},
{key: "bemerkungen", label: "Bemerkungen", type: "textarea", required: false}
]
- created_at
Поведения: - Создание шаблона → кнопка «Formular veröffentlichen» → генерация публичной ссылки - Родитель открывает ссылку → PWA с формой → заполняет поля → подписывает → submit - Musikschulleiter видит заполненные формы с фильтрацией и экспортом - FormSubmission хранит значения полей как JSONB
Отличие от Elternbrief:
- Elternbrief: Lehrer загружает готовый PDF → родитель только подписывает
- Anmeldeformular: Система генерирует форму → родитель заполняет И подписывает
5. Technical Constraints
5.1. PWA-ограничения
| Ограничение | Влияние | Решение |
|---|---|---|
| iOS Safari не поддерживает Web Share API для файлов | Нельзя «поделиться» подписанным PDF с Lehrer напрямую | PDF сохраняется на сервере, Lehrer скачивает из Dashboard |
| iOS PWA не имеет доступа к Face ID API напрямую | Нельзя кастомно вызвать Face ID | Используем WebAuthn — системный диалог через браузер |
| PWA на iOS имеет холодный старт (перезагрузка при простое) | Потеря состояния подписи | Сохраняем состояние в sessionStorage. При перезагрузке — восстанавливаем или начинаем заново с проверкой токена |
| WebAuthn требует HTTPS | Локальная разработка сложнее | ngrok / localhost (WebAuthn работает на localhost) |
| WebAuthn не работает в WebView (Instagram, Facebook in-app browser) | Родитель открывает из соцсетей — не работает | Инструкция «Bitte in Safari/Chrome öffnen» + кнопка копирования ссылки |
5.2. WebAuthn для eIDAS SES
Юридический анализ (MVP-допущение):
eIDAS определяет три уровня электронных подписей: 1. SES (Simple Electronic Signature) — базовая. Подходит для 80%+ школьных документов (Elternbriefe, Einwilligungen, Kenntnisnahmen). Не требует сертифицированного TSP. 2. AES (Advanced Electronic Signature) — требует сертификат. Для важных документов. 3. QES (Qualified Electronic Signature) — высший уровень. Требуется для нотариальных документов.
stimmt's использует SES через WebAuthn: - WebAuthn platform authenticator (Face ID, Touch ID, Android Biometric) обеспечивает привязку к устройству - WebAuthn assertion содержит подписанный challenge → криптографическое доказательство, что конкретное устройство участвовало - Комбинация: WebAuthn assertion + visual_signature + timestamp + IP-хеш → audit trail для SES - Достаточно для: Elternbriefe, Einwilligungen (Datenschutz, Foto, Exkursion), Kenntnisnahmen, Krankmeldungen - Недостаточно для: Schulverträge (Schriftformerfordernis), Abmahnungen (требуется QES)
Техническая реализация:
- Сервер генерирует WebAuthn challenge (случайные 32 байта)
- Клиент вызывает navigator.credentials.get() с publicKey опциями
- Устройство возвращает AuthenticatorAssertionResponse:
- authenticatorData (включает флаг User Verified)
- clientDataJSON (включает challenge, origin)
- signature (подпись приватным ключом устройства)
- Сервер верифицирует:
- Подпись с публичным ключом (сохранённым при первой же WebAuthn-сессии для этого родителя)
- Флаг UV (User Verified) = 1 (биометрия/PIN был использован)
- Challenge совпадает
- Origin совпадает (https://stimmts.app)
MVP-допущение: Родитель впервые использует WebAuthn на устройстве → credential создаётся при первом подписании (Resident Key / Discoverable Credential). Публичный ключ сохраняется на сервере. При последующих подписаниях — assertion с тем же credential.
5.3. Стек технологий
| Слой | Технология | Обоснование |
|---|---|---|
| PWA | React 19 + TypeScript + Vite | Быстрая разработка, компонентный подход, экосистема |
| PWA-инфраструктура | Workbox (service worker) | Кэширование ассетов, оффлайн-поддержка (post-MVP) |
| Стили | Tailwind CSS + daisyUI | Быстрая вёрстка без дизайнера |
| PDF-рендеринг (клиент) | pdf.js | Просмотр PDF в PWA |
| PDF-генерация (сервер) | pdf-lib (серверная Node.js) | Встраивание QR-кода, подписи, метаданных |
| WebAuthn (клиент) | @simplewebauthn/browser | Упрощение WebAuthn API |
| WebAuthn (сервер) | @simplewebauthn/server | Верификация assertion |
| QR-код | qrcode (npm) | Генерация QR PNG |
| Backend API | bun + Elysia / Hono | Легковесный, быстрый, TypeScript-native |
| База данных | PostgreSQL 16 (Supabase) | Бесплатный тир Supabase (500 MB), Row-Level Security |
| Хранилище файлов | Supabase Storage | PDF-файлы, S3-совместимое API |
| Аутентификация | Supabase Auth | Magic link, Row-Level Security, сессии |
| Supabase Auth (встроенный) или Resend (транзакционные) | Magic link + оповещения | |
| Хостинг | Hetzner VPS (Nürnberg) или Cloudflare Pages + Workers | EU-only |
| Мониторинг | Sentry (бесплатный тир) + Uptime Robot | Ошибки и доступность |
5.4. DSGVO-совместимость
| Требование GDPR/DSGVO | Реализация в stimmt's |
|---|---|
| Art. 5(1)(c) Data Minimisation | Подпись — на устройстве. Сервер не хранит приватные ключи. Visual_signature удаляется после встраивания. Email родителей: только SHA-256 хеш. |
| Art. 17 Right to Erasure | Мягкое удаление данных родителя. Полное удаление всех данных через 6 мес. после конца учебного года. |
| Art. 32 Security | HTTPS/TLS 1.3. WebAuthn. Данные в покое: AES-256 (Supabase). |
| Art. 28 Data Processing Agreement (DPA) | DPA с Supabase (EU region). DPA с Hetzner (VPS). |
| Art. 30 Records of Processing | Логи операций (аудит-трейл) = автоматический реестр обработки. |
| EU Data Residency | Хостинг: EU-only (Frankfurt/Nürnberg). Никаких US-серверов. |
| Cookie Consent | Не требуется: PWA не использует tracking-cookies. Только технически необходимые (session cookie). |
| Datenschutz-Folgenabschätzung (DPIA) | Требуется для школы как Verantwortliche. stimmt's предоставляет документацию для DPIA. |
| Auftragsverarbeitung (AVV) | Школа = Verantwortliche. stimmt's = Auftragsverarbeiter. AVV-договор входит в onboarding. |
5.5. Ограничения соло-основателя
| Ограничение | Влияние на MVP |
|---|---|
| €0 бюджет | Supabase бесплатный тир (достаточно для пилота: 500 MB БД, 1 GB Storage). Hetzner VPS: ~€5/мес (можно отложить до первого платящего клиента, начать на Cloudflare Pages + Workers) |
| IT=0 навыков программирования | Основатель не пишет код. Вся разработка через Claude Code + pAss-инфраструктура. Архитектура — максимально простая (монолит, минимум сервисов). |
| Один человек | Не может одновременно продавать, писать код, поддерживать и администрировать. MVP должен работать без ручного вмешательства (автоматический onboarding). |
| Lehrer-нетворк | Главный актив. Первые 5 школ — личный нетворк основателя. Не нужен маркетинг на старте. |
| pAss-инфраструктура | CI/CD, мониторинг, деплой — через родительский проект pAss. Не нужно настраивать с нуля. |
6. Data Model (концептуальная)
6.1. Сущности и связи
School (1) ────────── (N) Teacher
Teacher (1) ───────── (N) Class
Class (1) ─────────── (N) Parent
Teacher (1) ───────── (N) Document
Document (1) ──────── (N) DocumentRecipient
Parent (1) ────────── (N) DocumentRecipient
DocumentRecipient (1) ── (N) SigningRecord
School (1) ────────── (N) FormTemplate
FormTemplate (1) ──── (N) FormSubmission
Parent (1) ────────── (N) FormSubmission
Teacher (1) ───────── (N) WebAuthnCredential (свой, для входа)
Parent (1) ────────── (N) WebAuthnCredential (для подписания)
6.2. Описание сущностей
School (Schule)
id: UUID PK
name: string (название школы)
type: enum (schule | musikschule | kita)
street: string?
plz: string?
city: string?
bundesland: string?
created_at: timestamptz
Teacher (Lehrer)
id: UUID PK
school_id: FK → School
email: string (уникальный, используется для magic link)
name: string
role: enum (lehrer | leiter | admin)
created_at: timestamptz
last_login_at: timestamptz?
- Аутентификация: через Supabase Auth (external, не хранится в этой таблице)
- Связь с Supabase Auth: по email
Class (Klasse)
id: UUID PK
school_id: FK → School
teacher_id: FK → Teacher (Klassenlehrer)
name: string (напр. «5a», «Klavier-Anfänger Di 16:00»)
created_at: timestamptz
Parent (Eltern)
id: UUID PK
class_id: FK → Class
child_name: string (имя ребёнка — для идентификации)
email_hash: string (SHA-256(email) — для напоминаний, без хранения email в открытом виде)
created_at: timestamptz
- Принцип: Никаких персональных данных родителей, кроме child_name и email_hash
- Lehrer уже знает родителей — нам не нужны их имена для функционирования системы
- Email хранится как хеш: Lehrer вводит email → система хеширует → сохраняет хеш. Для отправки напоминаний: Lehrer вводит email → хеширует → сравнивает с сохранённым → если совпадает, отправляет
- Важно: Это означает, что email нужен Lehrer для напоминаний. Lehrer хранит email в своём адресном списке (как и сейчас). stimmt's не хранит email в открытом виде.
Document (Elternbrief)
id: UUID PK
school_id: FK → School
teacher_id: FK → Teacher
title: string
description: text?
type: enum (elternbrief | einwilligung | kenntnisnahme | sonstiges)
status: enum (draft | active | closed | expired)
deadline: date?
original_pdf_url: string (Storage URL)
printable_pdf_url: string? (PDF с QR-кодами, генерируется при активации)
created_at: timestamptz
closed_at: timestamptz?
DocumentRecipient
id: UUID PK
document_id: FK → Document
parent_id: FK → Parent
recipient_token: string (уникальный, часть signing URL)
status: enum (pending | opened | viewed | signed | declined | paper_fallback)
signed_pdf_url: string? (Storage URL — подписанный PDF)
signed_at: timestamptz?
reminder_count: int (default 0)
reminder_last_sent: timestamptz?
created_at: timestamptz
- recipient_token: случайный UUID v4, одноразовый (после подписания — только для повторного просмотра)
- status = paper_fallback: Lehrer пометил как «бумажный возврат», не учитывается в цифровых метриках
SigningRecord (аудит-трейл)
id: UUID PK
document_recipient_id: FK → DocumentRecipient
event_type: enum (opened | viewed | signing_started | signed | declined)
timestamp: timestamptz
device_platform: string
device_browser: string
device_screen: string
auth_method: enum (faceid | touchid | pin | none)
credential_id_hash: string (SHA-256(credential_id))
signature_hash: string (SHA-256(visual_signature_png))
ip_hash: string (SHA-256(client_ip))
ip_hash_expires_at: timestamptz (30 дней после создания → обнуление)
user_agent_hash: string
previous_record_hash: string? (хеш предыдущей записи для цепочки)
created_at: timestamptz
- Append-only + хеш-цепочка
- IP-хеш автоматически обнуляется через 30 дней (cron job)
WebAuthnCredential
id: UUID PK
parent_id: FK → Parent? (null для Lehrer)
teacher_id: FK → Teacher? (null для Eltern)
credential_id: string (WebAuthn credential ID)
public_key: text (PEM)
sign_count: int
device_name: string? (напр. «iPhone 15 Pro»)
created_at: timestamptz
last_used_at: timestamptz?
- Используется и для Lehrer (вход), и для Eltern (подписание)
- Одна запись на устройство: родитель может иметь несколько устройств (свой телефон + рабочий)
FormTemplate (для Musikschule)
id: UUID PK
school_id: FK → School
name: string
fields: jsonb (массив определений полей)
is_published: boolean
public_url_token: string (уникальный)
created_at: timestamptz
FormSubmission
id: UUID PK
form_template_id: FK → FormTemplate
parent_id: FK → Parent?
field_values: jsonb ({key: value, ...})
status: enum (pending | filled | signed)
signed_pdf_url: string?
submitted_at: timestamptz?
created_at: timestamptz
6.3. Принципы хранения данных
``` ГДЕ ЧТО ХРАНИТСЯ:
Устройство родителя: ├── Приватный ключ WebAuthn (Secure Enclave / TEE) ├── Визуальная подпись (временно, до отправки) └── Ничего после закрытия браузера
Сервер (Supabase): ├── PostgreSQL: School, Teacher, Class, Parent (метаданные), Document, │ DocumentRecipient, SigningRecord, WebAuthnCredential (публичный ключ), │ FormTemplate, FormSubmission │ ├── Supabase Storage: │ ├── /documents/{doc_id}/original.pdf │ ├── /documents/{doc_id}/printable/{recipient_id}.pdf │ └── /documents/{doc_id}/signed/{recipient_id}.pdf │ └── НЕ ХРАНИТСЯ НА СЕРВЕРЕ: ├── Приватные ключи WebAuthn ├── Визуальная подпись (PNG) — удаляется после встраивания в PDF ├── Email родителей в открытом виде (только SHA-256 хеш) ├── IP-адреса (только SHA-256 хеш, авто-удаление через 30 дней) └── Биометрические данные (никогда не покидают устройство) ```
7. Что НЕ входит в MVP
Категорически исключено из MVP:
| Функция | Причина исключения | Когда появится |
|---|---|---|
| Нативное мобильное приложение (iOS/Android) | PWA достаточно для MVP. Разработка нативных приложений — 2x времени соло-основателя. | M7-9 (при 50+ школ, если будет запрос) |
| Регистрация / аккаунт для родителей | Противоречит УТП («без аккаунта»). Родитель идентифицируется через уникальный recipient_token в QR-коде. | Никогда (архитектурное решение) |
| CSV-импорт списков учеников | Lehrer вводит учеников вручную (5-10 минут на класс из 28 человек). Для пилота из 2-5 классов — приемлемо. | M4 (первый фича-релиз после пилота) |
| Шаблоны документов для Lehrer | Каждый Elternbrief загружается как PDF — Lehrer использует свои Word/Canva-шаблоны. | M5 |
| Интеграция с Schulverwaltungssystemen (Untis, IServ, WebUntis) | Каждая интеграция — месяцы разработки. Нет смысла до первых 20 школ. | M12+ |
| Интеграция с EUDI Wallet (eIDAS 2.0) | Технология в стадии развёртывания в ЕС (2026-2027). Не для MVP. | M18+ (по факту adoption) |
| QES (Qualified Electronic Signature) через TSP | SES достаточно для 80%+ школьных документов. QES требует интеграции с D-Trust/Swisscom. | M12+ |
| Offline-подписание | Устройство должно быть онлайн для верификации токена и WebAuthn challenge. | Не планируется (архитектурное ограничение) |
| Мультиязычность (EN, FR, IT) | Только немецкий. DACH-рынок, школы в Германии говорят по-немецки. | M8 (по запросу из CH) |
| White-label / кастомизация бренда школы | Каждая школа видит стандартный stimmt's-интерфейс. | M10 |
| Автоматические email/SMS-напоминания родителям | Требует хранения контактов родителей в открытом виде (email, телефон). MVP: Lehrer получает текст напоминания и отправляет сам. | M5 (когда решим модель хранения контактов) |
| Родительский кабинет с историей | Нет аккаунта = нет истории. Каждый Elternbrief — отдельная сессия. | Не планируется (архитектурное ограничение) |
| Мобильное приложение для Lehrer | Lehrer работает через десктопный веб (школьный ноутбук/PC). Мобильный Lehrer — post-MVP. | M8 |
| Расширенная форма Anmeldeformular (conditional logic, расчёт стоимости) | Только простые поля (текст, выбор, дата). | M8 |
| API для третьих лиц | Закрытая система. | M12+ |
| Расширенная аналитика для Schulleitung | Только базовый статус в Lehrer-дашборде. | M6 |
| Интеграция с платежами (оплата Musikschule) | Только подписание и сбор данных. Оплата — вне системы. | M12+ |
| SCORM / экспорт для Schulamt | Аудит-трейл только в PDF и CSV. | M10 |
Границы MVP — одним предложением:
Lehrer вручную управляет классами и создаёт Elternbriefe через веб-дашборд; родители подписывают через PWA без аккаунта; школа получает подписанные PDF с аудит-следом. Всё.
8. Success Metrics
8.1. Пилотная фаза (M1-M3, 2-5 школ)
| Метрика | Цель | Как измеряем |
|---|---|---|
| Signing Completion Rate | >80% родителей подписывают в течение 3 дней | Считаем: signed / total_recipients для каждого документа, медиана по всем документам |
| Parent Open Rate | >90% сканируют QR и открывают PWA | Событие opened / total_recipients |
| Technical Error Rate | <5% попыток подписания завершаются ошибкой | События signing_started с переходом в signed vs без перехода |
| WebAuthn Success Rate | >95% успешных WebAuthn-аутентификаций | Успешные / всего попыток WebAuthn |
| Lehrer Time Saving | >50% меньше времени на отслеживание подписей (qualitative) | Опрос Lehrer до/после |
| Lehrer NPS | >30 | NPS-опрос после 1 месяца использования |
| Parent Satisfaction | >80% предпочитают stimmt's бумаге | Опрос родителей (через Lehrer) |
| Time to Sign (Median) | <3 минуты от сканирования QR до подписания | Разница signed.timestamp - opened.timestamp |
| Document Creation Time | <3 минуты на создание Elternbrief | Засекаем от клика «Neuer Elternbrief» до «Erstellen» |
8.2. MVP-фаза (M4-M7, 10-30 школ)
| Метрика | Цель | Как измеряем |
|---|---|---|
| Weekly Signed Documents per School (WSDpS) | >20 | COUNT(signed) / неделя / школа |
| Monthly Active Teachers (MAT) | >80% Lehrer используют хотя бы 1 раз в месяц | Уникальные teacher_id с document.created_at в месяце |
| School Retention (Semester) | >80% школ продолжают использование во втором семестре | Школы активные в Sem1 И активные в Sem2 |
| Document Completion Rate | >85% документов достигают >90% подписаний | Документы где signed/total > 0.9 |
| Time to First Sign | <2 часа от создания документа до первой подписи | Первое signed_at минус document.created_at |
| Repeat Usage | >70% Lehrer создают 3+ документов в месяц | Lehrer с ≥3 документами / все Lehrer с ≥1 |
| Churn Risk Indicator | <15% Lehrer с 0 документов за последние 30 дней | Lehrer без активности 30 дней / активные Lehrer |
| Server Uptime | 99.5% (пиковые часы: будни 18-22, выходные 10-14) | Uptime Robot |
| Support Tickets per School | <1 тикет/школа/месяц | Тикеты (email от Lehrer) / школы / месяц |
8.3. Growth-фаза (M8-M12)
| Метрика | Цель |
|---|---|
| WSDpS | >40 |
| Платящие школы | 50+ |
| MAT | >85% |
| School Retention (Jahr) | >75% остаются на второй год |
| Parent NPS | >40 |
| Time to Sign (P90) | <5 минут (худшие 10%) |
| Customer Acquisition Cost | Определяется PM-панелью |
| Lifetime Value | Определяется PM-панелью |
9. Pricing (Варианты — без жёстких цифр)
Статус: Модель ценообразования определяется Product Manager панелью. Ниже — варианты для анализа.
Вариант A: Per-Class (Fokus: Lehrer-бюджет)
- Школа платит за каждый класс, использующий stimmt's
- Цена: за класс / месяц или за класс / Schuljahr
- Плюсы: Lehrer может оплатить из Klassenkasse без участия Schulleitung. Низкий порог входа. Растёт organisch: 1 Lehrer → его Kollegen → вся школа.
- Минусы: Сложно прогнозировать доход. Школа может иметь 30 классов, но использовать только 2.
- Подходит для: Пилот и ранний рост через Lehrer-бюджет.
Вариант B: Per-School (Fokus: Schulleitung)
- Школа платит фиксированную сумму за всю школу
- Цена: за школу / месяц или Schuljahr, зависит от числа учеников
- Плюсы: Предсказуемый доход. Проще для Schulleitung (один договор). Мотивирует полный adoption.
- Минусы: Высокий порог входа. Требует решения Schulleitung / Schulträger. Долгий цикл продажи (3-12 месяцев).
- Подходит для: Schulen с >75% adoption, контракты на уровне Schulleitung.
Вариант C: Freemium (Fokus: вирусный рост)
- Бесплатно: первые 2 класса на школу
- Платно: дополнительные классы
- Плюсы: Нулевой барьер для Lehrer. Быстрый рост пользовательской базы. Lehrer доказывает ценность Schulleitung на бесплатном тире.
- Минусы: Бесплатные пользователи — затраты на инфраструктуру. Конверсия в платящих может быть низкой.
- Подходит для: Фаза пилота и MVP (M1-M7).
Вариант D: Per-Signature (Fokus: переменные издержки)
- Школа платит за каждую подпись
- Цена: за подпись или пакет подписей
- Плюсы: Справедливо для маленьких школ. Платишь за использование. Легко объяснить.
- Минусы: Непредсказуемый счёт для школы. Сложно бюджетировать. Школа видит каждую подпись как затрату → демотивирует использование.
- Подходит для: Musikschulen с сезонным потоком (семестровые Anmeldungen).
Вариант E: Комбинация (рекомендовано к анализу)
- Фаза 1 (M1-M7): Freemium. 2 класса бесплатно. Платные классы — per-class.
- Фаза 2 (M8+): Per-school для школ с >10 классов. Per-class для остальных. Per-signature для Musikschulen с сезонным потоком.
Принципы ценообразования (для PM-панели):
- Lehrer должен иметь возможность оплатить из Klassenkasse (€200-400/год на класс) — без согласования со Schulleitung.
- Цена должна быть ниже, чем затраты времени Lehrer на бумажный процесс (5 часов/месяц × €30/час = €150/месяц скрытых затрат).
- Freemium на старте снижает барьер для Lehrer-нетворка основателя.
- Нулевые затраты на привлечение в Lehrer-канале (основатель = Lehrer, личный нетворк).
- Цена не должна быть препятствием для adoption. Лучше 100 школ по €X, чем 5 школ по €10X.
10. Open Questions (для PM-панели)
| # | Вопрос | Важность | Затрагивает |
|---|---|---|---|
| OQ-1 | Достаточен ли WebAuthn SES для юридической силы Elternbrief-подписей в немецких Schulen? Нужна ли экспертиза Schulrecht? | Критическая | Юридическая состоятельность продукта |
| OQ-2 | Как именно работает Lehrer-бюджет (Klassenkasse) в разных Bundesländern? Есть ли ограничения на цифровые сервисы? | Высокая | Pricing, GTM |
| OQ-3 | Нужен ли AVV-договор (Auftragsverarbeitung) для каждой школы ИЛИ достаточно стандартных условий? | Высокая | Onboarding, Legal |
| OQ-4 | Модель ценообразования — per-class / per-school / freemium / комбинация? | Высокая | Бизнес-модель |
| OQ-5 | Хранение email родителей: SHA-256 хеш достаточно для функциональности напоминаний? Или нужен открытый email? | Высокая | Datenschutz, функциональность |
| OQ-6 | Как Schulen сейчас решают проблему подписания Elternbriefe? Используют ли уже какие-то цифровые инструменты? | Средняя | Позиционирование |
| OQ-7 | Готовы ли Eltern подписывать пальцем на экране? Или ожидают стилус/печатную подпись? | Средняя | UX подписи |
| OQ-8 | Нужна ли печатная копия подписанного PDF Lehrer для Ordner? Или цифровой PDF достаточен? | Средняя | Фича «печать Lehrer» |
| OQ-9 | Какие типы школьных документов ТОЧНО требуют Schriftform (письменной формы) и не могут использовать SES? | Средняя | Границы применимости |
| OQ-10 | Должен ли родитель иметь возможность отозвать подпись (до дедлайна)? | Низкая | UX |
| OQ-11 | Нужна ли интеграция с Elternabend-инструментами (Doodle, Terminfindung)? | Низкая | Роадмап |
| OQ-12 | Могут ли mehrere Eltern подписывать один документ (при совместной опеке)? | Низкая | Фича multi-sign |
11. Роадмап (концептуальный, для PM-панели)
Phase 0: Pre-Pilot (M0, 2-4 недели)
- Интервью с 5 Lehrer из нетворка основателя (боли, текущий процесс, готовность платить)
- Landing page: stimmts.app (описание, сбор waitlist)
- Технический spike: PWA + WebAuthn + pdf-lib — proof of concept (1 Elternbrief → подпись → PDF)
- Выбор модели ценообразования (PM-панель)
- Gate: 5 Lehrer подтвердили готовность участвовать в пилоте → GO
Phase 1: Pilot (M1-M3)
- MVP-разработка (соло, Claude Code)
- Пилот: 2-5 школ из нетворка основателя
- Только Elternbrief-поток (не Musikschule)
- Ручное onboarding каждого Lehrer (основатель лично)
- Сбор метрик, багов, фидбека
- Gate: Completion rate >80%, Lehrer NPS >30, нет критических багов → GO to MVP launch
Phase 2: MVP Launch (M4-M7)
- Расширение до 10-30 школ (Lehrer-нетворк + сарафанное радио)
- Musikschule-модуль (Anmeldeformular)
- Автоматический onboarding (без участия основателя)
- Базовый биллинг
- Gate: 10+ платящих школ, churn <10%
Phase 3: Growth (M8+)
- 50+ школ
- CSV-импорт, шаблоны, email-напоминания
- Интеграции: первые 1-2 Schulverwaltungssysteme
- QES для документов со Schriftformerfordernis
- Gate: Устойчивый MRR, основатель может нанять первого разработчика
12. Риски и митигация
| Риск | Вероятность | Влияние | Митигация |
|---|---|---|---|
| Eltern не готовы подписывать через PWA (предпочитают бумагу) | Средняя | Высокое | Пилот покажет реальную adoption rate. При <50% — добавить альтернативный поток (бумажное подписание с ручным вводом Lehrer) |
| WebAuthn слишком сложен для нетехнических родителей | Средняя | Среднее | Fallback: PIN (WebAuthn user verification) вместо биометрии. Инструкция с картинками на экране |
| Школы требуют QES (юридически) | Низкая | Критическое | Юридическая экспертиза ДО разработки. Определить точный перечень документов, где SES достаточен |
| Schulträger блокирует использование (Datenschutz-Bedenken) | Средняя | Среднее | Вход через Lehrer-бюджет (не требует согласования). AVV и DPIA-документация для Datenschutzbeauftragter |
| Конкуренты добавляют «без аккаунта»-режим | Низкая | Среднее | Скорость выполнения. Основатель = Lehrer = быстрее понимает потребности. Нишевый фокус на Elternbriefe |
| Соло-основатель не справляется с поддержкой при 30+ школах | Средняя | Высокое | Автоматический onboarding. FAQ/help в интерфейсе. Чат-поддержка только для платящих. При 30 школах — нанять Teilzeit-Support |
| Технический долг из-за скорости разработки (Claude Code) | Средняя | Среднее | Рефакторинг между фазами (запланирован в роадмапе). Монорепо, минимум микросервисов. |
13. Заключение
stimmt's — нишевый продукт для конкретной, хорошо понятной основателю проблемы: цифровизация Elternbrief-подписания в немецких школах.
Ключевые отличия от конкурентов: - Нет аккаунта для родителей - Нет установки приложения - Datenschutz через data minimization (подпись только на устройстве) - Вход через Lehrer-бюджет (минуя Schulträger) - Основатель = Lehrer (инсайдерские знания, нетворк)
Главный риск MVP — adoption родителями. Пилот из 2-5 школ покажет реальную готовность Eltern использовать PWA для подписания. Если completion rate < 80% — продукт требует доработки UX, а не смены концепции.
Архитектурный принцип — простота. Монолит, минимум сервисов, PWA вместо нативных приложений. Соло-основатель с Claude Code должен быть способен построить и поддерживать MVP в одиночку.
Следующий шаг: Product Manager панель (VeriChain #05) — определение модели ценообразования, приоритизация фич MVP, детальный план первых 4 недель разработки.
PRD составлен: 2026-06-30 Версия: 1.0 — Pre-MVP Следующая панель VeriChain: #05 Product Manager