macOS GUI for
Elasticsearch
and OpenSearch
Everything a cluster needs in one native window — browse, query, write, watch, compare. It opens instantly and never stalls, however large the answer.
Any Elasticsearch or OpenSearch cluster
Elasticsearch or OpenSearch, direct or through an SSH tunnel, an HTTP or SOCKS5 proxy, with mTLS where the cluster asks for it. Secrets live in the Keychain.
Elasticsearch at native speed, in a real desktop app
Not a browser in a frame. The table, the editors and the trees are the app’s own views, drawn by your own machine: the window opens in a moment, requests and parsing run off the interface thread, and megabytes of JSON come back as a table you can scroll straight away instead of a window that stops answering while it reads.
Everything the job needs, in one window
Documents as a table, not a wall of JSON
Typed, colored cells; every column sorts from its own menu; ⌘F filters what came back. Paging counts past the result window, so a jump to the end lands on the deepest page the cluster serves instead of its error.
Create an index, fix a document, move an alias
Rubber writes as well as it reads: create an index with its shards and aliases, edit the settings of one that exists, point an alias at another index, edit a document as JSON, drop a row straight from the table. Every destructive step asks first and names what it takes with it. And a connection has guard rails — mark it read-only and the app refuses the request, give it a colour and you see which cluster you are on before you press ⌘↩.
Write the request, get the page
A JSON editor that knows the language: comments and trailing commas allowed, the cluster’s own errors underlined where they happened, ⌘↩ to run. Any request exports as cURL.
The query you run every morning, a click away
Save a query or a REST request under a name, keep them in folders and drag them where they belong. A saved one opens in its own tab and remembers where it came from. They live in the app rather than in the cluster — and they came across from Rubber 1 with everything else.
What the cluster is doing right now
Health, shards and nodes at a glance, with search and indexing rates, latency, heap and CPU over the last minutes. Elasticsearch and OpenSearch name some of those counters differently and move them between releases, so what a chart can draw depends on what this cluster reports. It polls only while you are looking at it.
Two documents, side by side
Send a response, a row or a single cell into the diff from its context menu: changed lines tinted, differing characters marked, formatting and key order taken out of the picture. It needs no connection at all, and the result copies out as a patch.
Any cluster, however it is reached
Elasticsearch or OpenSearch, direct or through a jump host, an HTTP or SOCKS5 proxy. The cluster knows you by a password, an API key or a client certificate, and TLS verification is a switch on the connection like the rest. Keys and passwords live in the Keychain, never in a config file.
A layout that stays put
Sidebars on either side of the tabs, sections that move and resize, the editor on any side of the results. Every boundary you drag is where you left it next time, and ⌘⇧P reaches the rest.
Your setup is a file you own
Connections, groups and saved requests export as one JSON file — a backup, or the ten seconds it takes to set up a second Mac. Passwords and keys are not in it: they stay in the Keychain, and an imported connection asks for its secret the first time it is used. Coming from Rubber 1 there is nothing to export at all — the update finds your data and brings it across.
Quit whenever. Come back to the same session
Every window opens on the tool it was on, with its tabs in order and the one you were reading in front. Unsaved queries, the page the cluster answered and how far you had scrolled come back with them. What is kept is yours to decide: a size limit per tool, or nothing kept at all.
Smaller things you notice on the second day
Command palette
Every action with its shortcut, a keystroke away: ⌘⇧P.
Find and sort
⌘F filters the table and marks every match in the scrollbar. Columns sort from their own menu.
Send to diff
Any row, any cell, any response goes straight into a comparison from its context menu.
Copy it the way you need it
A request as cURL, a document as JSON, rows as an array or a line each, a diff as a patch.
The real total, not “10 000+”
A search stops counting at the index’s result window. One click asks the cluster for the exact number of matches instead.
Paging and sorting edit your query
Next page, or a column’s sort, rewrites
from,sizeandsortin the body in front of you — comments and formatting kept.Bulk without the newlines
Write a
_bulkbody as a plain JSON array of objects; it goes to the cluster as NDJSON, trailing newline and all.Themes, or a prompt for one
Rubber One Dark and Light out of the box. With Pro, import a theme — or copy a prompt and have an AI write it.
Switch cluster in place
⌘O points the window at another connection — Elasticsearch or OpenSearch, it makes no difference — and ⌘↩ opens it in a new one.
Pin what you use
Star an index or an alias and it stays at the top of the sidebar, whatever the filter says.
Your size
One setting scales the interface; the editor and the table have their own, down to row height and tab width.
Keep only what is worth keeping
Responses and comparisons come back after a relaunch — with a size limit per tool, or none at all.
Why not just a browser tab?
Kibana Dev Tools, a web client, curl in a terminal — they all work, and so does Rubber, on Elasticsearch and on OpenSearch alike. This is what changes when the client is a window of its own.
| In a browser tab | In Rubber |
|---|---|
| One query at a time; a second one means another tab of the whole console | A tab per query in every tool, and they are all still there after a relaunch |
| The page parses a large response and stops answering while it does | Requests and parsing run off the interface thread — the table scrolls straight away |
| Paging past the result window ends in the cluster’s error | Paging asks the cluster how deep it may go and stops at the deepest page it serves |
| Credentials live in a browser profile, or are typed in again | Passwords, API keys and certificates live in the macOS Keychain |
| A cluster behind a jump host needs a port forwarded by hand first | An SSH tunnel, an HTTP or a SOCKS5 proxy, set per connection |
| Nothing stands between a stray DELETE and production | A connection marked read-only refuses mutating requests outright |
| The queries you rely on sit in browser storage | Saved requests live in a tree you arrange, and export as a file you keep |
| A response is JSON you read line by line | A response is a typed table you sort, filter with ⌘F and send into a diff |
Free to use. Pro when it is your job.
The free version is the whole app, with limits. Rubber Pro lifts them and covers commercial use.
- Viewer, REST console, cluster dashboard and JSON diff
- Create, edit and delete indices, aliases and documents
- SSH tunnels, HTTP and SOCKS5 proxies, mTLS, read-only connections
- Saved requests, restored sessions, export and import of your setup
- One connection window
- Three tabs per tool
- Personal use
- Everything in the free version
- Unlimited connection windows
- Unlimited Viewer, REST and diff tabs
- Documents in tabs
- Comments and trailing commas in request bodies
- Custom themes
- Commercial use
- Cancel whenever — the app stays as the free version
- Everything in Rubber Pro
- No renewal, no expiry date
- Includes the updates we publish for the app
- Bought on one Apple ID, like any App Store purchase
Every plan is bought inside the app through the App Store. Cancel a subscription any time in your Apple account; the one-time purchase has nothing to cancel. Prices are in US dollars; the App Store charges in your currency.