npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@getsolaris/e11h

v0.6.0

Published

Keyboard-driven TUI for Elasticsearch and OpenSearch

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.

CI npm License: MIT

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 binarybun run source or brew 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/e11h

curl (one-liner)

curl -fsSL https://raw.githubusercontent.com/getsolaris/e11h/main/install.sh | bash

npm / bun

bun install -g @getsolaris/e11h
# or
npm install -g @getsolaris/e11h

Local 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 build

Run targeted tests when changing covered code, then full checks before opening a PR.

Quick Start

e11h

Opens 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: changeme

API 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 /_search only. Destructive methods (PUT/DELETE) blocked at the client level.
  • write: All HTTP methods. Bulk operations containing delete actions require explicit confirmation via modal.

Set the mode per profile in ~/.config/e11h/profiles.yaml:

mode: readonly  # or 'write' to enable destructive operations

Selection & 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