# Tennis > Local hybrid search. Keyword and semantic in one ranking, one binary, one SQLite file, no server. ## Docs - [Tennis](https://tennis.jlachance1.workers.dev/docs/): Local hybrid search. Keyword and semantic in one ranking, one binary, one SQLite file, no server. - [Getting Started](https://tennis.jlachance1.workers.dev/docs/getting-started): Install Tennis, index a directory, and run the search that shows why hybrid ranking matters. - [CLI](https://tennis.jlachance1.workers.dev/docs/cli): add, search, ls, rm, ns, serve, and version — every flag, with real output. - [Importing sessions](https://tennis.jlachance1.workers.dev/docs/importing): Index ChatGPT and Claude exports, and Claude Code and Codex transcripts, then search them by attribute. - [Cards](https://tennis.jlachance1.workers.dev/docs/cards): Every conversation and every file add reads also lands as a markdown card in ~/tennis — a readable copy, summarized when you have an API key. - [Go SDK](https://tennis.jlachance1.workers.dev/docs/go-sdk): Open a database, create a namespace, write documents, and query with filters from Go. - [HTTP API](https://tennis.jlachance1.workers.dev/docs/http-api): tennis serve exposes write, query, delete, and list over loopback — for every language that isn't Go. - [Embedders](https://tennis.jlachance1.workers.dev/docs/embedders): The built-in static model, switching to OpenAI, and why a namespace is bound to one embedder for life. - [How it works](https://tennis.jlachance1.workers.dev/docs/how-it-works): Chunking, BM25, cosine, and reciprocal rank fusion — and the reasoning behind each choice. - [Troubleshooting](https://tennis.jlachance1.workers.dev/docs/troubleshooting): The errors Tennis raises, what each one is protecting you from, and how to clear it. ## Machine-readable - [llms-full.txt](https://tennis.jlachance1.workers.dev/docs/llms-full.txt): Full docs in one file - Append `.md` to any docs URL for Markdown (e.g. https://tennis.jlachance1.workers.dev/docs/cli.md)