Budgie
July 17, 2026 · View on GitHub
Budgie — Mobile Expenses, Banking & Wealth Tracker (Offline-First)
A privacy-first money app with offline-first design, optional bank sync, and an AI chat that answers questions about your spending, budgets, debts, goals, and portfolio (stocks & crypto).
Table of Contents
- Project Description
- Features
- Tech Stack
- Architecture
- Roadmap
- Non-Functional Requirements
- AI Chat Capabilities
- QA & Testing
- CI/CD
- Risks & Mitigations
- Backlog / Nice-to-Have
- Contributing
- License
Project Description
Vision: Clarity about money without giving up privacy. Budgie works entirely offline, then selectively uses the network for bank sync and market prices when available.
Audience: Individuals and couples who want simple day-to-day tracking with a wider view (banking + investments + debts + goals).
Differentiators:
- Offline-first core (manual entry always works; everything stored locally)
- Bank sync ingestion that never blocks manual use (read-only; dedupe with local entries)
- Unified wealth view (cash/bank, stocks, crypto, debts, goals)
- Built-in AI chat that speaks plain language about your money (“why did groceries spike?”, “how to hit my trip goal?”)
Platforms: iOS & Android (React Native / Expo) Monetization (later): Free core; Pro adds multi-device sync, advanced rules, expanded connectors, automated exports Privacy: Local database is the source of truth; encryption at rest; opt-in analytics; no ads
Features
- Expenses: Quick add (≤3 taps), categories, accounts, budgets (monthly)
- Insights: Category breakdown, daily burn, budget usage
- Bank Sync (read-only): OAuth connectors + CSV import fallback, dedupe, rules
- Portfolio: Stocks & crypto holdings with cached prices and P&L
- Debts: Credit/loan tracking, APR, payoff calculators (snowball/avalanche)
- Goals: Targets, deadlines, allocation suggestions
- AI Chat: Natural-language Q&A with citations into app views
- Export: CSV (month/custom); onboarding with sample data; full offline usability
Assets
Tech Stack
- App: React Native (Expo), TypeScript, Expo Router, TanStack Query, Zustand/Jotai
- Local DB: WatermelonDB (schema versions & migrations, lazy loading, sync adapter)
- Bank Sync: Aggregator/OAuth connectors (abstracted provider API) + CSV import
- 8Market Data*: On-demand price fetch & local cache for stocks/crypto; offline last-known prices
- AI: On-device first (small LLM) with optional cloud inference; RAG over local data
- Observability: Sentry (crash/perf), opt-in analytics (redacted events)
- Testing: Vitest/Jest, React Native Testing Library, Maestro (E2E)
- CI/CD: GitHub Actions → EAS build & submit; Maestro for E2E
Architecture
- Offline-first: All core features work without network; bank sync & price fetches are additive
- Ingestion pipeline: normalize → dedupe (fuzzy match) → categorize (rules) → review queue
- Price cache: batched fetch; last-known fallback; manual override
- AI layer: embeddings over local data (transactions/budgets/holdings/debts/goals); intent → metric/period/entity; optional cloud for heavy queries
- Security: tokens in secure storage; at-rest encryption where available; PII minimization
- WatermelonDB specifics: normalized models, background sync adapter for bank imports, schema migrations tracked per version
Roadmap
Track in GitHub Projects. Use labels
area:*,type:feat|bug|doc,size:S|M|L,prio:P0|P1|P2.
Phase 0 — Foundations (Week 1)
Goals
- App scaffold, tokens, navigation; WatermelonDB v0; secure storage; CI/E2E
Deliverables
- Boot iOS/Android; dark mode
- WMDB schema + migrations; seed sample data
- Actions: typecheck, lint, tests, EAS build; Maestro “app opens”
- Sentry; analytics consent
Acceptance
- Cold start < 2s; PR CI green; crash-free dev builds ≥ 99%
Key Tasks
feat: expo + ts strict + routerfeat(contracts): data contractsfeat(db): watermelon schema v0 + migrationschore(ci): actions + EAS + maestro skeletonfeat(security): secure storage + opt-in analytics
Phase 1 — Core Expenses & Budgets (Weeks 2–3)
Goals
- Ultra-fast manual entry; lists; edit/delete; budgets; base insights
Deliverables
- Quick Add (amount → category → account → note)
- Transactions list (virtualized), edit, delete (soft)
- Budgets (monthly/category) + progress ring; insights (category pie, daily line)
- CSV export
Acceptance
- Add expense ≤ 3 taps (median); full offline
- Budget recomputes instantly on add/edit/remove
- Unit/component tests for input & budget math
Key Tasks
feat(tx): quick add + keyboardfeat(budget): model + UI + recomputefeat(insights): category + dailyfeat(export): csv (month/custom)
Phase 2 — Bank Sync (Read-Only) & Ingestion (Weeks 4–5)
Goals
- Link bank; import safely; never block offline usage
Deliverables
- Connector abstraction (OAuth UI, token store) + CSV import fallback
- Ingestion pipeline: normalize → dedupe → categorize (rules)
- Manual review queue (imported/uncategorized)
- Background sync (pull on open; user-triggered refresh)
Acceptance
- First link pulls 90 days in < 60s (happy path)
- Dedupe rate ≥ 99% vs manual entries (amount/date/merchant heuristics)
- Network failures fail “softly”; app remains usable offline
Key Tasks
feat(ingest): provider sdk + oauthfeat(ingest): normalizer + dedupefeat(rules): merchant/time/amount heuristicsui: review queue + conflict hints
Phase 3 — Portfolio (Stocks & Crypto) (Weeks 6–7)
Goals
- Manual holdings; price cache; unified net worth
Deliverables
- Holdings editor (ticker/qty/cost; crypto: symbol/network)
- Price cache (batched fetch; last-known fallback)
- Portfolio screen: value, P&L (daily/total), allocation
- Watchlists; manual price override
Acceptance
- Renders offline with last-known prices
- Price refresh < 2s per symbol (batched)
- P&L matches spreadsheet within ±0.1%
Key Tasks
feat(prices): cache + adaptersfeat(portfolio): holdings + chartstest: rounding/currency math
Phase 4 — Debts & Goals (Weeks 8–9)
Goals
- Track loans/credit; payoff; fund goals; budget interplay
Deliverables
- Debts (APR, min payment, due date), payoff calculators (snowball/avalanche)
- Goals (target/date/priority); allocation suggestions from surplus
- Notifications: due payments, slipping goals
Acceptance
- Amortization accurate to lender statement within 1 payment
- Goal ETA responds to budget changes
Key Tasks
feat(debts): model + calculators + remindersfeat(goals): model + allocation engineui: insights → goals/debt widgets
Phase 5 — AI Chat v1 (Local-First) (Weeks 10–11)
Goals
- Natural-language Q&A and explanations over user data
Deliverables
- Embedding index over transactions/budgets/holdings/debts/goals
- Intent detection: query → metric/period/category/entity
- Chat UI with citations to in-app views; privacy toggle (offline-only vs cloud-assist)
Acceptance
- Answers < 2s for common queries
- ≥90% correct on curated set; answers link to source screens
Key Tasks
feat(ai): embeddings + retrievalfeat(chat): intents + tool responsestest: gold-set Q&A
Phase 6 — Rules, Recurring & Notifications (Weeks 12–13)
Goals
- Reduce manual work; habit-forming nudges
Deliverables
- Rules editor (contains/regex → set category/account/goal)
- Recurring transactions (salary/subscriptions) with drift handling
- Alerts: budget 80/100%, low balance, upcoming debt payment
Acceptance
- ≥95% of repeated merchants auto-categorized after 2 entries
- Recurring reliability ≥ 99% within 1h of schedule
Key Tasks
feat(rules): engine + audit logfeat(recurring): schedulerfeat(notify): local notifications
Phase 7 — Polish & Public Beta (Weeks 14–15)
Goals
- A11y, perf, stability; store prep
Deliverables
- Accessibility pass (labels, contrast, dynamic type); haptics/gestures
- Perf: list virtualization; WatermelonDB indices; memoized selectors
- App icons, splash, store metadata; feedback panel
Acceptance
- Crash-free users ≥ 99.5% (beta)
- TTI < 1.5s on mid-tier devices
Key Tasks
perf: profile + optimizea11y: voiceover/talkbackrelease: beta metadata + guide
Phase 8 — v1 Launch (Week 16)
Goals
- Production release; support loop; metrics
Deliverables
- Store listings (localized), privacy policy, support site
- Post-launch dashboard: activation, retention, crash
- Data portability docs (export/delete)
Acceptance
- Approved on App Store & Play
- Activation ≥ 60% (first 5 transactions within 24h)
Key Tasks
release: 1.0.0docs: privacy + data handlinggrowth: share/export hooks
Non-Functional Requirements
- Offline-first: All core actions work without network; sync & prices are additive
- Security: Keystore-backed token storage; PII minimization; redacted analytics
- Performance: Add/edit < 100 ms; chat answers < 2 s (local queries)
- Reliability: Idempotent ingestion; conflict-safe merges; reversible migrations
- Accessibility8: WCAG AA contrast; full screen-reader paths; reduced motion
- Internationalization: Locale/currency aware; RTL-safe layouts
AI Chat Capabilities (v1)
- Q&A: “How much did I spend on food last month?”, “What’s my net worth trend?”
- Explain: “Why is this month higher?” (high-impact merchants, one-offs)
- Coach: “To hit the Trip goal by July, add €X/week or cut Y% from dining.”
- Navigate: Answers link to filtered views/charts
- Privacy Controls: Offline-only mode vs per-question cloud assist (opt-in)
QA & Testing
- Unit: currency math, dedupe, rules, amortization, P&L
- Component: Quick Add, BudgetCard, HoldingsEditor, DebtPlanner, Chat
- E2E (Maestro): First run → Link bank (mock) → Import → Budget updates → Portfolio render → Debt payoff → Chat Q&A
- Property-based: dedupe & rules engine
CI/CD
- PR checks: typecheck, lint, tests, bundle size, E2E (Android)
- Builds: nightly internal; weekly beta; EAS submit
- Observability: symbolication, crash triage, auto-changelog (semantic-release)
Lint tooling performance
Five equal-topology macOS arm64 runs using fresh processes, warm filesystem/dependency caches, and sequential Oxlint-first plus direct-root ESLint measured the parent at a 21.67 s / 1423.0 MiB median and the JavaScript-bridge configuration at 21.97 s / 1311.1 MiB. The bridge reduces ESLint ownership from 50 to 13 rules and median peak memory by 111.9 MiB, but Oxlint JavaScript plugins remain alpha and are not a native-speed substitute.
- Replace bridged ESLint-plugin rules with native Oxlint rules as coverage lands.
Risks & Mitigations
- Aggregator variance: Abstract provider; CSV fallback; robust normalizer
- Price feeds: Cache & batch; show timestamps; allow manual overrides offline
- LLM footprint: Modular AI (on-device first); streaming; cloud opt-in for complex queries
- Data integrity: Import audit log; idempotent merges; user-visible review queue
Backlog / Nice-to-Have
- Restore automated
UPPER_CASEenum-member enforcement with Oxlint when it supports an equivalent naming-convention rule. - Receipt OCR; bank SMS/email parsers
- Widgets & lock-screen complications
- Shared spaces (household) with roles
- Tax lots & realized gains report
- Multi-goal optimizer (Pareto frontier)
Contributing
- Create small, focused PRs.
- Use Conventional Commits (
feat:,fix:,chore:…). - Add tests for new logic; update docs for user-facing changes.
License
TBD (e.g., MIT).