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



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.


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


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


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.
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.




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.
| Check | Where | Result | Notes |
|---|---|---|---|
| Automated tests (45) | Node 24 · extracted buyer ZIP | passed | Money, dates, budget, subscriptions, goals, SQLite persistence, backup/CSV, contrast |
| Typecheck · lint · expo-doctor | Extracted buyer ZIP | passed | TypeScript 6 strict, ESLint (Expo config), 21/21 doctor checks |
| Deterministic package | Two consecutive builds | passed | Byte-identical ZIP, SHA-256 recorded with the release |
| iOS Release build | Xcode 27 · iOS 26.5 Simulator SDK | passed | Built from the extracted buyer ZIP |
| iOS device build (arm64) | Xcode 27 · unsigned | passed | Compiles for iPhone; installing needs your signing team |
| Android release APK | Gradle · SDK 36 · JDK 17 | passed | Built from the extracted final buyer ZIP; the full emulator suite then passed 16/16 |
| Journeys: capture, plan, commitments | iOS Simulator + Android emulator | passed | Record/edit/delete with restart, envelope assign, mark paid, goal deposit |
| Draft restore, deep links, back | iOS Simulator + Android emulator | passed | App killed mid-entry and reopened; budgelyx:// links; Android back |
| Reminders permission granted / denied | iOS Simulator + Android emulator | passed | Denied path tested on Android (revoked, user-fixed) |
| Export (share sheet) · erase | iOS Simulator + Android emulator | passed | CSV 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 motion | iOS Simulator + Android emulator | passed | iOS 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 iPhone | iPhone 14 Plus · iOS 26.6.2 | passed | Signed Release build of the final buyer ZIP clean-installed and launched; the month label reads at full size |
| Journeys on a physical iPhone | iPhone 14 Plus · iOS 26.6.2 | passed | Record, force-quit and reopen with the entry kept, change the amount, delete with confirmation, on the final package |
| Physical Android phone | Galaxy A24 · Android 16 | passed | Release 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 pass | iPhone 14 Plus · iOS 26.6.2 | passed | Statement, tabs, Goals, Settings, the Record sheet (focus stays inside) and the delete confirmation, on the final package |
| TalkBack pass | Galaxy A24 · Android 16 | passed | Statement, 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 iPhone | iPhone 14 Plus · iOS 26.6.2 | passed | Release 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 phone | Galaxy A24 · Android 16 | passed | Release 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