TypeLearn


Изучение языка через диктант — Django, Strawberry GraphQL и Vue

Идея

Большинство приложений для изучения языка проверяют узнавание: выбрать правильное слово из четырёх, перевернуть карточку. Так учишься узнавать слово, когда видишь его. Диктант учит другому — записывать то, что слышишь: вы слушаете фразу и набираете её сами, без вариантов на выбор.

Материал для этого уже есть. Common Voice — бесплатная коллекция записанных фраз более чем на сотне языков, собранная добровольцами: у каждой записи есть текст, а другие слушатели её проверяют. TypeLearn превращает эти записи в диктанты, оставляя только короткие фразы с проверенной озвучкой.

Возможности

(на данный момент)

  • Запись начинает играть, как только появляется фраза, — сначала слушаете, а не переписываете
  • Экранная тайская клавиатура (раскладка Kedmanee) подсвечивает следующую клавишу и сама переключается на слой Shift, если нужный символ там; после ошибки подсвечивается Backspace
  • Клавиши раскрашены по пальцам, которыми их нажимают, а исходные позиции указательных пальцев отмечены — слепая печать для письменности, на которой большинство учащихся никогда не печатали
  • Ответ проверяется, как только достигает длины фразы, — нажимать ничего не нужно
  • После правильного ответа — итоги за сегодня и за последние 7 дней (символы, нажатия клавиш, фразы) и ещё одно прослушивание только что набранной фразы
  • Тайский текст набран шрифтом с петельками: новички различают тайские буквы именно по ним
  • Работает на телефоне: системная клавиатура не выезжает и не закрывает клавиатуру приложения
  • Интерфейс на английском, французском, немецком, тайском, русском и венгерском
  • Без регистрации: счётчики практики хранятся в вашем браузере

Технологии

Backend — Django со Strawberry GraphQL API поверх PostgreSQL. Frontend — Vue 3 с Pinia и Tailwind. Деплой в Kubernetes одним Helm-чартом; CI/CD — на GitHub Actions.

Раскладки клавиатуры — обычные файлы с данными, поэтому новая раскладка — это новый файл, а не переписанная клавиатура.

Как я это разрабатываю

Локальная разработка поднимает тот же Helm-чарт, что и продакшен, на кластере kind под управлением Tilt. У каждого git worktree — моего или LLM-агента — свой namespace, своя база и свои порты, а каждая фича начинается с openspec-предложения ещё до кода.

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

CI на GitHub Actions собирает каждый образ один раз и тестирует внутри него — pytest, Vitest и Playwright в настоящем браузере, — рендерит Helm-чарт во всех поддерживаемых конфигурациях, проверяет, что секрет не может попасть в ConfigMap, поднимает весь стек в кластере kind для smoke-теста и только после этого публикует ровно те образы, которые прошли проверку. Между тестированием и выпуском ничего не пересобирается.

Попробовать

Откройте typelearn.app — регистрация не нужна. Исходный код на GitHub, лицензия AGPL-3.0.