A simple, beautiful, and efficient chess timer, made in Flutter for Android.
- Two clocks with tap alternation
- Time and increment presets (and customization)
- Pause/restart with wakelock
- Visual warning in critical time
- Click sound and vibration options
- Light/dark theme and responsive UI
- Languages: PT-BR, EN, ES, FR, IT, DE
- AdMob banner (with test IDs by default)
- Backup and restoration of preferences, presets, and language
- Flutter/Dart
- Provider (state)
- SharedPreferences (light persistence)
- Google Mobile Ads (AdMob)
Prerequisites: Flutter installed and in PATH; Android SDK configured.
# Install dependencies
flutter pub get
# Run with test IDs (default)
flutter runBy default, ad IDs are test ones (safe). If you want to test with your IDs, inject via --dart-define:
flutter run `
--dart-define=ADMOB_APP_ID_ANDROID=ca-app-pub-xxxxxxxx~yyyyyyyy `
--dart-define=ANDROID_NATIVE_AD_UNIT_ID=ca-app-pub-xxxxxxxx/aaaaaaaa `
--dart-define=ANDROID_BANNER_AD_UNIT_ID=ca-app-pub-xxxxxxxx/bbbbbbbbNote: this repository is configured only for Android.
- There are no passwords or keys in the code. Android signing uses local
android/keystore.properties(not versioned). Example:android/keystore.properties.example. - AdMob credentials can be configured in two ways:
-
Via
--dart-defineflags (recommended for CI/CD):flutter run --dart-define=ADMOB_APP_ID_ANDROID=ca-app-pub-xxxxxxxx~yyyyyyyy
-
Via local
secrets.jsonfile (recommended for local development):- Edit
secrets.jsonwith your real AdMob IDs (App ID, banner and native unit IDs) - For Android App ID in AndroidManifest, also update
android/keystore.properties(copy from example) - Files are automatically ignored by
.gitignore
- Edit
-
- The AdMob App ID in AndroidManifest is injected via placeholder (
${ADMOB_APP_ID}) fromADMOB_APP_ID_ANDROID. - Ad Unit IDs in Dart are read from
secrets.jsonor--dart-define, with fallback to test IDs inlib/secrets.dart. .gitignoreblocks:*.jks,android/keystore.properties,secrets.json,google-services.json,GoogleService-Info.plist,lib/firebase_options.dart,.env, certificates etc.
To sign locally, create android/keystore.properties from the example and point to your .jks (do not commit):
storeFile=android/app/chess_time_release.jks
storePassword=YOUR_STORE_PASSWORD
keyAlias=chess_time
keyPassword=YOUR_KEY_PASSWORD
ADMOB_APP_ID_ANDROID=ca-app-pub-xxxxxxxx~yyyyyyyyFor AdMob credentials, you can either:
- Set Android App ID in
android/keystore.propertiesand unit IDs insecrets.json - Or use
--dart-defineflags for all values
Build:
flutter build apk --releaselib/Flutter code (screens, services, widgets, l10n, utils)android/Android configuration (Gradle, Manifest)assets/sounds and media
See LICENSE in the project root.