The list you land on
This is the half of the app you use after the money is gone. Everything already logged is here to be read back, searched, corrected in batches, or taken out as a file. None of it needs a network connection — every screen in this chapter reads your local data and redraws the moment a transaction changes anywhere else in the app.
The ledger itself shows one budget cycle at a time. Rows are grouped into cards by calendar day, and each day's header sticks to the top of the screen while you scroll through that day, carrying the date and that day's net.
- The coloured circle on the left is the category's colour and icon. A row with no category gets a grey circle with a tag glyph instead.
- The bold title is the first line of the note. With no note it becomes the category name; with neither it reads "Uncategorized" / "ไม่มีหมวด", or "Cash adjustment" / "ปรับยอดเงินสด" on a reconcile row.
- A paperclip means a receipt photo is attached ("Has photo" / "มีรูปภาพ").
- At most three tag chips show inline; the rest collapse into a single +K pill, and that pill is not tappable. With exactly four tags nothing collapses — a +1 pill would take the same room as the chip it hides.
- Extra chips appear where they apply: a debt-kind chip on a debt payment, a "Pocket: …" / "กระเป๋า: …" chip on a row assigned to a pocket, and an "Adjustment" / "ปรับยอด" pill on a reconcile row.
- The amount on the right is signed. Income is green; an expense stays neutral, because the minus in front of it already carries the sign.
- "Today" / "วันนี้" and "Yesterday" / "เมื่อวาน" name the two most recent days. Every other header is the abbreviated weekday, day and month — the year is appended only when that day falls in a different year than today.
- The figure beside the date is that day's signed net, printed in whole baht with the satang dropped, and tinted green only when it is zero or above.
- Days are always newest-first, whatever sort you pick — the sort only decides the order inside a day.
- A row belongs to the day of its transaction date, at local midnight — never the day you happened to log it.
- Only personal money appears. Anything whose category — or its parent category — is a business one is partitioned off into My Shop.
- Deleted rows never appear anywhere in this chapter.
Rows captured automatically — by voice, a scan, a slip or Smart Paste — do not drop into the day list straight away. They wait in a pinned "To Review" / "รอตรวจสอบ" inbox at the top of the ledger with a count badge.
- Tap a queued row to open its edit form and fix whatever was captured wrong.
- Or tap the ✓ at its trailing edge ("Mark as reviewed" / "ทำเครื่องหมายว่าตรวจแล้ว") to accept it as it is — the row then flows into the normal day list.
- With more than one row queued, a "Mark All Reviewed" / "ทำเครื่องหมายตรวจแล้วทั้งหมด" button appears in the inbox header.
Moving between pay periods
The ledger shows one cycle, so there is a flat stepper directly above the day list — ◀, the date range, ▶ — to walk through them. Cycle boundaries come from your payday (the 1st unless you changed it), plus weekend adjustment, holidays and any per-cycle override.
- Tap ◀ ("Previous Cycle" / "รอบก่อนหน้า") to step back a cycle, or ▶ ("Next Cycle" / "รอบถัดไป") to step forward.
- Read the range text as you go: it turns the accent colour whenever you are not on the current cycle, so a time-travelled ledger is obvious at a glance.
- Tap "Back to Current" / "กลับไปรอบปัจจุบัน" — the pill that appears between the arrows once you have stepped away — to jump home.
- Stepping the cycle changes only the list. The Safe-to-Spend hero, the spend-pace warnings and the balance always describe the live current cycle.
- The stepper is not clamped here: you can walk forward into empty future cycles and backwards past your first-ever transaction. Cycle Summary, a different screen, does clamp — back at your earliest dated cycle and forward at the current one.
- A small calendar-with-clock glyph ("Start date adjusted" / "ปรับวันเริ่มแล้ว") marks a cycle whose start date you have overridden by hand.
- Where you are in time is deliberately not counted as a filter for the toolbar's badge dot — the visible stepper is the signal.
Searching your whole history
The cycle stepper is a fine way to browse and a bad way to find something. Search ignores it completely: it runs over your entire personal ledger, every cycle, matching the note, the category name and the amount.
- Tap the "Search transactions" / "ค้นหารายการ" bar sitting above the ledger. It appears once you have at least one transaction, and it takes over the whole screen with the field already focused and the keyboard already up.
- Before you type you get two blocks: "Suggestions" / "แนะนำ" chips built from your most-used categories and counterparties, and "Recent" / "ล่าสุด" — your ten most recent transactions.
- Type, or tap a suggestion chip. Results come back day-grouped with the same sticky headers and per-day nets the ledger uses — so a narrow search doubles as an ad-hoc daily total.
- Tap a result to open its edit form, or long-press it for Duplicate and Delete.
- Tap "Done" / "เสร็จ" at the top left to leave.
- Suggestion chips come in two kinds — categories with a folder glyph, counterparties with a person glyph — ranked by how often they appear in your ledger. At most four of each kind and eight in total, interleaved so one prolific kind cannot crowd the other out.
- A chip matches by id, not by text, so tapping one can never land you on an empty list — unlike typing the same words. Edit the text away from the chip's label and the screen falls back to ordinary typed search.
- Deleted categories are skipped, and so is a counterparty with no stored name. The frequency behind the ranking is never shown on screen.
- The search field's own Cancel button only clears and collapses the field. Leaving the screen is always the explicit "Done" / "เสร็จ".
- Dragging the results dismisses the keyboard, and there is no sort control here — results keep transaction date, newest first.
The seven filters
Inside search, the filter icon at the top right opens "Filters" / "ตัวกรอง" — seven facets that all combine with AND, on top of whatever you typed. The icon fills in once anything is set, but it carries no number, so the chip band under the search field is how you read what is active.
- Tap the filter icon in search and set any facets. The results behind the sheet update live as you type and toggle, so you can watch the list narrow.
- Tap "Done" / "เสร็จ" to close, or "Reset" / "รีเซ็ต" at the top left to clear every facet at once — it stays disabled while nothing is set.
- Back on the results, tap a chip in the band to drop that one facet, or "Clear All" / "ล้างทั้งหมด" to drop them all.
- Facets AND together; values inside one facet OR together — except Tags in "All" mode.
- Chip labels stay readable: amounts print in whole baht ("฿100–฿500", "≥ ฿100", "≤ ฿500") and dates print like "7 Jun 26 – 30 Jun 26" in the app language's calendar, so a Thai interface shows Buddhist-era years. Removing the amount or the date chip clears both of its bounds at once.
- The chip band is drawn above every state, including the no-match one, so an over-narrow filter is always visible and always clearable.
- If a name cannot be resolved, the chip still appears with a generic label ("Category" / "หมวดหมู่", "Tag" / "แท็ก", "Counterparty" / "คู่ค้า", "Trip" / "ทริป") so you can always clear it.
- Filters are per-visit. Closing the search screen discards them.
Fixing many rows at once
Two jobs come up often enough to have their own mode: giving a pile of rows the same category, and deleting a batch you imported twice. Select mode does both, straight from the day list.
- Open the camera icon in the nav bar ("Scan or Select" / "สแกนหรือเลือกรายการ") and choose "Select" / "เลือกหลายรายการ". The item only appears when the list has rows and you are not already selecting.
- Tap rows to toggle them. While selecting, the rows wiggle gently and each leading circle becomes a checkmark; a row tap no longer opens the edit form, and the tag chips stop being tappable.
- Use the floating bar at the bottom. Its header counts what you have picked ("%lld selected" / "เลือกแล้ว %lld รายการ"), and both actions are disabled at zero selected.
- "Change Category" / "เปลี่ยนหมวด" opens the "Choose Category" / "เลือกหมวดหมู่" picker and assigns your pick to every selected row. "Delete" / "ลบ" asks "Delete %lld transactions?" / "ลบ %lld รายการใช่ไหม" before it does anything.
- Tap "Done" / "เสร็จ" to leave. Deselecting the last row keeps select mode on — exiting is always explicit.
- The category picker offers personal categories only, expense sections first, and one level of hierarchy.
- Selection is by transaction, across the whole store — not only the rows currently drawn on screen.
- Bulk delete is revert-safe: for each row it first undoes any round-up deposit that went to a pocket, then reverses the row's effect on a debt, then tombstones it. Deletes are always soft, and they sync.
- If the save fails you get a "Couldn't Save" / "บันทึกไม่สำเร็จ" alert, and your selection and select mode are both kept so you can try again.
- Under Reduce Motion the rows do not wiggle at all; selection is carried entirely by the leading circle.
The month calendar
Some questions are shaped like a month rather than a cycle: which days were expensive, whether the weekends are the problem, where the quiet stretches were. The calendar swaps the day list for a week-aligned month grid, with every square coloured by that day's money.
- Tap the top-left button in the nav bar. The icon shows the mode you will switch to — a calendar glyph while you are in the list, a list glyph while you are in the calendar ("Calendar View" / "มุมมองปฏิทิน", "List View" / "มุมมองรายการ").
- Move between months with ◀ and ▶ ("Previous Month" / "เดือนก่อนหน้า", "Next Month" / "เดือนถัดไป").
- Pick how the squares are coloured with the segmented control under the header ("Calendar Metric" / "ตัววัดในปฏิทิน", spoken as "Day colour" / "สีของวัน").
- Tap a day square that has activity to open that day's transactions.
- The header carries the month and year plus "Net this month" / "คงเหลือเดือนนี้" — the month's signed net in whole baht, green only when it is zero or above.
- The calendar navigates by month and spans your whole personal history. It is independent of the cycle stepper, which only ever scopes the list.
- Days with no activity are not tappable and stay faint. Today always carries an accent ring, and when today has activity its numeral switches to the full-contrast colour so it stays readable on a coloured square.
- Colour intensity follows a square-root curve from 0.18 to 0.92 opacity, so a small day is still visible next to a huge one.
- Nothing rides on colour alone: every legend is text, and each square's VoiceOver label reads out the real numbers — the net, money in, money out and the transaction count, or that the day has no transactions.
- The week starts on whatever weekday your device calendar uses, with the short localized weekday symbols.
- The list-or-calendar choice is remembered on this device. The colour mode is not — it resets to Net every time the calendar is rebuilt. The tag filter and the sort order do not apply here at all.
Tapping a day opens a sheet you can drag to half height or all the way up. Its title is the day itself; tapping a row edits it, tapping a tag chip drills into that tag inside the sheet so Back returns you to the day, and "Done" / "เสร็จ" closes it. A day with nothing in it reads "No Transactions" / "ไม่มีรายการ". There are no Duplicate or Delete actions on this sheet — tap through to the form for those.
Other doors into the same rows
Several screens elsewhere in the app end in a filtered transaction list. They all use the same rows and the same day grouping, and they all describe the current cycle only — none of them has a stepper, a search field or a filter.
- By category: Summary tab → the donut legend. Tapping a parent row rolls up everything underneath it; tapping a child shows only that subcategory. The same list is reachable from Insights category rows and from Ask Pocketbird's answers.
- By tag: Summary tab → the "Spending by Tag" legend row, or a tag chip on any transaction row.
- Rows that were promoted into a shared shop are hidden from both lists.
- A deleted category still resolves — its transactions keep the link, and the screen title falls back to the name stored on a member row.
- Empty either way reads "No Transactions This Cycle" / "ยังไม่มีรายการในรอบนี้".
One more door is a cleanup screen. Summary tab → the "Uncategorized" legend row, or the cleanup insight card, opens "Categorize" / "จัดหมวดหมู่", which works through everything with no category.
- It opens in "Grouped" / "จัดกลุ่ม" mode: rows with the same note text are clustered into one row showing the note, "%lld transactions" / "%lld รายการ", the group total and — when the app can guess — a sparkles suggestion chip. Picking a category assigns it to every row in the group at once.
- Switch to "One by One" / "ทีละรายการ" for a plain multi-select checklist, then tap "Assign Category" / "กำหนดหมวดหมู่" in the toolbar — it stays disabled while nothing is selected.
- Flip "All time" / "ทุกช่วงเวลา" — off by default — to widen the scope from this cycle to your whole history. The footer always states which scope is showing.
- A group whose rows have no note is titled "No note" / "ไม่มีโน้ต".
- A transaction linked to a deleted category is not treated as uncategorized — it still renders under the old category's name, so this screen never nags you about it.
- Assigning is repeat-safe: re-assigning simply overwrites, and rows that already carry the category are skipped.
- Tag chips on this screen are deliberately not tappable, because the row tap belongs to selection.
- When there is nothing left you get "Nothing to categorize" / "ไม่มีรายการให้จัดหมวด".
Getting it out as a file
Two different exports exist, for two different reasons. One is a report on a period — a spreadsheet and a one-page PDF, the sort of thing you send to someone. The other is a complete dump of your data, for keeping or for moving elsewhere.
The period export is not on the Transactions tab at all. It lives on Summary → the share icon in the nav bar ("Export" / "ส่งออก"), which seeds the range with the current cycle — or Summary → Cycle Summary → the same icon, which seeds it with the cycle you are looking at.
- Tap Export. The sheet is titled "Export transactions" / "ส่งออกรายการ".
- Under "Range" / "ช่วงเวลา", keep "This cycle" / "รอบนี้" (the default, with the cycle label shown on the "Period" / "ช่วง" row) or pick "Custom range" / "กำหนดช่วงเอง" and set "Start" / "เริ่ม" and "End" / "สิ้นสุด".
- Check the "Summary" / "สรุป" block — "Transactions" / "รายการ" count, "Income" / "รายรับ", "Expense" / "รายจ่าย" and "Net" / "สุทธิ" — which recalculates live for the range you picked.
- Under "Format" / "รูปแบบไฟล์", both "CSV spreadsheet" / "สเปรดชีต CSV" and "PDF document" / "เอกสาร PDF" are on by default. Turn off whichever you do not want.
- Tap "Export" / "ส่งออก". It reads "Preparing…" / "กำลังเตรียม…" with a spinner while the files are written, then the iOS share sheet appears with them — Files, AirDrop, Mail and the rest.
- The CSV columns are date, type, amount, category, counterparty, note, tags and trip. Dates are yyyy-MM-dd, type is the raw income or expense rather than a translated word, category is the display path with Parent › Child for a subcategory, and tags are joined with a | character.
- The PDF is A4 portrait: a "Transaction report" / "รายงานรายการ" heading with the range underneath, a three-column Income / Expense / Net band with the transaction count, up to eight "Top spending categories" / "หมวดที่ใช้จ่ายมากที่สุด" rows with proportional bars, then the full table — "Date" / "วันที่", "Category" / "หมวดหมู่", "Details" / "รายละเอียด", "Amount" / "จำนวนเงิน" — which paginates and repeats its header on every page.
- Both files cover personal money only — shop sales and costs never appear — deleted rows are excluded, and the range is half-open, so a row dated at the next period's first instant is never counted twice.
- Filenames carry the range, like budgie-transactions-2026-06-01_2026-06-30, so two exports never collide in your Files app.
- The preview totals and the file's totals come out of the same engine as the Summary screens, so they cannot disagree with what you see in the app.
The portability export lives somewhere else again: More → Settings → "Export Data (JSON)" / "ส่งออกข้อมูล (JSON)" and "Export Transactions (CSV)" / "ส่งออกรายการ (CSV)". Each opens the system document picker so you choose where the file goes; the default names are budgie-export-v12-YYYY-MM-DD.json and budgie-transactions-YYYY-MM-DD.csv.
- The full CSV is every live transaction, all time, in chronological order — and unlike the period export it is not personal-only, so Shop rows are in it too. It carries seventeen columns, including id, account, trip, debt, installment_number, counterparty, recurring, needs_review and my_share, and its date is a full yyyy-MM-dd HH:mm:ss timestamp rather than an ISO one, so spreadsheets read it without a fight.
- The JSON is schema v12 and covers transactions, categories, tags, pockets, debts, trips, recurring rules and their exceptions, accounts, account transfers, credit limit groups, counterparties, pocket ledger entries, budgets, cycle overrides, holidays, user settings and your account profile — plus a social section with your own shop entries, bills, shares and contributions when you are signed in.
- Both read straight from the local store, so they work offline. The JSON's social section is the one part that needs the network; if it cannot be fetched, that key is simply absent from the file.
- Binary media is not in either file. Receipt photos, trip covers, avatars and shop receipts come back by signing in instead — the JSON says so in its own note field.
- Deleted data is excluded from both, and the JSON is deterministic — collections sorted by id, keys sorted — so identical data exports byte for byte identically.
- Cells that begin with =, +, -, @, a tab or a carriage return get a leading apostrophe in both CSV exports, so a note like =1+1 opens in Excel or Sheets as text and never runs as a formula.