feat: DevDesk v0.1.0, a persistent browser terminal for Claude Code
build-deb / Lint, test, package (push) Canceled after 1m13s
build-deb / Notify on failure (push) Canceled after 0s

ttyd serves a single-file xterm.js UI styled with the LotusGuild TDS
(web_template base.css). Sessions live in a dedicated tmux server unit
(devdesk-tmux.service), so restarting or upgrading the web unit never
stops Claude. Each named session maps to a project directory. A Claude
SessionStart hook records the conversation ID, so after a reboot the
session resumes that exact conversation.

- bin/devdesk: attach / new / ls / end / pick, with an fzf picker
- ttyd requires a credential that NPM injects; origin check enabled
- debian/: dh 13 with --no-stop-on-upgrade for the tmux unit, bundled
  sha256-verified ttyd 1.7.7, lintian overrides, man page
- CI: lint, test, build, smoke-test, artifact; v* tags publish to the
  Gitea apt registry and create a release

Refs: tinker ticket 887531976

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 23:11:07 -04:00
co-authored by Claude Opus 5.5
commit 07a41bd625
52 changed files with 10769 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
.TH DEVDESK 1 "October 2026" "devdesk" "User Commands"
.SH NAME
devdesk \- persistent Claude Code sessions in tmux, shared by the browser and SSH
.SH SYNOPSIS
.B devdesk attach
.RI [ NAME ]
.br
.B devdesk new
.I NAME
.br
.B devdesk ls
.br
.B devdesk pick
.br
.B devdesk end
.I NAME
.SH DESCRIPTION
.B devdesk
manages the named sessions served at https://dev.lotusguild.org. Each session is
a tmux session on the DevDesk server (\fI/run/devdesk/tmux.sock\fR, run by
\fBdevdesk-tmux.service\fR) with a \fIclaude\fR window and a \fIshell\fR window,
rooted in a project directory under \fBDEVDESK_PROJECTS_ROOT\fR.
.PP
Claude's conversation ID is recorded per session, so after a reboot the session
resumes its own conversation.
.SH COMMANDS
.TP
.B attach \fR[\fINAME\fR]
Attach to session \fINAME\fR, creating it if needed. The default session
(\fBmain\fR) uses the projects root; other names map to the project directory of
that name or slug (\(lqtest code\(rq becomes \fBtest-code\fR). Without \fINAME\fR,
opens the picker.
.TP
.B attach --list
Print sessions and projects as JSON (used by the web UI).
.TP
.B new \fINAME\fR
Create session \fINAME\fR detached, if it does not exist.
.TP
.B ls
List running (\(bu) and dormant (\(ci) sessions.
.TP
.B pick
Interactive picker (fzf).
.TP
.B end \fINAME\fR
Stop the session and forget its recorded conversation.
.SH FILES
.TP
.I /etc/devdesk/env
Port, projects root, Claude binary and arguments, Remote Control switch.
.TP
.I /etc/devdesk/secret.env
ttyd credential; the reverse proxy must send it as HTTP basic auth.
.TP
.I /var/lib/devdesk/registry.json
Session to directory and Claude session ID mapping.
.SH SEE ALSO
.BR tmux (1),
.BR claude (1)