controtto
Tracks financial transactions and calculates average buy prices, current asset values, and profit & loss. It supports importing and exporting transaction history for efficient management.
Author

contre95
Quick Info
Actions
Tags
📊 Controtto
A self-hosted, P&L tracker made with Go, HTMX and no JavaScript. Controtto, keeps track of your transaction saving it in a sqlite file, and returns all sorts of calculations including: * Avg. Buy price * Current asset value * Transaction history * Import / Export transaction (see sample) * Profit & Loss
In order to fetch the price of an asset, Controtto relies on mainly 4 APIs (see code).
* Binance - Public API, no token needed.
* BingX - Public API, no token needed.
* Alpha Vantage - Stocks, free but short rate limit. (get an token and set CONTROTTO_AVANTAGE_TOKEN)
* Tiingo - Stocks, crypto and Forex. (create account/token and set CONTROTTO_TIINGO_TOKEN)
Demo
You can also check out the demo at demo.contre.io, the database resets every hour.
https://github.com/user-attachments/assets/28bf8782-6118-47c0-a94b-085e1a7045b2
All configurations are set in the .env file and passed as environment variables. Variables CONTROTTO_PORT and CONTROTTO_DB_PATH are available.
# Install the dependencies
go mod tidy
# Set the .env
mv .env.example .env
# Source the env variables
export $(grep -v '^#' .env | grep -v '^$' | xargs)
Build and Run
go run ./cmd/main.go # go build ./cmd/main.go to just build it
Development env
go install github.com/cosmtrek/air@latest # Download air
air -c air.toml
and access localhost:3000
Run with Podman
A Container image is available on Docker's public registry.
If you want to use Docker, simply replace podman with docker.
mkdir data
podman container run --rm -p 8000:8000 -v $(pwd)/data:/data contre95/controtto
Run tests
go test -cover ./...
# Expected result
# ? controtto/cmd [no test files]
# ? controtto/src/app/managing [no test files]
# ? controtto/src/domain/pnl [no test files]
# ? controtto/src/gateways/markets [no test files]
# ? controtto/src/gateways/sqlite [no test files]
# ? controtto/src/presenters [no test files]
# ok controtto/src/app/querying 0.003s coverage: 40.7% of statements
TODO
- More tests
- Wrappers for logging and metrics would be nice as well.
- Add Accounts to keep track of the total net worth.
- Remove all the CSS and use custom
style.css+ Tailwind CDN.
