X-TrackerOffline-First Expense Tracker
- Period
- Feb 2026 - Jun 2026
- Project type
- Independent Product
- Role
- Mobile Product Developer (Individual)
- Team
- Solo
An offline-first Expo expense tracker that stores money as integer minor units in SQLite, provides monthly insights, and exports personal data without requiring an account or network connection.
- Documented defect tracker
- 13Resolved issuesDocumented defect tracker
- Categories and expenses
- 2Domain tablesCategories and expenses
Overview
X-Tracker lets people record and understand spending immediately in guest mode. Expense and category workflows run fully offline, SQLite keeps data on-device, Drizzle provides typed persistence, monthly totals and breakdowns are calculated locally, and spreadsheet export gives the user a portable copy of their records.
Role & context
- Role
- Mobile Product Developer
- Team
- Solo
- Type
- Independent Product
- Period
- Feb 2026 - Jun 2026
A solo mobile product and engineering project with full ownership supported by the repository history. The Version 1 codebase includes route groups, a local relational data layer, repositories, Zustand stores, charts, export utilities, design tokens, build configuration, and detailed engineering documentation.
Problem
Many expense tools require registration or connectivity before a transaction can be recorded. That adds friction and privacy concerns, so the product makes offline capture the functional core while keeping optional identity and future synchronization separate.
Approach & architecture
Screens delegate state to Zustand, repositories own persistence rules, and Drizzle maps typed operations onto on-device SQLite.
Practices followed
Stored monetary values as integer minor units to avoid floating-point rounding errors
Isolated persistence rules behind repositories rather than embedding database calls in screens
Used soft deletion and category archival to preserve historical references
Applied transactional ordering for category reordering and invalidated summaries after writes
Maintained strict TypeScript types across schema, repositories, state stores, and components
Challenges & resolutions
React Native UI configuration and animation defects caused several runtime crashes during product development.
FixTracked and resolved 13 documented issues across tokens, animations, dropdown rendering, extractor configuration, dependencies, and History state.
Monthly summaries must stay fast without presenting stale totals after a mutation.
FixCached period summaries and invalidated only the affected ranges after expense and category writes.
Outcomes
Implemented a complete offline expense-capture loop around 2 domain tables from form validation to SQLite persistence
Users can maintain categories, history, monthly totals, and category breakdowns without an account
Soft deletion, restoration, archival, and spreadsheet export improve user control over local data
Resolved 13 documented product defects across the React Native and native UI boundary
Tech stack
Concepts & skills8
- Offline-first mobile architecture
- SQLite with Drizzle ORM
- Repository and state-store separation
- Correct monetary representation
- Soft deletion and transactional ordering
- Local aggregation and charting
- Spreadsheet export and data portability
- Native defect triage