Skip to content

Commit a67adfe

Browse files
author
committed
Deployed 4ad808e with MkDocs version: 1.6.1
1 parent a914a7c commit a67adfe

6 files changed

Lines changed: 110 additions & 9 deletions

File tree

cli-reference.html

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,8 @@ <h3 id="study-sessions">Study Sessions<a class="headerlink" href="#study-session
11441144
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;Spark Internals&quot;</span><span class="w"> </span>--mode<span class="w"> </span>co-study<span class="w"> </span><span class="c1"># User-driven co-study</span>
11451145
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;topic&quot;</span><span class="w"> </span>--timer<span class="w"> </span>pomodoro<span class="w"> </span><span class="c1"># Override default timer</span>
11461146
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;topic&quot;</span><span class="w"> </span>--agent<span class="w"> </span>claude<span class="w"> </span>--web<span class="w"> </span><span class="c1"># Explicit agent + web dashboard</span>
1147+
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;topic&quot;</span><span class="w"> </span>--lan<span class="w"> </span><span class="c1"># Bind to 0.0.0.0, password-protected (implies --web)</span>
1148+
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;topic&quot;</span><span class="w"> </span>--lan<span class="w"> </span>--password<span class="w"> </span>SECRET<span class="w"> </span><span class="c1"># Explicit password for LAN auth</span>
11471149
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;topic&quot;</span><span class="w"> </span>--agent<span class="w"> </span>ollama<span class="w"> </span><span class="c1"># Local LLM via Ollama + LiteLLM</span>
11481150
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;topic&quot;</span><span class="w"> </span>--agent<span class="w"> </span>lmstudio<span class="w"> </span><span class="c1"># Local LLM via LM Studio</span>
11491151
studyctl<span class="w"> </span>study<span class="w"> </span>--resume<span class="w"> </span><span class="c1"># Resume conversation (-r)</span>
@@ -1156,7 +1158,10 @@ <h3 id="study-sessions">Study Sessions<a class="headerlink" href="#study-session
11561158
- Persistent session directory at <code>~/.config/studyctl/sessions/{name}/</code> — preserves AI conversation history (<code>.claude/</code>, <code>.kiro/</code>, etc.)
11571159
- Sidebar shows timer, activity feed, counters (keyboard: <code>p</code> pause, <code>r</code> reset, <code>Q</code> end session)
11581160
- IPC files for dashboard viewports
1159-
- Optional web dashboard at <code>/session</code> via <code>--web</code></p>
1161+
- Optional web dashboard at <code>/session</code> via <code>--web</code>
1162+
- <code>--web</code> auto-opens a browser to the dashboard on startup
1163+
- <code>--lan</code> binds the web server and ttyd to <code>0.0.0.0</code> with HTTP Basic Auth, prints dashboard URL and password (implies <code>--web</code>). Password is auto-generated if not set via <code>--password</code> or <code>lan_password</code> in config
1164+
- <code>--password SECRET</code> sets the LAN authentication password (used with <code>--lan</code>)</p>
11601165
<p><strong>Session lifecycle:</strong>
11611166
- <strong>Start:</strong> <code>studyctl study "topic"</code> — creates tmux session, agent, sidebar
11621167
- <strong>Exit:</strong> quit Claude normally (<code>/exit</code>, Ctrl+C) — auto-cleans up tmux, IPC files, switches back to previous session. Session directory preserved.
@@ -1293,9 +1298,16 @@ <h3 id="web-pwa">Web PWA<a class="headerlink" href="#web-pwa" title="Permanent l
12931298
</tbody>
12941299
</table>
12951300
<p><strong>Features:</strong> 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.</p>
1301+
<p><strong>Live session dashboard</strong> (<code>/session</code>): Real-time SSE activity feed, energy-adaptive timer, topic counters, and a <strong>terminal panel</strong> — an embedded ttyd iframe showing the tmux session live via same-origin proxy (<code>/terminal/</code>). 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 (<code>brew install ttyd</code>) but required for the terminal panel.</p>
12961302
<p><strong>Voice:</strong> Uses Web Speech API (browser built-in). Two modes:
12971303
- <strong>Read once</strong> — speaker icon on card or <code>T</code> key
12981304
- <strong>Auto-voice</strong> — header toggle or <code>V</code> key (reads everything automatically)</p>
1305+
<p><strong>Web + terminal config</strong> (<code>~/.config/studyctl/config.yaml</code>):</p>
1306+
<div class="highlight"><pre><span></span><code><span class="nt">web_port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8567</span><span class="w"> </span><span class="c1"># web dashboard port (default 8567)</span>
1307+
<span class="nt">ttyd_port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7681</span><span class="w"> </span><span class="c1"># ttyd web terminal port (default 7681)</span>
1308+
<span class="nt">browser</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="c1"># auto-open browser: chrome, safari, firefox, brave, or empty for system default</span>
1309+
<span class="nt">lan_password</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="c1"># persistent password for --lan mode (auto-generated if empty)</span>
1310+
</code></pre></div>
12991311
<hr />
13001312
<h2 id="agent-session-tools">agent-session-tools<a class="headerlink" href="#agent-session-tools" title="Permanent link">&para;</a></h2>
13011313
<p>AI session export, search, and cross-machine sync.</p>

roadmap.html

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,11 +2039,19 @@ <h2 id="next-v220-remote-study-local-llms">Next: v2.2.0 — Remote Study + Local
20392039
<p>Study from any device (iPad, laptop, phone) via ttyd + web dashboard, with optional local LLMs.</p>
20402040
<h3 id="ttyd-integration-embedded-web-pane">ttyd Integration + Embedded Web Pane<a class="headerlink" href="#ttyd-integration-embedded-web-pane" title="Permanent link">&para;</a></h3>
20412041
<ul>
2042-
<li>[ ] <code>studyctl study --lan</code> starts ttyd alongside tmux session (port 7681)</li>
2043-
<li>[ ] Embed ttyd as iframe in existing web dashboard</li>
2044-
<li>[ ] "Open Study Agent Session" button — iframe split (default) + pop-out new window</li>
2045-
<li>[ ] Doctor check for ttyd binary</li>
2046-
<li>[ ] Config support for ttyd port</li>
2042+
<li>[x] <code>studyctl study --lan</code> starts ttyd alongside tmux session (port 7681)</li>
2043+
<li>[x] Embed ttyd as iframe in existing web dashboard</li>
2044+
<li>[x] "Open Study Agent Session" button — iframe split (default) + pop-out new window</li>
2045+
<li>[x] Doctor check for ttyd binary</li>
2046+
<li>[x] Config support for ttyd port</li>
2047+
<li>[x] Draggable split-pane layout (stacked/side-by-side)</li>
2048+
<li>[x] Browser auto-open with configurable browser</li>
2049+
<li>[x] Claude Code trust bypass (<code>hasTrustDialogAccepted</code>)</li>
2050+
<li>[x] <code>window-size largest</code> tmux option for multi-client compatibility</li>
2051+
<li>[x] Same-origin reverse proxy — ttyd proxied through FastAPI at <code>/terminal/</code> (HTTP + WebSocket)</li>
2052+
<li>[x] Pop-out/return persistence — iframe stays in DOM (visibility CSS), pop-out auto-closes on return</li>
2053+
<li>[x] LAN password protection — HTTP Basic Auth middleware, auto-generated or explicit <code>--password</code></li>
2054+
<li>[x] <code>lan_password</code> config option for persistent password</li>
20472055
</ul>
20482056
<h3 id="local-llms-via-ollama-lm-studio">Local LLMs via Ollama / LM Studio<a class="headerlink" href="#local-llms-via-ollama-lm-studio" title="Permanent link">&para;</a></h3>
20492057
<ul>

search/search_index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

setup-guide.html

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,17 @@
495495
</span>
496496
</a>
497497

498+
</li>
499+
500+
<li class="md-nav__item">
501+
<a href="#remote-study-ipad-on-the-bus" class="md-nav__link">
502+
<span class="md-ellipsis">
503+
504+
Remote Study (iPad on the Bus)
505+
506+
</span>
507+
</a>
508+
498509
</li>
499510

500511
<li class="md-nav__item">
@@ -556,6 +567,17 @@
556567
</span>
557568
</a>
558569

570+
</li>
571+
572+
<li class="md-nav__item">
573+
<a href="#web-terminal-settings" class="md-nav__link">
574+
<span class="md-ellipsis">
575+
576+
Web Terminal Settings
577+
578+
</span>
579+
</a>
580+
559581
</li>
560582

561583
<li class="md-nav__item">
@@ -1535,6 +1557,17 @@
15351557
</span>
15361558
</a>
15371559

1560+
</li>
1561+
1562+
<li class="md-nav__item">
1563+
<a href="#remote-study-ipad-on-the-bus" class="md-nav__link">
1564+
<span class="md-ellipsis">
1565+
1566+
Remote Study (iPad on the Bus)
1567+
1568+
</span>
1569+
</a>
1570+
15381571
</li>
15391572

15401573
<li class="md-nav__item">
@@ -1596,6 +1629,17 @@
15961629
</span>
15971630
</a>
15981631

1632+
</li>
1633+
1634+
<li class="md-nav__item">
1635+
<a href="#web-terminal-settings" class="md-nav__link">
1636+
<span class="md-ellipsis">
1637+
1638+
Web Terminal Settings
1639+
1640+
</span>
1641+
</a>
1642+
15991643
</li>
16001644

16011645
<li class="md-nav__item">
@@ -1999,6 +2043,7 @@ <h2 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites"
19992043
<li><strong>Obsidian</strong> — for study notes (any vault structure works)</li>
20002044
<li><strong>Optional</strong>: <code>notebooklm-py</code> for Google NotebookLM sync</li>
20012045
<li><strong>Optional</strong>: <code>sentence-transformers</code> for semantic search</li>
2046+
<li><strong>Optional</strong>: <code>ttyd</code> — enables web terminal access from browser or iPad (<code>brew install ttyd</code> on macOS, <code>apt install ttyd</code> on Linux)</li>
20022047
</ul>
20032048
<blockquote>
20042049
<p><strong>tmux-resurrect / tmux-continuum users</strong>: studyctl automatically cleans up
@@ -2109,6 +2154,21 @@ <h3 id="web-pwa-recommended">Web PWA (recommended)<a class="headerlink" href="#w
21092154
- <strong>Read once</strong> — tap the speaker icon on a card, or press <code>T</code>. Reads the current content once.
21102155
- <strong>Auto-voice</strong> — toggle the header speaker icon, or press <code>V</code>. Reads everything automatically as you navigate.</p>
21112156
<p><strong>Accessibility:</strong> The <code>Aa</code> button toggles <a href="https://opendyslexic.org">OpenDyslexic</a> font. The sun icon toggles light/dark theme. Both are persisted across sessions.</p>
2157+
<h3 id="remote-study-ipad-on-the-bus">Remote Study (iPad on the Bus)<a class="headerlink" href="#remote-study-ipad-on-the-bus" title="Permanent link">&para;</a></h3>
2158+
<p>Use <code>--lan</code> to make the web dashboard and terminal accessible from any device on your network — phone, iPad, second laptop:</p>
2159+
<div class="highlight"><pre><span></span><code>studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;Python Decorators&quot;</span><span class="w"> </span>--energy<span class="w"> </span><span class="m">7</span><span class="w"> </span>--lan
2160+
<span class="c1"># Auto-generates password and saves LAN info to session state:</span>
2161+
<span class="c1"># Dashboard: http://192.168.1.42:8567/session</span>
2162+
<span class="c1"># Password: &lt;auto-generated&gt;</span>
2163+
2164+
<span class="c1"># Or set a known password:</span>
2165+
studyctl<span class="w"> </span>study<span class="w"> </span><span class="s2">&quot;Python Decorators&quot;</span><span class="w"> </span>--energy<span class="w"> </span><span class="m">7</span><span class="w"> </span>--lan<span class="w"> </span>--password<span class="w"> </span>mysecret
2166+
</code></pre></div>
2167+
<p>Access the live dashboard and embedded terminal from your iPad at <code>http://&lt;mac-ip&gt;:8567/session</code>. 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 (<code>brew install ttyd</code>).</p>
2168+
<p><strong>Password sources</strong> (checked in order):
2169+
1. <code>--password</code> CLI flag
2170+
2. <code>lan_password</code> in <code>~/.config/studyctl/config.yaml</code>
2171+
3. Auto-generated (displayed in terminal output, saved to session state)</p>
21122172
<h3 id="hosts-cross-machine-sync">Hosts — Cross-Machine Sync<a class="headerlink" href="#hosts-cross-machine-sync" title="Permanent link">&para;</a></h3>
21132173
<h4 id="prerequisites-passwordless-ssh">Prerequisites: Passwordless SSH<a class="headerlink" href="#prerequisites-passwordless-ssh" title="Permanent link">&para;</a></h4>
21142174
<p>Cross-machine sync uses SSH and rsync under the hood. <strong>Passwordless SSH must be configured</strong> between all machines before sync will work. If you're prompted for a password, sync will hang or fail.</p>
@@ -2272,6 +2332,13 @@ <h3 id="database-search-settings">Database &amp; Search Settings<a class="header
22722332
- <code>DATABASE_PATH</code> — override database location
22732333
- <code>LOG_LEVEL</code> — set logging level (DEBUG, INFO, WARNING, ERROR)
22742334
- <code>EMBEDDING_MODEL</code> — override embedding model</p>
2335+
<h3 id="web-terminal-settings">Web Terminal Settings<a class="headerlink" href="#web-terminal-settings" title="Permanent link">&para;</a></h3>
2336+
<div class="highlight"><pre><span></span><code><span class="c1"># Web terminal (optional — requires ttyd installed)</span>
2337+
<span class="nt">ttyd_port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7681</span><span class="w"> </span><span class="c1"># ttyd listens on this port (default 7681)</span>
2338+
<span class="nt">web_port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8567</span><span class="w"> </span><span class="c1"># web dashboard port (default 8567)</span>
2339+
<span class="nt">browser</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="c1"># auto-open browser: chrome, safari, firefox, brave, or empty for system default</span>
2340+
<span class="nt">lan_password</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="c1"># persistent LAN password (auto-generated per session if empty)</span>
2341+
</code></pre></div>
22752342
<h3 id="tts-voice-settings">TTS Voice Settings<a class="headerlink" href="#tts-voice-settings" title="Permanent link">&para;</a></h3>
22762343
<div class="highlight"><pre><span></span><code><span class="nt">tts</span><span class="p">:</span>
22772344
<span class="w"> </span><span class="nt">voice</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">am_michael</span><span class="w"> </span><span class="c1"># kokoro voice (am_michael, af_heart, bf_emma, etc.)</span>

system-overview.html

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,9 @@ <h2 id="the-big-picture">The Big Picture<a class="headerlink" href="#the-big-pic
10311031
TMUX --&gt; AGENT
10321032
TMUX --&gt; SIDEBAR
10331033
STUDY -.-&gt;|"--web"| DASH
1034+
STUDY -.-&gt;|"--lan"| TTYD["ttyd&lt;br/&gt;(port 7681)"]
1035+
TTYD -.-&gt;|"attaches to"| TMUX
1036+
DASH -.-&gt;|"/terminal/ proxy"| TTYD
10341037
AGENT --&gt;|writes| IPC
10351038
SIDEBAR --&gt;|polls| IPC
10361039
DASH --&gt;|polls SSE| IPC
@@ -1129,11 +1132,17 @@ <h3 id="2-study-sessions-one-command-full-environment">2. Study Sessions — One
11291132
U-&gt;&gt;CLI: studyctl study "Decorators" --energy 7
11301133
CLI-&gt;&gt;DB: start_study_session()
11311134
CLI-&gt;&gt;IPC: Write session-state.json + empty topics/parking
1132-
CLI-&gt;&gt;TMUX: Create session (cwd=sessions/study-decorators-xxx/)
1135+
CLI-&gt;&gt;TMUX: Create session (cwd=sessions/study-decorators-xxx/, window-size largest)
11331136
CLI-&gt;&gt;TMUX: Split pane 75/25
11341137
TMUX-&gt;&gt;AGENT: Main pane: claude --append-system-prompt-file persona.md
11351138
TMUX-&gt;&gt;TUI: Sidebar pane: python -m studyctl.tui.sidebar
11361139

1140+
opt --lan flag
1141+
CLI-&gt;&gt;WEB: Start ttyd (attaches to tmux session, port 7681)
1142+
CLI-&gt;&gt;WEB: Start web with Basic Auth + ttyd proxy
1143+
Note over WEB: Web dashboard proxies ttyd at /terminal/&lt;br/&gt;(same-origin — pop-out/return preserves WS)&lt;br/&gt;HTTP Basic Auth protects all routes on LAN
1144+
end
1145+
11371146
loop Every 2 seconds
11381147
TUI-&gt;&gt;IPC: stat() mtime check
11391148
IPC--&gt;&gt;TUI: Update timer, activity, counters
@@ -1542,6 +1551,11 @@ <h2 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites"
15421551
<td><code>brew install tmux</code> / <code>apt install tmux</code></td>
15431552
</tr>
15441553
<tr>
1554+
<td>ttyd</td>
1555+
<td>Optional — remote terminal (<code>--lan</code>)</td>
1556+
<td><code>brew install ttyd</code> / <code>apt install ttyd</code></td>
1557+
</tr>
1558+
<tr>
15451559
<td>Claude Code</td>
15461560
<td>For AI study sessions</td>
15471561
<td><code>npm install -g @anthropic-ai/claude-code</code></td>

0 commit comments

Comments
 (0)