Ecstacy
Beautiful data, right in your terminal.
Ecstacy is a Textual TUI for visualizing data from local files, REST endpoints,
SQL, and WebSockets -- with charts, tables, sparklines, gauges, heatmaps and a
JSON explorer. Any source feeds any visualization through a typed DataSet
contract, and dashboards compose multiple panels from a single YAML file.
| Splash screen |
Home screen |
| Sparkline chart |
JSON explorer |
Install
pip install ecstacy
Then launch it:
ecstacy
You can also run it directly with uv from a clone of this repo:
uv sync
uv run ecstacy
Quick start
Open a file directly:
ecstacy file sample.csv --chart line
ecstacy file data.csv --chart bar --x region --y value
ecstacy file metrics.parquet --chart table --max-rows 1000
ecstacy file sheet.xlsx --sheet data --chart table
Auto-refresh a live source:
ecstacy file metrics.csv --refresh 5s --chart line
ecstacy rest https://api.example.com/metrics --refresh 10s --chart table
Press r to manually refresh the current chart.
Pipe data in from stdin:
cat data.csv | ecstacy file -
curl -s https://api.example.com/items.json | ecstacy file - --format json
Go headless -- print rows or export without launching the TUI:
ecstacy file data.csv --head 20
ecstacy file data.csv --tail 5 --export csv > out.csv
ecstacy rest https://api.example.com/items --export json > out.json
ecstacy file data.csv --export markdown > out.md
ecstacy socket ws://localhost:8765 --head 20 --timeout 3
Query a REST endpoint:
ecstacy rest https://api.example.com/items --json-path data.items --chart table
Run a DuckDB SQL query:
ecstacy sql "select 1 as a, 2 as b" --chart table
ecstacy sql "select * from 'data.csv'" --db :memory: --chart line
Run a SQLite query:
ecstacy sqlite "select * from metrics" --db app.db --chart table
Stream from a WebSocket:
ecstacy socket ws://localhost:8765 --chart table
Open a multi-panel dashboard:
ecstacy dashboard ops.yaml
Inspect available themes, charts, or your config path:
ecstacy themes
ecstacy charts
ecstacy config path
Sources
| Source | Formats / protocol |
|---|---|
| file | CSV, TSV, JSON, NDJSON, Parquet, log/text, Excel (xlsx) |
| stdin | ecstacy file - -- CSV, TSV, JSON, NDJSON, log from pipe |
| rest | HTTP/HTTPS JSON endpoints with dotted json-path |
| sql | DuckDB queries (in-memory or file-backed) |
| sqlite | SQLite queries (in-memory or file-backed) |
| socket | WebSocket streaming JSON records |
Visualizations
table (sortable, searchable, column picker, export), line, bar, histogram,
scatter, sparkline, gauge, heatmap (correlation matrix), box plot, proportion
chart (horizontal bars, formerly pie), summary card
(count/mean/median/std/min/max), json tree.
Keys
Home: o open, d dashboard, t pick theme, ? help, q quit.
Chart: n/right next chart, p/left previous chart, ctrl+f query/transform, r refresh, t pick theme, esc back.
Table: s sort by column, / focus search, c column picker, e export view, type to filter, esc clear.
Dashboard: m toggle grid/single layout, n/p cycle panels, r refresh now, esc back.
Themes
Five built-in themes: ecstacy-dark (default), ecstacy-light, onedark,
darcula, synthwave. Press t to open the theme picker, or set one in
config.yaml:
theme: synthwave
Configuration
Ecstacy layers configuration in this order (later wins):
- Built-in defaults.
- User config:
$XDG_CONFIG_HOME/ecstacy/config.yaml(or~/.config/ecstacy/config.yaml). - Project config:
./ecstacy.yamlin the current directory. - Environment variables prefixed
ECSTACY_(e.g.ECSTACY_THEME=ecstacy-light). - CLI flags.
On first run Ecstacy auto-creates the user config directory and a default
config.yaml (it never overwrites an existing one).
Example config.yaml:
theme: ecstacy-dark
refresh: 0s
splash: true
max_rows: 1000
Dashboards
A dashboard YAML describes sources and panels. Each panel binds a source to a visualization with an optional column mapping. Source paths are resolved relative to the dashboard file, so dashboards are portable.
theme: ecstacy-dark
refresh: 5s
sources:
- id: metrics
kind: file
path: ./sample.csv
panels:
- source: metrics
viz: line
x: timestamp
y: [revenue, margin]
- source: metrics
viz: bar
category: region
value: revenue
When refresh is set, dashboard panels re-fetch on that interval. Press m to
switch between grid and single-panel layouts.
Architecture
core--DataSetcontract, plugin registry, transforms, store, scheduler.sources-- file, rest, sql, sqlite, socket -- all registered plugins.widgets-- visualization widgets, registered plugins.screens-- splash, home, chart, dashboard, modal, help.config-- defaults, Pydantic schema, layered config loader.theming-- Textual themes and the global stylesheet.
Sources resolve to a typed DataSet (DataFrame + schema + meta). Widgets bind
to a DataSet and a column mapping, so any source can feed any visualization.
Extending
Add a source by subclassing Source and decorating it with
@registry.sources.register("name"). Add a visualization by creating a widget
with a set_data(dataset, mapping) method and decorating it with
@registry.viz.register("name").
Known limitations
- Headless export is stdout-only (CSV/JSON/Markdown); in-TUI export writes to file. No PNG/SVG yet.
- No clipboard, Prometheus, InfluxDB, or Google Sheets source yet.
License
MIT. See LICENSE.
Changelog
See CHANGELOG.md.
Metadata
Release files for ecstacy-tui 0.14.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ecstacy_tui-0.14.4.tar.gz | 1.8 MB | Without provenance | Details for ecstacy_tui-0.14.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ecstacy_tui-0.14.4-py3-none-any.whl | Python 3 | none | any | Details for ecstacy_tui-0.14.4-py3-none-any.whl |
Total release size: 1.9 MB
Release files / ecstacy_tui-0.14.4.tar.gz
| Download URL | ecstacy_tui-0.14.4.tar.gz |
|---|---|
| Size | 1.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d2f6fe86508223ed214f3d22ae4fa960425754a09872ec7ca1f88cacbdc2d4c9
|
|
BLAKE2b-256 checksum How to use checksums |
d9ac41eb6c58a030e74788678ebdfef95395511dbc17fd8ebb0394209a793466
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ecstacy_tui-0.14.4-py3-none-any.whl
| Download URL | ecstacy_tui-0.14.4-py3-none-any.whl |
|---|---|
| Size | 81.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e955055a76ede4f2a0307d7c75a81b6f3a507f0b9376ba6165e5b54570060ac7
|
|
BLAKE2b-256 checksum How to use checksums |
49c3ce32d2257b947f825ebd9ba053ed74759e8a62fff5aede95131d928ee1f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for ecstacy-tui 0.14.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.