sessionpulse 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 (35) hide show
  1. sessionpulse-0.1.0/LICENSE +21 -0
  2. sessionpulse-0.1.0/PKG-INFO +221 -0
  3. sessionpulse-0.1.0/README.md +193 -0
  4. sessionpulse-0.1.0/pyproject.toml +49 -0
  5. sessionpulse-0.1.0/setup.cfg +4 -0
  6. sessionpulse-0.1.0/src/sessionpulse/__init__.py +3 -0
  7. sessionpulse-0.1.0/src/sessionpulse/__main__.py +5 -0
  8. sessionpulse-0.1.0/src/sessionpulse/cli.py +158 -0
  9. sessionpulse-0.1.0/src/sessionpulse/config.py +90 -0
  10. sessionpulse-0.1.0/src/sessionpulse/followups.py +273 -0
  11. sessionpulse-0.1.0/src/sessionpulse/hook.py +39 -0
  12. sessionpulse-0.1.0/src/sessionpulse/icons/sessionpulse-busy.svg +5 -0
  13. sessionpulse-0.1.0/src/sessionpulse/icons/sessionpulse-idle.svg +5 -0
  14. sessionpulse-0.1.0/src/sessionpulse/icons/sessionpulse-none.svg +5 -0
  15. sessionpulse-0.1.0/src/sessionpulse/install.py +149 -0
  16. sessionpulse-0.1.0/src/sessionpulse/learn.py +158 -0
  17. sessionpulse-0.1.0/src/sessionpulse/reader.py +333 -0
  18. sessionpulse-0.1.0/src/sessionpulse/server.py +122 -0
  19. sessionpulse-0.1.0/src/sessionpulse/static/brand/favicon.svg +6 -0
  20. sessionpulse-0.1.0/src/sessionpulse/static/brand/session-pulse-idle-animated.svg +52 -0
  21. sessionpulse-0.1.0/src/sessionpulse/static/brand/session-pulse-idle-static.svg +42 -0
  22. sessionpulse-0.1.0/src/sessionpulse/static/brand/session-pulse-none-animated.svg +52 -0
  23. sessionpulse-0.1.0/src/sessionpulse/static/brand/session-pulse-none-static.svg +42 -0
  24. sessionpulse-0.1.0/src/sessionpulse/static/brand/session-pulse-working-animated.svg +52 -0
  25. sessionpulse-0.1.0/src/sessionpulse/static/brand/session-pulse-working-static.svg +42 -0
  26. sessionpulse-0.1.0/src/sessionpulse/static/dashboard.html +927 -0
  27. sessionpulse-0.1.0/src/sessionpulse/todos.py +163 -0
  28. sessionpulse-0.1.0/src/sessionpulse/tray.py +162 -0
  29. sessionpulse-0.1.0/src/sessionpulse.egg-info/PKG-INFO +221 -0
  30. sessionpulse-0.1.0/src/sessionpulse.egg-info/SOURCES.txt +33 -0
  31. sessionpulse-0.1.0/src/sessionpulse.egg-info/dependency_links.txt +1 -0
  32. sessionpulse-0.1.0/src/sessionpulse.egg-info/entry_points.txt +2 -0
  33. sessionpulse-0.1.0/src/sessionpulse.egg-info/requires.txt +2 -0
  34. sessionpulse-0.1.0/src/sessionpulse.egg-info/top_level.txt +1 -0
  35. sessionpulse-0.1.0/tests/test_sessionpulse.py +448 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vijay Shukla
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,221 @@
1
+ Metadata-Version: 2.4
2
+ Name: sessionpulse
3
+ Version: 0.1.0
4
+ Summary: A quiet instrument panel for Claude Code: live sessions, usage, and a to-do board that fills itself from your sessions. Local only.
5
+ Author: Vijay Shukla
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/vijayshuklaHL/sessionpulse
8
+ Project-URL: Issues, https://github.com/vijayshuklaHL/sessionpulse/issues
9
+ Project-URL: Changelog, https://github.com/vijayshuklaHL/sessionpulse/blob/main/CHANGELOG.md
10
+ Keywords: claude,claude-code,dashboard,kanban,todo,developer-tools,tray,productivity
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: X11 Applications :: GTK
13
+ Classifier: Environment :: Web Environment
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Intended Audience :: Developers
21
+ Classifier: Topic :: Software Development
22
+ Classifier: Topic :: Utilities
23
+ Requires-Python: >=3.11
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Provides-Extra: tray
27
+ Dynamic: license-file
28
+
29
+ <h1 align="center">Session Pulse</h1>
30
+
31
+ <p align="center"><b>A quiet instrument panel for Claude Code.</b><br>
32
+ See every session at a glance, and never lose track of what a session left for you to do.</p>
33
+
34
+ <p align="center">
35
+ <a href="https://github.com/vijayshuklaHL/sessionpulse/actions/workflows/test.yml"><img alt="tests" src="https://github.com/vijayshuklaHL/sessionpulse/actions/workflows/test.yml/badge.svg"></a>
36
+ <img alt="Python 3.11+" src="https://img.shields.io/badge/python-3.11%2B-3776ab">
37
+ <img alt="No dependencies" src="https://img.shields.io/badge/dependencies-none-2a78d6">
38
+ <img alt="Local only" src="https://img.shields.io/badge/data-stays%20on%20your%20machine-1a7f37">
39
+ <a href="LICENSE"><img alt="MIT licence" src="https://img.shields.io/badge/licence-MIT-555"></a>
40
+ <a href="https://github.com/sponsors/vijayshuklaHL"><img alt="Sponsor on GitHub" src="https://img.shields.io/badge/sponsor-%E2%9D%A4-db61a2?logo=githubsponsors&logoColor=white"></a>
41
+ <a href="https://buymeacoffee.com/vijayshuklahl"><img alt="Buy me a coffee" src="https://img.shields.io/badge/buy%20me%20a-coffee-ffdd00?logo=buymeacoffee&logoColor=000"></a>
42
+ </p>
43
+
44
+ <p align="center"><img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/session-pulse-working-animated.svg" width="760"
45
+ alt="Session Pulse: a terminal prompt whose cursor turns into a pulse line, with Working, Idle and No sessions states"></p>
46
+
47
+ ### See it in action (1 minute)
48
+
49
+ https://github.com/user-attachments/assets/ba0b1bb5-c1b3-4b1a-816a-23b161823a6a
50
+
51
+ <sub>Made-up data throughout. Re-record it with <code>tools/showcase/run.sh</code>.</sub>
52
+
53
+
54
+ ---
55
+
56
+ ## Why
57
+
58
+ If you use [Claude Code](https://code.claude.com/docs/en/overview) every day, you probably have several sessions open across projects. Some are working, some are waiting for you, and some ended an hour ago with *"you still need to decide X, and someone has to approve Y"*. Those loose ends live in scrollback, and scrollback gets cleared.
59
+
60
+ Session Pulse sits next to your clock and keeps it all in one place:
61
+
62
+ - **What's running:** which sessions are open, working or idle, for how long, using how much.
63
+ - **What's left:** when a session goes quiet, Claude lists what it left open (decisions, outside work, checklists, things you're waiting on) and puts it on a board for you.
64
+ - **How you work:** tokens per day by model, real active hours, and tips to get better at Claude Code based on your own habits.
65
+
66
+ It reads the files Claude Code already writes under `~/.claude`. **Nothing leaves your machine.**
67
+
68
+ > Session Pulse is an independent project. It is not made, endorsed or supported by Anthropic.
69
+
70
+ ## Screenshots
71
+
72
+ <p align="center"><img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/overview.jpg" width="900" alt="Overview: live sessions, KPIs, to-do list and completed items"></p>
73
+
74
+ | To-dos that fill themselves | One board for everything you still owe |
75
+ |---|---|
76
+ | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/todo.jpg" alt="To-do list grouped by project, with follow-ups picked up from sessions"> | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/board.jpg" alt="Kanban board with colour-coded columns: Decide, Outside work, Waiting on, Checklist, Later, Added by me, Done"> |
77
+
78
+ | Get better at Claude Code | Light theme |
79
+ |---|---|
80
+ | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/learn.jpg" alt="Suggestions based on your usage, with links to free official docs and courses"> | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/overview-light.jpg" alt="The overview in the light theme"> |
81
+
82
+ *All screenshots use made-up data (`tools/showcase/`).*
83
+
84
+ ## Features
85
+
86
+ - **Live sessions:** working or idle, running time, last change, tokens, model. The panel icon shows the count and turns orange while Claude is working.
87
+ - **Follow-ups (optional):** Claude reads each session after 20 quiet minutes and adds what was left open to your to-do list, linked back to the session, with a one-click resume command. A later session that finishes an item closes it automatically.
88
+ - **Board:** every to-do as a card, colour-coded by kind (Decide, Outside work, Waiting on, Checklist, Later), or by status (To do, Doing, Done). Drag and drop, project filter, search.
89
+ - **Your own to-dos too:** add them on the dashboard or with `sessionpulse todo add "…"`.
90
+ - **Usage:** input, output and cache tokens per day, split by model; active hours per day; busiest projects.
91
+ - **Starts and exits:** when each session started and ended, and why (`/clear`, Ctrl+D, logout…).
92
+ - **History:** every session, searchable, with a copyable `claude --resume` command.
93
+ - **Get better at Claude Code:** suggestions picked from how you actually work (no `CLAUDE.md` in busy projects, very long sessions, features you haven't tried), with free official docs and Anthropic Academy courses.
94
+ - **Small and private:** standard library only, listens on `127.0.0.1`, needs a token, works in light and dark mode and on a phone screen.
95
+
96
+ ## Install
97
+
98
+ Requires Python 3.11+ and Claude Code.
99
+
100
+ **Linux with the panel icon** (Ubuntu and Debian shown):
101
+
102
+ ```sh
103
+ sudo apt install pipx python3-gi gir1.2-ayatanaappindicator3-0.1
104
+ pipx install --system-site-packages sessionpulse
105
+ sessionpulse install # adds the start/exit hooks and a login autostart
106
+ sessionpulse tray & # start the panel icon now
107
+ ```
108
+
109
+ On GNOME you also need the AppIndicator extension. Ubuntu has it on by default; elsewhere install "AppIndicator and KStatusNotifierItem Support". KDE, Xfce, Cinnamon and MATE need nothing extra.
110
+
111
+ **macOS, or without the panel icon:**
112
+
113
+ ```sh
114
+ pipx install sessionpulse
115
+ sessionpulse install --no-autostart
116
+ sessionpulse serve # then, in another terminal: sessionpulse open
117
+ ```
118
+
119
+ **Turn on follow-ups** (optional, see [what it costs](#follow-ups)):
120
+
121
+ ```sh
122
+ mkdir -p ~/.config/sessionpulse
123
+ echo 'followups = true' >> ~/.config/sessionpulse/config.toml
124
+ sessionpulse followups # read the last 30 days now instead of waiting
125
+ ```
126
+
127
+ Check everything with `sessionpulse doctor`. Remove it with `sessionpulse uninstall` (your data stays) and `pipx uninstall sessionpulse`.
128
+
129
+ ## Commands
130
+
131
+ | Command | What it does |
132
+ |---|---|
133
+ | `sessionpulse install` | Adds SessionStart/SessionEnd hooks to `~/.claude/settings.json` (after backing it up) and a login autostart entry |
134
+ | `sessionpulse uninstall` | Removes exactly those hooks and the autostart entry. Your data stays. |
135
+ | `sessionpulse tray` | Panel icon and dashboard server |
136
+ | `sessionpulse serve` | Dashboard server only |
137
+ | `sessionpulse open` | Opens the dashboard in your browser, signed in (add `#board` to the address for the board) |
138
+ | `sessionpulse doctor` | Checks the setup and warns if Claude Code's file formats look different |
139
+ | `sessionpulse todo [add TEXT -p PROJECT \| done ID \| undo ID \| delete ID \| list-done]` | Your to-do list from the terminal |
140
+ | `sessionpulse followups [--days N] [--session ID] [--now] [--again]` | Read recent sessions now and add their open follow-ups |
141
+ | `sessionpulse snapshot` | Prints the dashboard data as JSON |
142
+
143
+ ## Settings
144
+
145
+ Optional. Create `~/.config/sessionpulse/config.toml` with any of these keys:
146
+
147
+ ```toml
148
+ port = 8765 # dashboard port (on 127.0.0.1)
149
+ refresh_seconds = 5
150
+ claude_dir = "~/.claude" # defaults to $CLAUDE_CONFIG_DIR if that is set
151
+ gap_minutes = 30 # activity closer together than this counts as one block of active time
152
+ min_block_minutes = 15 # shortest block of active time
153
+ followups = false # true: pick open follow-ups out of quiet sessions
154
+ followups_model = "haiku"
155
+ followups_idle_minutes = 20
156
+ followups_days = 30
157
+ followups_parallel = 3
158
+ claude_command = "" # path to `claude` if it isn't on PATH
159
+ ```
160
+
161
+ ### Follow-ups
162
+
163
+ Off by default, because it uses Claude. When on, the dashboard server checks every 5 minutes for sessions that have been quiet for 20 minutes and changed since it last read them. It sends their prompts and Claude's replies to `claude -p` (Haiku by default) and asks only for what's still open. That counts toward your Claude usage: roughly one small Haiku request per session.
164
+
165
+ The request runs with all hooks disabled and `--no-session-persistence`, so it never shows up as a session, in this dashboard or in any hook of yours. Items you dismiss are remembered and not picked up again.
166
+
167
+ ## Privacy and security
168
+
169
+ Transcripts contain everything you type into Claude Code, so the dashboard is locked down:
170
+
171
+ - It listens on `127.0.0.1` only and rejects requests addressed to any other host name (no DNS rebinding).
172
+ - It needs an access token, stored in `~/.local/share/sessionpulse/token` (readable only by you). `sessionpulse open` and the panel menu pass it once; after that it lives in an HttpOnly, SameSite=Strict cookie. The first link with the token in it may stay in your browser history.
173
+ - Changing to-dos needs the cookie, a JSON request and a matching Origin, so other web pages can't add or delete items.
174
+ - Only the artwork under `/brand/` is served without the token.
175
+ - It never writes to Claude Code's files, except `install`/`uninstall`, which edit the `hooks` section of `settings.json` after a timestamped backup.
176
+
177
+ Found a problem? See [SECURITY.md](https://github.com/vijayshuklaHL/sessionpulse/blob/main/SECURITY.md).
178
+
179
+ ## How the numbers are worked out
180
+
181
+ - **Live status** comes from `~/.claude/sessions/<pid>.json`. A session counts as live only while its process is running.
182
+ - **Tokens** come from the `usage` field of assistant messages. Each API response is counted once, and subagent usage is added to the session that started it.
183
+ - **Active time** groups activity into blocks: messages less than 30 minutes apart belong to one block, and every block counts as at least 15 minutes.
184
+ - **Exits** are recorded by the SessionEnd hook, so sessions that ended before you ran `install` show as "Closed".
185
+ - **Cost** is not shown. On a subscription, tokens don't map to a bill, and API prices change.
186
+
187
+ **These file formats are internal to Claude Code and undocumented.** Session Pulse reads them defensively, and the dashboard and `sessionpulse doctor` warn when lines stop parsing, usage disappears, or the Claude Code version is newer than the one last tested. If you see a warning, please [open an issue](https://github.com/vijayshuklaHL/sessionpulse/issues) with your Claude Code version.
188
+
189
+ ## Fork it and make it yours
190
+
191
+ Session Pulse is small on purpose (a few Python files and one HTML page, no build step), so it's easy to bend to how you work. Some ideas:
192
+
193
+ | You want to… | Look at |
194
+ |---|---|
195
+ | Change the colours or layout | the `:root` tokens and sections in `src/sessionpulse/static/dashboard.html` |
196
+ | Use your own logo or artwork | `src/sessionpulse/static/brand/` and `src/sessionpulse/icons/` |
197
+ | Add your team's own learning links or habits to check | `LIBRARY` and `suggest()` in `src/sessionpulse/learn.py` |
198
+ | Change what counts as a follow-up, or the categories | `SYSTEM` and `KINDS` in `src/sessionpulse/followups.py` and `todos.py` |
199
+ | Send follow-ups somewhere else (Linear, Jira, a chat channel) | `todos.merge_followups()` is the one place new items land |
200
+ | Record your own demo video | `tools/showcase/run.sh` (needs Chrome, Node 20+, ffmpeg; uses made-up data) |
201
+
202
+ ```sh
203
+ git clone https://github.com/<you>/sessionpulse && cd sessionpulse
204
+ python3 -m unittest discover -s tests # 38 tests, a few seconds
205
+ PYTHONPATH=src python3 -m sessionpulse serve # then: PYTHONPATH=src python3 -m sessionpulse open
206
+ ```
207
+
208
+ If you build something others would like, a pull request is very welcome. See [CONTRIBUTING.md](https://github.com/vijayshuklaHL/sessionpulse/blob/main/CONTRIBUTING.md). The MIT licence only asks that you keep the copyright notice.
209
+
210
+ ## Support
211
+
212
+ If Session Pulse saves you time:
213
+
214
+ - ⭐ **Star the repo.** It helps other Claude Code users find it.
215
+ - πŸ› **Report bugs or ideas** in [Issues](https://github.com/vijayshuklaHL/sessionpulse/issues).
216
+ - β˜• **[Buy me a coffee](https://buymeacoffee.com/vijayshuklahl)** for a one-off thank-you.
217
+ - πŸ’– **[Sponsor on GitHub](https://github.com/sponsors/vijayshuklaHL)** for monthly support. Even a coffee's worth a month keeps it maintained.
218
+
219
+ ## Licence
220
+
221
+ [MIT](https://github.com/vijayshuklaHL/sessionpulse/blob/main/LICENSE) Β© 2026 Vijay Shukla. Claude and Claude Code are trademarks of Anthropic, used here only to say what this tool works with.
@@ -0,0 +1,193 @@
1
+ <h1 align="center">Session Pulse</h1>
2
+
3
+ <p align="center"><b>A quiet instrument panel for Claude Code.</b><br>
4
+ See every session at a glance, and never lose track of what a session left for you to do.</p>
5
+
6
+ <p align="center">
7
+ <a href="https://github.com/vijayshuklaHL/sessionpulse/actions/workflows/test.yml"><img alt="tests" src="https://github.com/vijayshuklaHL/sessionpulse/actions/workflows/test.yml/badge.svg"></a>
8
+ <img alt="Python 3.11+" src="https://img.shields.io/badge/python-3.11%2B-3776ab">
9
+ <img alt="No dependencies" src="https://img.shields.io/badge/dependencies-none-2a78d6">
10
+ <img alt="Local only" src="https://img.shields.io/badge/data-stays%20on%20your%20machine-1a7f37">
11
+ <a href="LICENSE"><img alt="MIT licence" src="https://img.shields.io/badge/licence-MIT-555"></a>
12
+ <a href="https://github.com/sponsors/vijayshuklaHL"><img alt="Sponsor on GitHub" src="https://img.shields.io/badge/sponsor-%E2%9D%A4-db61a2?logo=githubsponsors&logoColor=white"></a>
13
+ <a href="https://buymeacoffee.com/vijayshuklahl"><img alt="Buy me a coffee" src="https://img.shields.io/badge/buy%20me%20a-coffee-ffdd00?logo=buymeacoffee&logoColor=000"></a>
14
+ </p>
15
+
16
+ <p align="center"><img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/session-pulse-working-animated.svg" width="760"
17
+ alt="Session Pulse: a terminal prompt whose cursor turns into a pulse line, with Working, Idle and No sessions states"></p>
18
+
19
+ ### See it in action (1 minute)
20
+
21
+ https://github.com/user-attachments/assets/ba0b1bb5-c1b3-4b1a-816a-23b161823a6a
22
+
23
+ <sub>Made-up data throughout. Re-record it with <code>tools/showcase/run.sh</code>.</sub>
24
+
25
+
26
+ ---
27
+
28
+ ## Why
29
+
30
+ If you use [Claude Code](https://code.claude.com/docs/en/overview) every day, you probably have several sessions open across projects. Some are working, some are waiting for you, and some ended an hour ago with *"you still need to decide X, and someone has to approve Y"*. Those loose ends live in scrollback, and scrollback gets cleared.
31
+
32
+ Session Pulse sits next to your clock and keeps it all in one place:
33
+
34
+ - **What's running:** which sessions are open, working or idle, for how long, using how much.
35
+ - **What's left:** when a session goes quiet, Claude lists what it left open (decisions, outside work, checklists, things you're waiting on) and puts it on a board for you.
36
+ - **How you work:** tokens per day by model, real active hours, and tips to get better at Claude Code based on your own habits.
37
+
38
+ It reads the files Claude Code already writes under `~/.claude`. **Nothing leaves your machine.**
39
+
40
+ > Session Pulse is an independent project. It is not made, endorsed or supported by Anthropic.
41
+
42
+ ## Screenshots
43
+
44
+ <p align="center"><img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/overview.jpg" width="900" alt="Overview: live sessions, KPIs, to-do list and completed items"></p>
45
+
46
+ | To-dos that fill themselves | One board for everything you still owe |
47
+ |---|---|
48
+ | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/todo.jpg" alt="To-do list grouped by project, with follow-ups picked up from sessions"> | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/board.jpg" alt="Kanban board with colour-coded columns: Decide, Outside work, Waiting on, Checklist, Later, Added by me, Done"> |
49
+
50
+ | Get better at Claude Code | Light theme |
51
+ |---|---|
52
+ | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/learn.jpg" alt="Suggestions based on your usage, with links to free official docs and courses"> | <img src="https://raw.githubusercontent.com/vijayshuklaHL/sessionpulse/main/docs/images/overview-light.jpg" alt="The overview in the light theme"> |
53
+
54
+ *All screenshots use made-up data (`tools/showcase/`).*
55
+
56
+ ## Features
57
+
58
+ - **Live sessions:** working or idle, running time, last change, tokens, model. The panel icon shows the count and turns orange while Claude is working.
59
+ - **Follow-ups (optional):** Claude reads each session after 20 quiet minutes and adds what was left open to your to-do list, linked back to the session, with a one-click resume command. A later session that finishes an item closes it automatically.
60
+ - **Board:** every to-do as a card, colour-coded by kind (Decide, Outside work, Waiting on, Checklist, Later), or by status (To do, Doing, Done). Drag and drop, project filter, search.
61
+ - **Your own to-dos too:** add them on the dashboard or with `sessionpulse todo add "…"`.
62
+ - **Usage:** input, output and cache tokens per day, split by model; active hours per day; busiest projects.
63
+ - **Starts and exits:** when each session started and ended, and why (`/clear`, Ctrl+D, logout…).
64
+ - **History:** every session, searchable, with a copyable `claude --resume` command.
65
+ - **Get better at Claude Code:** suggestions picked from how you actually work (no `CLAUDE.md` in busy projects, very long sessions, features you haven't tried), with free official docs and Anthropic Academy courses.
66
+ - **Small and private:** standard library only, listens on `127.0.0.1`, needs a token, works in light and dark mode and on a phone screen.
67
+
68
+ ## Install
69
+
70
+ Requires Python 3.11+ and Claude Code.
71
+
72
+ **Linux with the panel icon** (Ubuntu and Debian shown):
73
+
74
+ ```sh
75
+ sudo apt install pipx python3-gi gir1.2-ayatanaappindicator3-0.1
76
+ pipx install --system-site-packages sessionpulse
77
+ sessionpulse install # adds the start/exit hooks and a login autostart
78
+ sessionpulse tray & # start the panel icon now
79
+ ```
80
+
81
+ On GNOME you also need the AppIndicator extension. Ubuntu has it on by default; elsewhere install "AppIndicator and KStatusNotifierItem Support". KDE, Xfce, Cinnamon and MATE need nothing extra.
82
+
83
+ **macOS, or without the panel icon:**
84
+
85
+ ```sh
86
+ pipx install sessionpulse
87
+ sessionpulse install --no-autostart
88
+ sessionpulse serve # then, in another terminal: sessionpulse open
89
+ ```
90
+
91
+ **Turn on follow-ups** (optional, see [what it costs](#follow-ups)):
92
+
93
+ ```sh
94
+ mkdir -p ~/.config/sessionpulse
95
+ echo 'followups = true' >> ~/.config/sessionpulse/config.toml
96
+ sessionpulse followups # read the last 30 days now instead of waiting
97
+ ```
98
+
99
+ Check everything with `sessionpulse doctor`. Remove it with `sessionpulse uninstall` (your data stays) and `pipx uninstall sessionpulse`.
100
+
101
+ ## Commands
102
+
103
+ | Command | What it does |
104
+ |---|---|
105
+ | `sessionpulse install` | Adds SessionStart/SessionEnd hooks to `~/.claude/settings.json` (after backing it up) and a login autostart entry |
106
+ | `sessionpulse uninstall` | Removes exactly those hooks and the autostart entry. Your data stays. |
107
+ | `sessionpulse tray` | Panel icon and dashboard server |
108
+ | `sessionpulse serve` | Dashboard server only |
109
+ | `sessionpulse open` | Opens the dashboard in your browser, signed in (add `#board` to the address for the board) |
110
+ | `sessionpulse doctor` | Checks the setup and warns if Claude Code's file formats look different |
111
+ | `sessionpulse todo [add TEXT -p PROJECT \| done ID \| undo ID \| delete ID \| list-done]` | Your to-do list from the terminal |
112
+ | `sessionpulse followups [--days N] [--session ID] [--now] [--again]` | Read recent sessions now and add their open follow-ups |
113
+ | `sessionpulse snapshot` | Prints the dashboard data as JSON |
114
+
115
+ ## Settings
116
+
117
+ Optional. Create `~/.config/sessionpulse/config.toml` with any of these keys:
118
+
119
+ ```toml
120
+ port = 8765 # dashboard port (on 127.0.0.1)
121
+ refresh_seconds = 5
122
+ claude_dir = "~/.claude" # defaults to $CLAUDE_CONFIG_DIR if that is set
123
+ gap_minutes = 30 # activity closer together than this counts as one block of active time
124
+ min_block_minutes = 15 # shortest block of active time
125
+ followups = false # true: pick open follow-ups out of quiet sessions
126
+ followups_model = "haiku"
127
+ followups_idle_minutes = 20
128
+ followups_days = 30
129
+ followups_parallel = 3
130
+ claude_command = "" # path to `claude` if it isn't on PATH
131
+ ```
132
+
133
+ ### Follow-ups
134
+
135
+ Off by default, because it uses Claude. When on, the dashboard server checks every 5 minutes for sessions that have been quiet for 20 minutes and changed since it last read them. It sends their prompts and Claude's replies to `claude -p` (Haiku by default) and asks only for what's still open. That counts toward your Claude usage: roughly one small Haiku request per session.
136
+
137
+ The request runs with all hooks disabled and `--no-session-persistence`, so it never shows up as a session, in this dashboard or in any hook of yours. Items you dismiss are remembered and not picked up again.
138
+
139
+ ## Privacy and security
140
+
141
+ Transcripts contain everything you type into Claude Code, so the dashboard is locked down:
142
+
143
+ - It listens on `127.0.0.1` only and rejects requests addressed to any other host name (no DNS rebinding).
144
+ - It needs an access token, stored in `~/.local/share/sessionpulse/token` (readable only by you). `sessionpulse open` and the panel menu pass it once; after that it lives in an HttpOnly, SameSite=Strict cookie. The first link with the token in it may stay in your browser history.
145
+ - Changing to-dos needs the cookie, a JSON request and a matching Origin, so other web pages can't add or delete items.
146
+ - Only the artwork under `/brand/` is served without the token.
147
+ - It never writes to Claude Code's files, except `install`/`uninstall`, which edit the `hooks` section of `settings.json` after a timestamped backup.
148
+
149
+ Found a problem? See [SECURITY.md](https://github.com/vijayshuklaHL/sessionpulse/blob/main/SECURITY.md).
150
+
151
+ ## How the numbers are worked out
152
+
153
+ - **Live status** comes from `~/.claude/sessions/<pid>.json`. A session counts as live only while its process is running.
154
+ - **Tokens** come from the `usage` field of assistant messages. Each API response is counted once, and subagent usage is added to the session that started it.
155
+ - **Active time** groups activity into blocks: messages less than 30 minutes apart belong to one block, and every block counts as at least 15 minutes.
156
+ - **Exits** are recorded by the SessionEnd hook, so sessions that ended before you ran `install` show as "Closed".
157
+ - **Cost** is not shown. On a subscription, tokens don't map to a bill, and API prices change.
158
+
159
+ **These file formats are internal to Claude Code and undocumented.** Session Pulse reads them defensively, and the dashboard and `sessionpulse doctor` warn when lines stop parsing, usage disappears, or the Claude Code version is newer than the one last tested. If you see a warning, please [open an issue](https://github.com/vijayshuklaHL/sessionpulse/issues) with your Claude Code version.
160
+
161
+ ## Fork it and make it yours
162
+
163
+ Session Pulse is small on purpose (a few Python files and one HTML page, no build step), so it's easy to bend to how you work. Some ideas:
164
+
165
+ | You want to… | Look at |
166
+ |---|---|
167
+ | Change the colours or layout | the `:root` tokens and sections in `src/sessionpulse/static/dashboard.html` |
168
+ | Use your own logo or artwork | `src/sessionpulse/static/brand/` and `src/sessionpulse/icons/` |
169
+ | Add your team's own learning links or habits to check | `LIBRARY` and `suggest()` in `src/sessionpulse/learn.py` |
170
+ | Change what counts as a follow-up, or the categories | `SYSTEM` and `KINDS` in `src/sessionpulse/followups.py` and `todos.py` |
171
+ | Send follow-ups somewhere else (Linear, Jira, a chat channel) | `todos.merge_followups()` is the one place new items land |
172
+ | Record your own demo video | `tools/showcase/run.sh` (needs Chrome, Node 20+, ffmpeg; uses made-up data) |
173
+
174
+ ```sh
175
+ git clone https://github.com/<you>/sessionpulse && cd sessionpulse
176
+ python3 -m unittest discover -s tests # 38 tests, a few seconds
177
+ PYTHONPATH=src python3 -m sessionpulse serve # then: PYTHONPATH=src python3 -m sessionpulse open
178
+ ```
179
+
180
+ If you build something others would like, a pull request is very welcome. See [CONTRIBUTING.md](https://github.com/vijayshuklaHL/sessionpulse/blob/main/CONTRIBUTING.md). The MIT licence only asks that you keep the copyright notice.
181
+
182
+ ## Support
183
+
184
+ If Session Pulse saves you time:
185
+
186
+ - ⭐ **Star the repo.** It helps other Claude Code users find it.
187
+ - πŸ› **Report bugs or ideas** in [Issues](https://github.com/vijayshuklaHL/sessionpulse/issues).
188
+ - β˜• **[Buy me a coffee](https://buymeacoffee.com/vijayshuklahl)** for a one-off thank-you.
189
+ - πŸ’– **[Sponsor on GitHub](https://github.com/sponsors/vijayshuklaHL)** for monthly support. Even a coffee's worth a month keeps it maintained.
190
+
191
+ ## Licence
192
+
193
+ [MIT](https://github.com/vijayshuklaHL/sessionpulse/blob/main/LICENSE) Β© 2026 Vijay Shukla. Claude and Claude Code are trademarks of Anthropic, used here only to say what this tool works with.
@@ -0,0 +1,49 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "sessionpulse"
7
+ version = "0.1.0"
8
+ description = "A quiet instrument panel for Claude Code: live sessions, usage, and a to-do board that fills itself from your sessions. Local only."
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ license-files = ["LICENSE"]
12
+ authors = [{name = "Vijay Shukla"}]
13
+ keywords = ["claude", "claude-code", "dashboard", "kanban", "todo", "developer-tools", "tray", "productivity"]
14
+ requires-python = ">=3.11"
15
+ dependencies = []
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Environment :: X11 Applications :: GTK",
19
+ "Environment :: Web Environment",
20
+ "Operating System :: POSIX :: Linux",
21
+ "Operating System :: MacOS",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Intended Audience :: Developers",
27
+ "Topic :: Software Development",
28
+ "Topic :: Utilities",
29
+ ]
30
+
31
+ [project.urls]
32
+ Homepage = "https://github.com/vijayshuklaHL/sessionpulse"
33
+ Issues = "https://github.com/vijayshuklaHL/sessionpulse/issues"
34
+ Changelog = "https://github.com/vijayshuklaHL/sessionpulse/blob/main/CHANGELOG.md"
35
+
36
+ [project.optional-dependencies]
37
+ # The panel icon needs PyGObject plus the Ayatana AppIndicator typelib from your
38
+ # distro (Ubuntu: sudo apt install python3-gi gir1.2-ayatanaappindicator3-0.1).
39
+ # Install with `pipx install --system-site-packages sessionpulse` to use them.
40
+ tray = []
41
+
42
+ [project.scripts]
43
+ sessionpulse = "sessionpulse.cli:main"
44
+
45
+ [tool.setuptools.packages.find]
46
+ where = ["src"]
47
+
48
+ [tool.setuptools.package-data]
49
+ sessionpulse = ["static/*.html", "static/brand/*.svg", "icons/*.svg"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """Session Pulse: a local dashboard and panel icon for Claude Code sessions."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,5 @@
1
+ import sys
2
+
3
+ from .cli import main
4
+
5
+ sys.exit(main())