bryan tan
Menu
Let’s talk
Back
PythonSQLiteDocument routing

Rental-property tax automation

Receipts in, a lodgement-ready financial-year pack out — with the judgment calls flagged rather than guessed.

  1. It starts with a photo of a receipt.

    Forwarded into a chat, or picked up by the browser addon. The vendor decides which ATO schedule the line lands on before anything else looks at it.

  2. Rules go first, the model goes second.

    Vendor rules route what they can. What is left is the judgment that changes the deduction — repair or capital — and that goes to a model, not to a guess.

  3. What it cannot decide, it flags.

    An unresolved line stays marked as a gap in the financial-year pack. The pack is ready to lodge with its open questions still open, which is the only honest way to hand it over.

  • 01 Automated AU rental-tax accounting end to end — Telegram and addon receipt ingest with vendor-based ATO-schedule routing, an LLM categoriser for repair-vs-capital judgment, and generation of a myTax-ready financial-year pack with gap flags on unresolved line items
  • 02 Built a Wealthfolio browser-extension addon and a local HTTP bridge to sync bank statements (NAB, Macquarie) — including a liability-account model for card and mortgage balances — and a depreciation engine feeding the tax pack
  • 03 Diagnosed and fixed a broker API integration bug by reverse-engineering the correct IBKR v3 asset payload shape from source, resolving a defect that valued portfolio holdings at $0.
  • 04 Built a universal document router that combines rules-based classification with an LLM (Haiku) fallback to auto-classify and file uploaded financial documents by type.

Interface recreated with invented data — no production screenshot is published. Private system; walkthrough and code review available on request.

Role
Sole engineer
Timeline
2026 — ongoing
Stack
Python · SQLite · Telegram · browser extension