
Typesense
- 1 installs
- 40 repo stars
- Updated August 4, 2026
- akillness/oh-my-skills
typesense is a Claude Code skill that stands up a self-hostable typo-tolerant Typesense search backend (binary, Docker, or Cloud), an open-source Algolia and ElasticSearch alternative.
About
typesense is a routing-first skill for standing up a self-hostable, typo-tolerant search backend with Typesense, an open-source Algolia and ElasticSearch alternative. A developer uses it to pick a server mode (binary, Docker, or Typesense Cloud), install an API client, design a collection schema, index documents, and run searches with faceting, geo-search, synonyms, and scoped API keys. It matters when adding site, app, or product search or migrating off Algolia/Elasticsearch.
- Stands up self-hostable typo-tolerant search via a single C++ binary with no runtime deps
- Covers server modes (binary, Docker, Typesense Cloud), schema design, indexing, and search
- An open-source Algolia and easier ElasticSearch alternative with <50ms instant search
Typesense by the numbers
- 1 all-time installs (skills.sh)
- Ranked #770 of 911 Databases skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
typesense capabilities & compatibility
Self-hosted binary/Docker is free; Typesense Cloud is fixed hourly plus bandwidth, not per-record
- Capabilities
- search backend · schema design · document indexing · faceted search
- Works with
- docker
- Use cases
- database · api development · devops
- Platforms
- Linux · macOS
- Runs
- Local or remote
- Pricing
- Freemium
What typesense says it does
a fast, typo-tolerant open-source search engine — an Algolia alternative and an easier-to-use ElasticSearch alternative.
It is a **single C++ binary with no runtime dependencies**, architected for low-latency (<50ms) instant search.
npx skills add https://github.com/akillness/oh-my-skills --skill typesenseAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 40 |
| Last updated | August 4, 2026 |
| Repository | akillness/oh-my-skills ↗ |
What it does
Stand up a self-hosted typo-tolerant search backend and wire site, app, or product search, or migrate off Algolia/Elasticsearch.
Who is it for?
Standing up site, app, catalog, or product search, or migrating off Algolia/Elasticsearch
Skip if: LLM trace/eval observability, token-efficient agent code search, or generic service dashboards
When should I use this skill?
The user wants to build or operate an installable search backend or add site/app/product search
What you get
A running typo-tolerant search backend with schemas, indexing, faceting, and scoped API keys
- Running Typesense server
- Collection schema
- Indexed documents
By the numbers
- <50ms instant search
- 3 server modes (binary, Docker, Cloud)
- single C++ binary with no runtime deps
Files
typesense — Installable Typo-Tolerant Search Environment
Typesense is a fast, typo-tolerant open-source search engine — an Algolia alternative and an easier-to-use ElasticSearch alternative. It is a single C++ binary with no runtime dependencies, architected for low-latency (<50ms) instant search. This skill is the routing-first wrapper: choose how to run the server, wire a client, model the data, and drive search + UI + production hardening.
When to use this skill
- The user wants to stand up a search backend for a site, app, catalog,
docs, or product browsing experience
- The user asks to install/run Typesense (binary, Docker, or Typesense Cloud)
- The user wants **typo tolerance, faceting/filtering, geo-search, sorting,
grouping, synonyms, curation, scoped API keys, or federated multi-search**
- The user wants to migrate off Algolia or Elasticsearch to a self-hosted
or managed open-source engine
- The user wants an InstantSearch.js UI or a Raft HA cluster in front
of / around Typesense
When not to use this skill
- The user wants LLM trace/eval observability (hallucination, prompt
scoring) → use opik / langsmith
- The user wants token-efficient code search for agents over a repo →
use semble
- The user wants generic service dashboards / uptime alerts (non-search
telemetry) → use monitoring-observability
- The user wants a vector database purpose-built for embeddings only —
Typesense does vector + hybrid search, but a dedicated store may fit better for pure ANN at extreme scale; confirm the workload first
Prerequisites
| Requirement | Notes |
|---|---|
| Docker (recommended) | Simplest local + prod path via the official image |
| or a binary host | Linux (x86-64) / macOS binary packages from typesense.org/downloads |
| or Typesense Cloud | Zero-ops managed cluster (fixed hourly + bandwidth, not per-record) |
| An API client | Python / JS / PHP / Ruby official; Go / Dart / C# community |
| An API key | Set at server start (--api-key); generate scoped keys per tenant |
Instructions
Step 1 — Choose the server mode
| Mode | When | Entry point |
|---|---|---|
| Docker (recommended) | Local dev → prod, single command | docker run typesense/typesense … |
| Binary | Bare-metal / no Docker | Download from <https://typesense.org/downloads> |
| Typesense Cloud | Zero-ops managed, HA | <https://cloud.typesense.org> |
Local Docker server (pin a real version tag, set a strong key):
docker run -p 8108:8108 -v /tmp/typesense-data:/data \
typesense/typesense:27.1 --data-dir /data --api-key=CHANGE_ME_STRONG_KEYThe skill ships `scripts/install.sh` to start a local Docker server and install the Python client in one shot.
Step 2 — Install an API client
pip install typesense # Python (official)
npm install typesense # JS/TS (official)
# PHP: composer require typesense/typesense-php Ruby: gem install typesensePrefer an official client over raw CURL — they ship a smart retry strategy for HA setups. See `references/commands.md` for the full client + integration matrix.
Step 3 — Design the collection schema
A collection is an index with a typed schema. Mark fields facet: true to filter/drill-down, and set default_sorting_field for ranking:
import typesense
client = typesense.Client({
"api_key": "CHANGE_ME_STRONG_KEY",
"nodes": [{"host": "localhost", "port": "8108", "protocol": "http"}],
"connection_timeout_seconds": 2,
})
client.collections.create({
"name": "companies",
"fields": [
{"name": "company_name", "type": "string"},
{"name": "num_employees", "type": "int32"},
{"name": "country", "type": "string", "facet": True},
],
"default_sorting_field": "num_employees",
})Unlike Algolia, most settings (searchable fields, facets, ranking) are set at query time, so one collection serves many sort orders — less memory, more flexibility.
Step 4 — Index documents
client.collections["companies"].documents.create({
"id": "124", "company_name": "Stark Industries",
"num_employees": 5215, "country": "USA",
})
# Bulk import (JSONL) for large datasets:
# client.collections["companies"].documents.import_(jsonl_lines, {"action": "upsert"})Step 5 — Search (typo tolerance + facets + filters + geo)
client.collections["companies"].documents.search({
"q": "stork", # typo of "stark" — handled out of the box
"query_by": "company_name",
"filter_by": "num_employees:>100",
"sort_by": "num_employees:desc",
"facet_by": "country",
})Capabilities to reach for: faceting/filtering, geo-search (sort by distance), grouping & distinct, synonyms, curation/merchandizing (pin records), federated multi-search across collections in one request, and vector / hybrid search. Details in `references/commands.md`.
Step 6 — Search UI + production
- UI: the InstantSearch.js adapter
gives filtering, sorting, pagination, and as-you-type UI fast.
- Multi-tenant: generate scoped API keys that restrict access to
certain records — never ship the admin key to the client.
- HA: run a Raft-based cluster (typically 3 nodes) for high
availability; upgrades are a binary swap + restart.
Step 7 — Plugin-style installation alongside jeo-skills
This skill folder is plugin-installable through the standard jeo-skills flow so the wrapper, references, and installer land on disk for any supported agent runtime:
# Project install (writes into .agents/skills/typesense/)
npx skills add https://github.com/akillness/jeo-skills --skill typesense
# Global install for every detected agent
npx skills add -g https://github.com/akillness/jeo-skills --skill typesense
# Target specific agents
npx skills add -g https://github.com/akillness/jeo-skills --skill typesense -a claude-code -a codex -yOutput format
When the user asks typesense for help, return a compact brief:
# typesense Routing Brief
## Scope
- Server mode: docker | binary | cloud | undecided
- Client: python | js | php | ruby | community
- Stage: install-server | install-client | schema-design | index | search | ui | production-ha
## Recommended next move
- start-docker-server | install-client | create-collection | import-docs | run-search | wire-instantsearch | scoped-keys | cluster
## Why
- 2-3 bullets grounded in the user's packet
## Route-outs
- `opik` / `langsmith` for LLM trace/eval observability
- `semble` for agent-facing code search over a repo
- `monitoring-observability` for non-search service telemetryBest practices
1. Pin a version tag, never `latest` — typesense/typesense:27.1, and keep the data dir on a real volume so restarts don't lose the index. 2. Set settings at query time — searchable fields, facets, sort, and ranking are per-query; you rarely need multiple collections for sort orders. 3. Mark facets in the schema — facet: true is required for filtering / drill-down on a field. 4. Use scoped API keys for clients — the admin key stays server-side; scoped keys enforce per-tenant record access. 5. Bulk import as JSONL with `upsert` — far faster than per-document creates for large datasets; size RAM to the index (memory-resident). 6. License awareness — the server is GPL, the client libraries are Apache-2.0; run the server as a separate daemon (the intended use).
References
- Upstream repo: <https://github.com/typesense/typesense>
- API docs: <https://typesense.org/api>
- Guide / walk-through: <https://typesense.org/guide>
- Downloads (binary): <https://typesense.org/downloads>
- Docker image: <https://hub.docker.com/r/typesense/typesense>
- Typesense Cloud: <https://cloud.typesense.org>
- InstantSearch adapter: <https://github.com/typesense/typesense-instantsearch-adapter>
- Installer script: `scripts/install.sh`
- Client + integration matrix: `references/commands.md`
- Adjacent skills:
../opik/SKILL.md,../semble/SKILL.md,
../monitoring-observability/SKILL.md
- License: GPL-3.0 (server); API clients Apache-2.0
{
"skill_name": "typesense",
"evals": [
{
"id": 1,
"prompt": "We need fast site search for our product catalog and want to self-host, not pay Algolia. Get us started with Typesense.",
"expected_output": "A routing brief that picks a server mode (Docker recommended), installs a client, and sequences schema → index → search, with self-host framing vs Algolia.",
"assertions": [
"Output starts the server via the official Docker image with a pinned version tag and a mounted data volume, not `latest`.",
"Output sequences create-collection → index/import → search rather than jumping to search first.",
"Output sets the admin API key at server start and notes scoped keys for client-side/multi-tenant access."
]
},
{
"id": 2,
"prompt": "How do I support faceted filtering and sort-by-price in Typesense without creating a separate index per sort order like Algolia?",
"expected_output": "An explanation that facets need `facet: true` in the schema and that sort/searchable settings are query-time, so one collection serves many sort orders.",
"assertions": [
"Output marks the faceted field with `facet: true` in the collection schema.",
"Output uses query-time `sort_by` / `filter_by` / `facet_by` and states one collection serves multiple sort orders.",
"Output does not recommend creating a separate collection per sort order."
]
},
{
"id": 3,
"prompt": "We want to monitor hallucinations and prompt quality in our LLM app.",
"expected_output": "A route-out to opik/langsmith — this is LLM observability, not a Typesense search-backend task.",
"assertions": [
"Output routes to `opik` or `langsmith` instead of standing up Typesense.",
"Output explains the boundary: Typesense is a search engine, not an LLM trace/eval tool.",
"Output does not create a Typesense collection or server for this request."
]
}
]
}
typesense command + client reference
Upstream: <https://github.com/typesense/typesense> · API docs: <https://typesense.org/api>
Server (run modes)
| Command | Purpose |
|---|---|
docker run -p 8108:8108 -v /tmp/typesense-data:/data typesense/typesense:27.1 --data-dir /data --api-key=KEY | Local/prod Docker server (pin a tag; mount a real volume) |
| binary from <https://typesense.org/downloads> | Bare-metal (Linux x86-64 / macOS), single self-contained binary |
| <https://cloud.typesense.org> | Managed HA cluster (fixed hourly + bandwidth, not per-record) |
curl http://localhost:8108/health | Liveness check |
curl -H "X-TYPESENSE-API-KEY: KEY" http://localhost:8108/debug | Version / node debug |
Build from source (Docker): TYPESENSE_VERSION=nightly ./docker-build.sh --build-deploy-image --create-binary.
API clients
| Language | Install | Status |
|---|---|---|
| Python | pip install typesense | official |
| JS / TS | npm install typesense | official |
| PHP | composer require typesense/typesense-php | official |
| Ruby | gem install typesense | official |
| Go | github.com/typesense/typesense-go | community |
| Dart | typesense (pub) | community |
| C# / .NET | DAXGRID/typesense-dotnet | community |
| Laravel Scout | devloopsnet/laravel-scout-typesense-engine | community |
| Symfony | acseo/TypesenseBundle | community |
Official clients ship a smart retry strategy for HA; prefer them over raw CURL.
Core API surface
| Operation | Python example |
|---|---|
| Create collection | client.collections.create({"name": "...", "fields": [...], "default_sorting_field": "..."}) |
| Index one doc | client.collections["c"].documents.create(doc) |
| Bulk import (JSONL) | client.collections["c"].documents.import_(lines, {"action": "upsert"}) |
| Search | client.collections["c"].documents.search({"q": "...", "query_by": "...", ...}) |
| Multi-search (federated) | client.multi_search.perform({"searches": [...]}, common_params) |
| Scoped API key | client.keys.generate_scoped_search_key(parent_key, {"filter_by": "tenant:acme"}) |
| Delete by filter | client.collections["c"].documents.delete({"filter_by": "num:<100"}) |
Search parameters (selected)
| Param | Purpose |
|---|---|
q, query_by | Query text + fields to search (typo tolerance is automatic) |
filter_by | num_employees:>100 && country:USA |
sort_by | num_employees:desc, _text_match:desc, geo location(lat,lng):asc |
facet_by | Fields to return facet counts for (must be facet: true in schema) |
group_by / group_limit | Group + distinct results |
num_typos | Tune typo tolerance per query |
vector_query | Vector / hybrid (kNN) search on a float[] field |
query_by_weights | Per-field ranking weights |
Feature map
Typo tolerance · faceting & filtering · sorting (query-time) · grouping & distinct · federated multi-search · geo search · vector + hybrid search · scoped API keys (multi-tenant) · synonyms · curation / merchandizing (pinned hits) · Raft-based clustering (HA) · seamless version upgrades (binary swap) · no runtime dependencies.
Search UI
InstantSearch.js adapter: <https://github.com/typesense/typesense-instantsearch-adapter> — filtering, sorting, pagination, as-you-type UI on top of Typesense.
Operations notes
- Memory-resident index: size RAM to the dataset (rough: 1M HN titles ≈
165 MB). A fresh server ≈ 30 MB.
- HA: 3-node Raft cluster typical; upgrades swap the binary + restart.
- Licensing: server is GPL-3.0; client libraries are Apache-2.0 — run the
server as a standalone daemon (intended use).
#!/usr/bin/env bash
# typesense installer wrapper.
# Starts a local Typesense server (Docker) and installs the Python client.
#
# Env knobs:
# TYPESENSE_VERSION — image tag to pin (default: 27.1)
# TYPESENSE_API_KEY — admin key for the local server (default: a dev key)
# TYPESENSE_PORT — host port (default: 8108)
# TYPESENSE_DATA_DIR — host data volume (default: ~/.typesense-data)
# TYPESENSE_NO_SERVER=1 — only install the client, do not start the server
#
# Usage:
# bash scripts/install.sh
# TYPESENSE_VERSION=27.1 TYPESENSE_API_KEY=mysecret bash scripts/install.sh
# TYPESENSE_NO_SERVER=1 bash scripts/install.sh
set -euo pipefail
TYPESENSE_VERSION="${TYPESENSE_VERSION:-27.1}"
TYPESENSE_API_KEY="${TYPESENSE_API_KEY:-dev-only-change-me}"
TYPESENSE_PORT="${TYPESENSE_PORT:-8108}"
TYPESENSE_DATA_DIR="${TYPESENSE_DATA_DIR:-$HOME/.typesense-data}"
echo "=== typesense installer ==="
echo "version: ${TYPESENSE_VERSION} port: ${TYPESENSE_PORT} data: ${TYPESENSE_DATA_DIR}"
echo "[1/2] Installing the Python client"
if [ -n "${VIRTUAL_ENV:-}" ]; then
if command -v uv >/dev/null 2>&1; then uv pip install --upgrade typesense; else pip install --upgrade typesense; fi
elif command -v uv >/dev/null 2>&1; then
uv pip install --system --upgrade typesense 2>/dev/null \
|| uv tool install typesense 2>/dev/null \
|| echo " (uv could not install into system; use a venv: 'uv venv && source .venv/bin/activate')"
elif command -v pip3 >/dev/null 2>&1; then
pip3 install --upgrade typesense 2>/dev/null \
|| pip3 install --user --break-system-packages --upgrade typesense
else
echo " ⚠️ no uv/pip found — install the client manually: pip install typesense"
fi
if [ "${TYPESENSE_NO_SERVER:-0}" = "1" ]; then
echo "[2/2] TYPESENSE_NO_SERVER=1 — skipping server start."
else
echo "[2/2] Starting the local Typesense server (Docker)"
if ! command -v docker >/dev/null 2>&1; then
echo " ⚠️ docker not found — install Docker, or download a binary from https://typesense.org/downloads" >&2
else
mkdir -p "$TYPESENSE_DATA_DIR"
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^typesense$'; then
echo " ℹ️ a container named 'typesense' is already running — leaving it as-is (docker rm -f typesense to reset)"
else
docker run -d --name typesense \
-p "${TYPESENSE_PORT}:8108" \
-v "${TYPESENSE_DATA_DIR}:/data" \
"typesense/typesense:${TYPESENSE_VERSION}" \
--data-dir /data --api-key="${TYPESENSE_API_KEY}" \
&& echo " ✅ typesense server up on http://localhost:${TYPESENSE_PORT}" \
|| echo " ⚠️ failed to start container (port in use? try TYPESENSE_PORT=8109)"
fi
fi
fi
echo ""
echo "Done. Verify + next steps:"
echo " curl http://localhost:${TYPESENSE_PORT}/health"
echo " python -c 'import typesense; print(\"client OK\")'"
echo " Then create a collection, import documents, and search (see references/commands.md)."
echo " Admin key (change for production): ${TYPESENSE_API_KEY}"
N:typesense
D:Stand up a self-hostable, typo-tolerant search environment with Typesense (open-source Algolia / ElasticSearch alternative; single C++ binary, <50ms, no runtime deps) — pick a server mode (Docker / binary / Typesense Cloud), install a client (Python/JS/PHP/Ruby official), design a collection schema, index docs, and search with typo tolerance, faceting/filtering, geo, sorting, grouping, synonyms, curation, scoped API keys, federated multi-search, and vector/hybrid; then wire an InstantSearch.js UI and a Raft HA cluster.
T:Bash|Read|Write|Edit|Glob|Grep|WebFetch
G:typesense|search engine|typo-tolerant search|algolia alternative|elasticsearch alternative|instantsearch|faceted search|geo search|vector search|self-hosted search|site search|product search
F:Claude|Gemini|Codex|OpenCode
S:
1:Choose server mode — Docker (recommended), binary (typesense.org/downloads), or managed Typesense Cloud; pin a version tag and mount a real data volume
2:Install a client — `pip install typesense` / `npm install typesense` (official clients ship HA retry)
3:Design the collection schema — typed fields, `facet:true` for drill-down, `default_sorting_field`; most settings are query-time
4:Index documents — per-doc create or JSONL bulk import with `upsert`; size RAM to the memory-resident index
5:Search — q + query_by (typo-tolerant), filter_by, sort_by, facet_by, group_by, geo, vector_query, multi_search
6:UI + production — InstantSearch.js adapter, scoped API keys per tenant, Raft 3-node HA cluster
R:
opik:Use for LLM trace/eval observability (hallucination, prompt scoring)
langsmith:Use for LangSmith-stack LLM tracing/evals
semble:Use for token-efficient agent code search over a repo
monitoring-observability:Use for non-search service dashboards/alerts
Related skills
FAQ
How is Typesense run?
As a single C++ binary via binary download, the official Docker image, or managed Typesense Cloud.
Does it support faceting and geo-search?
Yes, it covers faceting/filtering, geo-search, sorting, grouping, synonyms, curation, and scoped API keys.