Skip to main content

Ecstacy

Ecstacy

Beautiful data, right in your terminal.

CI PyPI version Downloads Python versions License Stars Forks Code style: ruff Made with Textual

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

Splash screen
Home screen

Home screen
Sparkline chart

Sparkline chart
JSON explorer

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):

  1. Built-in defaults.
  2. User config: $XDG_CONFIG_HOME/ecstacy/config.yaml (or ~/.config/ecstacy/config.yaml).
  3. Project config: ./ecstacy.yaml in the current directory.
  4. Environment variables prefixed ECSTACY_ (e.g. ECSTACY_THEME=ecstacy-light).
  5. 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 -- DataSet contract, 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.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ecstacy-tui 0.14.1
File Size Uploaded Provenance Actions
ecstacy_tui-0.14.1.tar.gz 1.8 MB Without provenance Details for ecstacy_tui-0.14.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ecstacy-tui 0.14.1
File Interpreter ABI Platform Actions
ecstacy_tui-0.14.1-py3-none-any.whl Python 3 none any Details for ecstacy_tui-0.14.1-py3-none-any.whl

Total release size: 1.8 MB

Release files / ecstacy_tui-0.14.1.tar.gz

Download URL ecstacy_tui-0.14.1.tar.gz
Size 1.8 MB
Tags Source
SHA-256 checksum
How to use checksums
373bff91c1758b1a63a1176baf96b5c172245895e9fe5b1219a6d2f5c8fddc3f
BLAKE2b-256 checksum
How to use checksums
a87f24a56f744429f07ec34b4f42cba2f6eb456d224d289fcda8034fe0b7e0dc
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.1-py3-none-any.whl

Download URL ecstacy_tui-0.14.1-py3-none-any.whl
Size 79.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
65d7d8d630bc43cac4b678ad442838a9d91cbd42b5a39dd15d6af032895f5c29
BLAKE2b-256 checksum
How to use checksums
3cacb49b1a2b8f75351a61b89db4979a1d52e064bccb9599507f384688743665
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.1

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.

Release history Release notifications | RSS feed

This release

0.14.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page