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
)
You can also check out the demo at demo.contre.io, the database resets every hour.
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
. <(cat .env | grep -v -e '^$' | grep -v "#" | awk '{}')
go run ./cmd/main.go # go build ./cmd/main.go to just build it
go install github.com/cosmtrek/air@latest # Download air
air -c air.toml
and access localhost:3000
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
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
- 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.