BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Приложение для персонального тренера и его клиентов
Расписание, абонементы, тренировки, питание и прогресс в одном месте: в браузере и прямо в Telegram.
Русский · English
Открыть DaFit · Бот @fitconnection_bot
Тренер обычно держит клиентов в тетрадке, таблице и переписках: кто когда придёт, кто сколько должен, у кого какой прогресс. DaFit собирает всё это в одно приложение, которым пользуются и тренер, и его клиенты.
Тренер ведёт своих клиентов в DaFit, а клиент видит свои занятия, абонементы и прогресс и сам решает, какие свои данные открыть тренеру. Один человек может быть и тренером, и клиентом: в приложении две зоны, «Тренер» и «Клиент», между ними можно переключаться. Вход только через Telegram.
Сейчас DaFit готовится к закрытой бете, которая стартует 24.11.2026. Название рабочее, репозиторий называется fit.
Для тренера
Для клиента
Приватность
| Часть | Технологии |
|---|---|
Веб и Telegram Mini App (apps/web) | Next.js 16, React 19, Tailwind CSS v4, shadcn/ui, motion |
Бот (apps/bot) | Python 3.13, aiogram 3, работает через вебхук |
| База и вход | Supabase: Postgres с RLS, миграции и тесты pgTAP; вход через Telegram |
| Хостинг | Vercel (веб и бот), уведомления уходят из очереди в базе по pg_cron |
Подробнее о стеке: ADR 0003.
apps/web/ веб-приложение и Telegram Mini App (Next.js)
apps/bot/ Telegram-бот (aiogram)
supabase/ SQL-миграции и pgTAP-тесты
docs/ решения, PRD, архитектура, дизайн, ADR
scripts/ служебные скрипты для CI и разработки
Нужен Docker и свой тестовый бот. Создай его в @BotFather (/newbot) и впиши токен в .env.local, он нужен и вебу, и боту. Боевой @fitconnection_bot локально не подойдёт: контейнер бота не запустится с ним, как и с любым ботом, у которого настроен вебхук (ADR 0002 §5). Если у тестового бота остался вебхук, например после запуска docker-compose.prod.yml, открой в браузере https://api.telegram.org/bot<токен тестового бота>/deleteWebhook или заведи другого бота.
cp .env.example .env.local и заполни пустые значения (подсказки есть в комментариях файла).docker compose up --build: веб откроется на http://localhost:3000, бот запустится в режиме polling.Telegram открывает Mini App только по публичному HTTPS-адресу:
docker compose --profile tunnel up и скопируй адрес https://….trycloudflare.com из логов tunnel..env.local впиши этот адрес в NEXT_PUBLIC_APP_URL и WEBAPP_URL и перезапусти docker compose up./start своему тестовому боту и нажми Открыть DaFit (Open DaFit, если Telegram на английском).В @BotFather → твой бот → Login Widget добавь адрес сайта и <адрес>/auth/telegram/callback в Allowed URLs, а показанные Client ID и Client Secret впиши в .env.local.
cd apps/web && npm run lint && npm run typecheck && npm test && npm run build
cd apps/web && npm run e2e # после build: Playwright и axe, телефон и десктоп, обе темы
cd apps/bot && uv run ruff check . && uv run ruff format --check . && uv run pytest
CI запускает то же самое, а ещё проверки базы, поиск секретов gitleaks и сборку Docker-образов.
Схема лежит в supabase/migrations/, тесты к ней в supabase/tests/ (pgTAP: RLS, права на столбцы, триггеры, ограничения). Нужны Docker и Supabase CLI 2.121.0, та же версия, что в CI. Команды запускаются из корня репозитория:
supabase db start # локальный Postgres 17, все миграции с нуля
supabase test db # все pgTAP-тесты
supabase db lint --local --schema public,private --fail-on error # plpgsql_check
supabase db advisors --local --type all --fail-on warn # советы по безопасности и скорости
supabase gen types typescript --local > apps/web/src/lib/supabase/database.types.ts
supabase stop # когда закончил
После новой или изменённой миграции supabase db reset пересобирает базу из всех миграций. Перегенерированный database.types.ts коммить как есть, без форматирования: CI падает, если файл расходится со схемой.
В рабочий проект Supabase миграции попадают только через main: когда push в main меняет supabase/migrations/, workflow Database deploy выполняет supabase db push и проверки советника. Строку подключения он берёт из секрета SUPABASE_DB_URL в окружении supabase-fit. Ночные зашифрованные копии базы делает отдельный закрытый репозиторий fit-backups: он по расписанию вызывает отсюда workflow db-backup.yml. Рабочую схему руками не правим.
Веб и бот работают на Vercel и выкатываются в продакшен только из main. Как устроены окружения, как настроить бота с нуля и как менять секреты, описано в docs/deployment.md (на английском).