Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

57 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

SceneSplit

SceneSplit logo

Split shared expenses by scene, track who owes what, and settle up β€” fully offline.

SceneSplit is a Flutter expense-splitting app for trips, roommates, dinners, and events. No account, no cloud β€” everything stays on your device.

Try the live demo

Download

Get SceneSplit from Google Play, or download the latest builds for all supported platforms from GitHub Releases.

Get SceneSplit on Google Play Get SceneSplit on GitHub

Screenshots

Home (light) Home (dark)
Home dashboard (light) Home dashboard (dark)
Scene detail Pending summary
Scene detail with balances and donut chart Home pending summary sheet

Play Store feature graphic, device captures, and phone mockups: see store/play/README.md (binaries are local / gitignored).

Features

  • People & scenes β€” Global people pool from Profile; create scenes (trips, dinners, shared activities) with emoji icons and members
  • Person detail β€” Per-person balances across scenes, per-currency will-give / gets, who-owes-whom, expense shares, and settle
  • Flexible splits β€” Equal, exact amounts, or percentage, with live validation; choose who is included per expense
  • Multi-payer bills β€” An expense can be paid by one or more people (equal or exact amounts)
  • Balances & settlements β€” Live balances; who-owes-whom follows shared expenses (A↔B offsets); editable settlement records
  • Share balances β€” Export Who Owes Whom (plus expense share totals) as an image for WhatsApp and other apps
  • Insights β€” Scene expense breakdown pie; tap a member to see which expenses make up their share
  • Currency β€” App-wide default for home summary and new scenes; each scene has its own currency; locale-aware formatting
  • Language β€” English, Spanish, French, German, Portuguese (Brazil), Hindi, Arabic, and Japanese (system or Profile override)
  • Appearance β€” System, light, or dark theme (saved and applied before first frame)
  • Backup β€” Export and import a local database backup (non-web platforms)
  • Share app β€” Localized pitch with store / web links from Profile and About
  • Legal & about β€” In-app privacy policy, terms of service, and app version
  • Offline-first β€” All data stored locally with Drift (SQLite); no sign-in required

See CHANGELOG.md for release history.

Tech Stack

Layer Technology
Framework Flutter 3.44 / Dart 3.12
State management Riverpod 3
Database Drift 2.34 (SQLite)
Localization Flutter gen-l10n
Architecture Feature-first + service / repository
Charts fl_chart
Analytics Mixpanel (AnalyticsService)
Navigation Material navigation (go_router listed for future use)

Prerequisites

  • Flutter SDK (3.44.5 stable or compatible)
  • Dart SDK ^3.12.2

Getting Started

flutter pub get
dart run build_runner build --delete-conflicting-outputs   # only after schema changes
flutter run

Optional demo data (debug / empty DB): Profile β†’ Load demo data, or:

flutter run --dart-define=SEED_DEMO=true

Project Structure

lib/
β”œβ”€β”€ main.dart / app.dart
β”œβ”€β”€ core/
β”‚   β”œβ”€β”€ constants/     # currencies, scene emojis, assets, links
β”‚   β”œβ”€β”€ l10n/          # context.l10n helpers, error localization
β”‚   β”œβ”€β”€ theme/
β”‚   └── utils/         # money formatting, share balance image
β”œβ”€β”€ database/
β”‚   β”œβ”€β”€ tables.dart
β”‚   β”œβ”€β”€ app_database.dart
β”‚   └── app_database.g.dart
β”œβ”€β”€ l10n/              # ARB sources + generated AppLocalizations
β”œβ”€β”€ repositories/      # user, group, expense, settlement
β”œβ”€β”€ services/          # split engine, balance, analytics, backup
β”œβ”€β”€ providers/         # Riverpod streams and derived state
β”œβ”€β”€ features/
β”‚   β”œβ”€β”€ onboarding/
β”‚   β”œβ”€β”€ home/
β”‚   β”œβ”€β”€ groups/        # create, edit, scene detail (UI: β€œscenes”)
β”‚   β”œβ”€β”€ expenses/
β”‚   β”œβ”€β”€ settlements/
β”‚   β”œβ”€β”€ profile/       # people, person detail, language, data & backup
β”‚   β”œβ”€β”€ legal/
β”‚   └── about/
β”œβ”€β”€ shared/widgets/
└── dev/               # debug demo seeder

Database Schema

All money amounts are stored as integer cents. Table names still use Groups internally; the UI calls them scenes.

Table Purpose
Users Global people pool (id, name, colorIndex, isCurrentUser)
AppSettings Single row: currencyCode, themeMode, localeCode
Groups Scene name, emoji, currencyCode
GroupMembers Scene ↔ user membership
Expenses Scene expenses (amountCents, splitType, note, date)
ExpensePayers Who paid (one or more), with per-payer amountCents
ExpenseSplits Per-user split amounts
Settlements Recorded payments between members

Commands

flutter pub get
dart format lib test
flutter analyze
flutter test
dart run build_runner build --delete-conflicting-outputs
flutter run

See AGENTS.md for dependency pins, architecture conventions, and codegen notes.

Future Enhancements

  • Backend sync
  • Multi-currency with exchange rates
  • Receipt scanning
  • Export (PDF / CSV)

Contributing

CI, PR checks, releasing, and GitHub secrets are documented in CONTRIBUTING.md.

License

MIT

About

🧾 SceneSplit β€” An expense splitting app inspired by Splitwise. Split expenses with friends, track balances, and settle up easily.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages