Skip to main content

Terminal crypto portfolio + daily-compounding growth tracker (DexScreener/Solana prices)

Project description

tzla

Terminal crypto portfolio + daily-compounding growth tracker. Live prices from DexScreener and candle charts from the Jupiter (Solana) public API — no API key. Set a fixed growth plan once and each day see whether you're ahead or behind the curve.

Running tzla --grow tracks today's live portfolio total against a fixed growth plan:

Day Date Plan balance TZLA amount Multiple
0 (today) 2026-01-01 $1,000.00 1,000 1.00x
1 2026-01-02 $1,003.69 1,004 1.00x
7 2026-01-08 $1,026.12 1,026 1.03x
30 2026-01-31 $1,116.83 1,117 1.12x
365 2027-01-01 $3,835.77 3,836 3.84x

Day 0 of 365 · plan today $1,000.00 · actual $1,000.00 · on plan (+0.0% vs plan)

In the terminal it renders as a colored, full-width table — near-term days first (today, tomorrow, +7, +30), then a monthly cadence out to the target.

Install

tzla is a normal Python CLI. The cross-platform way to install it is pipx (Linux, macOS, and Windows/PowerShell — it puts tzla on your PATH in an isolated venv).

# from a local clone
pipx install ./tools/tzla

# straight from git (once pushed)
pipx install "git+https://github.com/danielradosa/tzla"

# after it's published to PyPI
pipx install tzla

No pipx? pip install --user ./tools/tzla works too. For development: pip install -e ./tools/tzla (editable).

Windows / Homebrew / Scoop

  • PowerShell: install pipx (py -m pip install --user pipx; py -m pipx ensurepath) then pipx install tzla. The tzla command works in any shell afterwards.
  • Homebrew and Scoop are possible once a release artifact exists (PyPI sdist or a GitHub release tarball, needed to pin a checksum). Starter templates live in packaging/ — fill in the URL + sha256 after the first publish.

Usage

tzla                 # portfolio table + price chart(s)
tzla --no-chart      # table only
tzla -d 90           # 90-day chart history
tzla --coin <mint>   # chart only one token
tzla --grow          # growth-plan tracker (ahead/behind vs the fixed plan)
tzla --grow --history  # overlay your recorded daily actuals on the plan curve
tzla --grow --watch 30 # live refresh every 30s, with a behind-plan alert
tzla --verify        # cross-check each price against a live Jupiter quote
tzla --wallet <addr> # read holdings live from a Solana wallet (read-only)
tzla --no-pnl        # hide the Cost/PnL columns
tzla --where         # show where config files live
tzla --version

The growth plan

--grow projects a fixed baseline (start date, start value, daily rate, horizon) and compares today's live total against it:

tzla --grow                                   # first run auto-anchors to today's total
tzla --grow --reset-plan                      # re-anchor to today
tzla --grow --reset-plan --principal 1000 --rate 0.369 --grow-days 365

The plan never re-anchors on its own, so editing your holdings daily can't move the goal line — the ahead/behind number stays honest.

Config

Two JSON files in your per-user config dir (tzla --where to see exact paths):

File Default location What it is
portfolio.json ~/.config/tzla/portfolio.json Your holdings — edit this daily
plan.json ~/.config/tzla/plan.json The fixed growth anchor — set once (auto-created on first --grow)

They're deliberately separate so a daily holdings edit can't clobber the plan. On first run a starter portfolio.json is written from the bundled example.

Override locations with --config / --plan, or point the whole config dir elsewhere with $TZLA_HOME (e.g. TZLA_HOME=./mydata tzla). Standard $XDG_CONFIG_HOME is honored.

portfolio.json — holdings keyed by Solana token mint address:

{
  "currency": "usd",
  "holdings": {
    "4tWMJCW6tdpVUkwDpX1NEQURbtuQDg7H9DfkjEpGnq5D": { "symbol": "TZLA", "amount": 0 }
  }
}

The bundled starter ships with amount: 0 — set it to your real holding. Existing configs are never overwritten, so your numbers stay put across upgrades. Add more entries to track several tokens. The TZLA amount column in --grow only appears for single-asset portfolios (where "amount" is unambiguous).

Optional fields

All of these are additive — omit them and behavior is unchanged.

Field Where Effect
"currency" top level "eur", "gbp", … convert all amounts via live ECB rates (Frankfurter); "usd" skips the FX call
"wallet" top level a base58 Solana address → amounts are read live from chain (getTokenAccountsByOwner + SOL); wallet-only tokens are surfaced automatically. Read-only — never a private key.
"rpc" top level override the public Solana RPC (e.g. a Helius/QuickNode URL)
"invested" / "cost_basis" per holding USD cost basis (total) → adds Cost / PnL / PnL% columns + an Unrealized PnL line
"buy_price" per holding USD cost basis per unit (cost = buy_price × amount)
{
  "currency": "eur",
  "wallet": "YourBase58WalletAddress…",
  "holdings": {
    "4tWMJCW6tdpVUkwDpX1NEQURbtuQDg7H9DfkjEpGnq5D": {
      "symbol": "TZLA", "amount": 2232, "buy_price": 0.20
    }
  }
}

Per-run overrides: --wallet <addr>, --rpc <url>, --no-wallet, --no-pnl. --grow logs a daily snapshot to ~/.config/tzla/history.jsonl; --grow --history charts those recorded actuals against the plan (needs ≥2 logged days).

See src/tzla/data/ for the example files.

Notes

  • A daily rate like 0.369% compounds to ~+284%/year — that's an idealized assumption, not a forecast. The tracker just tells you how far reality drifts from it.
  • --verify and --wallet add network round-trips (a Jupiter quote per holding, and a Solana RPC call); a flaky endpoint degrades gracefully rather than aborting.

MIT licensed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tzla-0.2.0.tar.gz (25.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tzla-0.2.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file tzla-0.2.0.tar.gz.

File metadata

  • Download URL: tzla-0.2.0.tar.gz
  • Upload date:
  • Size: 25.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for tzla-0.2.0.tar.gz
Algorithm Hash digest
SHA256 447726c2d5d1e3aa33739462aeb57753947ae46fd61e29d8fde29346466b2d73
MD5 0e79e9a2af196915fbd4c27ab9413dd4
BLAKE2b-256 f8421115344825e79f84a3817d9416cdae16ecee437cf2397b3c5af9ab30d25e

See more details on using hashes here.

File details

Details for the file tzla-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: tzla-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for tzla-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0dc5bdd8c534c2d28a453355155001aaee8352c13b48bfa9da7c17f3b5ec496c
MD5 4b0fe093fa35f4509075ed4401e3711e
BLAKE2b-256 775829c99c5da34922d7c36fa6904e29892be35b1c9f12617dc16be4ac6eec17

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page