Skip to main content

A local, keyboard-driven Bloomberg-style market terminal for your shell.

Project description

bbterm

Gemini_Generated_Image_8zz0hr8zz0hr8zz0

A local, keyboard-driven market terminal — a Bloomberg-style TUI you run in your own terminal. Price charts, a watchlist, statistics, and SEC EDGAR fundamentals and filings, all backed by a local cache so it's fast, works offline once data is fetched, and costs almost nothing to run.

Built with Textual (TUI), plotext (terminal charts), DuckDB (local cache), and Databento for market data.

Features

  • Hybrid command bar — press : to type a command. A bare ticker loads a symbol (AAPL); verbs run actions (ADD, DEL, GP, DES, FA, FIL, ?).
  • Candlestick + volume chart (GP), with c to toggle a line view and 16 for time ranges (1D / 5D / 1M / 6M / 1Y / 5Y).
  • Statistics panel (DES) — last, 52-week high/low, 1M and YTD returns, average volume, and day range, all computed from cached price bars.
  • Fundamentals (FA) — revenue, net income, EPS, assets, cash flow and more from SEC EDGAR, each with its fiscal year and year-over-year change.
  • Recent filings (FIL) — the company's latest 10-K / 10-Q / 8-K filings with dates and links, from SEC EDGAR.
  • Persisted watchlistADD/DEL edit it and the change is saved.
  • Local cache — market bars and EDGAR data are cached in DuckDB; each paid record is bought once, and EDGAR data is reused for 24 hours.

Architecture

UI widgets never fetch data — they render what the DataService returns. The service is an async, cache-through layer over a DuckDB store, fetching only the date ranges it's missing. Data providers sit behind small Protocols:

  • Databento — primary historical bars (when DATABENTO_API_KEY is set).
  • yfinance — free fallback for bars/quotes when no Databento key is present.
  • SEC EDGAR — fundamentals and filings (free, official, no API key), accessed with the standard library only.

All parsing and number-crunching lives in pure, unit-tested modules (commands.py, data/stats.py, data/fundamentals.py); widgets stay dumb.

Requirements

  • Python ≥ 3.12
  • A Databento API key is optional — without it, bbterm runs on the free yfinance fallback. EDGAR needs no key.

Install

From PyPI (recommended):

pipx install bbterm-tui     # or: pip install bbterm-tui

The installed command and import name are bbterm (only the PyPI package is named bbterm-tui). To enable the Databento provider: pipx install "bbterm-tui[databento]".

To install the latest unreleased main instead, via pipx:

pipx install git+https://github.com/sgjlee0520/bbterm.git

The core install runs on the free yfinance + SEC EDGAR path. To enable the Databento provider (requires a DATABENTO_API_KEY):

pipx install "git+https://github.com/sgjlee0520/bbterm.git#egg=bbterm[databento]"

Contributors (editable, from a clone):

python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"          # add ,databento to work on the Databento provider

Configure

Settings come from environment variables or a .env file in the project root:

Variable Default Purpose
DATABENTO_API_KEY (unset) Enables Databento as the bar provider
BBTERM_DB_PATH data/market.duckdb Local cache database path
BBTERM_COST_CAP_USD 1.0 Per-request Databento cost ceiling
BBTERM_DATASET EQUS.MINI Databento dataset

Run

bbterm-sync     # optional: pre-cache recent daily bars for your watchlist
bbterm          # launch the terminal

Keys & commands

Input Action
: Focus the command bar (Esc / Enter to leave)
<ticker> Load a symbol
ADD <sym> / DEL <sym> Edit the watchlist (saved)
GP / DES Candlestick chart (crisp image in iTerm2) / statistics
FA / FIL Fundamentals / SEC filings (↑↓ select, Enter opens in browser)
N News headlines
16 Time range (1D / 5D / 1M / 6M / 1Y / 5Y)
r Refresh · q Quit · ? Help

Image charts use Sixel/Kitty terminal graphics; on terminals without image support, bbterm falls back to text charts automatically.

A beginner-friendly guide is in docs/manual/bbterm-guide.tex (build the PDF with pdflatex bbterm-guide.tex).

Tests

python -m pytest

Tests make no network calls and spend no Databento credits; live API access is exercised only by the manual scripts under scripts/.

Notes

  • yfinance is an unofficial data source intended here as a free development fallback only.
  • SEC EDGAR requests send a declared User-Agent with a contact address, as the SEC requires.

License

bbterm is licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See LICENSE. Copyright © 2026 sgjlee0520.

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

bbterm_tui-0.3.0.tar.gz (51.9 kB view details)

Uploaded Source

Built Distribution

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

bbterm_tui-0.3.0-py3-none-any.whl (45.7 kB view details)

Uploaded Python 3

File details

Details for the file bbterm_tui-0.3.0.tar.gz.

File metadata

  • Download URL: bbterm_tui-0.3.0.tar.gz
  • Upload date:
  • Size: 51.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bbterm_tui-0.3.0.tar.gz
Algorithm Hash digest
SHA256 cca2fa5e982fb89fd105de5efef073f95bedd3141b9be6bac0a030bda5846ab7
MD5 5b90ca5c44428d8e490d1940bdf7b74f
BLAKE2b-256 3e3313c513f9fd9540d3dd75a43608db5392d091009cfe5455156ddc09abc9b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for bbterm_tui-0.3.0.tar.gz:

Publisher: release.yml on sgjlee0520/bbterm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bbterm_tui-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: bbterm_tui-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 45.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bbterm_tui-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4fd68d229e0202f9ac81fa71c9b5245a41064b7b55d8caf4a297fa97146f647f
MD5 789adad904bbef27db4b776094557eb6
BLAKE2b-256 9b8b6ca7183dcca90a3c53193619dd46cd4e26f7f9cb28e56c17f851daa49cc2

See more details on using hashes here.

Provenance

The following attestation bundles were made for bbterm_tui-0.3.0-py3-none-any.whl:

Publisher: release.yml on sgjlee0520/bbterm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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