Your all-in-one companion for board game nights
Tally is a Kotlin Multiplatform application that brings together essential tools for game nights: scoring systems for popular games, dice rolling, player selection, and more. Built with Compose Multiplatform for a native experience on Android, iOS, and Web (WASM).
- Yahtzee Scoring - Full digital scorecard with automatic bonus calculation and upper section tracking
- Tarot Scoring - Score French Tarot games for 3-5 players with round-by-round tracking
- Counter - Universal counter with history for any board game that needs score tracking
- Dice Roller - Roll 1-5 dice with physics simulation and shake-to-roll support (iOS/Android)
- Finger Selector - Random player selection using multi-touch detection for fair turn order
- Save and organize your regular gaming group
- Assign colors to players for easy identification
- Quick player selection when starting new games
- Track player statistics across games
- Material Design 3 - Modern, clean interface following Material Design guidelines
- Dark Mode - Automatic theme switching based on system preference
- Multi-language - Full support for English and French
- Offline-First - All data stored locally with SQLDelight database, no internet required
- Modern Tech Stack - Kotlin Multiplatform, Compose Multiplatform, Coroutines, and SQLDelight
- Beautiful UI - Material 3 design with dark mode support
- Cross-Platform - Runs on Android, iOS, and Web (WASM)
Tally is built with modern technologies and follows best practices for Kotlin Multiplatform development:
- Kotlin Multiplatform (KMP) - Share business logic across platforms
- Compose Multiplatform - Declarative UI framework for Android, iOS, and Web
- Material Design 3 - Latest Material Design components and theming
- SQLDelight - Multiplatform local data persistence with SQLite
- Koin - Dependency injection framework
- Kotlin Coroutines - Asynchronous programming
- Kotlin Serialization - Data serialization
- Navigation Compose - Type-safe navigation
- Lifecycle ViewModel - UI state management
- Compose Resources - Multiplatform resource management
Tally follows Clean Architecture principles with clear separation of concerns:
๐ฑ UI Layer (Compose Multiplatform)
โโ Screens, Components, ViewModels
โ
๐ฏ Domain Layer
โโ Models, Repository Interfaces, Business Logic Engines
โ
๐พ Data Layer
โโ SQLDelight Database, Shared Repository Implementations
โ
โ๏ธ Platform Layer
โโ Driver initialization & Platform specific integrations
- MVVM (Model-View-ViewModel) - Separation of UI and business logic
- Repository Pattern - Abstract data sources from business logic
- Single Source of Truth - SQLDelight database as the single source of truth across all platforms (Android, iOS, and Web via LocalStorage)
- Unidirectional Data Flow - Predictable state management with ViewModels
- Scoring Engines - Game-specific logic for Yahtzee and Tarot scoring
- Platform Abstractions -
expect/actualfor platform-specific features - Shared ViewModels - Business logic shared across platforms
- Compose UI - 100% shared UI code between Android and iOS
Before building Tally, ensure you have the following installed:
- Android Studio: Ladybug 2024.2.1 or newer (Download)
- JDK: 17 or higher (Download)
- Kotlin: 2.3.0+ (bundled with Android Studio)
- Gradle: 8.14+ (included via Gradle wrapper)
- Xcode: 15.0+ (macOS only, for iOS development) (Download)
git clone https://github.com/yourusername/tally.git
cd tally- Launch Android Studio
- Select File โ Open
- Navigate to the cloned
tallydirectory - Click OK and wait for Gradle sync to complete
Android Studio will automatically sync Gradle dependencies. If not, click the Sync Project with Gradle Files button in the toolbar.
- Select an Android device or emulator from the device dropdown
- Click the Run button (green play icon) or press
Shift + F10 - The app will build and install on the selected device
# Build and install debug APK
./gradlew :composeApp:installDebug
# Or run directly on connected device
./gradlew :composeApp:assembleDebug
adb install composeApp/build/outputs/apk/debug/composeApp-debug.apk-
Build the Kotlin framework:
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
-
Open the iOS project in Xcode:
open iosApp/iosApp.xcodeproj
-
Select an iOS simulator or device from the scheme dropdown
-
Click the Run button or press
Cmd + R
# Build for iOS Simulator (Apple Silicon)
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
# Build for physical iOS device
./gradlew :composeApp:linkDebugFrameworkIosArm64The application is automatically deployed and hosted at: ๐ m0nkeysan.github.io/tally/
./gradlew wasmJsBrowserDevelopmentRunThis will start a local development server with hot reload enabled at http://localhost:8080.
# Generate release APK
./gradlew :composeApp:assembleRelease
# Generate Android App Bundle (for Play Store)
./gradlew :composeApp:bundleRelease- Open
iosApp/iosApp.xcodeprojin Xcode - Select Product โ Archive
- Follow the distribution workflow for App Store or Ad Hoc distribution
tally/
โโโ composeApp/ # Main Kotlin Multiplatform module
โ โโโ src/
โ โ โโโ commonMain/ # Shared code (UI, logic, data)
โ โ โ โโโ kotlin/io/github/m0nkeysan/tally/
โ โ โ โ โโโ ui/
โ โ โ โ โ โโโ screens/ # Feature screens (Yahtzee, Tarot, etc.)
โ โ โ โ โ โโโ components/ # Reusable UI components
โ โ โ โ โ โโโ theme/ # Material 3 theme & colors
โ โ โ โ โโโ core/
โ โ โ โ โ โโโ navigation/ # Navigation graph & routes
โ โ โ โ โ โโโ model/ # Domain models (Player, Game, etc.)
โ โ โ โ โ โโโ data/ # SQLDelight database & repositories
โ โ โ โ โ โโโ domain/ # Business logic engines
โ โ โ โ โโโ platform/ # Platform abstractions (expect)
โ โ โ โโโ composeResources/ # Shared resources (strings, images)
โ โ โโโ androidMain/ # Android-specific code (actual)
โ โ โโโ iosMain/ # iOS-specific code (actual)
โ โ โโโ commonTest/ # Shared unit tests
โ โโโ build.gradle.kts # Module build configuration
โโโ iosApp/ # iOS application wrapper
โ โโโ iosApp.xcodeproj # Xcode project
โโโ gradle/ # Gradle wrapper files
โโโ screenshots/ # App screenshots for README
โโโ docs/ # Additional documentation
โโโ build.gradle.kts # Root build configuration
โโโ settings.gradle.kts # Project settings
โโโ LICENSE # Apache 2.0 license
โโโ README.md # This file
- Launch Tally and tap the game type you want to play (Yahtzee, Tarot, Counter)
- Create or select players from your saved player list
- Start the game and begin tracking scores
- Tap categories to enter scores
- Upper section bonus calculated automatically
- View game summary and statistics when complete
- Select dealer and taker for each round
- Enter bid, oudlers, and points
- Scores calculated automatically based on French Tarot rules
- Supports 3, 4, and 5 player games
- Use + and - buttons to adjust score
- View history of all changes
- Reset counter at any time
- Select number of dice (1-5)
- Tap Roll or shake your device to roll
- Physics-based animation for realistic feel
- Place fingers on the screen (multi-touch)
- Tap to randomly select one finger
- Perfect for choosing who goes first
# Run all tests
./gradlew test
# Run specific test
./gradlew :composeApp:testDebugUnitTest# Generate coverage report
./gradlew koverHtmlReportTally currently supports:
- ๐ฌ๐ง English (default)
- ๐ซ๐ท French (Franรงais)
See docs/LOCALIZATION.md for details on adding new languages.
Copyright 2026 Thibaut Farcin
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
See LICENSE for the full license text.
- Built with Kotlin Multiplatform and Compose Multiplatform
- Icons from Material Icons
- Inspired by countless game nights with friends and family
Built with โค๏ธ using Kotlin Multiplatform





