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.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Самодокументирующий README для GitHub. Полная внутренняя версия:
../МЕТОДОЛОГИЯ_new_ce634_v1.0.md. Обновлять при существенных изменениях. Эталон «new»/мобильной версии —ce634.html.
Статический сайт статистики мафия-турниров. Без сборки (no build): чистые HTML+CSS+JS. Прод — Vercel (mafgamestat.vercel.app). Каждый турнир имеет id (напр. 634 = Чемпионат Европы 2026).
Два вида страниц турнира:
tournament.html, participants.html, seating{id}.html, cards{id}.html, standings.html, results.html, roles.html, player.html). Десктоп-ориентированы.ce{id}.html (эталон ce634.html). Мобайл-фёрст, esports-раскладка, всё в одном файле поверх ТЕХ ЖЕ данных.site/)index.html хаб турниров (список, статусы, постеры)
tournament.html страница турнира (?t=id) — меню разделов классики
participants.html состав + рейтинг markery (универсальная, ?t=id)
seating{id}.html интерактивная рассадка (классика)
cards{id}.html карточки игроков (классика)
standings.html сводная (?t=id) · roles.html (?t=id) · results.html · player.html
ce{id}.html «new»/мобильная версия (эталон ce634.html)
data/
tournaments.js РЕЕСТР всех турниров (статусы, постеры, accent, разделы, порядок)
live.js LIVE-движок: тянет игры с mafgame через прокси /mafgame/*, парсит, защищает снимок
streams.js ссылки на трансляции
tournament_{id}.json мета турнира (in_progress, games_total, prize_eur, stars, accent, referees, format)
participants_{id}.json ростер + рейтинг markery (nick,uid,real,av,status,markery_id,ms,r_tier,r_elo_cur,r_elo_2026,r_rank_eu_2026)
avatars_{id}.json {avatars:{nick:url}, judges:{"1":{name,tg,avatar},...}}
elo_{id}.json {players:{nick:{global,tournaments}}}
skip_{id}.json {nick: номер игры отдыха}
games_{id}_current.json {games:[{title,stage,tables:[{table_num,judge,winner,seats:[{seat,name,role,marker,aps,wpts,ci,result}]}]}]}
_snapshots/ снимки рейтинга markery по датам
assets/ постеры (bonn{id}.jpg — широкий, bonn{id}_card.jpg — 16:9 для hero), фавикон
vercel.json rewrite /mafgame/:path* -> https://mafgame.org/:path* (прокси для live)
tournaments.js (window.TOURNAMENTS_DB.tournaments[]) — что за турниры, статусы, постеры, accent, разделы.data/ (см. выше).tournament_{id}.json.in_progress===true, live.js loadGames(id) при каждом открытии тянет /mafgame/tournaments/{id}/game_results (Vercel проксирует на mafgame.org), парсит Inertia-данные (convertInertia), сравнивает с сохранённым в localStorage снимком и не затирает хорошие данные пустыми (snapScore/notRegression). До старта / для завершённых — отдаёт локальный games_{id}_current.json.results mafgame (red_win/black_win), не из очков.Источники: mafgame.org (ростер uid, протоколы, рассадка, результаты — HTML Inertia), markery.online (ELO/тиры/места — ведём через Excel-базу, снимок в _snapshots/), mafiastats.com (REST, сверка).
ce634.html)Загрузчик → объект D → computeSeating()+computeStats() → NAV (4 группы) строит sidebar(desktop)/tabbar(mobile) → RENDER[section]()+afterRender().
@media(max-width:1024px) (ловит и раскрытый Fold). Таб-бар снизу, всплывающее меню, тумблер Компактно/Подробно, залипший ник.statFull (Компактно/Подробно), myPlayer+viewMode (localStorage), демо-режим (makeDemo — полный случайный бракет для проверки статы до старта).Статус задаётся в tournaments.js (status) + флаг in_progress в tournament_{id}.json. Порядок на главной — поле phase.
status:"gathering", phase:4, in_progress:false. Показываем анонс/заявки.status:"upcoming", phase:3. Доступны рассадка/карточки/участники; игр ещё нет. in_progress:false до дня старта.tournament_{id}.json.in_progress:true, status:"live", phase:2. live.js при каждом открытии подтягивает game_results через прокси.
in_progress:true постоянно (лишняя нагрузка на mafgame + риск подтянуть кривое/пустое). Включаем на дни турнира, после — выключаем.in_progress:false, status:"finished", phase:1. Данные заморожены, турнир уходит в архив (главная сортирует по дате start).tournament_{id}.json → standings (total/final/qualification), awards, чемпион/подиум. Сверить с сайтом mafgame до цента — итог и расшифровка обязаны биться.games_{id}_current.json (роли, очки, победители столов) как есть на конец турнира.tournament_{id}.json.in_progress:false; в tournaments.js status:"finished", phase:1.tournament_{id}.json.final_coef (напр. 1.3) — live.js (v2.1) умножает баллы стадии «Финал» на лету, а при заморозке коэффициент вшивается в games_{id}_current.json. Сверка 694: квалификация 30/30 и финал 10/10 — 1:1. Для завершённых источник истины — всё равно таблица mafgame.data/*_{newid}* (participants/tournament/avatars/elo/skip/games_current) по схемам выше. Добавить запись в tournaments.js.ce634.html → ce{newid}.html, заменить 634→{newid}, тексты (название/город/даты), START-дату, постер assets/*_card.jpg (16:9).stagesPanel() и группировку селектора игр (День/стадии) под реальный формат. Число игр — из данных, не хардкод.tournament.html?t={newid} (условие по t.id).cd site
zip -r ../Uploaded/mafgamestat_vN_upload.zip . \
-x "_Архив/*" -x "data/_snapshots/*" -x "SPEC.md" -x "*.DS_Store" -x "*.bak" -x "* *"
→ содержимое залить в GitHub (github.com/ValeriiScz/bitvachempionov2026) → Vercel автодеплой. Zip кладёт содержимое site/ в корень (без префикса). Перед сборкой zip: поднять CACHE_VERSION в sw.js (иначе у установивших PWA код обновится только со 2-го открытия).
.seatgrid/сетки: repeat(N,minmax(0,1fr)) + min-width:0 — иначе min-content колонок вылезает.live.js (localStorage snapScore/notRegression) — она бережёт данные при глюках mafgame._Архив/.node --check / jsdom-прогон (проверять кликами, не только вызовом функций), баланс {} в CSS, десктоп-скриншот.Сайт устанавливается как приложение: manifest.json (standalone, палитра Bonn) + sw.js (service worker) + иконки assets/icons/ (эмблема mafgame внутри чемпионского кубка, золото на navy; any/maskable 192/512 + apple-touch-icon 180) + PWA-блок в <head> всех страниц (манифест, theme-color, iOS-меты, регистрация SW — только по http(s), локальный file:// просмотр не падает) + промо-плашка установки на всех страницах: iPhone — инструкция Safari→«На экран “Домой”», Android — кнопка «Установить» (beforeinstallprompt) или инструкция про меню Chrome; не показывается внутри установленного приложения и 14 дней после «Позже» (localStorage mgs_pwa_promo_hide_until).
Стратегии кэша (sw.js):
/mafgame/* — только сеть (кэш обходится): live всегда свежий, защита снимка в live.js не задета;data/*.json — network-first (офлайн — из кэша);⚠️ При каждом деплое поднять CACHE_VERSION в sw.js (…-v12.1, …-v13) — на activate старые кэши удаляются. Установка: iPhone — Safari → Поделиться → «На экран "Домой"»; Android — Chrome → меню ⋮ → «Установить приложение». Полноэкранный standalone-запуск заодно навсегда лечит баг «Версии для ПК».
Нативное приложение (Swift/Kotlin) — избыточно: та же зависимость от mafgame, магазины, поддержка.