OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Live scores and headlines from around the world, every 10 minutes.
Sports & fitnessJavaScript · CSSGitHub @nxtdelhi123-delOnlineOwner 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
Auto update in 15min
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Live scores and headlines from around the world, refreshed every 10 minutes, with a one-click copy code for every match.
lib/importance.js./studio turns today's stories into Instagram posts for two pages, @thesportsbinge and @musc_reddevils. For each page it ranks the newsroom's matches and headlines by that page's interests (lib/studio/brands/*.js, lib/studio/score.js), writes a headline, explainer, caption and hashtags in the page's voice (lib/studio/writer.js: formulas, improved by Claude when ANTHROPIC_API_KEY is set), and draws a 1080×1350 poster from a template that copies the page's look (lib/studio/templates.js, rendered server-side with satori + resvg). Open a story to switch template or size (post, story, square), edit the words, copy the caption and download the PNG. "Not this" records a rejection for the learning loop (Phase 2 stores it). The full plan is in docs/STUDIO_PLAN.md.
Brand badges: put tsb-badge.png and musc-crest.png (transparent PNG, square) in public/studio/brand/; until then a vector stand-in is drawn.
| Endpoint | Description |
|---|---|
GET /api/studio/candidates?brand=tsb|musc | Ranked post packs with formula words |
GET /api/studio/render?brand=&key=&size=post|story|square&template=&w= | PNG of a pack; &json=1 returns the pack with Claude-written words |
POST /api/studio/feedback | { brand, key, decision: approve|reject|edit } |
| Endpoint | Description |
|---|---|
GET /api/scores | Overview: top competitions plus every live match worldwide |
GET /api/scores?sport=soccer | Every match of one sport, yesterday to tomorrow. Optional &state=in|pre|post |
GET /api/news | Headlines, newest first. Filter: ?sport= |
GET /api/match?l=<league>&id=<id>&format=poster | One match with full details. Formats: json (default), poster, text, markdown, embed. Optional &tz=Asia/Kolkata |
GET /api/health?deep=1 | One real request to each data provider from the server, with status codes |
/debug | Human-readable source check: which providers work from this server, and how many matches each contributes |
The API functions cache at Vercel's edge until the next 10-minute mark (s-maxage, with stale-while-revalidate). Upstream sources are hit at most once every 10 minutes per region, however many people are on the site. Every source is fetched in parallel with a timeout and one retry, and a build has a 9-second budget: anything still loading is left out, the response is marked partial and cached for only 40 seconds so the next request fills it in. The footer shows how many matches each provider contributed; a banner appears when a major provider is blocked.
npm test # unit and API tests with mocked upstreams (no network needed)
npx vercel dev # run locally
There are no runtime dependencies, no build step and no API keys. To add a league, sport or feed, edit lib/sources.js.
api/ Vercel serverless functions (scores, news, match, health)
lib/ data sources, ESPN / Sofascore / Cricinfo normalizers, RSS parser
public/ static site (index.html, embed.html, js/, css/)
public/js/format.js copy-code formatter shared by the browser and the API
test/ node:test suite with fixtures