A Textual TUI for beautiful terminal data visualization from files, REST endpoints and more.
Project description
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
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
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 |
| rest | HTTP/HTTPS JSON endpoints with dotted json-path |
| sql | DuckDB queries (in-memory or file-backed) |
| socket | WebSocket streaming JSON records |
Visualizations
table (sortable and searchable), line, bar, histogram, scatter, sparkline, gauge, heatmap (correlation matrix), json tree.
Keys
Home: o open, d dashboard, t theme, ? help, q quit.
Chart: n/right next chart, p/left previous chart, t theme, esc back.
Table: s sort by column, / focus search, type to filter, esc clear.
Dashboard: m toggle grid/single layout, n/p cycle panels, esc back.
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.
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, 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
- No export to file yet (CSV/JSON/Markdown/PNG).
- No Excel, SQLite, clipboard, or stdin source yet.
- Live refresh applies to dashboards only (not single-source views).
License
MIT. See LICENSE.
Changelog
See CHANGELOG.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ecstacy_tui-0.1.1.tar.gz.
File metadata
- Download URL: ecstacy_tui-0.1.1.tar.gz
- Upload date:
- Size: 866.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bcfe9fc72ad8b933c580a5f6d13d2ed1a55b1336d35edc6cf5880ef5c9961590
|
|
| MD5 |
df84e0e7ad7362e160860df970d9827d
|
|
| BLAKE2b-256 |
d10e3b6275ccb12885b997db70abd548dcfc1a98ba192f02229dfd72ab71e02f
|
File details
Details for the file ecstacy_tui-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ecstacy_tui-0.1.1-py3-none-any.whl
- Upload date:
- Size: 40.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
400d65d63ff272cf19f77818f751057643a31e3acf9a2014df441d97f3b143cc
|
|
| MD5 |
b88772c2da0853701b88e2d7d51d29ff
|
|
| BLAKE2b-256 |
b337d9f119504baeb99cddcfc67bfde5f282cb49052cd62f26da2e5da46fbbab
|