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분 만에 확인하기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.