Elasticsearch

Lightweight, dependency-free Elasticsearch emulator speaking the REST API over HTTP/JSON.

KeyValue
Port9200
ProtocolREST API (HTTP + JSON)
Size~90 KB
Startupfast

Default Connection

http://parlel-bridge:9200

Supported Operations

OperationRequest
Cluster healthGET /_cluster/health
Create indexPUT /{index}
Delete indexDELETE /{index}
Index a documentPUT/POST /{index}/_doc/{id}
Get a documentGET /{index}/_doc/{id}
Delete a documentDELETE /{index}/_doc/{id}
SearchGET/POST /{index}/_search

Usage

The parlel/bridge sidecar exposes Elasticsearch at http://parlel-bridge:9200, carrying the REST (HTTP/JSON) protocol over the sandbox HTTPS preview proxy. Your app connects with an unmodified HTTP / @elastic/elasticsearch client — no Parlel code in the app.

# docker-compose.test.yml
include:
  - path: parlel-bridge.yml          # image: parlel/bridge
services:
  app:
    build: .
    env_file: test.env
    depends_on:
      parlel-bridge: { condition: service_healthy }
PARLEL_API_KEY=pk_... docker compose -f docker-compose.test.yml up
// Unmodified real client, pointed at the bridge hostname
// (or `localhost` if you run the bridge outside Docker and publish ports)
const base = "http://parlel-bridge:9200";

await fetch(`${base}/products`, { method: "PUT" });
await fetch(`${base}/products/_doc/1`, {
  method: "PUT",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Widget", price: 9.99 }),
});
const res = await fetch(`${base}/products/_search`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ query: { match_all: {} } }),
});

Or with the official client:

import { Client } from "@elastic/elasticsearch";
const es = new Client({ node: "http://parlel-bridge:9200" });
await es.search({ index: "products", query: { match_all: {} } });

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

FeatureStatus
Index + document CRUDSupported
match_all / basic searchSupported
Complex query DSL / aggregationsNot evaluated
Mappings / analyzersAccepted, not enforced
<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

ELASTIC_PASSWORD=parlel
xpack.security.enabled=false
<!-- parlel:testenv:end -->