The best Typesense hosting platforms in 2026
Most hosting comparisons start with a feature matrix. This one starts with a sentence, because with Typesense the sentence does almost all the work: the index lives in RAM. Not memory-mapped, not cached-if-there-is-room, not paged in lazily by an obliging kernel. Resident. If your index does not fit in the memory of the machine you rented, you do not have a slow deployment, you have a deployment that refuses writes and then stops.
That constraint is a design choice, not an oversight, and it is why Typesense query latency is boringly consistent in a way that disk-backed engines have to work for. It is also why every question further down this page — one node or three, which cloud, what the bill looks like in a year, whether to cluster at all — resolves to arithmetic you can do before signing up for anything. Almost nobody does the arithmetic first. It is the highest-leverage afternoon in this whole decision.
Disclosure up front, since I build PandaStack: we do not sell managed Typesense. We run managed PostgreSQL 16 and host applications and workers on Firecracker microVMs. There is a section below where our best-known feature — scale-to-zero — is actively the wrong tool for this job, and I say so rather than dressing it up. Pricing, tiers and availability features across every vendor here move fast; treat this as a map for reading their docs, not a replacement for it.
The one fact: your RAM must exceed your index
Typesense stores its searchable index in memory and keeps a durable copy on disk in its data directory. The disk copy survives a restart; the memory copy answers queries. On boot the server reads the on-disk store back into RAM, so startup time scales with data size — a detail that surprises people the first time a routine restart takes minutes instead of seconds.
The practical consequence is a hard floor rather than a soft gradient. A memory-mapped engine that runs short of RAM degrades: the page cache thrashes, p99 gets ugly, and you see it in a dashboard before you see it in an incident channel. Typesense has no such runway. It has a configurable memory-usage threshold above which the server rejects writes with an explicit error rather than getting itself OOM-killed — the correct engineering decision, and an unpleasant surprise if you have never read about it. Your bulk import fails at 4am with a 503 about running out of memory, and the fix is a bigger machine, not a retry.
I am deliberately not giving you a bytes-per-document multiplier. Every published one is wrong for somebody, because the figure depends on how many fields you index, facet on and sort by, and on your token distribution. The rule that holds instead: measure, then provision with headroom for indexing bursts and for growth you can see coming. Indexing is hungrier than serving, so a node sized exactly at steady state will fall over during the next full reimport.
Shrink the index before you buy memory
The reflex when the number comes back too big is to rent a bigger machine. Usually there are cheaper levers, and they are all in the schema.
- Mark fields you only display, never search or filter on, as not indexed. They stay retrievable and stop consuming RAM. This routinely removes the largest field in the collection — the long description body nobody actually queries.
- Faceting and sorting cost extra structures. Every facetable and sortable field is a decision to spend memory, so make it a decision rather than a default copied from an example schema.
- Do not put the whole source document in the index. It is a projection; your database holds the truth. Store the identifier plus the fields the results list renders, then hydrate from the primary store.
- If you are indexing embeddings, dimensionality is the dominant term, exactly as it is for a vector database. A smaller model that is nearly as good is often the largest cost decision available.
What Typesense is good at, and where it stops
Typesense is aimed at someone typing into a box and expecting results before they finish the word. Typo tolerance is on by default and scales with word length; prefix search is the default rather than an analyser you configure. Around that sit the parts that turn a search endpoint into a product: faceting with counts for the sidebar, filtering with a readable expression syntax, multi-field sorting, curation and pinning for when a merchandiser needs a specific result at the top, synonyms as configuration, and multi-search so one request populates a grouped dropdown across several collections.
Two things matter in 2026 that its closest sibling historically did not do as directly: multi-node high availability is a documented, first-class arrangement rather than an edge case, and vector plus hybrid search is built into the same engine and the same query, with optional server-side embedding generation. If you are building search for an AI product, that second point is why Typesense keeps appearing on shortlists.
Where it stops is where every dedicated search engine stops. No aggregation pipeline, no bucket maths feeding a dashboard, no log retention machinery. It is not a source of truth and not a database. It is a derived read model over data living somewhere else, and if you cannot say out loud how long a full rebuild from that somewhere else takes, you do not have a recovery plan. That framing is the one I applied to Meilisearch, and it survives contact with every engine in this category.
What running one node actually looks like
Worth showing in full, because the honest argument for self-hosting Typesense is that this is short and there is no runtime to tune underneath it. One static binary, one data directory, one key.
#!/usr/bin/env bash
set -euo pipefail
# 1. Dedicated user, and a data directory on the DURABLE volume. Typesense
# keeps the serving copy in RAM but the persistent store lives here -- put
# it on ephemeral instance storage and you have signed up for a full
# reindex every time the machine is replaced.
sudo useradd --system --no-create-home --shell /usr/sbin/nologin typesense || true
sudo mkdir -p /var/lib/typesense /var/log/typesense
sudo chown -R typesense:typesense /var/lib/typesense /var/log/typesense
# 2. Config file instead of flags, so the bootstrap key is not in ps output
# or your shell history. Mode 0600, owned by the service user.
sudo install -m 0600 -o typesense -g typesense /dev/null \
/etc/typesense/typesense-server.ini
BOOTSTRAP_KEY="$(openssl rand -hex 32)"
cat <<EOF | sudo tee /etc/typesense/typesense-server.ini >/dev/null
[server]
api-key = $BOOTSTRAP_KEY
data-dir = /var/lib/typesense
log-dir = /var/log/typesense
# Bind to a private interface and reach it over your own network or a proxy.
# A search engine on a public 0.0.0.0 is a public write endpoint waiting for
# somebody to guess one string.
api-address = 127.0.0.1
api-port = 8108
EOF
# 3. systemd. Restart=always matters more than usual: this process holds your
# whole index in memory, and an unnoticed crash costs a rebuild, not just a
# reconnect. Give it file descriptors and do NOT set a naive MemoryMax --
# the index is the resident set, so capping it is capping your corpus.
cat <<'EOF' | sudo tee /etc/systemd/system/typesense.service >/dev/null
[Unit]
Description=Typesense
After=network-online.target
[Service]
User=typesense
Group=typesense
ExecStart=/usr/local/bin/typesense-server --config=/etc/typesense/typesense-server.ini
Restart=always
RestartSec=2
LimitNOFILE=65535
# Startup reads the on-disk store back into memory, so a large corpus takes a
# while. Give it room before systemd decides the unit failed to start.
TimeoutStartSec=900
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now typesense
curl -s http://127.0.0.1:8108/health # -> {"ok":true}Then the schema, which is where your memory bill is actually decided. Note what is marked as not indexed, what is facetable, and what is not — each of those flags is a line item.
# Create a collection. Every "facet": true and every "sort": true costs
# memory; every "index": false gives it back while keeping the field
# retrievable in results.
curl -s -X POST 'http://127.0.0.1:8108/collections' \
-H "X-TYPESENSE-API-KEY: $BOOTSTRAP_KEY" \
-H 'Content-Type: application/json' \
-d '{
"name": "products",
"fields": [
{ "name": "name", "type": "string" },
{ "name": "brand", "type": "string", "facet": true },
{ "name": "categories", "type": "string[]","facet": true },
{ "name": "price", "type": "float", "facet": true, "sort": true },
{ "name": "popularity", "type": "int32", "sort": true },
{ "name": "in_stock", "type": "bool", "facet": true },
{ "name": "tenant_id", "type": "int32", "facet": true },
{ "name": "description", "type": "string", "index": false, "optional": true },
{ "name": "image_url", "type": "string", "index": false, "optional": true }
],
"default_sorting_field": "popularity"
}'
# Bulk import is JSONL, one document per line, and it is the memory-hungriest
# thing this node will ever do. Size the machine for the import, not the
# steady state.
curl -s -X POST \
'http://127.0.0.1:8108/collections/products/documents/import?action=upsert&batch_size=200' \
-H "X-TYPESENSE-API-KEY: $BOOTSTRAP_KEY" \
-H 'Content-Type: text/plain' \
--data-binary @products.jsonlThe key model, and the mistake that ships to production
The key you passed as api-key at boot is the bootstrap admin key. It can create collections, delete collections, and delete every document you have, and it should never leave your server environment. What goes in the browser is a search-only key, and for anything multi-tenant, a scoped key derived from it.
The scoped-key mechanism is the genuinely good part of Typesense's design and it is underused. You take a search-only key, embed a set of search parameters — a tenant filter, an expiry — and produce a signed token client-side with no round trip to the server. The embedded filter cannot be stripped or widened by the holder because it is part of what the signature covers. That gives you a per-user credential your backend mints on every session, which is exactly what tenanted browser search needs.
// 1. Server side, once: derive a search-only key from the bootstrap key.
// The full value is returned ONLY on creation -- store it then or lose it.
//
// curl -X POST 'http://127.0.0.1:8108/keys' \
// -H "X-TYPESENSE-API-KEY: $BOOTSTRAP_KEY" \
// -H 'Content-Type: application/json' \
// -d '{ "description": "search-only",
// "actions": ["documents:search"],
// "collections": ["products"] }'
import { Client } from "typesense";
const admin = new Client({
nodes: [{ host: "127.0.0.1", port: 8108, protocol: "http" }],
apiKey: process.env.TYPESENSE_ADMIN_KEY, // never sent to a browser
});
// 2. Per session, in your backend: sign a token that pins the tenant filter
// and expires. No network call -- this is an HMAC over the parameters.
// The user cannot widen the filter, because the signature covers it.
export function tokenFor(tenantId) {
return admin.keys().generateScopedSearchKey(
process.env.TYPESENSE_SEARCH_ONLY_KEY,
{
filter_by: `tenant_id:=${tenantId}`,
expires_at: Math.floor(Date.now() / 1000) + 60 * 60,
},
);
}
// 3. The browser gets that token and nothing else.
const search = new Client({
nodes: [{ host: "search.example.com", port: 443, protocol: "https" }],
apiKey: scopedTokenFromServer,
});
await search.collections("products").documents().search({
q: "runing shoe", // typo tolerance is on by default
query_by: "name,brand,categories",
filter_by: "in_stock:=true && price:<120",
facet_by: "brand,categories",
sort_by: "_text_match:desc,popularity:desc",
per_page: 20,
});Clustering: raft, quorum, and why two nodes is worse than one
Typesense clusters with raft. Each node gets a peers file listing every member as an address plus a peering port plus an API port; they elect a leader, writes go through the leader and replicate to followers, and any node can serve reads. It is a genuine documented HA arrangement, and one of the real differences between Typesense and its closest sibling.
Raft needs a majority to commit a write. That single rule generates the whole topology answer, including one result counter-intuitive enough that people get it wrong on purpose.
- One node. Quorum is one, so the node always has quorum and writes succeed whenever the process is up. No fault tolerance: the box dies, search is down until you restore. Honest, cheap, and the right answer more often than the HA marketing suggests.
- Two nodes. Quorum is two, so BOTH must be alive to accept writes. Either machine failing takes writes down. You have doubled your hardware, doubled the things that can fail, doubled your ways to lose write availability, and bought zero fault tolerance. A two-node cluster is strictly worse than a single node — and the mistake is usually made by someone reasoning that two of a thing is more available than one.
- Three nodes. Quorum is two, so the cluster survives losing one member. The smallest configuration that buys you anything, and the reason every raft HA guide starts here.
- Four nodes. Quorum is three, so it still survives only one failure — same tolerance as three, more cost, more replication traffic. Go to five if you must survive two simultaneous failures, and be honest about whether you do.
Where the three nodes sit matters too. Raft replication is chatty and sits on the write path, so spreading a cluster across regions to feel resilient shows up as write latency and as elections triggered by ordinary internet weather. Separate failure domains inside one low-latency region is the arrangement that works; geographic distribution of reads is a different problem with a different solution. One more note that will save you an afternoon: a node that has fallen too far behind, or a cluster that lost quorum because someone edited the peers list carelessly, does not always heal by itself. Read the recovery procedure before the day you need it.
Backups, snapshots and upgrades
Typesense exposes a snapshot operation: ask a node to write a consistent copy of its state to a path on its own filesystem, then get that directory somewhere durable. Restoring is the mirror image — stop the server, point the data directory at the restored contents, start it, wait while it reads everything back into memory.
# Ask the node to write a consistent snapshot to local disk...
curl -s -X POST \
"http://127.0.0.1:8108/operations/snapshot?snapshot_path=/var/backups/typesense/$(date +%F)" \
-H "X-TYPESENSE-API-KEY: $BOOTSTRAP_KEY"
# ...then get it OFF the box. A snapshot sitting on the same disk as the data
# it protects is not a backup, it is a copy.
tar -C /var/backups/typesense -czf - "$(date +%F)" \
| aws s3 cp - "s3://example-backups/typesense/$(date +%F).tar.gz"
# In a cluster this is per-node. Snapshot the leader, or accept that a
# follower may be marginally behind at the instant you asked.Useful — and still not your primary recovery path. A search index is a projection, the authoritative copy lives in your database, and the procedure that is always correct is running the indexer again. Leaning into that means your backup is a script you already maintain and can test weekly against a scratch collection, and you never have to reason about whether a three-week-old snapshot agrees with your current catalogue. The condition is a rebuild fast enough that you would run it under pressure. If a full reindex takes six hours, your search recovery objective is six hours, and that is a thing to fix now rather than at 3am.
Upgrades are less dramatic than the equivalent in some other engines — stop, replace the binary, start against the same data directory — but two cautions apply. Snapshot first, because downgrading after a storage-format change is not something to assume works. And in a cluster, upgrade followers before the leader. Read the release notes for the specific jump; that is the difference between a maintenance window and an incident.
Vector and hybrid search, which is why AI teams are here
A vector field is just another field type, so semantic search lives in the same collection, schema and query as your keyword search and your ordinary filters. Ask for both in one request and Typesense fuses the rankings; there is no second system, no separate index to keep in sync, and no application-level merge of two result lists that you will get subtly wrong.
# A. Bring your own embeddings: declare the dimensionality, write the floats
# with the document like any other field.
# { "name": "embedding", "type": "float[]", "num_dim": 1536 }
#
# B. Or let the node generate them, from the fields you name:
# { "name": "embedding", "type": "float[]",
# "embed": { "from": ["name", "description"],
# "model_config": { "model_name": "ts/all-MiniLM-L12-v2" } } }
# Convenient, and not free: the model runs on this node, using its CPU and
# its RAM -- the same RAM your index needs. Budget for it explicitly.
# Hybrid search: name the embedding field alongside the text fields in
# query_by and Typesense runs both and fuses the ranks. Filters and facets
# still apply, which is the part a bolted-on vector store makes awkward.
curl -s -G 'http://127.0.0.1:8108/collections/products/documents/search' \
-H "X-TYPESENSE-API-KEY: $SEARCH_ONLY_KEY" \
--data-urlencode 'q=something warm for hiking' \
--data-urlencode 'query_by=name,description,embedding' \
--data-urlencode 'filter_by=in_stock:=true && tenant_id:=42' \
--data-urlencode 'facet_by=brand' \
--data-urlencode 'per_page=20'
# Pure nearest-neighbour, when you already have the query vector:
# vector_query=embedding:([0.021, -0.114, ...], k:20)Two honest caveats. The memory rule does not soften for vectors, it hardens: embeddings are large and the graph index over them is larger, so a collection that was comfortable as pure keyword search can become a different size class entirely once you add a vector field. Redo the sizing rather than assume headroom. And if vectors are the whole workload with text search incidental, you are shopping in the wrong category — read the vector database comparison instead. Typesense is excellent when you want keyword and semantic retrieval to be one thing. It is not trying to be a billion-vector store.
The options
1. Typesense Cloud
The first-party managed offering, run by the people who write the engine. You pick a configuration — RAM and CPU — and optionally turn on a high-availability cluster instead of assembling raft yourself; they handle provisioning, upgrades, monitoring and support. There is also a separate mechanism for serving reads from multiple geographies, which as noted above is the right way to solve that rather than stretching a raft cluster across continents.
The structurally interesting part is the billing shape: Typesense Cloud charges for the configuration you provision, by the hour, rather than per search operation and per record. That is a meaningfully different relationship from the usage-priced end of this market. Your bill is a function of the machine you chose, so it is predictable and a traffic spike does not become an invoice — but an oversized cluster costs you every hour it is oversized, which is another argument for sizing first. Check current configurations and prices on their pricing page rather than anywhere else, this page included: I am describing the model, not quoting numbers. If you have chosen Typesense and do not want to own a stateful in-memory service, this is the default, and avoiding it is not clever.
2. A single self-hosted node on a VM with a data volume
Everything in the bring-up script above, on a machine rented from anybody. This is reasonable because Typesense is one static binary with one data directory and no runtime underneath — self-hosting it is closer to running a Redis than an Elasticsearch cluster. What you take on is a service that must stay up, a durable volume that must stay attached, RAM sized honestly with growth headroom, the key hygiene above, and a tested rebuild script.
The specific thing to get right is the volume. Because the serving copy is in RAM it is tempting to treat the disk as incidental. It is not: it is what makes a restart a restart instead of a reindex. Put the data directory on a durable volume that survives instance replacement, and check that your provider's definition of durable matches yours.
3. A self-managed three-node HA cluster
The raft arrangement above, run by you: three machines in three availability zones in one region, a peers file, a load balancer in front of the API ports, and monitoring that can tell you which node is leader and whether the cluster has quorum. Doable and well documented, and considerably more work than one node — not because any step is hard, but because you have signed up to understand raft well enough to debug it at an inconvenient hour.
My opinion, flagged as opinion: most teams reaching for this should either buy the managed HA option or accept a single node with a fast tested rebuild. Self-managed raft earns its place when residency or cost structure rules out the managed cluster and search being down is genuinely a page. That is a real situation. It is not the common one.
4. Docker and Kubernetes
Docker is the right answer for local development and CI, and it is one command: mount a volume at the data directory, pass a key, expose the port. Nobody should be installing a search engine on a laptop in 2026.
Kubernetes is fine if you already run Kubernetes and a strange amount of new machinery if you do not. Typesense there is a StatefulSet with a PersistentVolumeClaim per replica, a headless service for peering, and something that keeps the peers file current as pod addresses change. That last part is where the effort concentrates: raft wants stable identity, pods are designed to be disposable, and you are reconciling two philosophies. Get the readiness probe right — a node should not report ready until the in-memory index has finished loading — and set memory requests equal to limits, because an index the kubelet OOM-kills does not degrade, it dies and then spends your recovery window reading itself back off disk.
5. The search-for-one-app path, where one node is genuinely enough
This gets its own heading rather than a footnote, because it is the most common real requirement and the one most likely to be over-engineered. A documentation site. A catalogue with a few hundred thousand items. An in-app search box over the customer's own records. One node, a durable volume, a scoped search-only key in the frontend, and an application that falls back to a plain database query when the index is unavailable — worse results, still results, degradation rather than outage.
That is defensible, cheap, and quietly what a lot of production search actually is. What makes it defensible is not the topology but the rebuild: somebody has run the full reindex end to end, timed it, and knows the number. A single node with a tested twelve-minute rebuild is a better operational position than a three-node cluster nobody has failed over on purpose. The dishonest version is one node, called production, never restore-tested, described as highly available because it sits behind a load balancer.
6. The options where you do not run Typesense at all
Three of them, briefly, because a fair comparison has to include not buying. Each has its own full write-up linked at the end of this post rather than a rerun here.
- Meilisearch. The nearest sibling, and the comparison worth making. Its index is memory-mapped rather than resident, so it tolerates an index larger than RAM at the cost of latency that depends on the page cache — more forgiving to size, less predictable under pressure. Typesense trades that forgiveness for consistency and a clearer multi-node story. Load your corpus into both for an afternoon.
- Algolia. The hosted end: no operations, excellent relevance tooling, the best front-end libraries in the category. The trades are usage-shaped pricing, so the bill scales with success, and your data leaving your infrastructure.
- Postgres full-text search. A weighted tsvector column plus pg_trgm covers a surprising amount of ground, in the same query, transaction and backup as your filters and joins. If the search box is a filter above an admin table, you were about to add a stateful in-memory service to avoid forty lines of SQL.
7. PandaStack
Direct, because it is my company: we do not offer managed Typesense, and nothing here competes with Typesense Cloud on running the engine for you. If that is what you came for, option one is your answer.
What we are is a place to run the pieces around a search index — the application querying it, and the indexer keeping it current — on Firecracker microVMs, plus managed PostgreSQL 16 if the baseline above turns out to be enough. Sandboxes restore from a snapshot in about 179ms at p50, which suits the reindex worker: a job that boots, runs the sync and disappears, rather than an idle machine whose purpose is to run a script every fifteen minutes. You can also run Typesense itself on a microVM — root, a durable volume, a private network, one binary — and our billing shape happens to suit it: memory bills as committed GiB-hours at $0.0162 per GiB-hour while compute bills the CPU-seconds actually burned at $0.054 per vCPU-hour, so a node that is mostly RAM sitting still is dominated by the memory line rather than cores it is not using.
Side by side
- Typesense Cloud — first-party managed, configuration priced by the hour rather than per search, optional managed HA cluster. Ops: none. Best for teams who have chosen Typesense and want predictable billing without owning a stateful in-memory service.
- Single self-hosted node on a VM — one binary, one data directory, one durable volume, one systemd unit. Ops: RAM sizing, upgrades, key hygiene, a tested rebuild. Best for residency, flat cost, and the very common case where degraded search is acceptable.
- Self-managed three-node cluster — raft across three availability zones in one region, load balancer in front. Ops: everything above plus understanding raft well enough to debug quorum. Best for when search is a page, not a degradation. Never run two nodes.
- Docker and Kubernetes — a container per node; on Kubernetes a StatefulSet with a PVC per replica and stable peering identity. Ops: a readiness probe that waits for the index to load, and memory requests equal to limits. Best for teams already running Kubernetes for everything else.
- Meilisearch or Algolia instead — the nearest open-source sibling with a page-cache index, or full SaaS with no operations and usage-shaped pricing. Meilisearch if you want forgiveness on RAM sizing, Algolia if search drives revenue and your data may leave your infrastructure.
- Postgres full-text search instead — no new system; tsvector plus pg_trgm in the database you already run. Best for search as a feature rather than the product. Stops short of instant search and faceted counts.
- PandaStack — not a managed search engine. Firecracker microVMs for the app and the reindex worker, managed Postgres 16 for the baseline, an always-on VM if you self-host the node. Best for the surrounding pieces — our scale-to-zero is the wrong shape for a resident index and I will not pretend otherwise.
How to choose in ten minutes
- Index your real corpus on a scratch node and read the resident memory. Not a sample, not an estimate from a blog post — yours. Add twelve months of growth and headroom for a full reimport. That number selects your node size and your cloud tier.
- Trim the schema and measure again. Display-only fields should not be indexed; facetable and sortable should be decisions rather than defaults. This pass often moves the number enough to change which tier you buy.
- Time a full reindex from your primary database. That is your search recovery objective under every option here, managed or not. If it is unacceptable, fixing the indexer comes before choosing a host.
- Decide whether search being down is a page or a degradation. If the application can fall back to a database query, one node is defensible and you have saved yourself a cluster. If it genuinely cannot, you need three — and if you cannot afford three, you need one, never two.
- Decide whether your data may leave your infrastructure. That single question eliminates either the SaaS end of the market or half the operational burden here, and it is faster to answer than any benchmark.
- Only then pick: Typesense Cloud if you want it managed, a VM if residency or flat cost dominates, self-managed raft if HA matters and the managed cluster is ruled out, and the Postgres baseline if this page turned out to be about a filter box.
The short version
Typesense is one of the more pleasant stateful services to operate, for the same reason it constrains you: the index is in memory, so the engine is simple, latency is consistent, and sizing is a hard requirement rather than a tuning exercise. Do the memory arithmetic first and the rest of this decision mostly answers itself. Their cloud is the low-friction option and prices the machine rather than your traffic. A single VM with a durable volume is the low-cost full-control option and is genuinely sufficient for most single-application search. Three nodes buy real fault tolerance; two nodes buy the opposite of it.
And check the baseline before you commit. A meaningful share of teams shopping in this category would be well served by two indexes in the Postgres they already run, spared a second system, a sync worker, and an index nobody has ever restored. The measure of a good search decision is not the sophistication of the engine. It is whether anyone ever types a word with a letter wrong and gets nothing back — and, on the day the box dies, whether somebody already knows how long the rebuild takes.
Frequently asked questions
How much RAM does Typesense need?
Enough to hold the entire index, because Typesense keeps its searchable index resident in memory rather than paging it from disk. That makes RAM a hard floor rather than a performance dial: there is a configurable memory-usage threshold above which the server starts rejecting writes with an explicit error instead of being killed by the kernel, so running short shows up as failed imports rather than gradual slowness. Do not trust a bytes-per-document rule of thumb, because the real figure depends on how many fields you index, facet on and sort by, and on your data's token distribution. Index your actual corpus on a scratch node, read the resident memory, then provision with headroom for indexing bursts, which are hungrier than serving, and for twelve months of growth. If the number is uncomfortable, marking display-only fields as not indexed is usually cheaper than a bigger machine.
Do I need a Typesense cluster, and why is two nodes worse than one?
One node is enough far more often than the high-availability marketing suggests, and the deciding question is consequence rather than document count: if search going down means degraded results rather than a broken application, a single node with a fast, tested rebuild is a defensible production choice. Make the application fall back to a plain database query when the index is unavailable and you have converted an outage into a worse-results day. When search genuinely is a page, go to three nodes — never two. Typesense replicates with raft, and raft commits a write only when a majority of members agree: with two nodes the majority is two, so both must be alive for writes to succeed and either machine failing takes the cluster down. With one node the majority is one, so it always has quorum. A two-node cluster therefore doubles your hardware and your failure modes while buying exactly zero fault tolerance. Three is the smallest configuration that survives losing a member, and four tolerates the same single failure at higher cost, so odd numbers are the sensible sizes.
How do I back up and restore Typesense?
Typesense provides a snapshot operation that asks a node to write a consistent copy of its state to a path on its own filesystem; you then archive that directory to object storage, because a snapshot sitting on the same disk as the data it protects is a copy rather than a backup. Restoring means stopping the server, pointing the data directory at the restored contents, and starting it, which takes time because the in-memory index is rebuilt from disk on boot. Snapshots are worth taking, especially before an upgrade. They are still not your primary recovery plan: a search index is a projection of data that lives in your database, so the procedure that is always correct is running the indexer again. Time that full rebuild, treat the result as your recovery objective, and test it against a scratch collection on a schedule rather than during an incident.
Is Typesense a good vector database for AI applications?
It is a good choice when you want keyword and semantic retrieval to be one system rather than two. Vector fields are ordinary fields in the same collection, so a hybrid query runs keyword and nearest-neighbour search together, fuses the rankings, and still applies your filters and facets — which removes the synchronisation problem and the application-level result merging that come with bolting a separate vector store onto a search engine. Typesense can also generate embeddings on the node from fields you nominate, which is convenient but consumes the same CPU and RAM your index needs, so budget for it explicitly. Where it is the wrong tool is when vectors are the entire workload at very large scale and text search is incidental; a dedicated vector store or Postgres with pgvector is the better fit there. Note also that adding embeddings can move a collection into a different memory size class entirely, so redo the RAM arithmetic rather than assuming headroom.
Typesense vs Meilisearch — which should I choose?
They overlap heavily: both are open-source, single-purpose, typo-tolerant engines aimed at instant search, both have a first-party cloud, and both handle faceting, filtering and multi-collection search. The two differences that actually change decisions are memory and topology. Typesense keeps its index resident in RAM, which makes latency consistent and sizing a hard requirement; Meilisearch memory-maps its index, which tolerates an index larger than memory at the cost of latency that depends on the page cache. And Typesense treats multi-node high availability as a documented, first-class raft arrangement, which matters if you need a cluster you can reason about. Given how close they are on everything else, load your own corpus into both for an afternoon and judge the relevance you get on your data. That comparison is worth more than any feature table.
Keep reading
- The best Meilisearch hosting platforms in 2026 — The nearest sibling — memory-mapped instead of resident, and the trade that follows.
- The best Elasticsearch hosting platforms in 2026 — If you need aggregations and log retention rather than instant search.
- The best vector database hosting platforms in 2026 — When embeddings are the workload and text search is incidental.
- Per-tenant search indexing isolation on microVMs — Where the reindex worker should actually run.
- Right-sizing Postgres memory tiers — The same memory arithmetic, applied to a database.
- Managed Postgres on PandaStack — Postgres 16 in its own microVM, if the full-text baseline is enough.
49ms p50 cold start. Fork, snapshot, and scale to zero.