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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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-<name>) 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 <node> pct exec <id> --` 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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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-<name> 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
      (regex<TAB>reason).
    - 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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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/<session>/ (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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  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 <jjvititoe1@gmail.com>  Tue, 06 Oct 2026 22:58:26 -0400
