Тренажёр английского по шаблонам (pattern drills) с интервальным повторением, озвучкой ElevenLabs и накопительной отработкой фраз. Сидит в меню-баре macOS (🇬🇧), по расписанию показывает окно поверх всех окон.
Проще всего — иконкой ENGLESY.app (двойной клик; можно перетащить в Dock). Приложение
написано на Electron (JavaScript + HTML/CSS), работает в фоне как
значок в меню-баре. Если иконки нет — собрать её одной командой:
zsh bin/make-app.sh # создаёт ENGLESY.app с иконкой в корне проектаИз терминала — то же самое:
npm install
npm start # фоновое приложение (значок-флаги 🇬🇧🇫🇷)
npm run now # запустить и сразу показать окноМеню-бар (🇬🇧🇫🇷): для каждого языка время следующего окна и серия дней, подменю «Практика сейчас → язык», «Сбросить таймеры», «Выход». Двойной запуск не плодит копий (одна копия на систему); повторный клик по иконке просто открывает практику.
- Фраза проговаривается 3 раза голосом (Max, US, медленно) — слушаешь.
- Накопление по словам: did → did you → did you know → … Двигаешься клавишами:
- горит L → левая рука: ← / левый Ctrl
- горит R → правая рука: → / правый Ctrl
- не та сторона → фраза дёрнется и не пойдёт (держит чередование). Пробел — аварийно «дальше».
- Не знаешь слово? Наведи на него мышкой в строке вверху → всплывёт перевод.
- В конце — повтори быстро 10×: жми любую клавишу, точки растут и заливаются из 🔴 в 🟢.
Кнопки: 🔊 Ещё раз (R) — переозвучить, ⏭ Пропустить (S) — пропустить фразу. Esc — закрыть.
Каждая пройденная фраза возвращается через растущие интервалы: 0 → 1 → 3 → 7 → 16 → 35 → 90 дней (config.json → srs.intervalsDays). Сессия старается всегда набрать sentencesPerRun фраз: сначала повторения и новые фразы из фокусного шаблона, затем близкие шаблоны того же временного блока, затем fallback по текущему уровню. Пропущенные фразы возвращаются в ближайший подходящий слот.
Прогресс хранится в data/progress.json: серия дней (🔥), выучено/всего, сделано/пропущено по дням.
"schedule": { "days": [1,2,3,4,5], "startHour": 10, "endHour": 17, "everyMinutes": 60 }Пн–Пт, каждый час с 10:00 до 17:00 (8 окон/день). days: 0=вс … 6=сб.
Тренажёр заточен под разговорный автоматизм: быстрые блоки одного шаблона, чтобы конструкции вроде Did you ...?, Does he ...?, I haven't ... yet, Would you mind ...? ложились в речь без перевода в голове. Основная рабочая цель задаётся config.json → drill.targetLevel и по умолчанию равна B2; B2+ остаётся в базе как запас, но не съедает основные слоты.
Внутри дня фокус времен задаётся config.json → drill.tenseRotation:
["present", "past", "future", "present", "modal", "conditional", "perfect", "present"]При расписании 10:00–17:00 это даёт: утром present, потом past, future, снова present, modal, would/if, perfect и финальный present. Так текущий уровень не проходится линейной кашей из одних present-конструкций.
173 группы конструкций = 1932 предложения, сгруппированы по уровням A2 → B1 → B2 → B2+ и по шаблонам/временам. Активная цель B2 использует 1212 предложений: A2 и B1-группы дают по 10 фраз на шаблон, B2 даёт более длинные блоки для связной разговорной речи.
ElevenLabs через прокси (обход геоблокировки РФ). Голос Max (Gfpl8Yo74Is0W6cPUWWT), модель eleven_multilingual_v2, speed 0.85. Аудио кэшируется в data/tts-cache/ — кредиты не тратятся на повторы. Сменить голос/скорость — поля voiceId / speed.
Контент собирается из data/curriculum/*.json через build-data.js → пишет data/sentences.json. Правь группы в data/curriculum/, затем запусти node build-data.js. Формат предложения:
{ "text": "Did you call him", "translation": "Ты звонил ему?",
"gloss": [ {"w":"Did","t":"(вопрос. прош.)"}, {"w":"you","t":"ты"}, {"w":"call","t":"звонил"}, {"w":"him","t":"ему"} ] }gloss — пословный перевод (по одному на слово, в том же порядке, что и слова в text). Скрипт проверяет выравнивание.
Рекомендуемый способ — Login Item (приложение лежит в ~/Documents, а это защищённая
папка macOS, поэтому launchd/LaunchAgent к ней доступа не имеет). Добавить в автозапуск:
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/Users/artemiimiller/Documents/ENGLESY/ENGLESY.app", hidden:true, name:"ENGLESY"}'Убрать из автозапуска:
osascript -e 'tell application "System Events" to delete login item "ENGLESY"'Либо вручную: Системные настройки → Основные → Объекты входа → + и выбрать ENGLESY.app.
(Старый com.englesy.popup.plist оставлен для справки — он работает, только если проект лежит
вне ~/Documents.)