BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
DaFit helps personal trainers manage their schedule and keep track of client passes and progress.
Sports & fitnessTypeScript · PLpgSQLGitHub @toprudikOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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 (на английском).