Skip to content

M0nkeySan/tally

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

330 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Tally ๐ŸŽฒ

Your all-in-one companion for board game nights

Platform License Kotlin Compose Multiplatform

Download Try Online

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).


๐Ÿ“ธ Screenshots

Home Screen Dice Roller Counter

Tarot Scoring Tarot Statistics Yahtzee Statistics


โœจ Features

๐ŸŽฏ Game Scoring Tools

  • 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

๐ŸŽฒ Game Utilities

  • 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

๐Ÿ‘ฅ Player Management

  • 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

๐ŸŽจ User Experience

  • 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)

๐Ÿ›  Tech Stack

Tally is built with modern technologies and follows best practices for Kotlin Multiplatform development:

Core Technologies

Architecture & Data

UI & Navigation


๐Ÿ— Architecture

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

Architecture Patterns

  • 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

Key Components

  • Scoring Engines - Game-specific logic for Yahtzee and Tarot scoring
  • Platform Abstractions - expect/actual for platform-specific features
  • Shared ViewModels - Business logic shared across platforms
  • Compose UI - 100% shared UI code between Android and iOS

๐Ÿš€ Getting Started

Prerequisites

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)

Installation

1. Clone the Repository

git clone https://github.com/yourusername/tally.git
cd tally

2. Open in Android Studio

  1. Launch Android Studio
  2. Select File โ†’ Open
  3. Navigate to the cloned tally directory
  4. Click OK and wait for Gradle sync to complete

3. Sync Dependencies

Android Studio will automatically sync Gradle dependencies. If not, click the Sync Project with Gradle Files button in the toolbar.


Running on Android

Using Android Studio (Recommended)

  1. Select an Android device or emulator from the device dropdown
  2. Click the Run button (green play icon) or press Shift + F10
  3. The app will build and install on the selected device

Using Command Line

# 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

Running on iOS (macOS Only)

Using Xcode (Recommended)

  1. Build the Kotlin framework:

    ./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64
  2. Open the iOS project in Xcode:

    open iosApp/iosApp.xcodeproj
  3. Select an iOS simulator or device from the scheme dropdown

  4. Click the Run button or press Cmd + R

Using Command Line

# Build for iOS Simulator (Apple Silicon)
./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64

# Build for physical iOS device
./gradlew :composeApp:linkDebugFrameworkIosArm64

Running on Web (WASM)

Try it Online

The application is automatically deployed and hosted at: ๐Ÿ‘‰ m0nkeysan.github.io/tally/

Running Locally

./gradlew wasmJsBrowserDevelopmentRun

This will start a local development server with hot reload enabled at http://localhost:8080.


Building for Release

Android Release Build

# Generate release APK
./gradlew :composeApp:assembleRelease

# Generate Android App Bundle (for Play Store)
./gradlew :composeApp:bundleRelease

iOS Release Build

  1. Open iosApp/iosApp.xcodeproj in Xcode
  2. Select Product โ†’ Archive
  3. Follow the distribution workflow for App Store or Ad Hoc distribution

๐Ÿ“ Project Structure

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

๐ŸŽฎ How to Use

Starting a New Game

  1. Launch Tally and tap the game type you want to play (Yahtzee, Tarot, Counter)
  2. Create or select players from your saved player list
  3. Start the game and begin tracking scores

Yahtzee

  • Tap categories to enter scores
  • Upper section bonus calculated automatically
  • View game summary and statistics when complete

Tarot

  • 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

Counter

  • Use + and - buttons to adjust score
  • View history of all changes
  • Reset counter at any time

Dice Roller

  • Select number of dice (1-5)
  • Tap Roll or shake your device to roll
  • Physics-based animation for realistic feel

Finger Selector

  • Place fingers on the screen (multi-touch)
  • Tap to randomly select one finger
  • Perfect for choosing who goes first

๐Ÿงช Testing

Run Unit Tests

# Run all tests
./gradlew test

# Run specific test
./gradlew :composeApp:testDebugUnitTest

Test Coverage

# Generate coverage report
./gradlew koverHtmlReport

๐ŸŒ Localization

Tally currently supports:

  • ๐Ÿ‡ฌ๐Ÿ‡ง English (default)
  • ๐Ÿ‡ซ๐Ÿ‡ท French (Franรงais)

See docs/LOCALIZATION.md for details on adding new languages.


๐Ÿ“„ License

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.


๐Ÿ™ Acknowledgments


Built with โค๏ธ using Kotlin Multiplatform

About

Utility belt for tabletop gaming

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages