devdesk (0.10.1) bookworm; urgency=medium * Everything in 0.10.0, which was never published: its CI test for the usage ping depended on attaching a tmux client. * The usage ping counts you as away the same way "Claude needs you" does: no DevDesk tab in view for ~2 minutes. A forgotten background tab no longer silences it. -- Jared Vititoe Mon, 12 Oct 2026 01:45:00 -0400 devdesk (0.10.0) bookworm; urgency=medium * Matrix "Claude needs you" is quieter and says what is asked (#50): - Claude's idle reminder after a turn no longer counts as a wait: no red session, no inbox entry and no Matrix post. - Posts only when no DevDesk tab has been in view for ~2 minutes, after 60 s, and at most once per session per 10 minutes (DEVDESK_MATRIX_QUIET). - The message names the tool, its description and the command. * Own git worktree per session (#44): `devdesk new NAME PROJECT --worktree` or a checkbox in the New session form. It uses branch devdesk/NAME in $ROOT/.worktrees. Ending the session removes the worktree if it is clean, and the branch if it is merged. * Plan meters show when each window resets. If the pace so far would use a window up before then, they warn instead. Matrix gets one message per 5-hour window past DEVDESK_USAGE_WARN (90%) when no tab is in view (#45). * Repo panel lists the changed files; a click opens the diff (#46). * Copy Claude's last reply as Markdown: a session button and a palette entry, backed by `--last-reply` (#47). * Turn timer in the session chip, the tab title and session cards (#48). * Compact button when the context is 80% full and Claude is idle (#49). -- Jared Vititoe Sun, 11 Oct 2026 23:30:00 -0400 devdesk (0.9.5) bookworm; urgency=medium * Context use is shown in tokens as well as percent (#43): Claude's footer shows "ctx 34% 346k/1M", and the Sessions panel and session switcher show "ctx 34% · 346k/1M". -- Jared Vititoe Sun, 11 Oct 2026 23:07:00 -0400 devdesk (0.9.4) bookworm; urgency=medium * The inbox badge no longer only grows (#42). Opening the bell marks its events seen, leaving just what is live (sessions waiting on you, firing alerts). Viewing a session reads the events it reported while you were away. -- Jared Vititoe Sun, 11 Oct 2026 22:46:00 -0400 devdesk (0.9.3) bookworm; urgency=medium * Claude's footer shows 5-hour plan use instead of a dollar figure on a Pro/Max subscription (#40). Claude Code's cost is an API-price estimate, not a bill; it is still shown for API-key billing. The Sessions tooltip follows the same rule. * The bottom row is larger and easier to read (#41): 40px tall, larger hints, and 5h/week usage meters in bold monospace with wider bars. Narrow windows drop the least-used hints instead of clipping the meters. * Tests clear inherited DevDesk variables, so they pass when run from inside a DevDesk session. -- Jared Vititoe Sun, 11 Oct 2026 22:08:00 -0400 devdesk (0.9.2) bookworm; urgency=medium * Ops Alerts → Ask Claude starts an investigation (#39): - It opens a new session (alert-) and starts Claude with the prompt already sent, instead of typing it into the current session. Clicking again opens the running session. - The server writes the prompt from Grafana: rule, query, summary, details, labels, and where the alert runs. That is the Proxmox CT/VM id, the node it is on right now, its state and HA state, and the `ssh pct exec --` line. - Each alert card shows that guest or node. * `devdesk guests [ID|IP|NAME]`: Proxmox guests with their current node, status, HA state and IPs, read over SSH from DEVDESK_PVE_NODES. CT IPs come from lxc-info, VM IPs from the guest agent. Cached in /var/lib/devdesk/guests.json; stopped guests keep their last-seen IPs. -- Jared Vititoe Sun, 11 Oct 2026 11:23:53 -0400 devdesk (0.9.1) bookworm; urgency=medium * Robustness (#12): - A resume that fails (an early Ctrl+C, a network error) no longer replaces the session's recorded conversation with a new one: Claude starts fresh only when the conversation's file is really gone; otherwise the menu offers to try again. - The SessionStart hook reads the session name under the registry lock that rename holds, so renaming during /clear or a restart can't leave the conversation id under the old name. - Env files are parsed the way systemd parses them instead of being sourced: values are literal (no $ expansion or command substitution), and bad lines are reported and skipped. - Deploys wait for the dpkg lock (120 s), log an explicit "deploy FAILED" line, and the webhook answers with the result, so CI's deploy job fails (and alerts) when the install fails. The deploy log is rotated monthly. - postinst removes the duplicate tmux terminal-features entries left by upgrades before 0.3.1. - Temp files of hooks killed mid-write are swept. - NPM now sends X-Frame-Options DENY and CSP frame-ancestors 'none' for dev.lotusguild.org (proxy config, not part of the package). -- Jared Vititoe Sun, 11 Oct 2026 01:01:33 -0400 devdesk (0.9.0) bookworm; urgency=medium * Search past conversations (#24): every Claude conversation on this host (DevDesk and code-server), by what you asked, what Claude said, the commands it ran and their output (⋯ menu or the palette). Results show the title, folder, dates and highlighted snippets; Resume opens the conversation in a new session in its folder, Fork continues it as a new conversation (claude --fork-session) and leaves the original as it is. A conversation already open in a running session offers "Open" instead, and resuming it twice is refused. * Plan usage and PRs (#25): the 5-hour and weekly plan windows from Claude's statusLine, as meters in the footer (⋯ menu on phones), with a warning at 90 % of the 5-hour window; a PR chip (with review state) on sessions whose branch has a pull request. (The statusLine has no prompt cache expiry, so there is no cache timer.) * Phone pushes held back while you're at the desk (#26): while a DevDesk tab shows a session, its Claude sees a client-presence marker (CLAUDE_CLIENT_PRESENCE_FILE) and Remote Control holds back pushes; the marker expires about 2 minutes after the tab stops showing it. Applies to sessions whose Claude started on this version (/exit, then ⏎). -- Jared Vititoe Sat, 10 Oct 2026 21:44:07 -0400 devdesk (0.8.2) bookworm; urgency=medium * Click file paths in the terminal (#21): a path Claude prints (web/src/files.js, ./notes.md:12, /root/code/x/y.py:3) is a link when it is a file of the session; it opens in Files, at that line if given. * Alerts: "In a new session" (#18) opens (or reuses) alert- in the default folder and types the investigation prompt there once Claude is up, without sending it. * Ops trail and guard (#27): - devdesk-guard, a PreToolUse hook for Bash, makes Claude ask before commands that destroy things (pct/qm destroy, zfs/zpool destroy, Ceph pool/OSD removal, rbd rm, wipefs/mkfs/dd to /dev, rm -r of / or a top-level folder, git push --force, DROP TABLE, stopping devdesk-tmux, reboot/poweroff…), also in auto mode. It never blocks or allows on its own. DEVDESK_GUARD=0 turns it off; /etc/devdesk/guard.local adds rules (regexreason). - Every Bash command is logged per session (last 500); sessions are tagged with the hosts they work on (ssh targets, CT/VM ids), shown in the session list, the switcher and the palette; Peek lists the last commands. * Sessions pick up the new hooks when Claude next starts (/exit, then ⏎). -- Jared Vititoe Sat, 10 Oct 2026 20:36:32 -0400 devdesk (0.8.1) bookworm; urgency=medium * Answer sessions from the 🔔 inbox without switching to them: - Allow / Deny (#22): a PermissionRequest hook records what Claude wants to run (tool, command/file/URL, Claude's description); the inbox shows it with Allow, Deny and Open. The key is pressed in that session's Claude window only if the same wait is still on and the permission prompt is on screen, so a stale button never types into Claude. - Peek & reply (#23): the last thing you asked and Claude's latest answer (from the session's transcript), and a reply box; the reply is pasted as one bracketed paste and sent. Available for sessions that wait for input and from "finished" entries. - Matrix "needs you" messages include the command. * New attach commands: --answer SESSION SINCE allow|deny, --peek SESSION, --reply SESSION BYTES (text streamed like uploads). * Sessions pick up the new PermissionRequest hook when Claude next starts (/exit, then ⏎). -- Jared Vititoe Sat, 10 Oct 2026 20:22:37 -0400 devdesk (0.8.0) bookworm; urgency=medium * Edit and save files in the Files pane (#20): - Text files open editable; ● marks unsaved tabs; Ctrl+S or Save writes through `devdesk attach --fs-write`: a temp file in the same folder, mode and owner kept, swapped in with mv. - Conflict detection: the save carries the sha256 of the version you opened; if Claude (or anyone) changed the file since, nothing is written and you choose Compare (diff of disk vs yours), Overwrite or Cancel. - A file that changes on disk while you edit it shows a banner (Compare, Reload, Keep mine) instead of replacing your text; clean files still reload in place. - Unsaved edits are mirrored to the browser as drafts (flushed when the page closes), so a reload, a crash or a session switch doesn't lose them; a draft for a file that changed since offers Compare/Restore/ Discard. - Closing a tab with unsaved changes asks Save / Don't save / Cancel; leaving the page warns. - + New file (missing folders are created; never outside the session folder, and never through a symlink out of it). - Markdown previews show unsaved Source edits. Latin-1 files stay read-only. -- Jared Vititoe Sat, 10 Oct 2026 20:09:49 -0400 devdesk (0.7.3) bookworm; urgency=medium * Fix (#38): links that mean "go to that session" no longer re-create one that was ended. The 🔔 inbox, the session switcher, palette switches, the "needs you" chip and Matrix links (now ?arg=NAME&existing=1) open sessions existing-only; an ended one shows "NAME has ended" with an explicit "Start NAME again". Inbox entries for ended sessions are marked as such, and entries older than 7 days are dropped. -- Jared Vititoe Sat, 10 Oct 2026 19:57:52 -0400 devdesk (0.7.2) bookworm; urgency=medium * Fix: Go to file failed in big non-git folders such as /root/code: the file walk was cut off at its cap with SIGPIPE, which failed the command and truncated its reply. Producers piped into a cap now tolerate it (also for very large folders and git status). Outside git, Go to file skips build/cache folders and stops at 10,000 files. * Large side-channel replies no longer cost quadratic time in the browser. -- Jared Vititoe Thu, 08 Oct 2026 01:50:50 -0400 devdesk (0.7.1) bookworm; urgency=medium * Files pane reworked like VS Code (#37): - Explorer tree beside the editor: folders expand in place (also with the keyboard: arrows, Enter), the open file is highlighted and can be revealed, git colours on names, change dots on folders, gitignored entries dimmed, file-type badges. A drag handle sizes the explorer. - Tabs: a click opens a preview tab (italic) that the next click replaces; double-click or Enter keeps it. Switching tabs is instant and keeps the scroll position. Files Claude changes reload in place. - Go to file (Ctrl+P in the pane, the ⌕ button, the palette): fuzzy search over git ls-files, or a capped find outside git. - Explorer and Changes are two views of the left column; diffs open as tabs. - Expanded folders, open tabs and the active tab are remembered per session; an empty editor offers recent files and the change count. - Narrow panes and phones: the explorer slides over the editor. -- Jared Vititoe Thu, 08 Oct 2026 01:40:47 -0400 devdesk (0.7.0) bookworm; urgency=medium * Files pane (#19): a Files button (Ctrl+Shift+E) next to Panels opens the session's folder beside the terminal (a drag-resizable split on wide screens, an overlay on narrow ones and phones). - Browse folders; read files with syntax highlighting (CodeMirror, read-only, Ctrl+F search, line wrap toggle), markdown rendered as a sanitized preview with its relative images, images shown inline. - Changes tab: uncommitted git changes with line counts and a "C" badge on files Claude edited (recorded by the state hook from Edit/Write); diff against HEAD for any changed file. Non-git sessions list the files Claude edited there. - "→ Claude" types @path into the prompt; Copy path. - After Claude's turn the list refreshes, and an open file that changed on disk offers a reload. - Paths stay inside the session folder (no absolute paths, no symlink escapes). Read-only for now; editing is v0.8.0. - The editor (~600 KB) is not in the page: it ships in /usr/share/devdesk/assets, is fetched over ttyd the first time Files opens, checked against the page's SHA-256 and cached in the browser. * Fix: the state hook mis-read hook fields when Claude's message was empty. -- Jared Vititoe Thu, 08 Oct 2026 01:16:26 -0400 devdesk (0.6.1) bookworm; urgency=medium * Inbox bell (#36): sessions waiting on you, firing alerts, and what happened while you were away (a background session finished or started waiting, CI passed or failed). Click to jump there; shared by all tabs. Replaces the count on the Panels button. * Phone header: theme in the ⋯ menu, Panels as an icon, so the bell fits. -- Jared Vititoe Thu, 08 Oct 2026 00:50:56 -0400 devdesk (0.6.0) bookworm; urgency=medium * Light mode, like the other web_template apps (#31): the ☀/◐ button in the header, shared lt_theme preference (OS setting until you choose), applied before first paint and synced across tabs. The terminal has a light palette; Claude runs with its dark-ansi theme so its colours come from that palette, and the light palette maps bright white to ink, so Claude's text, scrollback included, stays readable in both modes. tmux and the statusLine use ANSI colours so they follow the theme too. Sessions pick up Claude's theme the next time Claude starts in them. * Command palette (#32): ⌕ button or Ctrl+Shift+P. Switch, create, rename and end sessions, Claude/Shell window, scroll back, detach, theme, panels, text size, fullscreen, notifications, copy link, open the repo / PRs / CI run, show alerts, keyboard help. * Dialogs instead of browser prompt/confirm for rename, end and new session (name check inline, project folder picker), and a keyboard shortcuts sheet in the ⋯ menu, the palette and the footer (#33). * Toasts for results: created, renamed, ended, uploads, link copied, CI finished, errors (#34). * Fix: renames, ends and new sessions often reported "no response" although they worked; ttyd dropped the reply of commands that exit right after printing. Replies now wait for the browser to hang up (#35). * Fix: the Sessions panel showed stale names right after a rename or end. -- Jared Vititoe Thu, 08 Oct 2026 00:32:11 -0400 devdesk (0.5.1) bookworm; urgency=medium * A session created by opening its URL shows up in the Sessions panel and the switcher right away instead of at the next poll. -- Jared Vititoe Wed, 07 Oct 2026 23:42:01 -0400 devdesk (0.5.0) bookworm; urgency=medium * Security (from the 2026-10-07 review): - ttyd :7681 is firewalled to NPM in CT 126 and its credential was rotated (#1). - "Ask Claude" strips control characters from Grafana text and pastes it as bracketed paste, so alert text can never run a command (#2). - OSC 52 clipboard is write-only: terminal output can no longer read the browser clipboard; tmux allow-passthrough is off (#7). - Gitea/Grafana tokens reach curl on stdin, never on its command line; remote URLs lose any userinfo (#11). * Fixes: - Ending the session you are in no longer leaves a ghost entry (#3). - Reconnecting after a drop never re-creates a session that was ended or renamed meanwhile (`attach --existing`) (#4). - Repo panel uses git --no-optional-locks and drops the safe.directory override (#5); uploads get unique names and are cleaned up on hangup (#6); uploads are size-checked first and streamed in slices with an idle timeout (#9); paths with tabs no longer break the session list (#10). - ttyd allows 32 clients; side-channel calls run two at a time and one tab polls for all open tabs (#8). * Header: the SSO chip is gone ("Sign in again" appears only when the session expires); the session chip shows Claude's state as a dot and opens a session switcher; LIVE is a dot; text size, notifications (with mute) and fullscreen move into a ⋯ menu; the Panels button shows a badge for waiting sessions and alerts (#13, #16). * A bare URL reattaches your last session instead of opening the picker (#16). * Notifications when *other* sessions start waiting, and alerts are polled with the panels closed (#15). * Sidebar: the Claude Context panel is folded into a context bar in each session row; Repo/CI collapses for non-git folders and offers "Ask Claude to fix CI"; the new-session form hides behind "+ New"; more legible labels (#17). * Phone: key bar (Esc, Tab, ⇧Tab, ^C, arrows, ⏎, Claude/Shell), drawer with backdrop, layout that follows the on-screen keyboard, DOM renderer on touch devices, no clock in the tmux status line (#14). * Matrix "Claude needs you": a wait that lasts 30 s with nobody attached posts one message with a link to the Devdesk hookshot webhook (#28). -- Jared Vititoe Wed, 07 Oct 2026 23:34:48 -0400 devdesk (0.4.0) bookworm; urgency=medium * Session status at a glance: Claude hooks record whether each session is working, waiting on you (with Claude's message) or idle. The sidebar shows it with context %, the header shows the current session's state, and a pulsing "needs you" chip jumps to sessions waiting for input. * File & image drop: drag files onto the terminal or paste a screenshot. They're uploaded through ttyd to /var/lib/devdesk/uploads// (25 MB max, pruned after 7 days) and the path is pasted into Claude, which attaches images itself. * Ops Alerts panel is live: firing/pending Grafana alert rules with severity, instances, summary and a link, plus an "Ask Claude" button that types an investigation prompt into the current session. -- Jared Vititoe Wed, 07 Oct 2026 19:24:15 -0400 devdesk (0.3.1) bookworm; urgency=medium * Auto-deploy: tagged releases trigger CT 126's webhook listener (house HMAC pattern), which runs /usr/lib/devdesk/devdesk-deploy to upgrade the package from the apt registry. Running sessions are untouched. -- Jared Vititoe Wed, 07 Oct 2026 13:20:58 -0400 devdesk (0.3.0) bookworm; urgency=medium * Repo / CI panel is live: branch, ahead/behind, uncommitted changes, the Gitea CI status of HEAD (linked to the run) and open PRs for the current session's folder, via `devdesk attach --repo` over the ttyd channel. No sidecar needed; public repos need no token (optional /etc/devdesk/gitea-token for private ones). A notification fires when CI for HEAD finishes while the tab is in the background. * Remote Control verified with resume (same claude.ai session link). * Local settings now go in /etc/devdesk/env.local (read after the packaged env, never shipped), so upgrades no longer stop at a conffile prompt. -- Jared Vititoe Wed, 07 Oct 2026 12:57:04 -0400 devdesk (0.2.1) bookworm; urgency=medium * Session hook and status line only record for panes on DevDesk's own tmux server (Claude run with these settings elsewhere no longer writes into DevDesk's state). * The Claude wrapper re-reads /etc/devdesk/env before every Claude launch, so Remote Control and CLAUDE_ARGS changes apply on the next restart. -- Jared Vititoe Wed, 07 Oct 2026 12:54:06 -0400 devdesk (0.2.0) bookworm; urgency=medium * Sessions no longer need a project folder: any name works and starts in DEVDESK_DEFAULT_DIR unless it matches a project; new NAME [PROJECT]. * Rename and end sessions from the Sessions panel (and devdesk rename). Renames keep the running Claude and its recorded conversation. * Claude Context panel is live: a statusLine command snapshots model, context-window use, cost and edits per session; Claude's footer shows a one-line summary. * Drop GANDALF from the Ops Alerts panel. * CI: bash shell, download retries, Node 22 test invocation, build-essential, smoke-test pipe fix. -- Jared Vititoe Wed, 07 Oct 2026 03:01:21 -0400 devdesk (0.1.0) bookworm; urgency=medium * Initial release: persistent browser terminal for Claude Code (ttyd + tmux) with LotusGuild TDS styling, multiple named sessions, per-session conversation resume and Debian packaging. -- Jared Vititoe Tue, 06 Oct 2026 22:58:26 -0400