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 가 자기 마스크를 한 번 더 씌운다.