A personal finance tracker, built to run on my own machine

An app to consolidate bank accounts and investments, and just reduce the headache of adulting

I built this app for myself, turns out it's something a lot of people could find a use for.

One person, one machine. Not a product I'm selling.

MY FINANCIAL PICTURELOCAL · IDR
pfin Home with known net worth in IDR, non-salary gains, and expandable splits for cash, stocks, crypto, bonds, deposits and liabilities
One home for the whole picture.01 / 03
01 Know what you own02 See what needs attention03 Keep the data at home

Twelve things I use

What I actually needed it to track.

Every one of these is built and in use. Nothing here is a plan for later.

pfin Accounts grouped by type, with per-currency balances for multi-currency accounts at Meridian Bank and Harbour Bank

Feature 01 / Cash and banks

Every bank account, every currency, one running balance.

A separate balance for every account and every currency, even when two banks hold the same one, valued in rupiah at a rate you enter yourself. No balance is silently folded into another, and no negative is quietly turned into a zero.

An account is single or multi currency, and you choose which currencies it may hold. Each balance stays its own number with its own observation date, so the IDR at one bank never absorbs the USD sitting at another.

  • Four currencies at one bank, six at another
  • Every balance standalone
  • One rate, entered by you
pfin Investments showing a fixed deposit valued as principal plus estimated interest to date

Feature 02 / Fixed deposits

A deposit that keeps earning until the day it matures.

Each deposit is its own contract, with principal, currency, start and maturity dates, stated annual rate, day-count basis and optional interest tax rate all on the record.

The value it shows is principal plus interest earned to date, labelled as an estimate. That estimate stops growing at maturity, and the total never adds principal and expected payout together as though both were already in your hands.

  • Principal, rate and maturity
  • Estimated interest, labelled
  • Stops growing at maturity
pfin Stocks page with a holdings table of per-instrument quantities, average buy price and value in IDR and USD, and a transactions table

Feature 03 / Stocks

The same stock in three places, counted once.

Define an instrument once and hold the quantity per account, so the same stock in an IDR brokerage and a USD one stays one position with the right quantity in each place. Fractional shares are fine, and both currencies land in one table instead of two apps.

Underneath the holdings sits a transactions table: every buy and sell with its date, price, total, and the gain or loss at today's price, with the exchange it happened on linking back to the holding. A mark flags any average or total that leaves a holding out.

  • Two brokerages, two currencies
  • Fractional shares
  • IDR and USD in one table
pfin Crypto page with holdings summed across exchanges and wallets, and a transactions table with gain since buy

Feature 04 / Crypto

A coin on an exchange and a coin in a wallet are still one coin.

A crypto tracker that won't replace a dedicated app, and doesn't pretend to. What it gives you is the overview: every exchange and every self-custody wallet as its own custody location, with the same asset counted wherever it actually sits.

Record the deposits and withdrawals as they happen and you get net money in beside the current value, so the gain is a number rather than a guess. No private keys, no seed phrases, nothing that could move a coin.

  • Exchange and wallet, kept apart
  • Money in, not just value
  • No keys, ever
pfin Investments bond section with two obligasi lots in IDR and USD, showing value, cost and estimated coupon

Feature 05 / Bonds

Two obligasi lots, two banks, two currencies, one honest picture.

Separate lots at different banks can carry different currencies, prices and maturities, with face amount, price convention and valuation basis all explicit on each one rather than averaged into a single figure.

Clean or dirty price, accrued interest and the coupon schedule are all stated, so the gross coupon shown per payment and per year is never confused with coupon income actually received. Deposits and bonds never have their principal and expected payout added together.

  • Two lots, two banks
  • Clean price and coupon
  • Coupon estimated, not banked
pfin credit card account showing the monthly Card spending summary by due month, with missing months left as gaps

Feature 06 / Card bills

What you owe on each card, and when it's due.

Every card keeps its own outstanding balance and its own due dates, so the useful number is which card is owed how much and on what day, not one total that hides the bill about to be missed. An overpaid card is recorded as a credit balance and reduces what you owe.

Card spending is summarised by due month and kept well away from net worth, because paying a bill is not the same as losing money. A month with nothing entered stays a visible gap rather than a zero.

  • Per-card balances and due dates
  • Spending kept out of net worth
  • Missing months stay missing
pfin Tax and Long Term Expenses page with income tax payments for the year, each carrying its kode billing and NTPN

Feature 07 / Tax and NTPN

Not a tax engine. A record of what you paid, and under which code.

Reminders for income tax and long-term expenses, monthly or annual, with the payment recorded against the reminder instead of a due date being ticked off and forgotten. Rule edits keep the amounts and paid history already entered.

Each payment holds its amount, currency, paid date and, for tax, the kode billing and NTPN it went out under. Yearly totals count by paid date rather than due date, and the page never invents a deadline on your behalf.

  • Kode billing and NTPN
  • Yearly totals by paid date
  • No deadline invented for you
pfin Bulk update screen listing every balance, position, price and rate with its last value and date, defaulting unchanged rows

Feature 08 / Bulk update

One screen, everything that's gone stale, one save.

One screen lists every active balance, position, investment price and needed exchange rate alongside its last value and date, so the monthly upkeep is a single pass instead of fourteen separate forms.

Rows with a prior value default to unchanged and new rows start blank. One save writes everything entered or nothing at all, blanks are skipped rather than saved as zero, and re-entering a date records whatever changed as an audited correction.

  • Every stale row on one screen
  • One save, all or nothing
  • Blanks skipped, never zeroed
pfin Calendar agenda showing expected bond coupon payments and upcoming card spending, with month and agenda views

Feature 09 / Financial calendar

Card bills, tax dates, maturities and coupons in one month.

Card bills, tax dates, deposit and bond maturities and coupon dates in one month or agenda view, with overdue and upcoming filters and every entry showing its due date, amount, linked account and where it came from.

Coupon dates stay informational and never enter task counts. Marking a bill paid records what happened without moving a balance, and a monthly schedule clamps an invalid day to the end of the month instead of skipping it.

  • Bills, taxes, maturities, coupons
  • Paid never moves a balance
  • Overflow dates clamp to month end
pfin Home with the all-time Non-salary gains figure in IDR above the asset-type splits

Feature 10 / Non-salary gains

What the money made, not what you were paid.

Rent, salary and agency income all land in the same accounts as everything else, so a month-on-month total answers the wrong question. Non-salary gains is the narrow one: what the investments themselves earned.

One all-time figure in IDR, built from realized gains on sales and maturities, income actually received after tax, and today's unrealized profit, and kept strictly out of net worth. Estimated deposit interest is never counted, and a missing rate leaves its part unknown rather than zero.

  • Sales, income and today's unrealised
  • One all-time IDR figure
  • Estimated deposit interest left out

Feature 11 / The AI agent

A narrow door, and a token that opens it.

A bot that fetches public prices and exchange rates and writes them straight in, labelled as coming from the agent, so the weekly price pass is one less chore. It can also save a finished analysis as a Markdown report that lands on its own page, newest first.

Everything else arrives as a draft. The agent proposes a holding entry, a reminder or a payment and it waits on Home until you complete, accept or reject it, on the same write path as the normal form.

  • Percentages, not values
  • Prices labelled "from agent"
  • Everything else waits as a draft

Feature 12 / Security

On a machine on my desk, with one documented exception.

Everything it knows lives in one database file on a disk I control, reachable on my own network and not from the open internet. Nothing goes out on its own initiative: no analytics, no CDN, no price or exchange-rate request it started by itself.

The agent is the single exception, and it is walled off. A separate MCP server, behind its own token, reads a narrow allowlist and stops there: percentages and dates, never positions, quantities, cash balances or deposit amounts. Only instrument identifiers and the currencies a price is needed for leave the machine, and the exception is written down rather than quietly assumed.

  • One database file, on my disk
  • Reads percentages and dates only
  • No positions or cash balances

The agent has a narrow door

Real help.
Drawn boundaries.

pfin exposes a separate, token-protected MCP connection for an AI agent. It isn't a login to the app or the database. The agent sees only what is on a short allowlist, some of it deliberately as percentages and dates rather than amounts, and the cash balances that would make it a proper hole are not reachable at all.

01

What it can see is a short list.
Stocks and crypto cross as percentages and profit percentages, never values, quantities or cost. Calendar and bond details cross as dates, not amounts.

02

Different writes have different rules.
Prices and exchange rates, and saved analysis reports, go in directly. Almost everything else arrives as a draft on Home to be finished, accepted or rejected on the normal write path.

03

The cloud model is the one exception.
What the allowed tools return leaves the machine for the AI service. That trade-off is the whole point of the allowlist, and it is written down rather than left implied.

Personal by design

The data stays
on my desk.

pfin is a single-user tracker, built for me before it was built for anyone else, and the goal was to make it as secure as I could without giving up the convenience. No remote fonts, no analytics, no third-party assets, and no request it makes on its own, so it behaves exactly the same with the internet switched off.

In practice that is a container on my own network the outside internet cannot reach, one database file on a disk I own, and an optional login for the devices I do let in. The agent is the single exception, and it sits behind its own token on a separate port.

See the interface for yourself

Built for personal use.
Not offered as a hosted service.

PRIVATE · LOCAL · MINE