Small inventory app (Tally)
Local-first Expo stock app: items with SKU, location and money in minor units; an immutable, trigger-enforced adjustment ledger with reason codes and reversals; low-stock reorder view; barcode scanning with permission recovery; validated CSV import and safe export.
Creator ($9 a month) includes up to 20 new premium families a billing month (5 in any 24 hours). Already a member? Open your library.
- Version
- 1.0.2
- Platforms
- iOS, Android
- Framework
- expo
- Archive
- 2.1 MB 143 files
Screens from the build
(open full size)
(open full size)
(open full size)
(open full size)
(open full size)
(open full size)App screenshots may come from an Expo web export; those are labelled as such and are not native verification. Native runs are listed under Tested with their own status.
What it does
- add and edit items (SKU, barcode, category, location, supplier, cost/price)
- receive / remove stock with reason codes
- cycle count
- undo via linked reversal (immutable ledger)
- low-stock reorder list with suggested quantities
- search, filter by status/category, sort
- scan barcode or enter SKU to find and adjust
- CSV import with row validation preview
- CSV export of items, ledger and reorder list
- archive, restore, delete permanently
- persist locally across restarts
Screens
stockSearch/filter/sort list with swipeable stock-gauge rows; first-run empty state; Android Scan FABreorderLow and out-of-stock items by urgency with suggested order and CSV exportledgerEvery stock movement, filter by reason, CSV exportdataCSV import/export, template, currency, categories, appearance, sample data, eraseitemGauge, money, actions, per-item ledger with reversal, archive/deleteitem-editCreate/edit item with validation and uniqueness checksadjustAdd / Remove / Count with reasons, preview and undoscanBarcode scanner with permission priming/recovery and manual entryimportCSV import preview with per-line errors and transactional applycategoriesRename and delete categories
States covered
- Loading
- Empty
- First run
- Error
- No results
- Validation
- Destructive confirm
- Undo
- Permission prompt
- Permission denied
- Permission blocked
- Import row errors
- Stock limit
- Large text
- Dark mode
Stack and versions
| expo | 57.0.25 |
|---|---|
| expo-router | 57.0.23 |
| expo-sqlite | 57.0.3 |
| expo-camera | 57.0.5 |
| react | 19.2.3 |
| react-native | 0.86.3 |
| react-native-gesture-handler | 2.32.0 |
| typescript | 6.0.3 |
| jest | 29.7.0 |
| jest-expo | 57.0.5 |
| @testing-library/react-native | 13.3.3 |
| sql.js | 1.14.2 (web preview + tests only) |
Commands:
| install | npm ci |
|---|---|
| dev | npx expo start |
| test | npm test |
| typecheck | npx tsc --noEmit |
| doctor | npx expo-doctor |
| build | npx expo prebuild (or EAS Build); npx expo run:ios | npx expo run:android for development builds |
| e2e | none (native procedure in docs/VERIFICATION.md) |
| web_preview | npx expo export -p web && node scripts/web-preview-screenshots.mjs |
Tested
| Check | Platform | Tool | Result | Date |
|---|---|---|---|---|
| dependency pins for Expo SDK 57 native modules (react-native-reanimated 4.5.1, react-native-worklets 0.10.1, react-native-gesture-handler 2.32): expo install --check, npm audit 0, jest, tsc, expo-doctor, Metro iOS + Android bundles | Node | npm 11 + expo install --check | Pass | 2026-09-26 |
| unit + screen tests (38: money, CSV, stock rules, trigger-enforced ledger integrity, import, restart persistence, migration v1->v2, screens) | Node | jest 29.7 + jest-expo 57 + @testing-library/react-native 13.3 | Pass | 2026-09-26 |
| typecheck | Node | tsc 6.0.3 --noEmit | Pass | 2026-09-26 |
| expo-doctor | Node | expo-doctor (21 checks) | Pass | 2026-09-26 |
| native project generation | Node | expo prebuild --no-install --clean (temp copy) | Pass | 2026-09-26 |
| web export preview screenshots (not native verification; camera not exercised) | web | expo export -p web + Playwright Chromium | Pass | 2026-09-26 |
| fresh-copy reproduction from packaged archive (npm ci, npm test, tsc) | Node | npm 10.9 / Node 22.22 | Pass | 2026-09-26 |
| Release build of this archive: install, launch, relaunch, dark mode; no crash reports | iOS | iOS Simulator (iPhone 17 Pro, Xcode 27) | Pass | 2026-09-26 |
| Release build of this archive: install, launch, relaunch, dark mode; no crash in logcat | Android | Android Emulator (Pixel 9) | Pass | 2026-09-26 |
| barcode scanning with a real camera | iOS | physical device | PendingNot run yet | — |
| barcode scanning with a real camera | Android | physical device | PendingNot run yet | — |
2 checks still pending. Pending means it hasn't been run yet, not that it passed.
Not included
- No accounts, cloud sync or multi-device/multi-user: data is local to the device (CSV export provided)
- No multi-warehouse quantities (location is a label)
- No purchase orders or supplier ordering (reorder list export only)
- No POS / e-commerce sync
- Single currency; no tax, FX or landed cost
- No lot, serial or expiry tracking; no label printing
- No network calls, analytics or crash reporting
Each boundary comes with instructions for adding it in docs/INTEGRATION-BOUNDARIES.md.
Known limitations
- Native iOS/Android runs and real-camera scanning are pending (web export preview screenshots only so far)
- Currency is locked once any item has a price (no conversion)
- Ledger view shows the newest 500 entries; full history via CSV export
- CSV import limited to 5,000 rows / 2 MB per file
- Database is not encrypted by the app (OS sandbox only)
- Web export is a preview target only (sql.js + localStorage, manual code entry instead of camera)
Licence
Use in unlimited end products incl. client/commercial; no resale/redistribution as a template, kit or dataset; no ML training. Survives cancellation for delivered versions.
Full terms: Motif template licence. Open-source parts keep their own licences (licenses.json, id lic-premium-inventory-1-0-2).
Ask your agent
Use Motif to activate the premium-inventory template and download it. Then adapt it for a climbing gym's route log: replace the content and imagery, keep the design tokens and every state in docs/STATE-MATRIX.md, and run check_design_contract before you finish.Motif guides applied
app-design-gate-workflow · app-transplant-test-no-generic-template-app · app-visual-identity-system-five-decisions · app-template-tab-fab-onboarding-budgets · app-tab-bar-implementation-expo-router · app-hard-fail-signatures-static-checks · app-functional-truth-rulings · app-category-productivity · app-category-utility · app-local-persistence-choice-expo · app-sqlite-data-model-offline-first · app-swipe-actions-with-accessible-alternatives · app-destructive-actions-undo-vs-confirm · app-permission-requests-and-recovery · app-dynamic-type-and-font-scaling · app-react-native-accessibility-semantics · app-theming-light-dark-system · app-platform-conventions-vs-brand · app-screen-state-matrix · app-form-validation-feedback
Archive
SHA-256 da6e46a1f81f506cd0857da460edaa9bd605bd8362444b22da9365205c339919