chat-logbook 0.10.0 → 0.12.0

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.
package/README.md CHANGED
@@ -2,80 +2,46 @@
2
2
 
3
3
  > _Where your AI conversations live._
4
4
 
5
- A local-first library for the conversations you've had with your AI tools.
6
- Read by chat-logbook, kept on your machine, browsable and searchable in one
7
- place — even after your AI tool has deleted the original.
5
+ A local-first library for the conversations you've had with your AI tools. Read by chat-logbook, kept on your machine, browsable and searchable in one place — even after your AI tool has deleted the original.
8
6
 
9
- > **Status.** A personal side project, moving at side-project pace —
10
- > development and responses happen as time allows. Early release:
11
- > browsing, rendering, soft-delete, and a local archive that survives
12
- > vendor cleanup all work today. Search and tags are next. See
13
- > [Roadmap](#roadmap).
7
+ > **Status.** A personal side project, moving at side-project pace — development and responses happen as time allows. Early release: browsing, rendering, soft-delete, and a local archive that survives vendor cleanup all work today. Search and tags are next. See [Roadmap](#roadmap).
14
8
 
15
9
  ## What chat-logbook is
16
10
 
17
- You open it from the command line, and a browser window opens onto your
18
- conversation history. You can browse it, find anything in it, tag what
19
- matters, and pick up where you left off.
11
+ You open it from the command line, and a browser window opens onto your conversation history. You can browse it, find anything in it, tag what matters, and pick up where you left off.
20
12
 
21
- It reads the files your AI tools already write to your machine — Claude Code
22
- today, with more tools planned. From there it keeps its own copy in a
23
- private archive on your machine, so the history is yours even when the
24
- source tool quietly cleans up after itself (Claude Code defaults to deleting
25
- conversations older than 30 days).
13
+ It reads the files your AI tools already write to your machine — Claude Code today, with more tools planned. From there it keeps its own copy in a private archive on your machine, so the history is yours even when the source tool quietly cleans up after itself (Claude Code defaults to deleting conversations older than 30 days).
26
14
 
27
15
  Nothing leaves your machine. There is no account to create. The original
28
16
  files your AI tools wrote are never modified.
29
17
 
30
- We built this because the right place for your AI conversations to live
31
- isn't inside the next vendor change.
18
+ We built this because the right place for your AI conversations to live isn't inside the next vendor change.
32
19
 
33
20
  ## What it gives you
34
21
 
35
- - **Read-only access to source directories.** Original conversation files
36
- are never modified. Today that means `~/.claude/`; the same rule applies
37
- to every agent we add.
22
+ - **Read-only access to source directories.** Original conversation files are never modified. Today that means `~/.claude/`; the same rule applies to every agent we add.
38
23
  - **Local-only.** No telemetry, no analytics, no third-party calls.
39
24
  - **Zero configuration.** Install and run.
40
- - **Drive everything from the keyboard.** A `/` or `⌘K` overlay finds any
41
- past conversation in seconds. The mouse still works, but every primary
42
- action has a binding.
43
- - **Your archive is yours.** It's a single SQLite file at
44
- `~/.chat-logbook/archive.db`. Copy it to back up. Open it with any tool
45
- that reads SQLite. If chat-logbook disappears tomorrow, the archive
46
- doesn't.
25
+ - **Drive everything from the keyboard.** A `/` or `⌘K` overlay finds any past conversation in seconds. The mouse still works, but every primary action has a binding.
26
+ - **Your archive is yours.** It's a single SQLite file at `~/.chat-logbook/archive.db`. Copy it to back up. Open it with any tool that reads SQLite. If chat-logbook disappears tomorrow, the archive doesn't.
47
27
 
48
- The full problem statement, user stories, and direction live in the
49
- [PRD](docs/PRD.md).
28
+ The full problem statement, user stories, and direction live in the [PRD](docs/PRD.md).
50
29
 
51
30
  ## What works today
52
31
 
53
32
  - **Three-column layout.** Resizable panels for filters, chat list,
54
33
  and conversation content.
55
- - **Rich conversation rendering.** Markdown, syntax-highlighted code
56
- blocks, collapsible tool calls with one-line summaries, and collapsible
57
- thinking blocks.
34
+ - **Rich conversation rendering.** Markdown, syntax-highlighted code blocks, collapsible tool calls with one-line summaries, and collapsible thinking blocks.
58
35
  - **Virtual scrolling.** Long conversations scroll smoothly.
59
36
  - **Solarized Dark theme.** Easy on the eyes, consistent with Claude
60
37
  Code's terminal look.
61
38
  - **Soft delete with Trash.** Hide chats you don't want to see; restore
62
39
  them anytime.
63
- - **Sortable lists.** Sort your chats by title, created time, or updated
64
- time, and the choice sticks between visits. Trash sorts independently
65
- by deleted time by default.
66
- - **Custom chat titles.** Rename any chat click its title in the
67
- list or conversation header, or select it and press `F2` / `↵`. Clear
68
- the title to fall back to the first message.
69
- - **Local archive.** Every conversation chat-logbook reads is copied into
70
- `~/.chat-logbook/archive.db`. The UI reads from the archive, so a
71
- chat stays visible even after the source JSONL is gone.
72
- - **Live updates.** While Claude Code is actively writing to a chat,
73
- new messages appear in chat-logbook within seconds — no restart
74
- needed.
75
- - **Chat metadata at a glance.** A ⓘ button on the conversation
76
- header opens a popover showing when the chat started, when it was
77
- last updated, the agent, the project working directory, and the
78
- chat's IDs — with one-click copy.
40
+ - **Sortable lists.** Sort your chats by title, created time, or updated time, and the choice sticks between visits. Trash sorts independently — by deleted time by default.
41
+ - **Custom chat titles.** Rename any chat — click its title in the list or conversation header, or select it and press `F2` / `↵`. Clear the title to fall back to the first message.
42
+ - **Local archive.** Every conversation chat-logbook reads is copied into `~/.chat-logbook/archive.db`. The UI reads from the archive, so a chat stays visible even after the source JSONL is gone.
43
+ - **Live updates.** While Claude Code is actively writing to a chat, new messages appear in chat-logbook within seconds no restart needed.
44
+ - **Chat metadata at a glance.** A ⓘ button on the conversation header opens a popover showing when the chat started, when it was last updated, the agent, the project working directory, and the chat's IDs with one-click copy.
79
45
 
80
46
  ## Quick start
81
47
 
@@ -100,93 +66,60 @@ You should see:
100
66
  chat-logbook is running at http://localhost:3100
101
67
  ```
102
68
 
103
- A browser window opens automatically, showing a list of your Claude Code
104
- chats on the left and conversation content on the right.
69
+ A browser window opens automatically, showing a list of your Claude Code chats on the left and conversation content on the right.
105
70
 
106
71
  ### Troubleshooting
107
72
 
108
73
  **"No conversations found."**
109
- You need to have Claude Code conversation history at `~/.claude/`.
110
- chat-logbook reads from this directory automatically.
74
+ You need to have Claude Code conversation history at `~/.claude/`. chat-logbook reads from this directory automatically.
111
75
 
112
76
  **"Port already in use."**
113
- chat-logbook runs on port 3100 by default. Use `chat-log --port 8080`
114
- (or `PORT=8080 chat-log`) to pick a different port.
77
+ chat-logbook runs on port 3100 by default. Use `chat-log --port 8080` (or `PORT=8080 chat-log`) to pick a different port.
115
78
 
116
79
  **Updating to the latest version.**
117
- Run `npm install -g chat-logbook@latest`. If you use npx, the `@latest`
118
- tag ensures you always run the newest version.
80
+ Run `npm install -g chat-logbook@latest`. If you use npx, the `@latest` tag ensures you always run the newest version.
119
81
 
120
82
  ## FAQ
121
83
 
122
84
  ### Does chat-logbook work with Claude Code on the web?
123
85
 
124
- No. chat-logbook reads from local `~/.claude/` files, which are only
125
- created by the Claude Code CLI on your machine. Conversations run via
126
- Claude Code on the web (cloud VMs) are not stored locally and aren't
127
- visible to chat-logbook.
86
+ No. chat-logbook reads from local `~/.claude/` files, which are only created by the Claude Code CLI on your machine. Conversations run via Claude Code on the web (cloud VMs) are not stored locally and aren't visible to chat-logbook.
128
87
 
129
88
  ### Why can't I see my `/btw` conversations?
130
89
 
131
- `/btw` is designed to be ephemeral — questions and answers appear in a
132
- temporary overlay and are never written to conversation history files.
133
- For a conversation to be preserved and visible in chat-logbook, send a
134
- regular message instead.
90
+ `/btw` is designed to be ephemeral — questions and answers appear in a temporary overlay and are never written to conversation history files. For a conversation to be preserved and visible in chat-logbook, send a regular message instead.
135
91
 
136
92
  ### Will chat-logbook lose my history if Claude Code deletes its files?
137
93
 
138
- Once chat-logbook has read a conversation into its archive, vendor
139
- cleanup of the original file no longer removes it from chat-logbook.
140
- The archive's contract: never delete in response to source deletion.
141
- Only an explicit user action (Hard Delete / Purge) removes archived
142
- conversations.
94
+ Once chat-logbook has read a conversation into its archive, vendor cleanup of the original file no longer removes it from chat-logbook. The archive's contract: never delete in response to source deletion. Only an explicit user action (Hard Delete / Purge) removes archived conversations.
143
95
 
144
96
  ### Where is my data stored?
145
97
 
146
98
  Three places, all on your machine:
147
99
 
148
100
  - `~/.claude/` (and equivalents for other tools) — read-only source.
149
- - `~/.chat-logbook/archive.db` — chat-logbook's copy of the
150
- conversations it has read.
151
- - `~/.chat-logbook/data.db` — your tags, titles, annotations, and
152
- soft-delete flags.
101
+ - `~/.chat-logbook/archive.db` — chat-logbook's copy of the conversations it has read.
102
+ - `~/.chat-logbook/metadata.db` your tags, titles, annotations, and soft-delete flags.
153
103
 
154
- Back up the two `~/.chat-logbook/` files together; they are the
155
- complete chat-logbook state.
104
+ Back up the two `~/.chat-logbook/` files together; they are the complete chat-logbook state.
156
105
 
157
106
  ### Is this affiliated with Anthropic / OpenAI?
158
107
 
159
- No. chat-logbook reads files those tools write on your machine. It
160
- doesn't talk to their servers and isn't endorsed by them.
108
+ No. chat-logbook reads files those tools write on your machine. It doesn't talk to their servers and isn't endorsed by them.
161
109
 
162
110
  ## Roadmap
163
111
 
164
112
  Two phases of work are in flight, in this order.
165
113
 
166
- **Custom titles and tags.** Rename a chat to something you'll
167
- recognize, attach tags with custom colors, and filter the list by tag or
168
- by project. This is the path from "I have a lot of conversations" to
169
- "I can find the one I need."
114
+ **Custom titles and tags.** Rename a chat to something you'll recognize, attach tags with custom colors, and filter the list by tag or by project. This is the path from "I have a lot of conversations" to "I can find the one I need."
170
115
 
171
- **Spotlight search.** A keyboard-driven overlay (`⌘K` or `/`) that
172
- searches across chats, messages, tags, and projects from one input.
173
- A match lands you on the exact message with the term highlighted, and
174
- you can jump between every match without leaving the overlay.
116
+ **Spotlight search.** A keyboard-driven overlay (`⌘K` or `/`) that searches across chats, messages, tags, and projects from one input. A match lands you on the exact message with the term highlighted, and you can jump between every match without leaving the overlay.
175
117
 
176
- Beyond these three, several smaller things are on the list without firm
177
- timing — live updates while an AI tool is writing, annotations and
178
- highlights for marking what matters, editing your own past messages,
179
- CLI commands for working with conversations from a terminal. Some will
180
- ship; some are still being weighed.
118
+ Beyond these three, several smaller things are on the list without firm timing — live updates while an AI tool is writing, annotations and highlights for marking what matters, editing your own past messages, CLI commands for working with conversations from a terminal. Some will ship; some are still being weighed.
181
119
 
182
- Explicit non-goals: semantic / vector search, cloud sync inside the OSS
183
- core, modification of source directories like `~/.claude/`, and bulk
184
- export to bespoke formats (the archive itself is the export). See the
185
- [PRD](docs/PRD.md) for the full out-of-scope list.
120
+ Explicit non-goals: semantic / vector search, cloud sync inside the OSS core, modification of source directories like `~/.claude/`, and bulk export to bespoke formats (the archive itself is the export). See the [PRD](docs/PRD.md) for the full out-of-scope list.
186
121
 
187
- This project is **not affiliated with Anthropic, OpenAI, or any other AI
188
- provider.** It reads files those tools write on your machine; it does
189
- not talk to their servers and is not endorsed by them.
122
+ This project is **not affiliated with Anthropic, OpenAI, or any other AI provider.** It reads files those tools write on your machine; it does not talk to their servers and is not endorsed by them.
190
123
 
191
124
  ## Changelog
192
125
 
@@ -194,20 +127,14 @@ See [CHANGELOG.md](CHANGELOG.md) for release notes.
194
127
 
195
128
  ## Contributing
196
129
 
197
- Chat Logbook is in very early development. To keep focus on the current
198
- goals, we're not taking contributions right now.
130
+ Chat Logbook is in very early development. To keep focus on the current goals, we're not taking contributions right now.
199
131
 
200
- If there's something you really need — or you'd genuinely like to help —
201
- reach out directly and we can talk through it.
132
+ If there's something you really need — or you'd genuinely like to help — reach out directly and we can talk through it.
202
133
 
203
134
  ## License
204
135
 
205
- This project is licensed under the
206
- [GNU Affero General Public License v3.0](LICENSE) (AGPL-3.0-only).
136
+ This project is licensed under the [GNU Affero General Public License v3.0](LICENSE) (AGPL-3.0-only).
207
137
 
208
- You are free to use, modify, and distribute this software under the
209
- terms of the AGPL-3.0. If you modify the program and make it available
210
- over a network, you must release your modified source code under the
211
- same license.
138
+ You are free to use, modify, and distribute this software under the terms of the AGPL-3.0. If you modify the program and make it available over a network, you must release your modified source code under the same license.
212
139
 
213
140
  For commercial licensing inquiries, contact the author.
@@ -0,0 +1,2 @@
1
+ DROP INDEX IF EXISTS `session_scan_state_idx`;--> statement-breakpoint
2
+ DROP TABLE IF EXISTS `session_scan_state`;
@@ -50,6 +50,13 @@
50
50
  "when": 1779100000000,
51
51
  "tag": "0006_add_project_path",
52
52
  "breakpoints": true
53
+ },
54
+ {
55
+ "idx": 7,
56
+ "version": "6",
57
+ "when": 1779200000000,
58
+ "tag": "0007_drop_session_scan_state",
59
+ "breakpoints": true
53
60
  }
54
61
  ]
55
62
  }
@@ -0,0 +1,11 @@
1
+ CREATE TABLE `chat_scan_state` (
2
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3
+ `agent` text NOT NULL,
4
+ `source_id` text NOT NULL,
5
+ `source_path` text NOT NULL,
6
+ `last_mtime_ms` integer NOT NULL,
7
+ `last_size_bytes` integer NOT NULL,
8
+ `last_scanned_at` integer NOT NULL
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE UNIQUE INDEX `chat_scan_state_idx` ON `chat_scan_state` (`agent`,`source_id`);
@@ -0,0 +1,83 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "7000812a-0b76-46c3-a086-0b2a551fe473",
5
+ "prevId": "00000000-0000-0000-0000-000000000000",
6
+ "tables": {
7
+ "chat_scan_state": {
8
+ "name": "chat_scan_state",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "integer",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": true
16
+ },
17
+ "agent": {
18
+ "name": "agent",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "source_id": {
25
+ "name": "source_id",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false
30
+ },
31
+ "source_path": {
32
+ "name": "source_path",
33
+ "type": "text",
34
+ "primaryKey": false,
35
+ "notNull": true,
36
+ "autoincrement": false
37
+ },
38
+ "last_mtime_ms": {
39
+ "name": "last_mtime_ms",
40
+ "type": "integer",
41
+ "primaryKey": false,
42
+ "notNull": true,
43
+ "autoincrement": false
44
+ },
45
+ "last_size_bytes": {
46
+ "name": "last_size_bytes",
47
+ "type": "integer",
48
+ "primaryKey": false,
49
+ "notNull": true,
50
+ "autoincrement": false
51
+ },
52
+ "last_scanned_at": {
53
+ "name": "last_scanned_at",
54
+ "type": "integer",
55
+ "primaryKey": false,
56
+ "notNull": true,
57
+ "autoincrement": false
58
+ }
59
+ },
60
+ "indexes": {
61
+ "chat_scan_state_idx": {
62
+ "name": "chat_scan_state_idx",
63
+ "columns": ["agent", "source_id"],
64
+ "isUnique": true
65
+ }
66
+ },
67
+ "foreignKeys": {},
68
+ "compositePrimaryKeys": {},
69
+ "uniqueConstraints": {},
70
+ "checkConstraints": {}
71
+ }
72
+ },
73
+ "views": {},
74
+ "enums": {},
75
+ "_meta": {
76
+ "schemas": {},
77
+ "tables": {},
78
+ "columns": {}
79
+ },
80
+ "internal": {
81
+ "indexes": {}
82
+ }
83
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1781328041144,
9
+ "tag": "0000_sour_zeigeist",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }