Архитектура
Обзор системы
iOS app / agent client -> api.<domain> -> API Gateway -> Lambda backend -> Postgres
Web app -> app.<domain> -> CloudFront -> SPA
Browser and agent auth -> auth.<domain> -> API Gateway -> Auth Lambda -> Cognito
Apex fallback -> <domain> -> CloudFront redirect -> app.<domain>
Принципы
- Для
app,apiиauthиспользуются отдельные публичные домены - Postgres остаётся источником истины
- iOS-приложение работает по модели offline-first: локальная SQLite плюс синхронизация
- Веб-приложение, iOS-приложение и внешний агентский интерфейс используют одну и ту же модель рабочих пространств
- Внешние агенты начинают работу с
GET https://api.flashcards-open-source-app.com/v1/
Поддерживаемые клиенты
- Веб-приложение на
app.flashcards-open-source-app.com - iOS-приложение в основном репозитории с локальным хранилищем SQLite
- Android-приложение в Google Play
- Внешние агенты через discovery, OTP bootstrap и
Authorization: ApiKey
Модель данных
workspacesworkspace_membersuser_settingsdevicescardsdecksreview_eventsapplied_operationssync_state
Поток данных
Веб
- Браузер выполняет вход через
auth.<domain>. - Веб-приложение загружает данные рабочего пространства из
api.<domain>. - Запросы AI-чата проходят через
/chat/local-turn. - При записи результатов повторения обновляется состояние планировщика.
iOS
- iOS-приложение сначала записывает данные в локальную SQLite.
- Локальные изменения ставятся в очередь outbox.
- Синхронизация отправляет изменения через
/v1/workspaces/{workspaceId}/sync/push. - Синхронизация получает удалённые обновления через
/v1/workspaces/{workspaceId}/sync/pull. - Локальная база данных применяет изменения и продвигает курсор синхронизации.
Внешние агенты
- Агенты начинают с
GET /v1/. - OTP bootstrap выполняется на
auth.<domain>. - Агент получает долгоживущий ключ API.
- Агент загружает
/v1/agent/me, получает список рабочих пространств, при необходимости выбирает одно и затем использует/v1/agent/sql.
Планирование повторений
В Flashcards за планирование повторений отвечает FSRS.
Примечания по реализации:
- На backend и в iOS поддерживаются согласованные реализации FSRS
- Веб-приложение повторяет контракт данных планировщика, но не содержит третью отдельную реализацию
- Настройки планировщика на уровне рабочего пространства включают desired retention, learning steps, relearning steps, maximum interval и fuzz
- Фактическое время повторения берётся из
reviewedAtClient
Подробный контракт описан в FSRS scheduling logic in the main repository.
Аутентификация
- Email OTP через Cognito
- Cookies браузерной сессии, общие для всего домена, для размещённого веб-приложения
- OTP bootstrap для агентов на
auth.<domain>с выдачей долгоживущего ApiKey AUTH_MODE=noneдля локальной разработкиAUTH_MODE=cognitoдля аутентификации, приближенной к боевой среде
Схема развертывания
app.<domain>-> CloudFront + S3api.<domain>-> API Gateway + Lambda backendauth.<domain>-> API Gateway + Lambda auth service- Postgres в AWS RDS
Корневой домен может оставаться на отдельном маркетинговом сайте. Если на этапе начального запуска он свободен, инфраструктура может временно перенаправить его на app.<domain>.