Metadata-Version: 2.4
Name: claude-session-search
Version: 0.1.0
Summary: Blazing-fast local full-text search (SQLite FTS5) for your Claude Code sessions
Author: ducode
License: MIT
Project-URL: Homepage, https://github.com/aleducode/cc-search
Keywords: claude-code,search,fts5,sqlite
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# cc·search

**Blazing-fast local full-text search for your [Claude Code](https://claude.com/claude-code) sessions.**

Every conversation you've ever had with Claude Code — your prompts, Claude's answers, its internal thinking, every tool call and its output, even subagent transcripts — indexed and searchable in milliseconds.

![Python](https://img.shields.io/badge/python-3.9%2B-blue) ![Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen) ![License](https://img.shields.io/badge/license-MIT-black)

- **Zero dependencies** — pure Python standard library (SQLite FTS5 is built in)
- **100% local & private** — binds to `127.0.0.1` only, makes zero network requests, nothing ever leaves your machine
- **Fast** — indexes ~200k messages (1.8 GB of transcripts) in under 10 seconds; incremental after that

## Installation

Run it instantly with [uv](https://docs.astral.sh/uv/) (nothing installed permanently):

```bash
uvx claude-session-search
```

Install it with [pipx](https://pipx.pypa.io/) or pip:

```bash
pipx install claude-session-search    # or: pip install claude-session-search
cc-search
```

Or straight from GitHub:

```bash
uvx --from git+https://github.com/aleducode/cc-search cc-search
```

Or clone and run:

```bash
git clone https://github.com/aleducode/cc-search && cd cc-search
./run.sh
```

Any of the above indexes your sessions and opens http://localhost:7777 in your browser. The first run takes a few seconds; subsequent runs only process files that changed.

```
cc-search --port 8080     # use a different port
cc-search --no-open       # don't open the browser
cc-search --reindex       # rebuild the index and exit
```

The index lives at `~/.cc-search/index.db`.

## What gets indexed

Everything inside every session under `~/.claude/projects/`:

| Role | Content |
|---|---|
| `user` | Your prompts |
| `assistant` | Claude's responses |
| `thinking` | The model's internal reasoning |
| `tool_use` | Every tool invocation and its arguments |
| `tool_result` | Tool output (truncated to 4 KB per message) |

Subagent transcripts (`<session>/subagents/*.jsonl`) are included too — tagged with `⑂` and attributed to their parent session.

## Search features

- **SQLite FTS5** full-text engine with **BM25** relevance ranking
- **Diacritic-insensitive**: `migracion` matches `migración`
- **Automatic prefix matching**: `index` matches `indexer`, `indexing`, …
- **Exact phrases** with quotes: `"connection refused"`
- **Filters**: project (sidebar), message role (chips), date range, sort by relevance or recency
- **Full-context view**: click any result to open the entire conversation with the matching message centered and highlighted
- **Keyboard-first**: `/` focuses the search box, `Esc` closes panels

## How it works

```
cc_search/indexer.py     JSONL parser → SQLite (~/.cc-search/index.db) with an FTS5 virtual table
cc_search/server.py      stdlib HTTP server + JSON API: /api/search, /api/sessions,
                         /api/session/<id>, /api/projects, /api/stats, /api/reindex
cc_search/static/        single-page UI, no build step
```

The indexer tracks each file's mtime and size, so reindexing (on startup or via the **⟳ Reindex** button) only reprocesses sessions that changed.

## Privacy

Everything is strictly local. The server listens on `127.0.0.1` only and performs no outbound requests of any kind. Your transcripts never leave your machine.

## License

MIT
