Meilisearch is an open-source search engine replacing Algolia with instant typo-tolerant search, hybrid vector querying, and full data privacy.
Algolia routes search queries, index data, and analytics through multi-tenant cloud servers under metered contracts. Meilisearch packages instant search-as-you-type into a single Rust binary that deploys inside an internal network or private VPC, keeping customer records and logs under local governance. Teams get fast response times and automated typo tolerance without streaming customer data across third-party networks.
Data privacy and infrastructure control define the choice between the two engines. Algolia operates exclusively as a hosted platform, sending catalog records, query terms, and user IP addresses across public boundaries into a shared cloud. For organizations navigating GDPR, HIPAA, or strict internal compliance rules, exporting sensitive data into an external provider introduces regulatory risk and vendor overhead. Running Meilisearch on internal compute instances ensures that indexed records never leave private subnets, query logs remain behind firewalls, and data policies stay under local control.
The functional trade-offs center on operational ownership and feature scope. Meilisearch matches the core capabilities developers prize in Algolia: instant prefix matching, typo tolerance, faceted navigation, and compatibility with the InstantSearch UI library. It also provides native hybrid search without gating vector retrieval behind high-tier plans. Conversely, Meilisearch lacks Algolia's global edge network, turnkey merchandising dashboards, and pre-built e-commerce connectors. In exchange for managing server provisioning yourself, you eliminate usage-based billing spikes and retain complete authority over your search stack.
Meilisearch vs Algolia — which should I choose? Algolia fits globally distributed estates needing managed multi-region routing and marketing dashboards. Meilisearch fits teams prioritizing private data residency, predictable compute costs, and self-hosted hybrid search.
Is Meilisearch free for commercial use? Yes. The open-source Community Edition allows commercial deployment and modification within proprietary applications without license fees.
Can Meilisearch run inside an air-gapped network? Yes. Operating as a standalone binary with embedded LMDB storage, it requires no external network access once provisioned.
Meilisearch fits teams prioritizing data sovereignty, rapid deployment, and predictable hosting costs over hosted merchandising platforms. While multi-node clustering requires enterprise licensing, active maintenance with pushed updates through September 2026 keeps the project dependable. Its permissive MIT license makes deploying the search engine a reliable, royalty-free foundation for production applications.
Commands from the official package registries. Each package is matched to Meilisearch through the registry's own link to its source code or website.
brew install meilisearchbrew install meilisearchWe started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Meilisearch's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p meilisearch && cd meilisearch
curl -fsSL https://open-source.store/tools/meilisearch/compose.yml -o compose.ymlcat > .env <<EOF
MEILI_MASTER_KEY=$(openssl rand -hex 16)
EOFMEILI_MASTER_KEY — Master key required to authenticate Meilisearch API requests and access admin endpoints. Generated above; keep it secret.docker compose up -dservices:
meilisearch:
image: getmeili/meilisearch:v1.56.0
restart: unless-stopped
environment:
MEILI_ENV: production
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
ports:
- "127.0.0.1:7700:7700"
volumes:
- ./meili_data:/meili_data
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:7700/health"]
interval: 10s
timeout: 5s
retries: 5
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Meilisearch is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 16 s: getmeili/meilisearch:v1.56.0.
Based on the upstream setup. Official Docker deployment. Image pinned to v1.56.0, production mode and master key configured, bound to 127.0.0.1, and healthcheck enabled.
meilisearch-1 | 2026-11-01T03:32:54.871590175Z
meilisearch-1 | 2026-11-01T03:32:54.871673425Z 888b d888 d8b 888 d8b 888
meilisearch-1 | 2026-11-01T03:32:54.871678508Z 8888b d8888 Y8P 888 Y8P 888
meilisearch-1 | 2026-11-01T03:32:54.871680925Z 88888b.d88888 888 888
meilisearch-1 | 2026-11-01T03:32:54.871683050Z 888Y88888P888 .d88b. 888 888 888 .d8888b .d88b. 8888b. 888d888 .d8888b 88888b.
meilisearch-1 | 2026-11-01T03:32:54.871685217Z 888 Y888P 888 d8P Y8b 888 888 888 88K d8P Y8b "88b 888P" d88P" 888 "88b
meilisearch-1 | 2026-11-01T03:32:54.871687550Z 888 Y8P 888 88888888 888 888 888 "Y8888b. 88888888 .d888888 888 888 888 888
meilisearch-1 | 2026-11-01T03:32:54.871689717Z 888 " 888 Y8b. 888 888 888 X88 Y8b. 888 888 888 Y88b. 888 888
meilisearch-1 | 2026-11-01T03:32:54.871691675Z 888 888 "Y8888 888 888 888 88888P' "Y8888 "Y888888 888 "Y8888P 888 888
meilisearch-1 | 2026-11-01T03:32:54.871694050Z
meilisearch-1 | 2026-11-01T03:32:54.871695842Z Config file path: "none"
meilisearch-1 | 2026-11-01T03:32:54.871698508Z Database path: "./data.ms"
meilisearch-1 | 2026-11-01T03:32:54.871700550Z Server listening on: "http://0.0.0.0:7700"
meilisearch-1 | 2026-11-01T03:32:54.871702508Z Environment: "production"
meilisearch-1 | 2026-11-01T03:32:54.871704925Z Commit SHA: "47567abc0e7e86b9f561ef2dbe9fd9764c6955d8"
meilisearch-1 | 2026-11-01T03:32:54.871707967Z Commit date: "unknown"
meilisearch-1 | 2026-11-01T03:32:54.871710633Z Package version: "1.56.0"
meilisearch-1 | 2026-11-01T03:32:54.871713633Z
meilisearch-1 | 2026-11-01T03:32:54.871716258Z Thank you for using Meilisearch!
meilisearch-1 | 2026-11-01T03:32:54.871718008Z
meilisearch-1 | 2026-11-01T03:32:54.871719925Z
meilisearch-1 | 2026-11-01T03:32:54.871722883Z We collect anonymized analytics to improve our product and your experience. To learn more, including how to turn off analytics, visit our dedicated documentation page: https://www.meilisearch.com/docs/learn/what_is_meilisearch/telemetry
meilisearch-1 | 2026-11-01T03:32:54.871728050Z
meilisearch-1 | 2026-11-01T03:32:54.871730592Z Anonymous telemetry: "Enabled"
meilisearch-1 | 2026-11-01T03:32:54.871733383Z Instance UID: "1554e7b8-8e55-4a7c-8cb4-079f9f5d32d4"
meilisearch-1 | 2026-11-01T03:32:54.871735383Z
meilisearch-1 | 2026-11-01T03:32:54.871737092Z A master key has been set. Requests to Meilisearch won't be authorized unless you provide an authentication key.
meilisearch-1 | 2026-11-01T03:32:54.871739133Z
meilisearch-1 | 2026-11-01T03:32:54.871740675Z Check out Meilisearch Cloud! https://www.meilisearch.com/cloud?utm_campaign=oss&utm_source=engine&utm_medium=cli
meilisearch-1 | 2026-11-01T03:32:54.871743050Z Documentation: https://www.meilisearch.com/docs
meilisearch-1 | 2026-11-01T03:32:54.871745050Z Source code: https://github.com/meilisearch/meilisearch
meilisearch-1 | 2026-11-01T03:32:54.871747008Z Discord: https://discord.meilisearch.com
meilisearch-1 | 2026-11-01T03:32:54.871748883Z
meilisearch-1 | 2026-11-01T03:32:54.871834758Z 2026-11-01T03:32:54.871739Z INFO actix_server::builder: starting 2 workers
meilisearch-1 | 2026-11-01T03:32:54.871840342Z 2026-11-01T03:32:54.871777Z INFO actix_server::server: Actix runtime found; starting in Actix runtime
meilisearch-1 | 2026-11-01T03:32:54.871843300Z 2026-11-01T03:32:54.871783Z INFO actix_server::server: starting service: "actix-web-service-0.0.0.0:7700", workers: 2, listening on: 0.0.0.0:7700
meilisearch-1 | 2026-11-01T03:32:57.297568968Z 2026-11-01T03:32:57.297317Z INFO HTTP request{method=GET host="127.0.0.1:7700" route=/health query_parameters= user_agent=Python-urllib/3.12 status_code=200}: meilisearch: close time.busy=315µs time.idle=17.0µs
meilisearch-1 | 2026-11-01T03:32:57.303353259Z 2026-11-01T03:32:57.303058Z INFO HTTP request{method=POST host="127.0.0.1:7700" route=/indexes query_parameters= user_agent=Python-urllib/3.12 status_code=202}: meilisearch: close time.busy=481µs time.idle=4.25ms
meilisearch-1 | 2026-11-01T03:32:57.311298176Z 2026-11-01T03:32:57.311197Z INFO HTTP request{method=POST host="127.0.0.1:7700" route=/indexes/movies/documents query_parameters= user_agent=Python-urllib/3.12 status_code=202}: meilisearch: close time.busy=1.71ms time.idle=4.98ms
meilisearch-1 | 2026-11-01T03:32:57.315233426Z 2026-11-01T03:32:57.315083Z INFO HTTP request{method=POST host="127.0.0.1:7700" route=/indexes/movies/search query_parameters= user_agent=Python-urllib/3.12 status_code=200}: meilisearch: close time.busy=442µs time.idle=2.54ms
meilisearch-1 | 2026-11-01T03:32:57.315673051Z 2026-11-01T03:32:57.315616Z INFO index_scheduler::scheduler: A batch of tasks was successfully completed with 1 successful tasks and 0 failed tasks.
meilisearch-1 | 2026-11-01T03:32:57.320020968Z 2026-11-01T03:32:57.319945Z INFO index_scheduler::scheduler::process_index_operation: document indexing done indexing_result=DocumentAdditionResult { indexed_documents: 2, number_of_documents: 2 } processed_in=2.782375ms
meilisearch-1 | 2026-11-01T03:32:57.321547676Z 2026-11-01T03:32:57.321489Z INFO index_scheduler::scheduler: A batch of tasks was successfully completed with 1 successful tasks and 0 failed tasks.
meilisearch-1 | 2026-11-01T03:33:02.323207262Z 2026-11-01T03:33:02.322960Z INFO HTTP request{method=POST host="127.0.0.1:7700" route=/indexes/movies/search query_parameters= user_agent=Python-urllib/3.12 status_code=200}: meilisearch: close time.busy=452µs time.idle=690µs
meilisearch-1 | 2026-11-01T03:33:02.476499679Z 2026-11-01T03:33:02.476443Z WARN HTTP request{method=GET host="127.0.0.1:7700" route=/indexes query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: tracing_actix_web::middleware: Error encountered while processing the incoming HTTP request: ResponseError { code: 401, message: "The Authorization header is missing. It must use the bearer authorization method.", error_code: "missing_authorization_header", error_type: "auth", error_link: "https://docs.meilisearch.com/errors#missing_authorization_header" }
meilisearch-1 | 2026-11-01T03:33:02.476514512Z 2026-11-01T03:33:02.476460Z INFO HTTP request{method=GET host="127.0.0.1:7700" route=/indexes query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: meilisearch: close time.busy=54.1µs time.idle=53.7µs
meilisearch-1 | 2026-11-01T03:33:02.476912429Z 2026-11-01T03:33:02.476879Z WARN HTTP request{method=POST host="127.0.0.1:7700" route=/indexes query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: tracing_actix_web::middleware: Error encountered while processing the incoming HTTP request: ResponseError { code: 401, message: "The Authorization header is missing. It must use the bearer authorization method.", error_code: "missing_authorization_header", error_type: "auth", error_link: "https://docs.meilisearch.com/errors#missing_authorization_header" }
meilisearch-1 | 2026-11-01T03:33:02.476921262Z 2026-11-01T03:33:02.476889Z INFO HTTP request{method=POST host="127.0.0.1:7700" route=/indexes query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: meilisearch: close time.busy=45.3µs time.idle=25.9µs
meilisearch-1 | 2026-11-01T03:33:02.477189512Z 2026-11-01T03:33:02.477161Z WARN HTTP request{method=GET host="127.0.0.1:7700" route=/keys query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: tracing_actix_web::middleware: Error encountered while processing the incoming HTTP request: ResponseError { code: 401, message: "The Authorization header is missing. It must use the bearer authorization method.", error_code: "missing_authorization_header", error_type: "auth", error_link: "https://docs.meilisearch.com/errors#missing_authorization_header" }
meilisearch-1 | 2026-11-01T03:33:02.477192679Z 2026-11-01T03:33:02.477168Z INFO HTTP request{method=GET host="127.0.0.1:7700" route=/keys query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: meilisearch: close time.busy=46.8µs time.idle=20.8µs
meilisearch-1 | 2026-11-01T03:33:02.477464012Z 2026-11-01T03:33:02.477416Z WARN HTTP request{method=POST host="127.0.0.1:7700" route=/indexes/movies/search query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: tracing_actix_web::middleware: Error encountered while processing the incoming HTTP request: ResponseError { code: 401, message: "The Authorization header is missing. It must use the bearer authorization method.", error_code: "missing_authorization_header", error_type: "auth", error_link: "https://docs.meilisearch.com/errors#missing_authorization_header" }
meilisearch-1 | 2026-11-01T03:33:02.477468470Z 2026-11-01T03:33:02.477424Z INFO HTTP request{method=POST host="127.0.0.1:7700" route=/indexes/movies/search query_parameters= user_agent=Python-urllib/3.12 status_code=401 error=The Authorization header is missing. It must use the bearer authorization method.}: meilisearch: close time.busy=43.9µs time.idle=27.8µs
meilisearch-1 | 2026-11-01T03:33:04.220940846Z 2026-11-01T03:33:04.220791Z INFO HTTP request{method=GET host="localhost:7700" route=/health query_parameters= user_agent=curl/8.14.1 status_code=200}: meilisearch: close time.busy=73.0µs time.idle=18.0µs
meilisearch-1 | 2026-11-01T03:33:14.449225920Z 2026-11-01T03:33:14.448949Z INFO HTTP request{method=GET host="localhost:7700" route=/health query_parameters= user_agent=curl/8.14.1 status_code=200}: meilisearch: close time.busy=39.0µs time.idle=26.2µs