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분 만에 확인하기Personal trainer app
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Petra is a minimalist, privacy-focused personal-trainer web app that generates
and tracks gym workouts. It plans a weekly schedule around the days you pick,
progresses weights and reps from your logged performance, and runs through a
complete mesocycle including deload weeks — for people who want guided
workouts rather than building their own programs.README 전문 보기 ↗Petra is a minimalist, privacy-focused personal-trainer web app that generates and tracks gym workouts. It plans a weekly schedule around the days you pick, progresses weights and reps from your logged performance, and runs through a complete mesocycle including deload weeks — for people who want guided workouts rather than building their own programs.
Design stance, throughout:
The module is organised as a small platform/product monorepo:
internal/platform/ shared infrastructure, reusable by any app in the module
sqlitekit/ declarative SQLite migrator + Config-based NewDatabase (RO/RW split, optimizer, healthcheck)
auth/ passkey/WebAuthn handler, Store interface, auth.SchemaSQL
obs/ observability: logging, errorrecorder, flightrecorder, pprofserver
envstruct/ struct-tag environment-variable config
contexthelpers/ request-scoped context helpers
testkit/ shared test helpers
internal/petra/ the fitness product (domain / repository / service / notification)
repository/ owns schema.sql, fixtures.sql, and embed.go (SchemaSQL / FixturesSQL)
cmd/petra/ the Petra web app (owns its ui/templates + ui/static)
cmd/example/ a minimal todo CRUD app that proves the shared platform plumbing
internal/platform/ is generic and must stay product-agnostic; internal/petra/
is everything specific to the workout product. The split is enforced at lint time:
depguard rules forbid internal/platform/ from importing
internal/petra or cmd/, and forbid cmd/example/ from importing
internal/petra (it may only build on the shared platform).
cmd/example/ deliberately copies the web middleware/render boilerplate
rather than importing a shared web kit — see
ADR 0005.
make # install dependencies, configure linting
make setup-git-hooks # optional: pre-push gate for developing straight on main
make dev # start the server on a free local port and open the browser
You can attach a debugger to the running server.
When a feature spans multiple layers, work outwards from the data model; when a change is scoped to one layer, start there. Each layer has a README next to the code:
internal/petra/repository/ —
schema (schema.sql), migrations, SQL persistenceinternal/petra/domain/ — pure domain
logic and aggregate methodsinternal/petra/service/ —
cross-aggregate orchestration and external integrationscmd/petra/ — HTTP handlers, routing, error
handling, testingcmd/petra/ui/templates/ — templates
and CSS, with the visual language in
cmd/petra/ui/design-system.mdThe domain vocabulary — canonical terms and the aliases to avoid — lives in CONTEXT.md. Templates and static assets load from the filesystem at runtime, so the UI dev loop is edit → refresh, no rebuild.
make test # go test --race ./... (cached)
go test -v ./path/to/package -run TestName # single test
make ci # build + lint-fix + test; the pre-push gate
Petra is trunk-based: once make ci passes, push to main. Every push runs
make ci-full (adds shuffled tests + govulncheck) plus make migratetest
(restores the latest production backup and migrates it) in GitHub Actions,
deploys to staging, and promotes to production only when staging is healthy.
make ci is the fast local gate and deliberately skips the shuffle,
govulncheck, and migratetest that server CI adds — so a green make ci
can still fail the deploy gate. Before a risky push (test-ordering changes,
schema.sql/migrations, or go.mod bumps) run make ci-full locally —
and make migratetest for schema changes — to catch it on your machine.
Opening a PR instead provisions a production-like per-PR review app — useful
for infrastructure-level changes. Details in
docs/operations.md.
| Doc | Contents |
|---|---|
CONTEXT.md | Ubiquitous language of the workout domain |
docs/operations.md | Fly.io ops: database access, profiling, CI/CD, deployments |
docs/disaster-recovery.md | DR runbook: scenario catalog, rebuild from nothing |
docs/adr/ | Architecture decision records |
docs/ops-log/ | Dated records of manual prod surgery |
| Layer READMEs (above) | Per-layer architecture and conventions |
tlaplus/README.md | TLA+ models of the navigation shim |
secrets/README.md | Age-encrypted backup of app secrets |
Petra logo made by Martin Yrjölä using Inkscape.