Projects

Xialu

Personal finances, on your phone.

I built Xialu to manage my personal finances. I use it day to day as I continue to develop it.

My work
Product, interface & engineering
Testing
Tested on iPhone; Android not yet tested
Status
In development

Xialu in use

What it does

  • Accounts and credit cards. Keep track of balances and movements by account and currency.
  • Income and expenses. Record transactions, assign categories and review your history.
  • Transfers and currency exchange. Move money between accounts while preserving the amounts and exchange rate recorded at the time.
  • Exchange-rate lookup. Look up reference rates from Yahoo Finance when exchanging currencies. If the request fails, you can use a saved quote or enter the rate manually.
  • Credit card payment reminders. Set statement closing and payment dates when adding a card. Xialu uses the payment day to schedule local reminders for cards with recorded debt.
  • Apple Pay and Shortcuts. An iOS Shortcuts automation captures Apple Pay payment details for review in Xialu. Confirm the expense before it affects your balance. The updated flow is still undergoing device testing.
  • Portable backups. Export your data in a common format for iOS and Android, with optional password-protected encryption. Cross-platform restoration still needs validation on Android.

Why local-first

Checking a balance or recording an expense should not wait for a remote server. Xialu reads and writes to SQLite on the device, so the core financial workflow works offline. This keeps network latency out of those operations; it also makes backups an important part of keeping your data safe.

The engineering behind the numbers

Transactions are the source of truth

An account balance is calculated from its posted, non-deleted movements. It cannot be overwritten independently. Correcting a transaction changes the derived balance, avoiding two separately maintained values that can drift apart.

A transfer is one atomic operation

The outgoing and incoming entries are written in a single database transaction. If one fails, neither is committed. The ledger cannot keep only one half of a transfer.

Money uses integer minor units

Amounts are stored as whole minor units rather than floating-point numbers. Historical currency exchanges keep their recorded amounts and rate, so a new rate does not rewrite an old movement.

Domain contracts separate rules from storage

Account and transaction repositories expose interfaces with SQLite implementations. This gives responsibility boundaries a concrete shape and lets callers depend on contracts. These are the single-responsibility and dependency-inversion principles I applied, rather than tying every screen directly to database details.

  1. Interface
  2. Application services
  3. Repositories
  4. SQLite

How I built it

I defined the product, interface and architecture through incremental specifications across the app’s workflows. For transaction handling, for example, I required amounts in integer minor units to avoid floating-point rounding errors. Balances had to be derived from transactions. Correcting a transaction had to update the balance without maintaining a separate value that could drift out of sync.

For each step, the agent implemented only what I had specified. I then reviewed the diff and checked the behavior before accepting it. I closed each increment with a conventional commit before writing the next specification.

Built with

AI-assisted development

The black cat in the logo is a tribute to my own cat. 🐈‍⬛

Khala, my black cat, resting on a blue bedspread