How a message becomes a sorted payment, the handful of components every screen uses, and the rules they follow.
System
F
First run
Gmail, banks, bank texts, payday, then your number with its math.
5 screens
T
Today
One number with its math in place, payday, over, where it went.
4 screens
P
A payment
From the lock screen to everything you can change, on one screen.
2 screens
R
Checking
Only when the model is unsure. The guess is preselected.
2 screens
H
Past texts
Scroll your bank chats and the phone reads them. Mac and statements as backups.
3 screens
L
Plan
Salary, bills, savings, one limit.
3 screens
A
Accounts
Banks, cards, dollar money and wallets.
3 screens
U
Shared
Home by default, other groups beside it. Tricount without the typing.
2 screens
How a message becomes a payment
Boxes are stored states, diamonds are checks. Click a state to open its screen.
Text or emailBank text, Gmail, screenshot.
Components
Existing is used as is, adapted is an existing component in a new place, new is built for this feature.
Left to spend
Rs63,380
4,225a day
15days left
2,059ahead of pace
HeroNew
apps/mobile/src/ui/hero.tsx
Label, number, three facts, line.
Salary
Wise to NIC Asia
Rs2,10,750
Kept in Wise
Not counted
$1,500
Bills
8 a month
−Rs55,510
Savings
To Sanima
−Rs20,000
Spendable
Rs1,35,240
Money columnNew
apps/mobile/src/ui/row.tsx
One right edge, tabular digits, hanging signs, muted currency.
Bhatbhateni
12:41 · Groceries
Rs3,460
H
Himalayan Java
8:02 · Eating out
Rs640
Claude
Nov 12
$20
Rs2,810
RowsNew
apps/mobile/src/ui/row.tsx
Logo, letter, dollar amount with rupee cost.
GroceriesEating outShopping
Continue
Chips and buttonNew
apps/mobile/src/ui/button.tsx
One white pill per screen.
Design rules
How this fits the product.
One thing per screenOne number to read or one choice to make. Details open in place, never on a copy of the screen.
Edit where it's shownIf something can change, the control sits on it: chips, switches, steppers. No extra screens.
Discover, don't askAccounts, salary and bills come from Gmail and texts. You confirm, never fill forms.
Money reads in a columnAmounts share one right edge, digits are tabular, signs hang, currency is muted.
Warm ink, one marigoldOff-white on near-black, Inter tracked tight. Marigold appears once: the line or the pace.
Private by defaultRaw texts stay on the phone. Sharing is one payment at a time.
F1Welcome
device: new
The product, shown working: payments arrive sorted, each with what's left. One promise, one button.
No account or login: the profile lives on the phone
1 existing2 new
F2Gmail
gmail: not_connected
Two taps instead of forwarding rules: Continue, then Allow. The phone searches Gmail for every bank in the registry.
OAuth PKCE on device, scope gmail.readonly, no server in the loop
Query from packages/registry emailDomains, newer_than:6m, statements included
Restricted scope: personal use runs as your own Google app (Testing or unverified under 100 users); a public release needs verification
2 new
F3Your banks
discovery: gmail found 5, picks pending
What Gmail found is the list. Banks that only text you are one tap below; their accounts fill in from the first text.
Gmail found nothing: the title becomes 'Which banks?' and the picks move up; same screen
Picks below are registry institutions not found, ordered by how common they are
A picked bank with no email gets a quiet 'turn on email alerts' hint later, from the registry's how-to when one exists
4 new
F4Bank texts
sms: setting_up
The finished automation is the instructions: three numbered rows, in the order Shortcuts asks. Open Shortcuts copies NPR first. Coming back, the screen waits and ticks itself on the first bank text (tap Open Shortcuts to see it).
Log bank text ships as an App Shortcut; nothing to install
Apple blocks apps and links from creating personal automations, so this cannot be one tap
Later keeps one quiet row on Today until the first text ticks it
Trigger word comes from the registry; NPR covers the samples so far, verify against real texts
Android: one READ_SMS permission instead (sideload only)
4 new
F6Your number
plan: proposed
The first number, with the lines that make it. Payday is asked here, already answered: the Salary row says Every 30th, and a tap opens the English or Nepali month picker in place. This is why you trust Today.
Bills = recurring payees in the last 3 months (rent, internet, subscriptions)
Savings = the regular move to Sanima, proposed not assumed
Spent so far is emails only; banks that only text are missing until past texts come in, and the row says so
1 existing6 new
T1Today
cycle: active
One number and three facts. Tap the number and the math opens in place; tap again to fold it.
capacity(plan, cycle, flexibleSpent, today) re-run on every insert
Ahead of pace in marigold is the only accent on the screen
Check chip exists only when the review queue is not empty
1 existing7 new
T3Payday
cycle: new, previous: closed
Payday is a moment, not a home screen variant: what landed, what that means, one decision about the leftover.
Shown once, the first open after the salary text
The rate moved, so this month's number moved by Rs 430
I'll save it is an intent: the Sanima transfer text closes it, so nothing counts twice
3 new
T4Over
cycle: over (left = -4100_00)
The fact, the cause, one way out, all on the screen.
Today is Thu, Nov 26 here
Cover = plan adjustment, not a fake transfer
1 existing6 new
T5Activity
insights: cycle to date
A day-by-day chart with one reference line, then where it went. Nothing to tap to understand it.
Dashed line = even pace (Spendable / 31 days); today in marigold; future days faint
Category bars share one scale (largest = full); dollar spends at rupee cost
Cash is ATM withdrawals counted as spent; no per-item entry
1 existing5 new
P1Lock screen
txn: labeled, notified
Most payments end here: already sorted, with what's left. Long press to share or change the category.
Notification actions are App Intents
1 existing1 new
P2Payment
txn: labeled (rule)
Everything you can change about a payment, on the payment: category chips, split, and the original text, each opening in place.
Picking another category reveals the every-time switch inline
Share opens with Home preselected and halves; other groups are one chip away; members see only this payment
Bank text unfolds with the read words lit; sample text is illustrative
5 new
R1Check
txn: needs_review
A truly unsure one: a hotel at 8:40 PM. The guess and its reason are shown; tap another chip and the every-time switch appears.
Queue = model confidence < 0.8 or kind unknown; history groups use the same card ('12 payments')
A rule is only offered after a correction, never made silently
5 new
R2Done
review_queue: empty
A short receipt, then back to life.
Counts over 7 days by label_source
1 new
H1Past texts
history: gmail_done, sms_missing
Three ways in, best first. Scrolling works on any iPhone with nothing else installed.
Start opens the system broadcast picker; the user taps Start Broadcast once
Mac helper reads ~/Library/Messages/chat.db (Full Disk Access) when Messages in iCloud is on
A Finder or iTunes backup holds sms.db too; same helper reads it, Windows included
Statement passwords asked once per bank
3 new
H2Scrolling
history: broadcasting (142 texts)
You scroll up your bank's chat in Messages. Tuktuk watches the screen and reads each bubble; the island counts what it caught and how far back you are.
Broadcast Upload Extension (ReplayKit) samples frames, Vision fast text recognition, dedupes by text hash; 50 MB extension memory, verify on device
Frames never leave the phone and are dropped once read
Sender and bubble wording here are illustrative, not real Siddhartha texts
Marigold dot = read; stop from the island or Control Center
1 new
H3Importing
history: importing
Newest first, because this cycle drives today's number. Stops at the current cycle plus three months.
BGContinuedProcessingTask with a progress Live Activity
Dedup across Gmail, texts and statements
2 new
L1Plan
plan: active
Everything that sets the number, editable where it sits. Tap an amount to change it in place; the column never moves.
Payday opens the same picker as setup (F6); Kartik 2083 ends Nov 16 (verify against the official calendar)
Editors open under their row; Spendable recomputes live
Limits are suggested only where spending swings
2 existing3 new
L2Bills
fixed_costs: 5 paid, 3 due
Bills mark themselves paid when the text lands.
Matched by payee and day window
Electricity plans on the 3-bill average
2 new
L3Eating out
limit(eating_out): 90%
This month against the last three and the limit line, then who it went to.
Bars share one scale with values on top; the dashed line is the Rs 18,000 limit, named in the stats above
Push at 80% and 100%
5 new
A1Accounts
accounts: 9
First, whether capture is working. Then every account with what its last message said.
Texts row turns marigold if an email shows a card spend no text caught within an hour: the Shortcut stopped
Today's bank icon gets a dot only then
Balances from the latest text or email
2 new
A2Dollar card
pocket(usd_card): rate 14050
Dollars count at what they cost to load. The line is this year's $500 load cap, used $300.
spend() in packages/core/src/dollars.ts
Loads are transfers; cap is the NRB prepaid rule, verify with the bank
4 new
A3eSewa
wallet(esewa): loaded 600000, sorted 435000
Money into eSewa counts as spent until a text, screenshot or statement says what it bought.
eSewa sends a text per transaction; Khalti sends text and email
No consumer API; reverse engineering not shipped
6 new
U1Shared
groups: Home (default), Pokhara trip
Home is the default group: you and Partner, open on arrival. Other groups sit beside it as chips and open in place. Tricount without the typing.
Shared = Share flicked on a payment, on either phone; synced sealed through the Worker relay
Wait for payment settles itself when Partner's Rs 3,800 text lands
Group members without the app are names only; you settle with them by hand
2 existing6 new
U2New group
group: draft
A name and people. Anyone with the link joins; people without the app can still be in the group.
Invite link = one-time pairing code on the Worker; keys swap device to device
Home is made at setup with just you; inviting Partner is the same screen
3 new
Welcome
Gmail
Your banks
Bank texts
Your number
First run5 screens · Gmail, banks, bank texts, payday, then your number with its math.
Today
Payday
Over
Activity
Today4 screens · One number with its math in place, payday, over, where it went.
Lock screen
Payment
A payment2 screens · From the lock screen to everything you can change, on one screen.
Check
Done
Checking2 screens · Only when the model is unsure. The guess is preselected.
Past texts
Scrolling
Importing
Past texts3 screens · Scroll your bank chats and the phone reads them. Mac and statements as backups.
Plan
Bills
Eating out
Plan3 screens · Salary, bills, savings, one limit.
Accounts
Dollar card
eSewa
Accounts3 screens · Banks, cards, dollar money and wallets.
Shared
New group
Shared2 screens · Home by default, other groups beside it. Tricount without the typing.