You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -81,6 +81,9 @@ graph LR
81
81
```bash
82
82
# Study sessions (tmux + AI agent + sidebar)
83
83
studyctl study "topic" --energy 7 # Full tmux environment in one command
84
+
studyctl study "topic" --web # Also start web dashboard + auto-open browser
85
+
studyctl study "topic" --lan # LAN access with password auth (implies --web)
86
+
studyctl study "topic" --lan --password SECRET # Explicit LAN password
84
87
studyctl study --resume # Resume conversation from history
85
88
studyctl study --end # End session (quit Claude also works)
86
89
studyctl park "question"# Park tangential topic
@@ -140,6 +143,7 @@ Launch with `studyctl web`. Accessible from any device on the network.
140
143
- Timer with energy-adaptive colour phases (green/amber/red)
141
144
- Topic counters (wins, parked, review)
142
145
- Session summary on completion
146
+
-**Terminal panel** — embedded ttyd iframe proxied same-origin at `/terminal/` with draggable split-pane (stacked or side-by-side). Pop-out to new window and seamless return. HTTP Basic Auth when using `--lan`. Requires ttyd (optional but recommended).
- Optional web dashboard at `/session` via `--web`
82
+
-`--web` auto-opens a browser to the dashboard on startup
83
+
-`--lan` binds the web server and ttyd to `0.0.0.0` with HTTP Basic Auth, prints dashboard URL and password (implies `--web`). Password is auto-generated if not set via `--password` or `lan_password` in config
84
+
-`--password SECRET` sets the LAN authentication password (used with `--lan`)
80
85
81
86
**Session lifecycle:**
82
87
-**Start:**`studyctl study "topic"` — creates tmux session, agent, sidebar
@@ -153,10 +158,21 @@ studyctl web --host localhost # Local only
153
158
154
159
**Features:** Source/chapter filter, card count limiter (10/20/50/100/All), due cards badge, session history, 90-day study heatmap, Pomodoro timer (25min/5min), OpenDyslexic font toggle, dark/light theme, PWA installable.
155
160
161
+
**Live session dashboard** (`/session`): Real-time SSE activity feed, energy-adaptive timer, topic counters, and a **terminal panel** — an embedded ttyd iframe showing the tmux session live via same-origin proxy (`/terminal/`). The panel is draggable (stacked or side-by-side), has a layout toggle and panel-swap buttons, and can be popped out to a separate window (pop-out auto-closes when returning inline). ttyd is optional (`brew install ttyd`) but required for the terminal panel.
162
+
156
163
**Voice:** Uses Web Speech API (browser built-in). Two modes:
157
164
-**Read once** — speaker icon on card or `T` key
158
165
-**Auto-voice** — header toggle or `V` key (reads everything automatically)
Copy file name to clipboardExpand all lines: docs/setup-guide.md
+32Lines changed: 32 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,6 +24,7 @@ Step-by-step installation and configuration for Socratic Study Mentor.
24
24
-**Obsidian** — for study notes (any vault structure works)
25
25
-**Optional**: `notebooklm-py` for Google NotebookLM sync
26
26
-**Optional**: `sentence-transformers` for semantic search
27
+
-**Optional**: `ttyd` — enables web terminal access from browser or iPad (`brew install ttyd` on macOS, `apt install ttyd` on Linux)
27
28
28
29
> **tmux-resurrect / tmux-continuum users**: studyctl automatically cleans up
29
30
> zombie sessions on startup, so resurrect-restored sessions are handled
@@ -173,6 +174,27 @@ Two voice modes in the PWA:
173
174
174
175
**Accessibility:** The `Aa` button toggles [OpenDyslexic](https://opendyslexic.org) font. The sun icon toggles light/dark theme. Both are persisted across sessions.
175
176
177
+
### Remote Study (iPad on the Bus)
178
+
179
+
Use `--lan` to make the web dashboard and terminal accessible from any device on your network — phone, iPad, second laptop:
180
+
181
+
```bash
182
+
studyctl study "Python Decorators" --energy 7 --lan
183
+
# Auto-generates password and saves LAN info to session state:
184
+
# Dashboard: http://192.168.1.42:8567/session
185
+
# Password: <auto-generated>
186
+
187
+
# Or set a known password:
188
+
studyctl study "Python Decorators" --energy 7 --lan --password mysecret
189
+
```
190
+
191
+
Access the live dashboard and embedded terminal from your iPad at `http://<mac-ip>:8567/session`. Enter any username and the displayed password when prompted. The terminal panel (ttyd iframe) is proxied through the web server on the same origin, so pop-out/return works seamlessly. ttyd must be installed for the terminal panel to work (`brew install ttyd`).
192
+
193
+
**Password sources** (checked in order):
194
+
1. `--password` CLI flag
195
+
2. `lan_password` in `~/.config/studyctl/config.yaml`
196
+
3. Auto-generated (displayed in terminal output, saved to session state)
Copy file name to clipboardExpand all lines: packages/studyctl/pyproject.toml
+7-1Lines changed: 7 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -26,7 +26,7 @@ dependencies = [
26
26
content = ["pymupdf>=1.25", "httpx"]
27
27
notebooklm = ["notebooklm-py>=0.3.4"]
28
28
tui = ["textual>=0.80"]
29
-
web = ["fastapi>=0.115", "uvicorn[standard]>=0.34"]
29
+
web = ["fastapi>=0.115", "uvicorn[standard]>=0.34", "httpx>=0.27", "websockets>=12.0"]
30
30
mcp = ["mcp[cli]>=1.0.0"]
31
31
all = ["studyctl[content,web,notebooklm,tui,mcp]"]
32
32
@@ -52,9 +52,15 @@ testpaths = ["tests"]
52
52
addopts = "--tb=short -m 'not integration'"
53
53
markers = [
54
54
"integration: requires external infrastructure (tmux, real DB, network)",
55
+
"e2e: end-to-end browser tests requiring Playwright + web server",
55
56
]
56
57
57
58
[tool.pyright]
58
59
pythonVersion = "3.12"
59
60
typeCheckingMode = "basic"
60
61
exclude = ["src/studyctl/tui", "src/studyctl/content", "src/studyctl/cli/_content.py", "src/studyctl/cli/_web.py", "src/studyctl/web", "src/studyctl/mcp"] # optional deps not in CI
0 commit comments