Launch a niche search engine in a weekend.
searchengine.life is the search platform for independent builders. Declare your sources in TypeScript, commit to git, and ship a hosted hybrid index — BM25 plus embeddings — with a search UI at <slug>.searchengine.life.
Reference engine: indie-saas.searchengine.life — 83 hand-curated indie SaaS tools, fully open-source.
- Source adapters
- 8
- Ranking signals
- 12
- Sitemap → index
- < 60s
- Price per public engine
- $0
Six adapters. Crawl anything that holds still for a second.
Every adapter is a typed TypeScript module you import from @se/sources. Compose them into a search engine with a single defineEngine() call.
Sitemap· Web
@se/sourcesCrawl any sitemap.xml. Follow pagination, respect robots.txt, dedupe via canonical.
<!-- sitemap.xml --> <url> <loc>https://blog.example/ai-eval-101</loc> <lastmod>2026-04-21</lastmod> </url> ⤷ 412 urls discovered · 12 queued
RSS · Atom · JSON feed· Feeds
@se/sourcesFollow a feed. Pull full-text, author, tags. Fires on new items with a webhook.
- 12:04New item · Agentic retrieval, a primer
- 08:22New item · Vector DB benchmark v4
- 07:10Reindexed · 14 docs re-embedded
GitHub repos· Code
@se/sourcesIndex READMEs, releases and issues across an org or topic. Token-scoped, rate-aware.
OpenAPI· APIs
@se/sourcesPoint at a spec — every operation becomes a searchable document with typed facets.
# openapi.yaml paths: /v1/search: get: summary: Hybrid search tags: [search, public] ⤷ 38 operations indexed
Markdown · MDX · Notion· Docs
@se/sourcesA directory of .md(x) or a Notion workspace. Headings, code blocks, frontmatter facets.
Generic HTTP· Any API
@se/sourcesWrite a 10-line fetcher. Paginator, header signer and schema mapper built in.
httpSource({ url: "https://api.example/items", paginate: "?page={{n}}", map: (r) => ({ id: r.id, title: r.name }) })
An engine is a file. A reindex is a commit.
Drop a TypeScript file in engines/, export a defineEngine() result, and searchengine.life crawls, embeds and hosts it — with typed sources, hybrid ranking and a search UI you can theme or replace.
- Preview URL per PR — review a changed ranker the same way you review code.
- Ranking is data — rank.hybrid(), rank.bm25() or a callable.
- Sources are typed adapters — sitemap, RSS, GitHub, OpenAPI, Notion, your own.
// engines/ai-papers.ts
import { defineEngine, rank } from "@se/runtime";
import { sitemap, rss, github } from "@se/sources";
export default defineEngine({
slug: "ai-papers",
title: "AI papers — independent index",
audience: "public",
sources: [
sitemap("https://arxiv.org/sitemap.xml", { filter: (u) => u.includes("/abs/2026") }),
rss("https://papers.cool/feed.xml"),
github.repos({ topic: "ai-papers", stars: ">=25" }),
],
ranking: rank.hybrid({
bm25: 0.4,
vectors: 0.5,
recency: 0.1,
}),
facets: ["year", "author", "topic"],
});Three steps. One git workflow. Zero infra to run.
- 01Install the CLI
pnpm add -D @se/cli and run searchengine init. Your repo gets an engines/ folder and a GitHub App hook.
- 02Declare an engine
An engine is one TypeScript file. Wire sources, pick a ranker, set access — commit the file.
- 03Merge the PR
The platform crawls, embeds and hosts your engine at <slug>.searchengine.life or a custom domain.
# bootstrap searchengine in any Next.js repo
pnpm add -D @se/cli
pnpm searchengine init
# add your first engine
pnpm searchengine new ai-papers
# ship it
git checkout -b feat/ai-papers && git commit -am "feat: ai-papers engine" && gh pr createFour search engines most of us have almost built.
API docs search
Index every OpenAPI spec + SDK README your team ships. One /search endpoint that replaces four half-broken docs searches.
Indie SaaS directory
83 hand-seeded indie SaaS tools, live at indie-saas.searchengine.life. This is the reference engine — ships with the same defineEngine() contract you get.
AI paper finder
ArXiv + papers.cool + GitHub repos, hybrid ranked with a recency boost. Subscribers get a daily digest via webhook.
Forum + wiki search
Crawl a Discourse instance and a /docs Notion. One unified search UI, SSO-scoped for members.
Opinionated where it matters. Boring where it should be.
Engines are typed. Sources are typed. Facets and ranking signals are typed. Autocomplete every field, catch regressions at build time.
Version, review, revert. Every PR spins up a preview index. Rollbacks are `git revert`, not a form in a SaaS UI.
BM25 for keyword precision, embeddings for meaning, recency and authority signals you can weight — blended per engine.
Server Components by default, Cache Components per engine, streamed results. Installs into any Next.js repo.
Crawlers reuse instances with graceful shutdown. 300s default timeouts for the deepest sitemap.
Ship to your own Next.js app with @se/runtime, or point the CLI at searchengine.life Cloud. Same code either way.
Free to self-host. Paid when you want crawl + index off your plate.
Open core
The searchengine runtime, sources and ranker — MIT-licensed. Drop into any Next.js repo.
- @se/runtime · @se/sources · @se/rank
- MIT licence, MIT-forever
- Public engines on your own domain
- GitHub App for PR previews
Cloud
Most popularHosted crawl, embeddings, hybrid index and a tunable /search UI at <slug>.searchengine.life.
- Everything in Open core
- Managed crawl on a schedule
- Hosted embeddings (OpenAI · Voyage · Cohere)
- Search analytics + zero-result reports
- Custom domain per engine
Business
SSO, private engines, private source adapters and an SLA — for teams running search as infra.
- Everything in Cloud
- Unlimited private engines
- SSO (SAML · OIDC) + SCIM
- Private source adapters
- 99.95% uptime SLA