BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Basketball app for P11 röd
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A small phone app to follow Blackeberg Basket P11 Röd (KFUM Blackebergs IK): fixtures, results, tables, play-by-play (Matchspel) and player stats. The text in the app is in Swedish.
Open the app: https://keithhearne.github.io/bbpered/
On Android (Chrome): open the link → ⋮ menu → Add to home screen. It then opens like a normal app, and it still works offline using the last data it saved.
Profixio (league + USM) ─┐
├─► GitHub Action (scraper/scrape.py) ─► data.json ─► the app
Cup Manager (cups) ─┘ runs on GitHub's servers in this repo on your phone
The update job. A GitHub Action (.github/workflows/update.yml) wakes up twice an hour. It runs the script scraper/scrape.py, which first decides whether there is anything to do right now (see the schedule below).
Fetching. When it is time, the script reads Blackeberg's pages on Profixio:
It also reads Cup Manager for cup games. Everything is saved into one file, data.json, in the root of this repository.
Publishing. The job commits data.json. GitHub Pages republishes the site, which takes about 1–2 minutes.
The app. Every time the app opens, it downloads the latest data.json and shows it. If the data has changed, the page refreshes itself and keeps you on the same tab or Matchspel page. The app also keeps a copy on the phone, so it works offline.
The app has a full copy of the data built in, from the day it was last published. If data.json can't be reached, it shows that instead.
The job wakes twice an hour, but it only contacts Profixio when there's a reason to. Most runs stop after a few seconds, which keeps the load on Profixio light.
| When | What happens |
|---|---|
| Every night: the first run after 03:00 (Swedish time) | Full check: new or changed fixtures, results and tables. It also checks the club's team list on Profixio for new competitions P11 Röd has been entered into (see below). |
| Fridays–Sundays, 08:00–22:00 | A check at least every 5 hours, for late changes before a game weekend. |
| Game day: from ~3 hours before tip-off | The first run in this window stays on and waits for the game. |
| Game day: from 10 min before tip-off, for ~1 h 40 min | Live mode: the score is checked every 2 minutes and written to live.json on the separate live branch. The full data (Matchspel, tables) is published every 15 minutes and as soon as a game ends. |
| Game day: after the live window | One full update, including tables. |
| The 6 hours after a game | Hourly catch-up, to pick up the final score sheet if it's uploaded late. |
| Any other time | Nothing; the job exits straight away. |
GitHub doesn't guarantee that scheduled runs happen on time, and it sometimes skips them altogether. On the first night (18–19 Oct 2026) it skipped the 03:00 run. So the job doesn't rely on exact times:
The job works out game days by itself from the same fixture list you see in Kalender, for league, USM and cup games alike. Weekday games are covered too. Times follow Swedish time, including the summer/winter time change.
Why a separate live branch? Every change on main makes GitHub rebuild the website, and GitHub only likes about 10 rebuilds an hour. The live score goes to the live branch instead, which isn't part of the website, so it can change every 2 minutes. The app reads it straight from GitHub and only redraws the score; the page doesn't reload. Don't delete the live branch.
Översikt shows a "Pågår nu" strip with the live score. Tap it to open Matchspel.
Matchspel fills in basket by basket and shows a LIVE badge instead of V/F.
While a game is on, the open app reads the live score every 2 minutes and the full data every 5 minutes. Normally it checks every 15 minutes, and whenever you switch back to it.
Delay: expect the score to be up to about 10–13 minutes behind real life. It's fetched every 10 minutes, plus 1–3 minutes for GitHub to publish it.
Each game is read from its own source. League and USM games come from Profixio; cup games (e.g. Södertälje Open) come from Cup Manager, where the cup publishes its scores. During a cup game the job only asks Cup Manager, and during a league/USM game only Profixio.
It depends on the scorers. Live data only exists if they enter it during the game (in Profixio, or in Cup Manager for cups). If a hall uses a paper score sheet, the result appears once it has been uploaded.
The new data is in the app about 2–3 minutes later.
STATUS.md in this repository lists the last run and the 40 most recent runs, with what each one did: "Checked — nothing due", "Full update (nightly check)", "Live update", and so on. status.json holds the same information for the app.GitHub pauses scheduled jobs in a public repository after 60 days without any activity. The nightly data commits should count as activity, so this shouldn't happen. If it ever does, GitHub shows a banner on the Actions tab, with a button to turn the workflow back on.
Every night the job looks through Blackeberg's list of teams on Profixio (the club's "registrations" page). It uses the page's own search filter, "Pojkar U16", so it only reads the club's ~5 Pojkar U16 teams instead of all ~73. It looks for Pojkar U16 entries that belong to P11 Röd: "KFUM Blackebergs IK Röd" in a Stockholm series, or "KFUM Blackebergs IK" in Ungdoms-SM or Riksmästerskap.
New rounds of a competition we already follow (for example USM "Omg 2" after "Omg 1") are found a different way: Profixio lists every round the team is entered in on the team's own page. Every full update (not just the nightly one) looks at that list, so a newly published round is picked up at the next full update. That is how USM Omg 2 (6–8 November) was found.
When it finds one that isn't followed yet, it starts following it straight away. A new USM round, for example, then shows up in the app:
New games, times and results inside competitions we already follow (league, USM, and the cup's knock-out games on Cup Manager) were already picked up every night.
You can see when the check last ran, and how many club teams it looked through, under "discovery" in data.json.
Two limits:
REG_URL (in scraper/scrape.py) needs updating once.Every update also writes calendars with P11 Röd's games: matcher.ics (all games), matcher-serie.ics (the league), matcher-usm.ics (all USM rounds), matcher-cup.ics (all cups), and one extra calendar for each new competition the job finds and for each cup. The list is stored in data.json under calfeeds, so the app can offer each one (new ones get a "Ny" badge for two weeks). People subscribe once, and new games, changed times and results then show up in their calendar by themselves (calendar apps check a few times a day, so changes can take some hours). They are plain text lists of games; nothing is installed on anyone's phone.
The collapsible "Matcherna i din kalender" box at the top of Kalender walks people through it: pick which games, pick their calendar (Google/Android, iPhone/Mac or Outlook), then follow the steps. It is only shown in the private version for now; set PUBLIC_CAL_FEED = True in build_site.py (or ask Claude) to show it on the public site.
The @Instagram section on Översikt shows the 3 newest videos listed in instagram.txt in this repository.
instagram.txt → the pencil icon (Edit).The next update run (at the latest the nightly check, or straight away with Run workflow) reads the date and caption from Instagram and fetches the cover picture. If Instagram refuses to give the job the cover picture, the video shows as a red tile with a play button instead; ask Claude to fill in the cover. The private copy shows new videos only when Claude republishes it.
Cups are not on Profixio, so each new cup is added by hand in scraper/scrape.py under CUPS. That needs the cup's Cup Manager address, plus its tournamentId and categoryId. The easiest way is to ask Claude to add it, giving the cup's link.
For example a new USM round: it is added under SERIES in scraper/scrape.py, and also in the app's SERIES. Ask Claude, giving the team's Profixio link.
Free. GitHub Actions is free for public repositories using GitHub's standard runners, and GitHub Pages is free for public repositories. If the repository is ever made private, the job would only have a limited number of free minutes per month.
| File | What it is |
|---|---|
index.html | The app: one page with the design, the code and a built-in copy of the data. |
instagram.txt | The Instagram video links shown on Översikt (newest at the top). You can edit this one. |
data.json | The latest data, written by the update job. Don't edit it by hand. |
STATUS.md, status.json | When the job last ran and what it did (rewritten on every run). |
scraper/scrape.py | The update script: fetching, the schedule and live mode. Settings are at the top: LIVE_STEP (10 min), NIGHT_START (03), WEEKEND_EVERY (5 h), LIVE_LEAD (3 h), LIVE_BEFORE/LIVE_AFTER. |
.github/workflows/update.yml | Tells GitHub to run the script twice an hour, and when you click "Run workflow". |
sw.js, manifest.webmanifest, icons | Make the site installable on the home screen and usable offline. |
PUBLIC_PHOTOS in the build script).backup-before-v2.