WallpaperMachine
당신이 사랑하는 배경화면, 맥에서 새롭게 만나보세요
Garmin 패들 활동을 Kanu-EFB와 자동 동기화·강 데이터로 여행 기록 자동 생성, 무료·보안·비밀번호 필요 없음
Automatically sync your Garmin paddling activities to Kanu-EFB. Auto-create trip entries with river data. Free, secure, no password required.
라이프스타일Go · HTMLGitHub @sauroter온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Multi-tenant web service that syncs water sport activities from Garmin Connect to Kanu-EFB
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A multi-tenant web service that automatically syncs water sport activities from Garmin Connect to the Kanu-EFB electronic logbook.
Live instance: efb-connector.sauroter.de
garminconnect packageOr use devbox to get everything automatically:
devbox shell
The fastest way to run the server locally uses dev mode, which substitutes mock implementations for Garmin Connect and Kanu-EFB so no external accounts are needed:
make dev
This starts the server on http://localhost:8080 with mock providers. Magic link emails are printed to stdout instead of being sent.
make build
make test
| Target | Description |
|---|---|
make dev | Run server in dev mode (mock EFB + Garmin, auto-generated encryption key) |
make build | Build the efb-connector binary |
make test | Run all tests (unit + integration) |
make cover | Run tests with coverage and print per-function summary |
make lint | Run golangci-lint (install via make lint-install) |
make lint-install | Install the pinned golangci-lint version into $GOPATH/bin |
make clean | Remove built binaries and local dev database |
ENCRYPTION_KEY=<base64-encoded-32-byte-key> \
RESEND_API_KEY=<resend-api-key> \
INTERNAL_SECRET=<secret> \
BASE_URL=http://localhost:8080 \
go run ./cmd/server
The server is configured via environment variables:
| Variable | Description |
|---|---|
ENCRYPTION_KEY | Base64-encoded 32-byte key for credential encryption |
RESEND_API_KEY | Resend API key for sending magic link emails |
INTERNAL_SECRET | Secret for internal/cron API endpoints |
BASE_URL | Public base URL (e.g. https://efb-connector.sauroter.de) |
PORT | HTTP listen port (default: 8080) |
DB_PATH | Path to SQLite database file (default: efb-connector.db) |
DEV_MODE | Set to true for local dev (mock EFB + Garmin, relaxed env requirements) |
The service is deployed on Fly.io in the Frankfurt (fra) region with a persistent volume for the SQLite database.
fly deploy
See infrastructure/README.md for detailed deployment and operations instructions.
EFB rate-limits the source IP of our login requests. We keep a static Fly egress IPv6 allocated so it can be whitelisted by the EFB maintainers. The nightly bulk run paces at ~30s/user, so a healthy run is roughly 60–80 min; runs that approach the 120-min cap indicate the absorbed-rate-limit-backoff path tripped. If the nightly sync fails with efb login rate-limited, rotate to a fresh egress IP and notify Tim (kanu-efb.de) of the new address:
make egress-status # show current allocations + live outbound IPv6
make rotate-egress # allocate new pair, restart machine, release old pair
The full REST API (public, authenticated, and internal endpoints) is documented in openapi.yaml using the OpenAPI 3.1 specification. You can view it with any OpenAPI-compatible tool (Swagger UI, Redoc, etc.).
Licensed under the Apache License, Version 2.0. See LICENSE for the full text.