React Native · Expo SDK 57 · iOS & Android

A calm statement for every month.

Budgelyx is the source code of a native personal-budget app. People record what they spend, give every dollar a job in monthly envelopes, and keep subscriptions and savings goals in view — all stored on their phone.

  • TypeScript
  • expo-sqlite
  • 45 tests
  • 20 screens
  • 23 currencies
  • light & dark
Budgelyx Statement screen on iPhone: left to spend this month, income, spent and ready to assign
Statement
Budgelyx Plan screen on iPhone: ready to assign and envelopes with what is left
Plan
Budgelyx Recurring screen on iPhone: monthly commitments and renewal stubs
Recurring

Every screen on this page is a screenshot of the app running on an iOS 26.5 Simulator (iPhone 17) and an Android 16 emulator, from release builds of the buyer package. This page is a review showcase — the app itself is native and is not served from this website.

Three working journeys

Built around what people actually do with a budget.

Record screen with the cents-first keypad and envelope chips showing what is left
Record
Ledger grouped by day with search and type filter
Ledger

1 · Capture a transaction in seconds

A receipt-tape amount display with a cents-first keypad — type 1 2 3 4 and it reads $12.34, in any locale, with no decimal-key guessing. Each envelope chip shows what is left this month, so choosing one is already a decision.

  • Spending, income and refunds; edit, move to another month or delete with Undo
  • An interrupted entry is kept as a draft and restored when Record reopens
  • Ledger by day with search across payee, note and envelope
Plan with envelope bars, carry-over and assigned amounts
Plan
Envelope detail with assigned, carried, spent and left plus six months of history
Envelope

2 · Plan the month with envelopes

Everyday, Bills and Annual envelopes. Annual costs become a suggested monthly amount. Optional carry-over moves leftovers forward, while overspending stays in its month — shown with a hatched bar and the words “Over by”, never colour alone.

  • Ready to assign = income − assigned − set aside for goals
  • Fill from targets or copy last month in one tap, with Undo
  • Statement with left-to-spend and an everyday pace chart
Recurring payment detail with monthly equivalent, schedule and payment history
Recurring payment
Goals with progress and the monthly amount needed to reach each one
Goals

3 · Keep commitments in view

Subscriptions sit on stubs, like the part of a receipt you keep. Billing dates follow the first billing day — a plan billed on the 31st uses the last day of shorter months. “Mark paid” records the payment in the ledger; nothing is charged.

  • Weekly, monthly, quarterly and yearly plans with monthly equivalents
  • Local renewal reminders, with a clear path when notifications are denied
  • Savings goals with deposits, withdrawals and the monthly amount needed

Money rules, written down

Amounts you can trust.

Storageinteger minor units
DecimalsISO 4217 (0, 2 or 3)
Monthly equivalentyearly ÷ 12, rounded
Amounts to reachrounded up
Currency changerelabel only, never converts
Datesplain local YYYY-MM-DD
31st billing day28/29 Feb → 31 Mar
Carry-overleftovers only
WritesSQLite, after every change
Tested with45 automated tests

Both platforms, every reader

Native on iOS and Android, readable for everyone.

Atkinson Hyperlegible type keeps 0/O and 1/l apart in every figure. Screen-reader labels speak amounts in full, touch targets are at least 48 points, and the layout holds at the largest text sizes.

Budgelyx Statement on Android
Android · Statement
Budgelyx Plan on Android
Android · Plan
Budgelyx in dark mode on iPhone
iOS · Dark
Budgelyx at a large accessibility text size on iPhone
iOS · Large text

Included

  • React Native + Expo SDK 57 + TypeScript source for one iOS and Android app
  • 20 screens: onboarding, 5 tabs, detail, form, sheet and settings screens
  • Local SQLite storage with schema versioning, JSON backup/restore, CSV export
  • Fictional demo household you can load or erase in the app
  • Config-driven name, ids, scheme, icon, splash, colours, fonts and strings
  • Automated tests, docs for native builds, signing and customization

Not included

  • Bank or card connections, payments or money movement
  • Accounts, login, cloud sync or a backend
  • Push server, analytics or exchange rates
  • App Store / Google Play listings or developer accounts
  • Financial advice

Verification for this review build

What was actually run.

Simulator, emulator and device results are recorded separately. A check that could not be run is listed as not run, with the reason.

CheckWhereResultNotes
Automated tests (45)Node 24 · extracted buyer ZIPpassedMoney, dates, budget, subscriptions, goals, SQLite persistence, backup/CSV, contrast
Typecheck · lint · expo-doctorExtracted buyer ZIPpassedTypeScript 6 strict, ESLint (Expo config), 21/21 doctor checks
Deterministic packageTwo consecutive buildspassedByte-identical ZIP, SHA-256 recorded with the release
iOS Release buildXcode 27 · iOS 26.5 Simulator SDKpassedBuilt from the extracted buyer ZIP
iOS device build (arm64)Xcode 27 · unsignedpassedCompiles for iPhone; installing needs your signing team
Android release APKGradle · SDK 36 · JDK 17passedBuilt from the extracted final buyer ZIP; the full emulator suite then passed 16/16
Journeys: capture, plan, commitmentsiOS Simulator + Android emulatorpassedRecord/edit/delete with restart, envelope assign, mark paid, goal deposit
Draft restore, deep links, backiOS Simulator + Android emulatorpassedApp killed mid-entry and reopened; budgelyx:// links; Android back
Reminders permission granted / deniediOS Simulator + Android emulatorpassedDenied path tested on Android (revoked, user-fixed)
Export (share sheet) · eraseiOS Simulator + Android emulatorpassedCSV share sheet opens on both; erase verified on both (iOS re-run on the final package's Simulator Release build)
Dark mode · large text · reduced motioniOS Simulator + Android emulatorpassediOS accessibility-extra-large and AX5 at 375/402/428 pt; Android 1.3× and 2.0× font at 360 dp; Android animator scale 0
Physical iPhoneiPhone 14 Plus · iOS 26.6.2passedSigned Release build of the final buyer ZIP clean-installed and launched; the month label reads at full size
Journeys on a physical iPhoneiPhone 14 Plus · iOS 26.6.2passedRecord, force-quit and reopen with the entry kept, change the amount, delete with confirmation, on the final package
Physical Android phoneGalaxy A24 · Android 16passedRelease build of the final buyer ZIP clean-installed; record, force-stop and reopen with the entry kept, change the amount, delete with confirmation
Manual VoiceOver passiPhone 14 Plus · iOS 26.6.2passedStatement, tabs, Goals, Settings, the Record sheet (focus stays inside) and the delete confirmation, on the final package
TalkBack passGalaxy A24 · Android 16passedStatement, tabs, Goals, Settings, the Record sheet (focus stays inside) and the delete confirmation, on the final package; tree and focus checks 8/8
Performance on a physical iPhoneiPhone 14 Plus · iOS 26.6.2passedRelease build: launch to first frame about 0.14 s, 0 hangs; 0 hitches for tabs, Record and edits; scrolling at 57–59 fps on a 60 Hz screen; 7-minute memory peak 110 MiB
Performance on a physical Android phoneGalaxy A24 · Android 16passedRelease build: launch about 1 s, scrolling at 89 fps on a 90 Hz screen with under 0.4 % janky frames, 7-minute memory soak with no crash or ANR

Source map

mobile/src/
  app/        screens (Expo Router)
  config/     brand · theme · currency
  content/    strings (localization-ready)
  data/       demo · starter envelopes
  domain/     money · dates · budget ·
              subscriptions · goals · backup
  storage/    SQLite schema & migrations
  state/      store, undo, persistence
  ui/         paper, stubs, charts, keypad
tests/        node:test suites

Get started

cd mobile
npm ci
npm test
npx expo run:ios
npx expo run:android

Full install guide