Upload script: - Retry curl on transient network failures (504, schannel TLS abrupt close): up to 4 retries with 15s/45s/2m/5m backoff. Before each retry, list the release assets server-side — Gitea sometimes commits the body but times out the response, so the file may already be there at the expected size (skip retry). If present at wrong size (partial), delete before re-uploading. ASCII-only (PS5.1 reads files in CP1251 without BOM). Docs: - README: bump release/test badges to v0.5.1 / 51 tests; mention silent retry in the auto-update feature line. - RELEASING: rewrite around the new update-channel architecture, bridge tags, and dropped Gitea Actions workflows. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Laude — Exercise Reminder
Windows desktop приложение, которое напоминает делать упражнения во время работы за компьютером. Опционально подключается к Dota 2 и после каждого матча превращает статистику (смерти, убийства, ассисты) в количество повторений.
Что внутри
- Гибкие напоминания — любое количество упражнений, интервал от минуты до часов, разные иконки.
- История и стрики — heatmap-календарь активности, ежедневный счётчик, серия дней подряд.
- Тихие часы — окно времени когда напоминания подавляются (например
22:00 → 08:00), с выбором дней недели. - Сделал частично — степпер
−/+в окне напоминания: если ты сделал 5 из 10, в историю запишется честное число. - Игровая интеграция (Dota 2) — Game State Integration читает статистику матча, после Победа/Поражение показывает экран с «причитающимися» повторениями (например
10 смертей × 3 = 30 приседаний). - Apple-style интерфейс — Plus Jakarta Sans + Bricolage Grotesque, iOS-палитра, vibrancy sidebar, spring-анимации, светлая/тёмная/системная тема.
- Два языка — русский и английский, переключение мгновенное.
- Auto-update — приложение само скачивает новые версии из фиксированного
update-channel(проверка каждый час, силент-ретрай при сетевых сбоях).
Скриншоты
TODO: вставить screenshots Dashboard / Reminder / Match summary (light + dark).
Установка
Скачай последний Exercise-Reminder-Setup-X.Y.Z.exe со страницы релизов и запусти. Установщик:
- Создаёт ярлык на рабочем столе и в Пуске
- Сохраняет настройки в
%APPDATA%\Exercise Reminder\ - При запуске поверх существующей инсталляции — обновляет, настройки сохраняются
Windows SmartScreen может предупредить «не доверено» — приложение не подписано code-signing сертификатом. Нажми Подробнее → Выполнить в любом случае.
Разработка
git clone https://xn--90adajar8af4h.xn--p1ai/git/AnRil/laude.git
cd laude
npm install
npm run dev
Полезные команды:
npm run typecheck # tsc по main + renderer
npm run test # vitest в watch-режиме
npm run test:run # vitest один раз (для CI)
npm run build # сборка без NSIS
npm run dist # сборка + NSIS-инсталлятор → release/
npm run release -- -Bump patch # bump версии + tag + push + upload в Gitea
Документ RELEASING.md описывает процесс выпуска новых версий.
Архитектура
- Electron 33 — multi-process: main (Node/scheduler/GSI) + preload (contextBridge) + renderer (React)
- Renderer — React 18, TypeScript 5, Vite 5, Tailwind 3, framer-motion, react-router, zustand
- Persistence — единственный JSON-файл
%APPDATA%\Exercise Reminder\app-state.json(debounced writes) - IPC — типизированные каналы через
src/shared/ipc.ts, обёрнуто preload-ом - i18n — самописная микро-система:
src/renderer/src/i18n/dict.ts(плоский словарь ~200 ключей × 2 языка) + хукuseT() - Auto-update —
electron-updaterсgenericprovider, манифестlatest.ymlлежит в Gitea release attachments - GSI Dota 2 — локальный HTTP-сервер слушает GameStateIntegration коллбэки от Steam, парсит match-end events
Тесты
src/shared/types.test.ts (4)
src/shared/quiet-hours.test.ts (5)
src/renderer/src/lib/format.test.ts (8)
src/renderer/src/lib/history.test.ts (13)
src/main/games/vdf.test.ts (11)
src/renderer/src/i18n/i18n.test.ts (10)
─────────────────────────────────────────
51 ✓
Покрытие: чистые helpers (форматирование, история/стрики, тихие часы, парсер VDF для Steam-конфигов), i18n с плюрализацией для RU/EN, дефолты shared-типов.
Лицензия
Пока не указана. По умолчанию все права защищены. Если хочешь форк/использование — открой issue.
Stack
- Electron · runtime
- electron-vite · build
- React + TypeScript
- Tailwind CSS · стили
- framer-motion · анимации
- lucide-react · иконки
- electron-updater · auto-update
- Vitest · тесты
- Шрифты: Plus Jakarta Sans, Bricolage Grotesque, JetBrains Mono