This website requires JavaScript.
c25c82932d
void: a statementless row for a charge that never posted (migration 0040)
main
siddharthd and Claude Opus 5.5
2026-10-12 18:05:05 +11:00
a1c2eb736f
rules: run history timestamps in en-AU, not the browser's locale (d/m, never m/d)
siddharthd
2026-10-11 00:48:20 +11:00
069034951e
reconcile queue: offer a foreign row's exact native twin regardless of provisional AUD
siddharthd
2026-10-11 00:35:50 +11:00
e956f39ffc
order-parse: document that both order lanes must send the RFC Message-ID
siddharthd and Claude Opus 5.5
2026-10-03 18:59:56 +10:00
d75589e128
docs: the wallet lane -- storage convention, pairing, lock, skips, replay
siddharthd and Claude Opus 5.5
2026-10-03 17:30:48 +10:00
ce0bf0a775
reconcile queue: never list or offer a superseded row
siddharthd and Claude Opus 5.5
2026-10-03 17:21:31 +10:00
a3e4e1102a
wallet: lock the ingest, pair on time and app, skip notices, ECB fallback
siddharthd and Claude Opus 5.5
2026-10-03 16:55:07 +10:00
22fde30b26
currency: a wallet row's amount is AUD, so show its native figure, not the AUD one under a foreign label
siddharthd and Claude Opus 5.5
2026-10-03 16:38:33 +10:00
48c6b2395f
wallet: never store a native figure as AUD; rate from statement rows only
siddharthd and Claude Opus 5
2026-09-11 12:43:25 +10:00
5076f27f68
annual charges: surface upcoming card/loan fees from payments alone
siddharthd
2026-08-23 21:44:17 +10:00
10cf0aaf21
transactions: merge/supersede a duplicate by hand, and widen the picker band
siddharthd
2026-08-23 19:00:57 +10:00
2251060ac6
db: append-only change log for the ledger (migration 0037)
siddharthd
2026-08-23 15:57:44 +10:00
2c05f10aed
wallet+intake: adopt the row that is already there, and keep a gift card out of the queue
siddharthd
2026-08-22 18:10:08 +10:00
9b59edcf48
reconcile: machine auth for the scheduled sweep, across all owners
siddharthd
2026-08-22 16:50:40 +10:00
3d0d75519a
wallet: the deterministic parse must beat the model's location
siddharthd
2026-08-22 16:33:56 +10:00
8d1875225f
wallet: a transaction for every tap (board #252 , ING-11)
siddharthd
2026-08-22 16:24:28 +10:00
8e66e527ae
receipts: adopt the wallet row instead of creating a second one (board #252 )
siddharthd
2026-08-22 16:17:38 +10:00
f31f12799a
reconcile: automatic pass for unambiguous statement matches (board #252 )
siddharthd
2026-08-22 16:13:28 +10:00
5e355c7e85
currency: normalise foreign_currency_code to ISO-4217 (board #254 )
siddharthd
2026-08-22 16:03:06 +10:00
669f9119b9
enrichment readers: resolve one metadata row, deterministically (board #253 )
siddharthd
2026-08-22 15:57:31 +10:00
258fe3b617
intake: the needs-header card names what is missing and gives the right advice for it
siddharthd
2026-08-22 12:35:09 +10:00
0823244e4a
intake: the word "Image" is not a receipt, and the prompt must not be data
siddharthd
2026-08-22 11:46:05 +10:00
d88ca2a24c
intake: a duplicate card that refuses a purchase must say what to do instead
feat/intake-router
siddharthd
2026-08-21 18:27:53 +10:00
91586ce4a4
test(intake): the second review pass, and CLAUDE.md for the rules it set
siddharthd
2026-08-21 18:23:52 +10:00
4b09d4136f
intake: lock the purchase, not the batch, and hold on both write paths
siddharthd
2026-08-21 18:23:51 +10:00
4f0f0dd285
intake: escape the currency and the button label too
siddharthd
2026-08-21 18:23:51 +10:00
b788b4e8fa
line-items: snapshot before writing, and stop reporting writes that did not happen
siddharthd
2026-08-21 18:23:32 +10:00
b5569b8ccc
schema: previous_line_items on the model; say what the finish_reason rule is
siddharthd
2026-08-21 18:23:32 +10:00
d4ff68363a
expense_metadata: every reader resolves the row a write lands on
siddharthd
2026-08-21 18:23:31 +10:00
631e75e58f
test(intake): cover the review findings, and CLAUDE.md for the rules they set
siddharthd
2026-08-21 17:53:06 +10:00
c25db5211b
intake: a NULL platform is "no platform", and Create re-checks before it inserts
siddharthd
2026-08-21 17:53:06 +10:00
9a442b7355
intake: escape mrkdwn, and stop printing every total as dollars
siddharthd
2026-08-21 17:52:47 +10:00
f9638cc5e5
line-items: one metadata row, agreed on by the write and the read
siddharthd
2026-08-21 17:52:47 +10:00
7424d13858
intake: only a reply that finished is a reply the schema constrained
siddharthd
2026-08-21 17:52:25 +10:00
be3d10d4f1
intake: match merchants on whole words, not substrings
siddharthd
2026-08-21 17:52:25 +10:00
a4e5f540cc
docs: intake router routes, env vars, migration 0034
siddharthd
2026-08-21 12:10:06 +10:00
32a47bf8ee
test(intake): rules, PDF text, C2 idempotency, enrich-vs-candidates, pantry hand-off, Slack taps
siddharthd
2026-08-21 12:10:06 +10:00
c7ea516c34
slack: dispatch the four intake taps on action_id (plan §11 C5)
siddharthd
2026-08-21 12:10:05 +10:00
db5c9a02a7
intake: POST /api/intake router + PUT /api/transactions/[id]/line-items (plan §11 C1, C2)
siddharthd
2026-08-21 12:10:05 +10:00
a538376638
db(0034): intake_batches + intake_merchant_kinds for the intake router
siddharthd
2026-08-21 12:10:05 +10:00
b958d05287
test(db): resolve the integration DSN at run time instead of storing an IP (#161 )
siddharthd
2026-08-21 00:52:54 +10:00
eaf5d5ac66
test(analytics): guard the three unguarded Priority 0 behaviours (#155 )
siddharthd
2026-08-21 00:52:36 +10:00
fc9ffaba25
chore(ci): clear the lint debt and make lint blocking (#79 )
siddharthd
2026-08-21 00:52:14 +10:00
9f1be74330
transactions: let a gift card be a payment method you can pick
siddharthd
2026-08-17 18:14:58 +10:00
4f307e9517
docs: what importing a BNPL account changes, and the Zip data decisions
siddharthd
2026-08-15 19:11:50 +10:00
2cfaf8e8c8
statements: derive account identity, fix the new-bank alert (0033)
siddharthd
2026-08-15 17:03:13 +10:00
c3b623052d
statements: keep one bank's national entities apart (migration 0032)
siddharthd
2026-08-15 16:52:14 +10:00
0bb4329249
statements: one institution, one bank name (migration 0031)
siddharthd
2026-08-15 16:45:04 +10:00
95d8544752
transactions: change who paid, on a row and on a statement
siddharthd
2026-08-15 16:17:38 +10:00
6c14b493ef
analytics: your share of what someone else paid is your spend
siddharthd
2026-08-15 15:37:32 +10:00
22c2349a47
docs: one CSV import path, and the statement-coverage rule that replaced the Frollo importer
siddharthd
2026-08-13 15:09:11 +10:00
3edcc27781
csv import: map a currency column, or foreign rows land as AUD
siddharthd
2026-08-13 15:08:50 +10:00
461c021e7a
csv import: exclude what the statements already cover, and delete the Frollo importer
siddharthd
2026-08-13 12:58:06 +10:00
b82c4570bd
frollo: don't import what the statements already cover
siddharthd
2026-08-13 12:36:08 +10:00
afd75d3f09
transactions: never print a foreign amount as AUD
siddharthd
2026-08-13 12:32:17 +10:00
2738213a23
docs: record the ledger-duplicate guard and why awaitsStatementLine is gone
siddharthd
2026-08-13 12:24:59 +10:00
bb8a009e02
frollo: don't re-import what the ledger already has, and stop hiding the queue
siddharthd
2026-08-13 12:23:01 +10:00
3e826a317b
CLAUDE.md: document the Frollo account feed and the new reconcile exclusion
siddharthd
2026-08-13 11:29:08 +10:00
21e9e765a3
Add /api/frollo/ingest so the import can run unattended
siddharthd
2026-08-13 11:19:27 +10:00
493ff6f631
Import Frollo account feeds for the accounts statements don't cover
siddharthd
2026-08-13 10:49:35 +10:00
2c666236b2
orders: share the merchant tidy, and fix two bugs the corpus run found (board 212)
siddharthd
2026-08-12 21:07:50 +10:00
215303161b
orders: bring the lifecycle-only toggle's numbers up to date (board 210)
siddharthd
2026-08-12 20:38:43 +10:00
3b5e495ca4
orders phase 2: order_transaction_links, and move every reader to it (board 205)
siddharthd
2026-08-12 20:29:42 +10:00
6b9b5fe518
orders: badge the annual summary receipts (board 211)
siddharthd
2026-08-12 20:12:36 +10:00
231ef3411a
orders: record why line items may not exempt a row from the phantom filter
siddharthd
2026-08-12 18:26:24 +10:00
699e4a2ddd
orders: cast cadence order_count to int — BigInt broke every recurring merchant
siddharthd
2026-08-12 17:12:14 +10:00
79940202f1
orders: fix the 42703 that broke EVERY order detail page
siddharthd
2026-08-12 17:10:13 +10:00
9790b64e1d
orders: badge sender authentication, not source_trust
siddharthd
2026-08-12 17:10:04 +10:00
1b34cd65d8
orders: restore the design the prototype had, and stop repeating the row
siddharthd
2026-08-12 13:28:06 +10:00
c05c4b5a35
orders: show the context, not just the row
siddharthd
2026-08-12 12:50:03 +10:00
b26d526e83
orders: a browse surface for the purchase history the ledger cannot show
siddharthd
2026-08-12 12:15:16 +10:00
872da3b12c
shared page: window the rendered rows — DOM no longer grows with history
siddharthd
2026-08-10 19:46:58 +10:00
b4f28010df
shared page: fix expand freeze — cache date formatter, memoize rows
siddharthd
2026-08-10 19:39:19 +10:00
0e5422919e
shared page: expandable receipt details on split transactions
siddharthd
2026-08-10 18:27:16 +10:00
7f8e363b5b
order details: hide the review surface for spine-bridged retail rows
siddharthd
2026-08-10 18:02:51 +10:00
502e3f563c
0029: rescope uq_expense_source_order for per-shipment bridge rows
siddharthd
2026-08-10 17:42:45 +10:00
7819a88af2
order-details: null item amounts render nothing, not $0.00; qty defaults to 1
siddharthd
2026-08-10 13:37:39 +10:00
a1e776e9be
docs: quote the net trip phase figures, not the raw sums
siddharthd
2026-08-02 22:22:46 +10:00
9e4b518f57
Split a trip into its two economies, so travel stops being a 60% slab
siddharthd
2026-08-02 22:20:55 +10:00
2d341e24a0
A negative trip balance is over-coverage, not a bill
siddharthd
2026-08-02 21:52:51 +10:00
6db2345c49
Net the trip debt to one figure, and show payer, category and search on Shared
siddharthd
2026-08-02 21:19:40 +10:00
cb7665ded1
Let everyone on a trip see it, and give payments their scope back
siddharthd
2026-08-02 19:11:19 +10:00
6e179d3a0a
docs: put the UI review's priorities 1-4 on the board, and correct two claims
siddharthd
2026-08-02 16:44:04 +10:00
dbc6fd1352
Add source identity to transactions so a feed can be re-imported safely
siddharthd
2026-08-01 22:13:07 +10:00
c70d2b1fac
Sign the investments line so withdrawals net against contributions
siddharthd
2026-07-31 00:05:05 +10:00
f6c500b27a
Hide transfers in the transactions view by default
siddharthd
2026-07-30 23:34:31 +10:00
549abd8cca
docs: point work tracking at the board, not ACTIONS.md
siddharthd
2026-07-30 23:12:50 +10:00
a465b147a3
Read receipt lines under the keys the receipt panel renders
siddharthd
2026-07-30 13:51:33 +10:00
17028c79ff
Accept grocery receipts scanned in pantry as candidate spend
siddharthd
2026-07-30 13:40:32 +10:00
69b3ed8ea9
docs: catch CLAUDE.md and the UI review up with the shared-expenses rebuild
siddharthd
2026-07-29 22:22:42 +10:00
a56e5e2de5
docs: splits total 100%, and why the remainder is the owner's
siddharthd
2026-07-29 10:26:44 +10:00
22e4a1ead0
fix(splits): make every split account for 100%
siddharthd
2026-07-29 10:23:06 +10:00
dd0462a5f9
fix(orders): decode • so item options separate again
siddharthd
2026-07-28 22:38:38 +10:00
3144cf3176
feat(orders): record credits orders from before the cutover
siddharthd
2026-07-28 22:20:03 +10:00
fe104a9618
fix(orders): read both legs of an Uber payment
siddharthd
2026-07-28 21:59:35 +10:00
63aaf1eb21
fix(orders): read A$ totals and credits-funded receipts
siddharthd
2026-07-28 20:32:02 +10:00
7cf247951a
docs: the verdict scale, and the two Slack rules that cost real data
siddharthd
2026-07-28 19:17:25 +10:00
d458228625
feat(orders): a fifth verdict, 'bad', between ok and never again
siddharthd
2026-07-28 19:12:26 +10:00
82f751cbf4
fix(slack): update the card via response_url, not the HTTP response
siddharthd
2026-07-28 18:54:53 +10:00
9f0f38449b
feat(slack): ask the other person too, and put rating before sharing
siddharthd
2026-07-28 18:33:25 +10:00