← All notes

Wallet Tracker is open source

The little dashboard I wrote about a few days ago is now open source.

github.com/Gpatrickj7/tofte-wallet-tracker-

MIT licensed. Take it, run it, change it.

What it is

A dashboard for crypto you already own. Balances across Ethereum, BNB Chain, Ethereum Classic, Solana, Bitcoin, TRON, Linea and Monad. A mining income log that records the USD value of each payout at the moment it arrived. A purchase log. CSV export for tax time. Charts for how it has all moved over time.

It only reads. There is nowhere to enter a private key and no code that signs anything. That is the whole design, not a missing feature.

What is in this release

Version one is the tool as it stands, packaged so a stranger can run it. Since the last post it grew a proper set of charts: allocation by asset, holdings by chain, income and spending by month, running totals over time, and a portfolio value line that fills in one point per day once a database is attached. Every chart has a hover readout and a table view, so nothing depends on color or a mouse.

None of my own addresses are in it. Every wallet variable ships blank, and the app skips any chain you leave empty.

Setting it up

You need Node 22 and at least one public receiving address.

git clone https://github.com/Gpatrickj7/tofte-wallet-tracker-.git
cd tofte-wallet-tracker-
npm install
cp .env.example .env.local

Open .env.local, set a username and password for the login page, paste in an address, and run npm run dev. That is it. The README walks through every variable, deploying to Vercel, and what to do when something does not show up.

If you want the purchase log and the value-over-time chart, add a MongoDB connection string. The free tier is enough. Without one, holdings still work.

One thing worth repeating

Wallet addresses are public, but publishing yours is still a decision. Anyone with an address can watch that balance forever. Keep them in your environment variables, never in a commit. The repository is set up to make that the default, but it cannot stop you from doing it on purpose.

This is v1. The private version keeps moving, and improvements that make sense for everyone will land back here.