CalisCoaching
개인 운동 일지와 실시간 calisthenics 수업, 검증된 요약 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Web app for following Finnish pesapallo live events with spoken voice announcements. Pesisselostaja on selaimessa toimiva pesäpallon live-seuranta, joka lukee ottelun tärkeimmät tapahtumat ääneen suomeksi. Se on tarkoitettu tilanteisiin, joissa haluat seurata peliä ilman että katsot koko ajan tulospalvelua. Jaksojen ja palojen seuranta on vielä vajaa ja kertoo välillä vääriä arvoja.README 전문 보기 ↗
Web app for following Finnish pesapallo live events with spoken voice announcements.
Pesisselostaja on selaimessa toimiva pesäpallon live-seuranta, joka lukee ottelun tärkeimmät tapahtumat ääneen suomeksi. Se on tarkoitettu tilanteisiin, joissa haluat seurata peliä ilman että katsot koko ajan tulospalvelua. Jaksojen ja palojen seuranta on vielä vajaa ja kertoo välillä vääriä arvoja.
👉 Avaa sovellus: https://midnight-builds.github.io/pesisselostaja/
Käyttö:
Jaa ottelu: Jokaisella ottelulla on oma osoite (#ottelu/<id>), joka näkyy selaimen osoiterivillä ottelua seuratessa. Ottelunäkymän Jaa-napista voit lähettää linkin eteenpäin (tai kopioida sen leikepöydälle) — linkistä ottelu avautuu suoraan. Ottelunäkymästä pääsee myös katsomaan ottelun tarkemmat tilastot pesistulokset.fi-palvelussa (aukeaa uuteen välilehteen).
Vinkki – parempi ääni: Asetuksista voit valita käytettävän puheäänen. Oletuksena käytetään selaimen omaa puhesyntetisaattoria, mutta ottamalla käyttöön Edistynyt ääni (Piper) saat luonnollisemman suomenkielisen neuroverkkoäänen, joka toimii kokonaan selaimessa. Piperin oletusääni on yhteisömalli Asmo (CC BY-NC 4.0, tekijä AsmoKoskinen, epäkaupalliseen käyttöön — ks. CREDITS.md ennen tämän projektin kaupallista forkkausta); vaihtoehtona on myös Harri-ääni (CC0, lähde rhasspy/Piper). Ääni ladataan kerran ja tallennetaan selaimeen, joten se on heti käytössä seuraavilla kerroilla. Jos lataus ei onnistu, sovellus palaa selaimen omaan ääneen. Piper- ja ElevenLabs-äänille voi lisäksi kytkeä päälle Kaiutintilan, joka vahvistaa selostuksen normaalia kovemmalle esimerkiksi ulkokäyttöön kännykän kaiuttimesta. Kolmas vaihtoehto on ElevenLabs (oma avain): laadukkain ääni, joka syntetisoidaan ElevenLabsin pilvipalvelussa omalla API-avaimellasi. Avain tallentuu vain omaan selaimeesi ja synteesi kuluttaa omia ElevenLabs-krediittejäsi; virhetilanteessa (esim. krediitit loppu) sovellus palaa selaimen ääneen. Käytettävän äänen voi vaihtaa syöttämällä oman Voice ID:n samaan asetuskohtaan; tyhjänä käytetään oletusääntä. Äänten lähteet ja lisenssit: CREDITS.md.
Sovellus käyttää pesistulokset.fi-palvelun otteludataa. Tämä projekti on itsenäinen, eikä se ole pesistulokset.fi:n tekemä, hyväksymä tai sponsoroima.
Pesisselostaja turns live Finnish pesäpallo match updates into spoken Finnish announcements. The public web UI runs in the browser and can speak important match events with the Web Speech API. You can pick which voice to use in the settings, including an optional advanced neural voice (Piper) that produces a more natural Finnish voice entirely in the browser.
The repository also contains a broadcast pipeline (apps/broadcast) that can
republish a live YouTube stream with the same Finnish narration mixed on top,
and a control app (apps/control, "ohjaamo") that runs the whole broadcast
day from the operator's phone — picking the match, creating both YouTube
broadcasts, starting the relay and cleaning up afterwards.
Left to right: live match list, favorites tab, voice-active match view.
Alpha / public preview.
What works now:
apps/broadcast).apps/control) that drives that pipeline end to end: one state card per match, from picking the game to cleaning up after it.Known limitations:
Pesisselostaja uses live match data from pesistulokset.fi. This project is independent and is not affiliated with, endorsed by, or sponsored by pesistulokset.fi. The data source and API behavior may change without notice.
Open the public web app:
https://midnight-builds.github.io/pesisselostaja/
The web app can:
No server account is required. The web app stores settings locally in the browser.
An npm-workspaces monorepo: one platform-agnostic domain core, three thin apps.
| Workspace | What it is |
|---|---|
packages/core | Pure domain logic: types, pesistulokset API client, speech text generation, scoring, pronunciation substitution. No localStorage, no fs, no DOM. |
apps/web | The mobile browser app (Vite). Browser adapters: localStorage persistence, Web Speech / Piper-WASM voices. Deployed to GitHub Pages. |
apps/broadcast | The YouTube broadcast pipeline: pulls a live stream with yt-dlp, mixes synthesized narration (ElevenLabs API, native-Piper fallback) with ffmpeg, republishes over RTMP. Node adapters: file persistence, ElevenLabs/Piper TTS. See apps/broadcast/README.md. |
apps/control | The ohjaamo: mobile control app on :3002 that owns the broadcast chain — match selection, creating the YouTube broadcast pair, the start guard, in-match controls and cleanup. This is how a match day is run; nobody edits config files or runs systemctl on the normal path. See apps/control/README.md. |
apps/server | Minimal static file server hosting the built web app on :3000. |
Persistence goes behind small ports defined in core (WatcherStateStore,
PronunciationStore); each app supplies its own adapter.
packages/core).packages/core/src/speech.ts).npm ci
npm run lint # all workspaces
npm test # root vitest, covers all workspace test dirs
npm run typecheck # all workspaces
npm run build # all workspaces
Single workspace: npm run typecheck -w @pesisselostaja/web etc.
Workspace names: @pesisselostaja/core, @pesisselostaja/web,
@pesisselostaja/broadcast, @pesisselostaja/server.
apps/server is a minimal static file server that hosts the built web app on
port 3000 (systemd unit pesisselostaja.service runs
node apps/server/dist/index.js from the repo root). Old /v2/ bookmarks
redirect to /. It serves files only — no watcher and no API endpoints; the
browser app talks to pesistulokset.fi directly.
Note: the old v1 server's POST /api/debug-log endpoint (mobile ?debug=1
logging to debug.log) was dropped with v1 — ?debug=1 posts now fail
silently, same as on the GitHub Pages deployment.
The optional advanced neural voice uses Piper voice models and a speech stack that have their own licenses. They are downloaded in the browser at runtime and are not bundled in this repository:
fi_FI-harri) — CC0 1.0, from rhasspy/Piper (Finnish Single Speaker Speech Dataset).fi_FI-asmo-medium) — CC BY-NC 4.0 by AsmoKoskinen; a non-commercial community model, used with attribution.@diffusionstudio/piper-wasm (embeds espeak-ng, GPL-3.0-or-later), onnxruntime-web (MIT).Full attribution, source links and license notes are in CREDITS.md.
The canonical machine-readable list lives in apps/web/src/piper.ts.
This project's own code is MIT. See LICENSE. Third-party voices and libraries keep their own licenses — see CREDITS.md.