Ephemeral is a keyboard-first research environment for market analysis, thesis development, and local-or-cloud LLM workflows. It combines a Claude-Code-style Ink shell, a legacy Textual fallback, market-data tools, and provider-aware setup so you can stay inside the terminal for the entire research loop.
v3.8.0 is a product-quality pass over the terminal experience:
- The Ink UI was redesigned around a cleaner workspace, compact sidebar, and dedicated prompt dock.
- Input handling is more reliable: typing always returns focus to the prompt, the cursor behaves consistently, and requests no longer make the shell feel frozen.
- The composer is more usable: when it is empty,
↑and↓switch actions directly so the shell no longer feels static. - Repeated Ink actions are much faster because the shell now keeps a persistent Python bridge worker alive instead of cold-starting one per request.
- The layout falls back earlier on smaller terminals so content stays inside the frame instead of clipping or colliding.
- Ollama onboarding is more accurate: setup can now adopt already-installed local models instead of assuming every machine needs a fresh pull.
- GitHub release installs now use a repo-hosted one-line bootstrap script instead of a PyPI publish path.
- Versioning is centralized and release changes are now logged in
CHANGELOG.md.
Ephemeral ships with three ways to work:
| Surface | Purpose |
|---|---|
ephemeral |
The default Ink command center for interactive research, setup inspection, and workflow switching. |
ephemeral --legacy-ui |
The older Textual experience for teams that still prefer the previous full-screen shell. |
ephemeral <command> |
One-shot CLI commands for scripting, automation, and quick checks. |
Configuration, exports, charts, and session artifacts live under ~/.ephemeral/.
curl -fsSL https://raw.githubusercontent.com/desenyon/ephemeral/main/scripts/install.sh | bashThe installer:
- downloads the selected GitHub ref,
- creates
~/.ephemeral/.venv, - installs the Python package from source,
- installs Ink UI dependencies under
ephemeral/ink_ui, - links
ephemeralinto~/.local/bin.
To pin a release:
curl -fsSL https://raw.githubusercontent.com/desenyon/ephemeral/main/scripts/install.sh | EPHEMERAL_REF=v3.8.0 bashRequirements:
- Python
3.11+ - Node.js and
npm curlandtar
After install:
ephemeralIf ~/.local/bin is not on your PATH, run ~/.local/bin/ephemeral or add that directory to your shell profile.
git clone https://github.com/desenyon/ephemeral.git
cd ephemeral
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
npm install --prefix ephemeral/ink_ui
pip install -e ".[dev]"
ephemeralWith uv:
git clone https://github.com/desenyon/ephemeral.git
cd ephemeral
uv sync --extra dev
npm install --prefix ephemeral/ink_ui
uv run ephemeralThe default interface is now intentionally closer to Claude Code in structure, but customized for Ephemeral research workflows: one navigator, one dominant workspace, and one durable composer.
- One dominant workspace pane for the selected result.
- One compact navigator for actions, session state, and recent runs.
- One always-available composer at the bottom.
Tab: cycle focus across modes, activity, workspace, and prompt.↑/↓orj/k: move within the focused rail or scroll the workspace.[/]: page the workspace output.d: toggle rendered vs raw payloads.Esc: clear the current prompt and return focus to the dock.Ctrl+C: quit.
- Typing from any pane returns focus to the prompt immediately.
- The prompt shows a live caret without appending the cursor to placeholder text.
- While a request runs, the shell remains navigable and shows the active job in the chrome.
Ephemeral supports both cloud providers and local models.
Set a key with:
ephemeral --setkey openai <your-key>
ephemeral --setkey anthropic <your-key>
ephemeral --setkey google <your-key>Then choose a default:
ephemeral --provider openai
ephemeral --model gpt-5.4v3.8.0 improves the local-model path:
- If Ollama is reachable and you already have models installed, setup offers to bind one immediately.
- Selecting a local model persists
DEFAULT_PROVIDER,DEFAULT_MODEL,OLLAMA_MODEL, andOLLAMA_HOSTtogether. - Status output now reports whether the active default model is actually available locally.
Common Ollama flow:
ollama serve
ollama pull qwen3.5:8b
ephemeral --provider ollama
ephemeral --model qwen3.5:8b
ephemeral --statusYou can also run:
ephemeral --setupto walk through installation, model binding, and key verification interactively.
| Command | Purpose |
|---|---|
ephemeral |
Launch the default Ink shell. |
ephemeral --legacy-ui |
Launch the legacy Textual shell. |
ephemeral --ink-ui |
Force Ink and fail instead of falling back. |
ephemeral --setup |
Run the setup wizard. |
ephemeral --status |
Show provider, model, key presence, and dependency health. |
ephemeral --list-models |
Print bundled model suggestions by provider. |
ephemeral --provider <provider> |
Persist the default provider. |
ephemeral --model <id> |
Persist the default model id. |
ephemeral --setkey <provider> <key> |
Save an API key in ~/.ephemeral/config.env. |
| Command | Purpose |
|---|---|
ephemeral ask QUERY... |
Run a one-shot LLM request with tools. |
ephemeral quote AAPL MSFT |
Fetch quote snapshots. |
ephemeral news NVDA -n 12 |
Produce a news digest. |
ephemeral compare META GOOGL AMZN |
Compare returns, vol, and quality metrics. |
ephemeral chart SPY --period 6mo |
Save a chart artifact. |
ephemeral backtest AAPL -s sma_crossover --period 2y |
Run the built-in backtest engine. |
ephemeral doctor |
Run a dependency and environment check. |
ephemeral tools |
List registered tool names. |
| Layer | Responsibility |
|---|---|
ephemeral/ink_ui |
React + Ink shell for the default interactive experience |
ephemeral/ink_bridge.py |
Structured bridge between the Ink UI and Python workflows |
ephemeral/cli.py |
CLI entry point and launcher orchestration |
ephemeral/setup_agent.py |
Setup wizard for providers, keys, and local models |
ephemeral/llm |
Router and provider implementations |
ephemeral/tools |
Tool registry and market-data integrations |
ephemeral/backtest |
Built-in backtesting engine and related workflows |
The release number is now centralized in ephemeral/version.py to keep package metadata, runtime banners, and setup surfaces aligned.
For the 3.8 UI and setup work, the primary checks are:
npm --prefix ephemeral/ink_ui run typecheck
npm --prefix ephemeral/ink_ui run smoke
.venv/bin/python -m pytest tests/test_ink_bridge.py tests/test_setup_agent.py -q./scripts/build.shThis produces:
- Python distributions under
dist/ - A macOS app bundle via
scripts/create_app.py
- Human-readable release history lives in
CHANGELOG.md. - Setup and command examples in this README reflect
v3.8.0.
See LICENSE.
