OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
내가 응원하는 일곱 팀을 한 화면에. 첫 화면은 팀 로고가 꽂힌 서가고, 표지를 고르면 그 팀의 다음 경기·일정·로스터·순위표·부상자·뉴스가 나온다. 골수팬용이다. 입문자에게 종목을 설명하지 않는다 — 다음 홈경기가 언제인지, 누가 다쳤는지, 지금 몇 위인지를 빨리 보여 주는 것이 전부다. 배포: Vercel — master 에 push 하면 production 으로 나간다(2026-10-04 까지는 production 브랜치가 없는 main 으로 잡혀 있어서 push 가 Preview 로만 갔다). 태평양 시간으로 그린다(팀도 나도 남부 캘리포니아에 있다). 모델을 안 태운다. 공개 JSON 을 그냥 읽는다 — 비용이 0 이고, 지어낼 자리가 없다.查看完整 README ↗
내가 응원하는 열여섯 팀을 한 화면에. 첫 화면에서 Los Angeles·Boston·London·Korea 중 하나를 고르면 그 도시의 팀 로고가 꽂힌 서가가 나오고, 표지를 고르면 그 팀의 다음 경기·일정·로스터·순위표·부상자· 뉴스가 나온다.
골수팬용이다. 입문자에게 종목을 설명하지 않는다 — 다음 홈경기가 언제인지, 누가 다쳤는지, 지금 몇 위인지를 빨리 보여 주는 것이 전부다.
Los Angeles
| 팀 | 리그 | 출처 |
|---|---|---|
| Los Angeles Rams | NFL | ESPN |
| Los Angeles Dodgers | MLB | ESPN |
| LA Clippers | NBA | ESPN |
| Anaheim Ducks | NHL | ESPN |
| Los Angeles FC | MLS | ESPN |
| UC San Diego Tritons | Big West 농구 | ESPN |
| Orange Lutheran Lancers | Trinity League 풋볼·야구 | 학교 공식 캘린더 + MaxPreps |
Boston
| 팀 | 리그 | 출처 |
|---|---|---|
| Boston Red Sox | MLB | ESPN |
| Boston Celtics | NBA | ESPN |
| Boston Bruins | NHL | ESPN |
| New England Patriots | NFL | ESPN |
| New England Revolution | MLS | ESPN |
| Harvard Crimson | Ivy League 풋볼 (FCS) | ESPN |
London
| 팀 | 리그 | 출처 |
|---|---|---|
| Chelsea FC | Premier League | ESPN |
Korea
| 팀 | 리그 | 출처 |
|---|---|---|
| LG Twins | KBO | 네이버 스포츠 |
| Suwon Samsung Bluewings | K League 2 | 네이버 스포츠 |
배포: Vercel — master 에 push 하면 production 으로 나간다(2026-10-04 까지는 production
브랜치가 없는 main 으로 잡혀 있어서 push 가 Preview 로만 갔다). 태평양 시간으로 그린다(팀도
나도 남부 캘리포니아에 있다).
모델을 안 태운다. 공개 JSON 을 그냥 읽는다 — 비용이 0 이고, 지어낼 자리가 없다.
site.api.espn.com — 키 없음. 일정·로스터·코치·순위표·뉴스·부상자·라이브 스코어.api-gw.sports.naver.com — 키 없음. ESPN 에 없는 KBO·K리그. 일정·순위표·
뉴스·라이브 스코어·KBO 포스트시즌 시리즈 전적. 로스터는 없다(선수 주소가 리그 전체 기록표다).oluathletics.org — 고등학교는 ESPN 에 아예 없다(검색해도 0건).
학교가 스스로 내보내는 캘린더 피드(.ics) 와 RSS 를 읽는다. 상대·홈/원정·결과·구장·
중계 링크까지 거기 다 있다. 내보내라고 만든 문이라 잘 안 부러진다.__NEXT_DATA__)을 읽는다.
여기만 공개용 문이 아니라서 모양이 어긋나면 그냥 없다고 말하게 해 뒀다 — 특히 로스터는
이름표 없는 배열이라, 줄마다 "전체 이름 == 이름+성" 을 확인하고 하나라도 틀리면 탭을 접는다.매일 크론이 돌면서 Claude 에게 팀마다 웹 검색을 시키고, 그 결과를 Postgres 에 적어 두고, 화면은 그 표를 읽었다. 그게 이 앱의 유일한 고정 비용이었고(8월에 그래서 크론을 껐다), 데이터는 늘 하루쯤 낡아 있었으며, 가끔 모델이 없는 경기를 지어냈다.
지금은 화면을 열 때 그 자리에서 읽는다. 크론도 DB 도 없다. 되살릴 것도 없다.
src/lib/sources/
teams.ts 열여섯 팀 표(도시 칸 포함). 팀을 더하고 빼는 일은 여기 한 줄을 고치는 일이다.
espn.ts ESPN 어댑터
naver.ts 네이버 스포츠 어댑터(KBO·K리그)
sidearm.ts 학교 캘린더(.ics)·RSS 어댑터
index.ts 화면이 부르는 창구. 어느 출처인지는 여기서 갈리고 여기서 끝난다.
split.ts 일정을 다음 경기·다음 홈경기·최근 경기로 가르는 셈(바깥을 안 부른다)
src/app/
page.tsx 도시 고르기 (Los Angeles · Boston · London · Korea)
[city]/ 도시 서가
team/[slug]/ 팀 화면 (Now · Schedule · Roster · Standings · News)
값은 Next 데이터 캐시가 들고 있고 TTL 은 종류마다 다르다 — 점수는 1분, 일정은 15분,
로스터는 6시간. 일정만은 받은 JSON 이 아니라 추려 낸 결과를 캐시한다: MLB 의 162경기
일정이 3.7MB 라 2MB 한도를 넘어 캐시를 조용히 빠져나갔다(espn.ts 의 readFresh 참고).
null 이 "못 가져왔다" 이고 [] 가 "없다" 다.
화면도 다르게 적는다 — 하나는 기다리는 것이고 하나는 새로고침이다.npm install
npm run dev
환경 변수는 SLKeyboard 엔드포인트에만 필요하다. 팀 데이터는 키가 없다.
| 변수 | 쓰는 곳 |
|---|---|
KEYBOARD_API_KEY | /api/transcribe, /api/correct (SLKeyboard 앱이 부른다) |
AI Gateway 는 Vercel OIDC 로 붙는다(/api/transcribe, /api/correct). 팀 데이터는 모델을 안 쓴다.
챗 어시스턴트(/api/chat, /api/speak)는 2026-10 에 걷어냈다.
ios/ 에 WKWebView 껍데기가 있다. 화면은 이 웹앱을 그대로 쓰고, 네이티브는 당겨
새로고침·복귀 시 갱신·바깥 링크·마이크만 맡는다. 빌드와 테스트플라이트는
ios/README.md.
천장에 걸린 우승 배너. python3 assets/icon/gen_icon.py 로 다시 만든다. 아이폰 앱
아이콘은 같은 그림의 모서리 안 깎은 판을 쓴다 — iOS 가 자기 마스크를 한 번 더 씌운다.