- Rust 99.4%
- Shell 0.6%
| .claude | ||
| .sisyphus | ||
| bin | ||
| locales | ||
| src | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| .woodpecker.yaml | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| README.md | ||
Googleplex Pomodoro
Steampunk Pomodoro Idle Game written in Rust on Bevy 0.19. Runs as a window and a system tray icon.
Features
- Pomodoro timer with break handling and session logging.
- Idle game progression: classes, party, beyonder paths, quests.
- Optional Spotify integration for focus music (OAuth2 Authorization Code with PKCE, no client secret).
- Internationalization: English, Portuguese (pt-BR), German.
Build and Run
cargo build # Compile the project
cargo run # Run the app
cargo test # Run all tests
cargo clippy -- -D warnings # Lint with warnings as errors
cargo fmt --check # Check formatting
bin/coverage.sh # Coverage report (lib 100%, main+glue 80%, UI excluded)
A full Bevy release build takes around 5 minutes; this is normal for the stack.
Spotify Integration Setup
Spotify playback is optional. When configured, the app can pause/resume your active Spotify session during focus and break periods.
Spotify's redirect URI policy only accepts 127.0.0.1 for local development.
The integration is wired to 127.0.0.1:8888.
Step-by-step:
- Create a Spotify app at https://developer.spotify.com/dashboard.
- In the app settings, add the redirect URI:
http://127.0.0.1:8888/callback - Export your client ID before launching the app:
export SPOTIFY_CLIENT_ID=your_client_id - Start the app. On first connect the system opens a browser tab for Spotify
authorization. Tokens are persisted to:
~/.local/share/googleplex-pomodoro/spotify_tokens.json - Subsequent launches reuse the saved tokens. If the access token expires and no refresh is available, the widget logs a warning and prompts re-auth.
Notes:
- The integration uses Authorization Code with PKCE (S256). No client secret is required and none is stored.
- Spotify rate limiting (HTTP 429) is not currently handled; the app is intended for personal/local use.
- Token auto-refresh is dormant in this build. Manual reconnect is required when the access token expires.
Internationalization
Locale files live under locales/{en,pt-BR,de}/strings.json. Select a locale
with the GOOGLEPLEX_LOCALE environment variable (default: en):
export GOOGLEPLEX_LOCALE=pt-BR
cargo run
Testing
cargo test # Unit and integration tests
bin/coverage.sh # Tarpaulin coverage (lib 100%, main+glue 80%)
UI modules are excluded from the coverage target. The lib modules (db/,
game/, timer/, audio/, i18n.rs) target 100% line coverage.
Project Status
See CLAUDE.md for the current stack, conventions, and active plan list.