@getsolaris/e11h
v0.6.0
Published
Keyboard-driven TUI for Elasticsearch and OpenSearch
Maintainers
Readme
e11h
English | 한국어
Keyboard-driven TUI for Elasticsearch and OpenSearch
Single-binary, fast. Browse clusters, indices, and documents from your terminal with a vim-like keymap. Per-profile readonly/write modes (default readonly). Write mode enables PUT/POST/DELETE. Inspired by k9s and lazygit.
Features
- TUI navigation — vim-like keys for clusters, indices, documents
- Multi-cluster — switch profiles instantly via command palette
- Multiple auth methods — basic, API key, Cloud ID, bearer token
- readonly/write modes — readonly by default, write mode enables PUT/POST/DELETE per profile
- Single binary —
bun runsource orbrew install— your choice - Both Elasticsearch & OpenSearch — same interface for both engines
Requirements
- Bun runtime (≥ 1.3.13) — only for source/npm install. Homebrew installs Bun automatically.
- Elasticsearch 7.x+ or OpenSearch 1.x+ cluster
- macOS or Linux terminal (≥ 80x24)
Installation
Homebrew (macOS/Linux)
brew install getsolaris/tap/e11hcurl (one-liner)
curl -fsSL https://raw.githubusercontent.com/getsolaris/e11h/main/install.sh | bashnpm / bun
bun install -g @getsolaris/e11h
# or
npm install -g @getsolaris/e11hLocal Development
For local contributor testing, run the repo directly with Bun:
bun install
bun run src/index.tsx
bun run typecheck
bun test
bun run buildRun targeted tests when changing covered code, then full checks before opening a PR.
Quick Start
e11hOpens the TUI. On first run, a setup wizard walks you through creating your first connection profile. Select a cluster from the list and start exploring.
Connection Setup
Profiles live in ~/.config/e11h/profiles.yaml. Each profile needs a name, host, and auth method.
Basic auth:
- name: local
host: http://localhost:9200
mode: readonly
auth:
type: basic
user: elastic
pass: changemeAPI key:
- name: staging
host: https://staging.example.com
mode: readonly
auth:
type: api_key
key: "VnVhQ..."Cloud ID:
- name: prod
host: ""
mode: readonly # change to 'write' to enable PUT/POST/DELETE
auth:
type: cloud_id
cloud_id: "my-cluster:dXMt..."
api_key: "abc..."Bearer token:
- name: opensearch
host: https://os.example.com
mode: readonly
auth:
type: bearer
token: "eyJ..."Keymap Reference
Global
| Key | Action |
|-----|--------|
| q | Quit |
| ? | Toggle help |
| : | Command mode |
| Ctrl+P | Open profile switcher popup (when not on connection screen) |
| Esc | Back / cancel |
| r | Refresh current view |
Profile switcher popup: press Ctrl+P from any screen (except connection) to open. Use j/k to move, Enter to switch, Esc or Ctrl+P to close. Secrets (passwords, API keys, tokens) are masked in the detail pane.
Cluster screen (console editor + response panel)
| Key | Action |
|-----|--------|
| Ctrl+Enter | Run active block (kitty/Alacritty/Foot) |
| Ctrl+T | Run active block (Ghostty-safe alt) |
| Ctrl+Space | Trigger context-aware autocomplete (verbs, paths, DSL templates) |
| Ctrl+L | Format JSON in editor |
| Ctrl+J | Toggle focus: Editor ↔ Response |
| Ctrl+B | Toggle Response: JSON ↔ Table |
| Ctrl+S | Open Export popup (DevTools / Response, JSON) |
| Ctrl+\ | Toggle layout: auto / row / column |
| ? | Toggle help |
| r | Refresh cluster health |
| Esc | Back |
Response panel (when focused)
| Key | Action |
|-----|--------|
| v | Visual mode (extend with arrows, copy with y/Enter) |
| y | Copy selection (in visual mode) |
| a | Toggle auto-fit / fixed column widths |
| Tab | Open column visibility picker |
| / | Filter rows by substring |
| h/j/k/l or arrows | Scroll |
| Mouse drag | Select text (auto-copied to clipboard via OSC52) |
Index screen
| Key | Action |
|-----|--------|
| Enter | Browse documents |
| / | Filter indices |
| s | Sort by name / size / docs |
| H | Toggle hidden indices |
Document screen
| Key | Action |
|-----|--------|
| j / k | Scroll down / up |
| / | Search within document |
Search screen
| Key | Action |
|-----|--------|
| Ctrl+Enter | Run query (kitty/Alacritty/Foot) |
| Ctrl+T | Run query (Ghostty-safe alt) |
| Tab | Move focus between index and query |
| Enter | Open selected document |
| n / p | Next / previous page |
Connection screen
| Key | Action |
|-----|--------|
| Tab | Navigate between fields |
| Ctrl+N / Ctrl+J | Next profile |
| Ctrl+P / Ctrl+K | Previous profile |
| Ctrl+T | Cycle auth type |
| Ctrl+S | Test connection |
| w | Toggle password visibility |
| r | Reload profiles |
Commands
Enter command mode with :.
| Command | Description |
|---------|-------------|
| :context | Switch active connection profile |
| :cluster | Jump to cluster overview |
| :indices | Jump to index list |
| :search | Open search panel |
| :format / :fmt | Format JSON in editor (same as Ctrl+L) |
| :export [json\|csv] | Export current response to ~/.cache/e11h/exports/ (default json) |
| :help | Show full keymap |
| :q / :quit | Exit e11h |
Modes & Safety
e11h supports per-profile readonly and write modes (default: readonly).
- readonly: GET requests + POST to
/_searchonly. Destructive methods (PUT/DELETE) blocked at the client level. - write: All HTTP methods. Bulk operations containing
deleteactions require explicit confirmation via modal.
Set the mode per profile in ~/.config/e11h/profiles.yaml:
mode: readonly # or 'write' to enable destructive operationsSelection & Copy
Mouse drag in any focused panel auto-copies the selection to the system clipboard via OSC52 (no Cmd+C needed — the text is available for Cmd+V immediately after releasing the mouse).
OSC52 is supported in Ghostty, iTerm2, kitty, WezTerm, Alacritty. macOS Terminal.app shows a "clipboard not supported" warning.
Current Limitations
- No aggregations or complex query DSL builder UI
- No mTLS support
- No plugin system
- Search input is single-line JSON only
Roadmap
- Demo GIF and screenshots
- mTLS support
- Aggregations and query DSL builder
- Theme customization
License
MIT — see LICENSE
