BMS is a local-first business management system for retail and wholesale operations, built with Flutter. All data is stored on-device using SQLite.
- POS - touch-optimised point-of-sale with barcode scan, line-item discounts, and bill-level discounts
- Quick Sales - no-invoice cash sales for fast counter transactions, tracked separately from invoiced sales
- Invoices - full invoice lifecycle (open, partial, paid, void) with PDF export and share
- Inventory - product catalogue with units, categories, reorder levels, and real-time stock levels
- GRN - goods receipt workflow that stocks in products, updates cost price, and posts to supplier ledger
- Customers and Debtors - credit sales, outstanding balances, payment collection, debtor ageing
- Suppliers - supplier ledger, purchase history, payment tracking
- Cheques - post-dated cheque register with due-date reminders
- Petty Cash - daily petty cash entries with receipt photos and approval workflow
- Dashboard - real-time sales summary, top products, and stock valuation
- Reports - sales, stock, and debtor reports
- Users - role-based access control with three tiers
- Audit log - immutable, insert-only financial audit trail
| Layer | Technology |
|---|---|
| UI | Flutter 3.44 + Material 3 |
| State | Riverpod 3.x with riverpod_annotation |
| Navigation | go_router 14.x |
| Database | Drift 2.34 on SQLite (WAL mode, FK enforced) |
| Models | Freezed 3.x |
| Auth | bcrypt (logRounds 12) + flutter_secure_storage |
| Primary keys | UUID v7 (time-ordered, collision-safe) |
pdf + printing packages |
|
| Charts | fl_chart |
lib/
core/
router/ # go_router setup, route guards, route constants
theme/ # AppTheme, AppColors, AppTextStyles
utils/ # Currency, date, and general utilities
data/
database/
daos/ # Drift DAOs - one per domain (inventory, sales, suppliers...)
tables/ # Drift table definitions
app_database.dart
models/ # Freezed value objects (UserModel etc.)
features/ # Feature-first screens
auth/
dashboard/
inventory/
invoices/
pos/
quick_sales/
grn/
customers/
suppliers/
cheques/
petty_cash/
reports/
users/
settings/
providers/ # Riverpod providers per domain
shared/
widgets/ # Reusable widgets (sidebar, filter bar, error widget)
- Flutter 3.24 or later
- Dart 3.8 or later
git clone https://github.com/getbms/BMS.git
cd BMS
flutter pub get
dart run build_runner build
flutter runThe primary target is Windows desktop. For development on macOS, run on Chrome:
flutter run -d chrome --web-port 9090 --no-wasm| Field | Value |
|---|---|
| Username | dev |
| Password | changeme |
Change the password immediately after first login via Settings.
Drift DAOs and Riverpod providers use build_runner:
dart run build_runner build
# watch mode during development
dart run build_runner watch --delete-conflicting-outputs- Bump
schemaVersioninAppDatabase - Add a migration step in
onUpgrade - Never alter existing tables manually - always use migrations
The web build uses IndexedDB. After a schema change, clear the old database:
Chrome DevTools -> Application -> IndexedDB -> delete bms_local -> refresh
Edit RouteGuard._adminOnlyRoutes in lib/core/router/route_guard.dart.
| Feature | Cashier | Admin | Developer |
|---|---|---|---|
| POS | yes | yes | yes |
| Inventory (view) | yes | yes | yes |
| Inventory (edit) | no | yes | yes |
| Invoices | no | yes | yes |
| Quick Sales | no | yes | yes |
| GRN | no | yes | yes |
| Customers | yes | yes | yes |
| Debtors | no | yes | yes |
| Suppliers | no | yes | yes |
| Cheques | no | yes | yes |
| Petty Cash | no | yes | yes |
| Reports | no | yes | yes |
| Users | no | no | yes |
| Settings | no | yes | yes |
Apache License 2.0 - see LICENSE for details.
