session-sidekick 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. session_sidekick-0.1.0/.gitignore +8 -0
  2. session_sidekick-0.1.0/CLAUDE.md +27 -0
  3. session_sidekick-0.1.0/FEATURE_session_sidekick.md +163 -0
  4. session_sidekick-0.1.0/LICENSE +21 -0
  5. session_sidekick-0.1.0/PKG-INFO +192 -0
  6. session_sidekick-0.1.0/PLAN_session_sidekick.md +2151 -0
  7. session_sidekick-0.1.0/README.md +164 -0
  8. session_sidekick-0.1.0/pyproject.toml +48 -0
  9. session_sidekick-0.1.0/src/sidekick/__init__.py +1 -0
  10. session_sidekick-0.1.0/src/sidekick/__main__.py +4 -0
  11. session_sidekick-0.1.0/src/sidekick/cli.py +119 -0
  12. session_sidekick-0.1.0/src/sidekick/daemon.py +128 -0
  13. session_sidekick-0.1.0/src/sidekick/db.py +66 -0
  14. session_sidekick-0.1.0/src/sidekick/embeddings.py +30 -0
  15. session_sidekick-0.1.0/src/sidekick/hooks.py +60 -0
  16. session_sidekick-0.1.0/src/sidekick/indexer.py +119 -0
  17. session_sidekick-0.1.0/src/sidekick/parser.py +78 -0
  18. session_sidekick-0.1.0/src/sidekick/paths.py +26 -0
  19. session_sidekick-0.1.0/src/sidekick/recall.py +69 -0
  20. session_sidekick-0.1.0/src/sidekick/search.py +85 -0
  21. session_sidekick-0.1.0/src/sidekick/titler.py +121 -0
  22. session_sidekick-0.1.0/state.md +56 -0
  23. session_sidekick-0.1.0/tests/conftest.py +12 -0
  24. session_sidekick-0.1.0/tests/fixtures/abandoned.jsonl +5 -0
  25. session_sidekick-0.1.0/tests/fixtures/completed.jsonl +3 -0
  26. session_sidekick-0.1.0/tests/fixtures/context_limit.jsonl +3 -0
  27. session_sidekick-0.1.0/tests/test_cli.py +42 -0
  28. session_sidekick-0.1.0/tests/test_daemon.py +54 -0
  29. session_sidekick-0.1.0/tests/test_db.py +28 -0
  30. session_sidekick-0.1.0/tests/test_e2e.py +41 -0
  31. session_sidekick-0.1.0/tests/test_embeddings.py +26 -0
  32. session_sidekick-0.1.0/tests/test_hooks.py +41 -0
  33. session_sidekick-0.1.0/tests/test_indexer.py +52 -0
  34. session_sidekick-0.1.0/tests/test_parser.py +36 -0
  35. session_sidekick-0.1.0/tests/test_recall.py +38 -0
  36. session_sidekick-0.1.0/tests/test_search.py +50 -0
  37. session_sidekick-0.1.0/tests/test_smoke.py +4 -0
  38. session_sidekick-0.1.0/tests/test_titler.py +46 -0
@@ -0,0 +1,8 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .pytest_cache/
4
+ .ruff_cache/
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ .venv/
@@ -0,0 +1,27 @@
1
+ # CLAUDE.md — session-sidekick
2
+
3
+ Project-local instructions. Inherits from `D:\Aru\NYU\CLAUDE.md` and `~/.claude/CLAUDE.md`.
4
+
5
+ ## What this project is
6
+
7
+ A local CLI + hook bundle for Claude Code that auto-titles sessions on close and surfaces per-prompt semantic matches against past sessions via a `UserPromptSubmit` hook. See `FEATURE_session_sidekick.md` for the full spec, `state.md` for current phase.
8
+
9
+ ## Project conventions
10
+
11
+ - **Source of truth:** `FEATURE_session_sidekick.md`. Update it before changing behavior.
12
+ - **State tracking:** Update `state.md` whenever phase changes (design → planning → implementing → shipped).
13
+ - **Language:** Python is the V1 default (per spec § Open questions). Revisit if 300ms recall budget is missed.
14
+ - **Data location:** `~/.session-sidekick/index.db` (SQLite, WAL mode). Never write inside `~/.claude/projects/` — that's Claude Code's data, read-only to us.
15
+ - **Hooks:** Stop hook (titler + indexer) and UserPromptSubmit hook (recall). Both must fail silent — never block Claude Code.
16
+
17
+ ## Don't
18
+
19
+ - Don't duplicate ccusage's job — no cost dashboards.
20
+ - Don't add a TUI / web UI in V1.
21
+ - Don't auto-patch `~/.claude/settings.json` without explicit `--apply` flag from the user.
22
+ - Don't make the recall hook chatty — silent on miss is the default.
23
+
24
+ ## Testing notes
25
+
26
+ - Real corpus for testing: Aru's `~/.claude/projects/` (~15 project dirs as of 2026-05-05).
27
+ - Use a tmp copy for destructive tests: `cp -r ~/.claude/projects /tmp/sidekick-fixture`.
@@ -0,0 +1,163 @@
1
+ # FEATURE: session-sidekick
2
+
3
+ **Date:** 2026-05-05
4
+ **Status:** Design — not yet approved for implementation
5
+ **Author:** Aru
6
+
7
+ ## One-line goal
8
+
9
+ A local Claude Code companion that (1) auto-titles every session on close so they're findable later, and (2) when you start typing a new prompt, semantically searches your past sessions and surfaces a tight pointer if you've already solved this exact thing.
10
+
11
+ ## Problem
12
+
13
+ Aru runs Claude Code across 15+ project directories under `~/.claude/projects/`. Sessions get closed without renaming (sleepy-close problem) — so even existing search tools (ccrider, ClaudeHistoryMCP, cc-sessions) struggle to surface them, because the only metadata is "first user message" which is rarely the gist of the session. Result: same problems get re-derived from scratch in new sessions, burning tokens and time.
14
+
15
+ Two underlying causes:
16
+
17
+ 1. **Sessions aren't titled meaningfully** — search tools index content, but recall is poor when you can't remember a keyword from a 4-week-old conversation.
18
+ 2. **Existing recall tools are either broad-and-eager (ClaudeHistoryMCP injects project-wide context at session start, often irrelevant) or reactive (Claude must decide to call a search tool, which it often doesn't).** Nothing fires at `UserPromptSubmit` with a precise per-prompt semantic match.
19
+
20
+ ## Non-goals
21
+
22
+ - **Cost dashboards.** ccusage owns this. We do not duplicate.
23
+ - **TUI / web UI.** Out of scope. CLI only for V1.
24
+ - **Multi-machine sync.** Local only.
25
+ - **Real-time token-waste prevention** (PreToolUse hooks for redundant Reads/Bash). Considered and dropped from V1 — risk of false-positive annoyance is high. Revisit in V2.
26
+ - **Auto-skill compiler / CLAUDE.md generator.** V2.
27
+ - **Replacing `claude --resume`.** We surface session IDs; the user runs `--resume` themselves.
28
+
29
+ ## Comparison to existing tools
30
+
31
+ | Tool | What it does well | Gap we fill |
32
+ |---|---|---|
33
+ | ccusage | Cost/token tracking | (we don't compete) |
34
+ | ccrider, cc-sessions | CLI search, resume | No LLM titles → poor recall on unrenamed sessions; no per-prompt auto-injection |
35
+ | ClaudeHistoryMCP | SessionStart hook injects project context | Broad dump, fires once, often irrelevant — no per-prompt precision match |
36
+ | session-seek, conversation-search | MCP search tools | Reactive — Claude must invoke; doesn't fire automatically per prompt |
37
+ | kmizzi/claude-code-sessions | Web UI, embeddings | UI-heavy; no hooks; no LLM titles |
38
+
39
+ **Our wedge:** LLM-generated titles + tags on every session at close, plus a `UserPromptSubmit` hook that does a precision semantic match per prompt and only injects a hit when confidence is high (silent otherwise). Two small, focused mechanisms; nobody currently combines them.
40
+
41
+ ## Architecture
42
+
43
+ ```
44
+ Claude Code
45
+
46
+ ├─ Stop hook ───────────► sidekick titler ───► SQLite (titles + tags + summary)
47
+ │ (1 Haiku call per closed session)
48
+
49
+ ├─ Stop hook ───────────► sidekick indexer ──► SQLite FTS5 + embeddings
50
+ │ (incremental, line-level)
51
+
52
+ └─ UserPromptSubmit hook ─► sidekick recall ──► (semantic search past sessions)
53
+ │ │
54
+ │ ├─ confidence ≥ threshold → inject 1-paragraph hit
55
+ │ └─ below threshold → silent (no injection)
56
+
57
+ CLI: sidekick search / list / show / why-stopped
58
+ ```
59
+
60
+ ### Components
61
+
62
+ **1. Indexer (`sidekick index`)**
63
+ - Scans `~/.claude/projects/**/*.jsonl`.
64
+ - Parses each JSONL turn (user prompts, assistant responses, tool calls).
65
+ - Stores in SQLite at `~/.session-sidekick/index.db`:
66
+ - `sessions(id, project, cwd, started_at, ended_at, title, summary, tags, status)`
67
+ - `turns(session_id, turn_idx, role, content, tools_used, timestamp)`
68
+ - FTS5 virtual table on `turns.content` and `sessions.title|summary|tags`.
69
+ - Embedding column on `turns` (sqlite-vec or LanceDB; decision deferred to writing-plans).
70
+ - Incremental: tracks `(file_mtime, byte_offset)` per JSONL; only processes new bytes.
71
+ - Idempotent: safe to run repeatedly.
72
+
73
+ **2. Titler (`sidekick title <session_id>`)**
74
+ - Triggered by Stop hook.
75
+ - Reads first ~5 user turns + last ~3 assistant turns of the session.
76
+ - Single Haiku call (~$0.0001) producing strict JSON: `{title, tags[3], summary, status}` where `status ∈ {completed, abandoned, context_limit, in_progress}`.
77
+ - Status detection:
78
+ - `context_limit` if last turn shows compaction marker or context-full error.
79
+ - `abandoned` if last 3 user turns are short corrections / "no" / "stop" without resolution.
80
+ - `completed` otherwise.
81
+ - Persisted to `sessions` row.
82
+
83
+ **3. Recall (`sidekick recall <prompt>`)**
84
+ - Triggered by `UserPromptSubmit` hook with the user's pending prompt.
85
+ - Embeds the prompt; semantic-searches `turns` (filter: same project preferred, then global).
86
+ - Reranks top-K by recency × project-match × content-type weight.
87
+ - **Confidence gate:** only inject if top hit's similarity ≥ 0.78 AND the hit is from a different session AND not from the last 24h (avoid telling the user about a session they're already in the middle of).
88
+ - On hit, writes a small markdown block to stdout (consumed by Claude Code as `additionalContext`):
89
+ ```
90
+ 💡 You may have done this before — session `<id>` (<date>): <title>
91
+ <one-line summary>. Tags: <tag1, tag2, tag3>
92
+ Resume with: claude --resume <id>
93
+ ```
94
+ - Silent on miss. **No false-positive nags.**
95
+ - Hard timeout: 300ms. If recall hasn't returned, hook exits silent.
96
+
97
+ **4. CLI**
98
+ - `sidekick search <query>` — full-text + semantic, ranked.
99
+ - `sidekick list [--project X] [--status abandoned|completed|...] [--since 7d]`
100
+ - `sidekick show <id>` — title, summary, tags, turn count, full transcript on `--full`.
101
+ - `sidekick reindex [--full]` — rebuild index.
102
+ - `sidekick stats` — basic db stats (sessions, turns, db size, last index time).
103
+
104
+ ## Data flow
105
+
106
+ 1. User finishes a session in Claude Code → Stop hook fires.
107
+ 2. Hook calls `sidekick index --session <id>` (incremental, ~50ms) and `sidekick title <id>` (Haiku call, ~1s, async — does not block Claude Code exit).
108
+ 3. Next session: user types a prompt → `UserPromptSubmit` hook calls `sidekick recall <prompt>` with 300ms budget.
109
+ 4. If confident match: a one-paragraph hint is injected as additional context. Otherwise: nothing happens.
110
+
111
+ ## Token / cost budget
112
+
113
+ | Operation | Cost per event | Notes |
114
+ |---|---|---|
115
+ | Titler (per closed session) | ~$0.0001 (Haiku, ~2K input + 100 output) | One-time per session |
116
+ | Recall (per user prompt) | $0 (local embeddings) | Local model only |
117
+ | Injected context (on hit) | ~50–80 tokens of *your* context window | Only when injected |
118
+ | Indexing | $0 | Local |
119
+
120
+ Worst case: 50 sessions/week × $0.0001 = $0.005/week for titles. Negligible.
121
+
122
+ ## Failure modes & handling
123
+
124
+ - **Hook timeout** → silent, log to `~/.session-sidekick/logs/recall.log`.
125
+ - **Malformed JSONL** → skip line, count, surface in `stats`.
126
+ - **DB locked** (concurrent index + recall) → recall reads from snapshot; index uses WAL.
127
+ - **Haiku titler fails** (network, quota) → leave title null, retry on next `sidekick reindex`.
128
+ - **Embedding model not yet downloaded** → recall returns silent; titler still works; indexer queues for later embedding.
129
+ - **Hot loop / repeat injection** — same hint injected twice in one session: dedupe by session-id within current sidekick run; don't re-suggest the same prior session twice.
130
+
131
+ ## Privacy
132
+
133
+ - 100% local. No data leaves the machine.
134
+ - Haiku titler is the only network call — sends ~2KB of session content to Anthropic per closed session. Opt-out flag: `--no-titler` (falls back to first-user-message heuristic).
135
+ - Honors CLAUDE.md rule: never reads `.env` files; sidekick parses only `*.jsonl` under `~/.claude/projects/`.
136
+
137
+ ## Open questions (resolve in writing-plans phase)
138
+
139
+ 1. **Embedding model:** all-MiniLM-L6-v2 (384d, fast, what session-seek and kmizzi use) vs. bge-small-en-v1.5 (better recall, slightly heavier). Default: MiniLM unless we hit recall problems.
140
+ 2. **Vector store:** sqlite-vec (single-file, simple) vs. LanceDB (faster at scale). Default: sqlite-vec; revisit if turn count > 500K.
141
+ 3. **Confidence threshold (0.78):** placeholder — needs empirical tuning on Aru's actual session corpus during implementation.
142
+ 4. **Language:** Python (matches Aru's stack, easy hooking) vs. Go (single binary, ccrider's choice). Default: Python — fewer build steps, faster iteration; revisit if startup latency hurts the 300ms budget.
143
+ 5. **Hook installation UX:** should `sidekick install-hooks` patch `~/.claude/settings.json` automatically, or print the snippet for the user to paste? Default: print + `--apply` flag for auto-patch. Reversible.
144
+
145
+ ## Success criteria
146
+
147
+ - Aru can ask `sidekick search "modal vllm"` and find every relevant past session, even ones closed without rename.
148
+ - At least one `UserPromptSubmit` hit per week that prevents a re-derivation (measured: count of injections in `recall.log`, anecdotal "this was useful").
149
+ - Indexing 1500 sessions in <30s on first run.
150
+ - Recall p95 < 200ms.
151
+ - Zero false-positive nags in normal use (subjective; track injection-dismissal rate if we add a thumbs-down).
152
+
153
+ ## Out of scope (V2 candidates)
154
+
155
+ - PreToolUse token-waste warnings (#3 from brainstorming — dropped from V1).
156
+ - Auto-skill / CLAUDE.md compiler from recurring corrections.
157
+ - Session DAG / lineage tracking.
158
+ - Multi-machine sync.
159
+ - TUI / web UI.
160
+
161
+ ## Database impact
162
+
163
+ New SQLite database at `~/.session-sidekick/index.db`. Does not touch any existing project database. No SCHEMA.md update needed for any existing project — this is a standalone tool.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Aravind Kurapati
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,192 @@
1
+ Metadata-Version: 2.4
2
+ Name: session-sidekick
3
+ Version: 0.1.0
4
+ Summary: Search your Claude Code sessions and get semantic recall hints as you type
5
+ Project-URL: Homepage, https://github.com/AravindKurapati/session-sidekick
6
+ Project-URL: Issues, https://github.com/AravindKurapati/session-sidekick/issues
7
+ Author: Aravind Kurapati
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: anthropic,claude,claude-code,cli,hooks,recall,search,semantic,sessions
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Utilities
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: click>=8.1
19
+ Requires-Dist: fastembed>=0.4
20
+ Requires-Dist: platformdirs>=4.2
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
23
+ Requires-Dist: pytest>=8; extra == 'dev'
24
+ Requires-Dist: ruff>=0.6; extra == 'dev'
25
+ Provides-Extra: titler
26
+ Requires-Dist: anthropic>=0.40; extra == 'titler'
27
+ Description-Content-Type: text/markdown
28
+
29
+ # session-sidekick
30
+
31
+ > **Stop re-explaining context you've already worked through.**
32
+
33
+ A local CLI + Claude Code hook that indexes all your past sessions and surfaces relevant ones as you type — before you accidentally redo work you've already done.
34
+
35
+ ---
36
+
37
+ ## The problem this solves
38
+
39
+ Claude Code sessions are ephemeral. Every time you start a new one, Claude has no memory of the three hours you spent debugging the same Modal deployment last week, or the exact vLLM flag you figured out, or how you structured that RAG pipeline.
40
+
41
+ You either:
42
+ - Re-explain everything from scratch every session (slow)
43
+ - Search through raw JSONL files manually (painful)
44
+ - Forget you solved it and solve it again (expensive)
45
+
46
+ Session-sidekick fixes this with two pieces:
47
+
48
+ 1. **A recall hook** — fires on every prompt via `UserPromptSubmit`. Runs semantic search against all your past sessions. If it finds a confident match, it prints a one-line hint before Claude sees your message: `💡 You did this before — session abc12345: add modal vllm endpoint`
49
+
50
+ 2. **A search CLI** — keyword + semantic + combined search across every session you've ever had. `sidekick search "modal deployment"` ranks results by relevance, not just recency.
51
+
52
+ Everything is local. No API keys. No data leaves your machine.
53
+
54
+ ---
55
+
56
+ ## Install
57
+
58
+ ```bash
59
+ pip install session-sidekick
60
+ ```
61
+
62
+ Or from source:
63
+ ```bash
64
+ git clone https://github.com/AravindKurapati/session-sidekick
65
+ cd session-sidekick
66
+ pip install -e .
67
+ ```
68
+
69
+ **Requirements:** Python 3.11+ — no API keys needed.
70
+
71
+ ---
72
+
73
+ ## Quick start
74
+
75
+ ```bash
76
+ # Index your Claude Code sessions (reads ~/.claude/projects/)
77
+ sidekick reindex
78
+
79
+ # Build semantic embeddings (one-time, ~1-2 min)
80
+ sidekick embed
81
+
82
+ # Check what got indexed
83
+ sidekick stats
84
+
85
+ # Search
86
+ sidekick search "modal vllm"
87
+ sidekick search "react state management" --mode fts
88
+ sidekick list --project my-project
89
+ sidekick show abc12345 --full
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Live recall hook (the main feature)
95
+
96
+ The recall hook injects a past-session hint into your terminal at the moment you submit a prompt to Claude Code — giving you context before Claude even sees your message.
97
+
98
+ **Setup:**
99
+
100
+ ```bash
101
+ # 1. Install the hooks into ~/.claude/settings.json
102
+ sidekick install-hooks --apply
103
+
104
+ # 2. Start the daemon (keeps the embedding model warm for fast recall)
105
+ sidekick-daemon
106
+ ```
107
+
108
+ The daemon needs to be running for recall to work. Add it to your shell startup to keep it always-on:
109
+
110
+ ```bash
111
+ # ~/.zshrc or ~/.bashrc
112
+ sidekick-daemon &>/dev/null &
113
+ ```
114
+
115
+ **How it looks:**
116
+
117
+ ```
118
+ You: fix the vllm timeout on modal
119
+
120
+ 💡 You may have done this before — session a3f2b1c8 (2026-04-28): debug modal vllm timeout
121
+ Set request_timeout=120 in the Modal endpoint config, not in the vLLM args.
122
+ Tags: modal,vllm,timeout
123
+ Resume with: claude --resume a3f2b1c8
124
+
125
+ Claude: ...
126
+ ```
127
+
128
+ The hint only appears when the confidence score exceeds the threshold (default 0.78). Silent otherwise — it never interrupts you.
129
+
130
+ ---
131
+
132
+ ## All commands
133
+
134
+ | Command | What it does |
135
+ |---------|-------------|
136
+ | `reindex` | Incrementally scan `~/.claude/projects/*.jsonl` |
137
+ | `embed` | Build/update semantic embeddings for unembedded turns |
138
+ | `stats` | Sessions, turns, embeddings count + DB path |
139
+ | `list` | Browse sessions (`--project`, `--status`, `--limit`) |
140
+ | `search` | Keyword + semantic search (`--mode fts\|semantic\|combined`) |
141
+ | `show` | Full session detail by id (`--full` for all turns) |
142
+ | `install-hooks` | Print or apply hook config (`--apply` to patch settings.json) |
143
+ | `stop-hook` | Run by Claude Code Stop event — reindex + embed |
144
+
145
+ ---
146
+
147
+ ## How it works
148
+
149
+ ```
150
+ ~/.claude/projects/**/*.jsonl
151
+ ↓ sidekick reindex
152
+ SQLite (WAL) + FTS5
153
+ ↓ sidekick embed
154
+ MiniLM embeddings (384d, ONNX, local)
155
+ ↓ sidekick-daemon
156
+ TCP socket server (Windows) / Unix socket (macOS/Linux)
157
+ ↓ UserPromptSubmit hook → sidekick-recall
158
+ Cosine similarity → hint printed if score > 0.78
159
+ ```
160
+
161
+ - **Index:** `~/.session-sidekick/index.db` — SQLite with FTS5 full-text and raw float32 embeddings
162
+ - **Model:** `sentence-transformers/all-MiniLM-L6-v2` via fastembed (ONNX, ~80MB, downloads once)
163
+ - **Search:** FTS5 keyword, cosine similarity semantic, or RRF-fused combined
164
+ - **Recall budget:** 300ms timeout — silent if daemon is slow or down, never blocks Claude Code
165
+
166
+ ---
167
+
168
+ ## Data & privacy
169
+
170
+ - All data stays local at `~/.session-sidekick/`
171
+ - Only reads `~/.claude/projects/` — never writes to it
172
+ - No network calls (the optional titler uses Anthropic's API but is disabled by default)
173
+ - The daemon runs on localhost only
174
+
175
+ ---
176
+
177
+ ## Optional: session titler
178
+
179
+ If you want auto-generated titles for sessions (requires `ANTHROPIC_API_KEY`):
180
+
181
+ ```bash
182
+ pip install "session-sidekick[titler]"
183
+ ANTHROPIC_API_KEY=... sidekick-titler
184
+ ```
185
+
186
+ Calls Claude Haiku (~$0.0005 per session). Titles are stored locally and shown in `sidekick list`.
187
+
188
+ ---
189
+
190
+ ## License
191
+
192
+ MIT