Repository navigation
Releases: blerglab/blerg-ai
Release list
Blerg 0.5.0 🎃 — the workspace release
Released just in time for Halloween: no tricks, only treats. 🦇
0.5.0 turns a Blerg session into a workspace: the files, a shell, the board and the chat side by
side, arranged the way you work, and fast to come back to.
Highlights
- A real workspace in every session. A project file explorer and viewer with syntax highlighting,
line wrap and image zoom; split any two tabs side by side; a focus mode that maximizes the active
tab; a tab row that scrolls with an overflow menu. - A shell that behaves like one. The shell is a regular tab you can drag, split and theme. It
survives bursts of output, switching sessions and page refreshes (with its last screen). On a
desktop it lasts as long as the session by default, even with the browser closed; admins can set
idle and lifetime limits. - Instant switching. Coming back to a session shows the chat, files, explorer, panel and shell at
once, at the scroll position you left, then refreshes quietly in the background. - Command palette and quick open. Ctrl/⌘+K for actions, sessions, cards and files; Ctrl/⌘+P to
open a file; an empty palette starts with what you can do in this session. - Desktops you manage in one place. Account settings list your desktops; add one from any machine;
engines installed later are discovered with a reason when something is missing. - Boards closer to the work. Card keys like BLG-205, a Board button in the session, Assist sessions
that start in the right place, and column management for agents with full access. - Calmer usage limits. Usage meters warn at 80/90/95% (a slow pulse near the limit); orchestrating
sessions get a heads-up so they shift work; "Resume when limit resets" works for every limit and
engine.
Known limitations
sudodoesn't work in a host shell. Blerg tracks every process a shell starts so it can end
them all when the shell ends, and on Linux that tracking blocks programs that raise privileges.
Use a terminal outside Blerg forsudo. Making this work is planned for 0.6.0.- Updating Blerg ends open shells. After a server update a shell reconnects if it still can.
Otherwise its tab says "This shell ended." with a New shell button. Shells that survive
updates are planned for 0.6.0. - Standard workspace storage has no size limit per workspace. Cluster workspaces now work on
any cluster, in the storage class Blerg already uses, but nothing stops one from filling the
node's disk. Workspace claims are kept until you remove them. For a hard limit, set
WORKSPACE_STORAGE_CLASSto a size-limited class. Automatic cleanup is planned for 0.5.1. - Cluster workspace sessions don't resume after their pod ends. Start a new session instead;
the files stay on the session's claim. Resuming them is planned for 0.5.1.
Upgrade notes
- Reinstall the desktop daemon (
install/desktop/daemon/install.sh install). It brings the shell
output and scrollback changes, git-aware file search, desktop "busy" replies, usage notices, and it
now refreshes the local-sandbox image when it was built from another commit. - Runner migrations 092–096 run on start.
- The public repository no longer includes
video/(the maintainers' demo harness).
Full list of changes: CHANGELOG.md. What's next: ROADMAP.md. 🕸️
v0.4.5
Upgrade notes
- Reinstall the desktop daemon (
install/desktop/daemon/install.sh install) for the sandbox homes below and forblerg-runnerunder Claude Code's own sandbox. A sandboxed session can no longer renew its engine's sign-in: keep Claude Code or Codex signed in on the machine (running it there refreshes the sign-in the sessions get). Sandboxed sessions started by an older daemon keep their old mounts until they end; stop them before you reinstall. If you ran Local sandbox sessions before this release, check~/.claude/settings.json,~/.claude/settings.local.json,~/.claude/hooks,~/.claude/plugins,~/.claude/skills,~/.claude/agents,~/.claude/commands,~/.claude.json(itsmcpServers),~/.codex/config.tomland~/.hermes/config.yamlfor anything you did not put there. - The same daemon reinstall gives
blerg-runnerthe dismissed exit code (4) forask,review waitandreview status; an older CLI reads a dismissed question as an empty answer and a dismissed review as a failure (exit 1). - The same daemon reinstall gives
blerg-runnerin your sessions the new review-thread rules (your own resolve or reject stands unless the agent reopens the thread, your replies show inblerg-runner review list, andreview reply <id> reopen). Until then an older CLI still lets an agent's answer at the same revision change a thread you settled, in the agent's own view; the browser keeps your status either way.
Added
- Dismiss in Needs you and the bell. A review request or a question you answered some other way (in the chat, say) no longer waits forever: Dismiss closes it at once, with an Undo toast for 5 seconds before anything is sent. A review request closes as
dismissed(neither approved nor changes requested) and a question as dismissed (not answered); the agent is told in a Blerg system message ("The person dismissed the review request for ; they may have answered in the chat instead."), may ask again, andblerg-runner ask,review waitandreview statusexit 4 for a dismissal. Only the person can dismiss (the session's owner for a review request; whoever may answer for a question); the agent still closes its own questions withask --resolve. History shows a dismissed item as "dismissed by you", and the bell now lists your pending review requests too (and drops one you decide or dismiss at once). A dismissal reaches the agent the way an answer does: queued while its desktop is away and sent again after a server restart. A question someone else dismissed says "Dismissed by another person". Dismiss is never offered on an engine's command approval (allow or deny those), and a dismissal still in its Undo time is sent when you close the tab or switch away. An engine that waited on the question (Codex, Hermes, native sessions) reads that it was dismissed, not a bare close. Runner migration074adds thedismissedstate (@blerglab/chat0.82.0). - Card numbers in the checklist link to their cards and show when the plan is stale. A checklist item that names a card ("#155 Dismiss in Needs you"), on Plan and on Live's checklist line, gets the chat's treatment: once the card is confirmed on the session's one board, "#155" is an inline link with the card's hovercard, and a click opens the ticket dialog. Beside the item, the card's state glyph (✓ ◐ ○) shows when it differs from the item's own, for example an unticked item whose card is done. Until confirmed the text is drawn as written; a number with no such card stays text; the lookups are batched and kept, and the card states follow the live reads the pins use. Live's checklist line is no longer one button: a click anywhere still opens Plan, and its head is the keyboard's control. Every Plan item has a small chevron beside its title (aria-expanded) that shows the whole item from the keyboard; a click on the words still does.
- Ask a session to make a board.
blerg-runner board create "<name>" [--repo R ...] [--template T | --columns A,B,C] [--description D] [--access read|file|full]proposes a new Board; nothing is created until you approve it. The proposal waits in Needs you, on Proposals and as a card in the chat, showing the name, description, repositories (the first is primary), columns or template, and the access the session asks for on the new board (Full by default). When you approve you can lower that access or give none, never raise it. Approving creates the board with your own authority (only an administrator can, signed in; Core issues a 30-second credential for that one approved board, and Board uses it once), then gives the proposing session, and no other, access to the board at the approved level, capped for a started session by its parent. Rejection or expiry creates nothing, approving twice creates one board, and "Allow for this session" never applies. Each proposal carries an idempotency key (--idempotency-keyrepeats one whose reply was lost). Sessions still never hold board administration; cron, restricted and board-started sessions cannot propose a board. Names, columns and descriptions with bidi or invisible format characters are refused. The session guide tells agents to use it when asked to "make a board for X" (@blerglab/chat0.77.0: board proposals in the chat card; board migration 028). - New board picks its repositories. The Board app's New board form lists the repositories your connected desktops have checked out (
owner/namewhen the desktops agree on the folder's remote, else the folder name), several allowed, with a filter and a field to type one no desktop has; the first chosen is the board's primary repository. They are set as the board is created, so there is no trip to the board's settings afterwards. Templates work as before. - "+ Add" in the Capabilities tab opens a plugin browser, and MCP servers that need a sign-in get a button for it. The browser lists every plugin of the marketplaces the session's engine knows (Claude Code and Codex), read by the session's daemon from the engine's own files: name, description, version, author, marketplace, and whether it is installed and enabled. It has a search, a marketplace filter, and an Install per plugin, which goes through the same owner-approved path as before (this session only, or always on). Adding a marketplace (a GitHub
owner/repoorhttps://github.com/owner/repoURL the install allows) and entering a plugin by name stay as secondary actions; an engine with no catalog, or a sandboxed session, gets the add-by-name form. In the MCP servers list, a claude.ai connector that needs a sign-in has Connect, which opens claude.ai's connector settings in a new tab (restart the session after connecting); a server from your own settings (Claude Code's user scope, or Codex's globalconfig.toml), in a session on your machine, has Sign in: Blerg asks the engine to start its own OAuth sign-in, shows the address the link goes to (in plain ASCII, with a warning when it uses international characters), and asks you to confirm the server, where it was defined and the address before opening it. "Your own settings" means your engine configuration on that machine, which an agent running there could also edit: only continue for a server you added. The sign-in returns to the engine on the machine that runs the session, the token stays where the engine keeps it, and the row turns connected when it is done. A server the project, a plugin or the session defined gets no link: sign in to it from a terminal. Sandboxed sessions say sign-in there is coming. Marketplaces added here are shared by everyone using that machine's engine. Only the session's owner can browse, add or sign in. A session's custom variables can no longer setHOME,CLAUDE_CONFIG_DIR,CODEX_HOMEorXDG_CONFIG_HOME. Needs a daemon reinstall. - Card numbers and commit hashes in chat messages are chips once confirmed. In a message, the agent's or a person's,
#147links to the card when the session's board is known (its one board) and the card exists there, and a 7 to 40 digit hash links when the session's repository confirms it is a commit (a read only the session's owner may make; others see plain text). A confirmed reference has the same hovercard as elsewhere, and a click opens the ticket dialog or the commit viewer. Until confirmed the text is drawn exactly as written, so nothing moves; "#1 priority" with no card #1, a hex word that is no commit, anything in a fenced code block and anything inside a link stay text, and an inline code span links only when it holds nothing but a hash. Lookups are batched (one pass every 60 ms, each reference asked once per session and kept) (@blerglab/chat0.75.0). - A README's HTML renders as on GitHub. Raw HTML in a markdown file (a centered banner, badges, a table of videos, a screenshot grid) used to show as literal tags; in the file viewer, the folder-file viewer and review mode it now renders through GitHub's allowlist of elements and attributes, sanitized by DOMPurify and rebuilt by React, with anything else (scripts, event handlers, styles, frames, forms,
javascript:anddata:links) dropped. In the viewer, a markdown file from the session's folder shows its relative images, read from the folder beside the file with the session's own access; a published file shows their alt text. Remote images (badges) are never fetched by themselves: each shows its alt text and Load image. Folder images load two at a time and retry while the server is busy, up to 50 per file before Load images. Relative links in a folder file open that file inside Blerg (in a published file they stay text),#links scroll to the heading, and external links open in a new tab. Chat messages, approvals, tickets, board cards and threads keep HTML as literal text, so nothing in them can be hidden from you; in review mode a document whose page does not show every word (an HTML comment, a closed sectio...
v0.4.4
Upgrade notes
- Reinstall the desktop daemon before starting Local sandbox sessions (
install/desktop/daemon/install.sh install). The runner refuses every sandboxed start (launch sheet, board, cron, child) on a daemon that does not reportsandbox_clones, with "update the daemon before starting Local sandbox sessions"; host sessions are unaffected. Stop running sandboxed sessions before you reinstall: the restart ends sandboxed Agent sessions as before, and a sandboxed Terminal session an older daemon started with your folder mounted is stopped when the new daemon reattaches (or, if its container is gone, not recovered), with a note in the session. A sandboxed session's work now lands onwip/<session-id>in your repository, not in your working tree: check out or merge that branch to use it. If you ran Local sandbox sessions before this release, check the.git/hooksand.git/configof those repositories for anything you did not put there. - Existing "Always allow … on the cluster" rules now also cover your unsandboxed desktop sessions' cluster children (until now they could start pods only for cluster sessions). Review them in Settings → Sessions starting sessions. Sandboxed desktop sessions still ask for each cluster child unless the runner sets
BLERG_RUNNER_SANDBOX_CLUSTER_CHILDREN=any(new; defaultonce; seeinstall/k8s/CLUSTER-RUNTIME.md). - Desktop sessions can start cluster children (no migration). Reinstall the desktop daemon for the updated session CLI and guide (
--runtime clusterfrom a desktop session,budget --runtime cluster). Desktop sessions launched before the upgrade have no recorded sign-in, so their first cluster child always asks on the card. - Runner migration
071records proposal deadline extensions (it applies on start; nothing to do). - Runner migration
072adds questions that do not wait (messages.no_wait; it applies on start). Reinstall the desktop daemon (or redeploy) forblerg-runner ask --no-wait/--resolve, the session guide line that tells interactive sessions to use it, and the marked delivery of a question's answer: a daemon older than this release passes the answer to the agent as plain text, which another person or a parent session could imitate. Questions are notified to the session's owner only (bell, toast) and send no phone push, because push subscriptions belong to no account. - Runner migration
073lets a board level a parent passed down to a child be stored without a sign-in of its own (created_via = 'parent'; it applies on start). Reinstall the desktop daemon (or redeploy) forblerg-runner session start --boardand the cap shown byboard access. - Runner migration
070gives every session board permission a level; existing filing permissions become File without asking. Reinstall the desktop daemon (or redeploy) for the updated session CLI (board access, board commands without a launch board) and theblerg_boardsession tool for Codex. - Reinstall the desktop daemon (
install/desktop/daemon/install.sh install), or redeploy, for the marked relayed decisions in Claude, Codex and native sessions, the owner-only Hermes approvals and their failure messages, and the batch review-reply wording in the session prompts and the managed~/.claude/CLAUDE.mdblock. The daemon keeps a new private key,marker.key, in its state directory (~/.blerg-runner-daemon); a cluster pod with retained conversation history keeps it on that history's volume, so a replacement pod derives the same codes. Do not delete it: Claude Code records a conversation's system prompt, the code's announcement included, and a resumed conversation keeps that record until it is compacted, so after a new key every relay to a resumed Claude conversation carries a code the model was told is not Blerg's, and the agent treats real decisions as forged (it can still confirm them withblerg-runner review statusorticket status). A daemon that cannot keep the key says so in its log and uses an in-memory one, with the same effect after its next restart. Sessions started before this version keep the system prompt they were started with: their relays carry the marker, but the model is told about it only in new sessions or after a compaction.
Rolling back to 0.4.3
0.4.3 reads every live board permission as File without asking, so a board a person set to Read (or lowered to Propose) under 0.4.4 would file without asking again. Before starting a 0.4.3 runner on a database that 0.4.4 migrated, run this once against the runner database (on a database 0.4.4 never migrated it fails harmlessly: there is no level column):
UPDATE session_proposal_grants
SET revoked_at = now(), revoked_reason = 'downgrade'
WHERE kind = 'board_file' AND level IN ('propose', 'read') AND revoked_at IS NULL;Board permissions at File without asking and Full keep filing without asking under 0.4.3, which is what they allow. A launch board that was lowered goes back to what its launch gave it (0.4.3 has no levels).
Rolling back to a build before children inherit board access
This applies to a rollback to 0.4.3 and to any earlier 0.4.4 build (one without runner migration 073). Such a build does not cap a child by its parent: it reads a child's board level as the child's own, and acts with the sign-in stored on it. Before starting it, end every board level a parent passed down and every level set on a started session, including children whose parent row was deleted (the delete clears parent_session_id, so a child is also known by how it was started):
UPDATE session_proposal_grants g
SET revoked_at = now(), revoked_reason = 'downgrade'
FROM sessions s
WHERE s.id = g.session_id
AND g.kind = 'board_file' AND g.revoked_at IS NULL
AND (g.created_via = 'parent' OR s.parent_session_id IS NOT NULL
OR COALESCE(s.delegation_via, '') <> '' OR s.started_by_kind = 'session');Run it together with the block above when going back to 0.4.3. Started sessions then have no board access until you give them levels again.
Added
- Children inherit board access. A session that starts another one passes board access down with the start:
blerg-runner session start --board <name|id>:<level>(read, file or full; repeatable), never above its own level for that board. The approval card shows it ("with Blerg · Full"); a rule or grant can start such a child too, and the start is checked against the parent's levels again when it runs. No credential is minted: the child gets a level of its own and its board calls go through the runner with its own session token, acting with the parent's sign-in, on the desktop and the cluster, sandboxed or not. Every call is capped by the parent's level at that moment, so lowering or revoking the parent lowers every child at its next call, and a child never exceeds its parent even if the parent is raised later. The child's Permissions dialog shows each level with the cap; you can lower a single child, and raising one above its parent is refused. The child gets the same "Board access changed" note, the parent's changes included. Its access ends when the parent is stopped for good, a kept-running child included. Child-start rules and session grants you gave before this release also cover starts that pass boards (the child never gets more than the parent). A desktop child cannot file proposals yet (it has no recorded board sign-in), so File without asking gives it only Read in practice. Each child has its own board limits (4 calls at once, 240 requests a minute, 20 filings an hour without asking), bounded by 3 running children per parent and 6 per account (@blerglab/chat0.35.0). - A pinned board card shows the live card. A Blerg Board card the agent pins (
blerg-runner pinwith"source": "blerg-board", itsboard_idand"key": "#<number>") is shown in the session panel's chip and ticket dialog as the board holds it now, read with your own board permissions through the runner (GET /api/board-cards/{board}/{number}): its column, type, priority and tags, where it was filed from, its repos and its trail, with a live mark, and a note when the agent pinned it in another state. Move works in place (as your role on the board allows); Run, Discuss and Archive open the card in the Board. When the board cannot be read, the dialog shows the agent's copy and says so. The runner sets the card's address itself (the Board's page, never a link the agent wrote), andblerg-runner ticket get,ticket createandticket fileprint the card's address and a readypinline.blerg_card_gettakeswith_trail(column name, columns and the latest 30 trail events in one call). Pins from other trackers keep their dialog, now one column with the details as chips instead of a Details box. The ticket dialog takesmin(1400px, 94vw)like the file viewer, keeps its text at a reading width, and has Maximize (⤢ / Ctrl+Alt+F), remembered like the viewer's (@blerglab/chat0.34.0). - Questions that do not block the agent.
blerg-runner ask --no-wait "<question>"puts a decision that belongs to you in the session's Needs you and the bell ("Question · not blocking"), and the agent keeps working. Answer it there or on its card in the chat: the answer is recorded like any answer and reaches the agent at its next step as a message naming the question (Answer to your question <id> ("…"): …). A message you type in the chat is never taken as its answer; if you answer that way, the agent closes it withblerg-runner ask --resolve <id>. Only the session's owner answers one, a daemon restart leaves it open, and a session started with the runner key cannot post one. An answer the agent can never be sent (for example, too long to send with its question) is tried three times; then the session says so, and you send it as a message. A delay (a busy session, a full queue, a database error) is retried until i...
v0.4.3
Local models in the cluster, agents that work together, and permissions you can see.
- Hermes in cluster pods with a shared provider config for your own model servers (e.g. NVIDIA Nemotron on vLLM), shown as local in
budget. - Child sessions on the cluster: a cluster session can start other agents as pods, with approval cards and rules.
- Board access from desktop sessions, and Run this card can target your desktop sandbox. New boards run as their creator; existing ones are one click (Run as me).
- Proposals and review requests in the chat: approve a filed card or a reviewed diff right where the agent asked, and the agent is told the outcome.
- A Permissions dialog with search, for child sessions, board filing and MCP write tools, also available when launching a session.
- First run asks for your account instead of logging a generated password.
Full notes below.
Upgrade notes
- Desktop: reinstall the daemon (
install/desktop/daemon/install.sh install) for the new CLI commands (models,review request,ticket status) and the child-session guide; rerun./blerg-up.shso it addsBLERG_CORE_BOARD_MINT_KEY. - Kubernetes: rerun
./deploy.sh; it adds the mint key, and optionally storesHERMES_PROVIDERS_FILEas the shared Hermes provider config. Runner migrations 064–069 and the new core and board migrations apply on start. - Run as me needs one new secret,
BLERG_CORE_BOARD_MINT_KEY, on core and the board../blerg-up.shadds it to an existing.envandinstall/k8s/deploy.shto an existingblerg-secrets; with neither re-run, boards keep working and take a pasted token as before. Core migration022, board migration024. - An existing install keeps its accounts, and setup mode does not open on it, because an account exists. That includes an install whose generated admin never signed in: its one-time password is still the one printed next to
BLERG_BOOTSTRAP_ADMIN_PASSWORDin that first boot's log, if you still have the log. Otherwise reset it: on the desktop./blerg-up.sh --reset-admin; on a clusterkubectl -n blerg exec deploy/blerg-core -- /blerg-core users set-password --subject <username>(look up the username with thepsqlquery ininstall/k8s/README.md, "First login").
Added
-
Run as me: a board's sessions run as you in one click. Board settings → Automation has a Run as me button that has core mint a
run-sessionstoken for you and saves it on the board, with no copy and paste; the create-board form has Run this board's cards as me checked (BLERG_BOARD_DEFAULT_RUN_AS_CREATOR, default true; a multi-tenant operator may set false); and a board with no token offers it beside Run this card, after which the run-target chooser appears for you. Run this card now works out of the box on a single-user install. The token is listed in core Settings → Agent tokens as "Board automation" (minted by board ) and can be revoked there; replacing or removing it, or deleting the board, revokes it. Pasting a token stays available (Use a different token…). The board never sees your core cookie, and for this it uses a dedicated key rather than core's internal key: it presents (BLERG_CORE_BOARD_MINT_KEY) that opens only this mint and its revoke, and core requires your own live browser session, refusing agent, session and daemon tokens, another account's, and more than 10 attempts an hour. -
Hermes agent sessions discover named model providers, preserve explicit provider selection through switches and native recovery, and keep local-budget claims conservative across configured targets.
-
Live → Session lets owners enable or revoke child-session approval across currently available engines for the parent session, with separate sandbox and unsandboxed permissions and explicit standing-rule disclosure.
-
Checklists show current work and explicit native-subagent or child-session assignments, with stable item references that survive rename and reorder.
-
Hermes agent sessions use the native streaming gateway for tools, steering, questions, plans, children, background process inventory, model capabilities and token accounting, with exact native host-conversation recovery and explicit unsupported-runtime limits.
-
Document local vLLM setup for Hermes, local-budget checks, sandbox reachability and child-session permissions.
-
A session running on the cluster can start child sessions that run as cluster pods (
blerg-runner session start --runtime cluster, the default there), with the same approval card ("on the cluster", chat 0.27.1), rules, session grants, budget, child routes and discard cascade as desktop children. Cluster rules and grants are separate from desktop ones; a desktop session still cannot start a cluster child. -
Hermes sessions on the cluster can use the operator's own model servers: set
HERMES_PROVIDERS_FILEininstall/k8s/.envto a Hermes provider fragment, and every Hermes pod merges it into its configuration, the cluster launch sheet lists those servers' models with the same IDs as on a desktop, and Hermes counts as local hardware when every endpoint is private and keyless. The example session NetworkPolicy gains an opt-in rule for reaching those servers. -
Proposals show in the session's chat as a card (chat 0.28.0): Approve, Edit (the draft editor in a sheet), Reject, or Allow for this session, which also approves the session's later proposals of exactly that scope (one board, or one connection's one tool). A created card follows as a compact ticket with Open, and becomes a chip in the History tab. The Proposals page stays the inbox, and a decision in either place is the same decision.
-
One Session permissions block in Live replaces the separate child-approval checkboxes and the child-permissions row: toggles for starting children, filing cards on a board and running an MCP write tool without asking, and every permission in force with a styled Revoke. The launch sheet's Permissions gives the same ones before the session starts. Session permissions are owner-only, end with the session (and with a parent's discard), are refused for cron, restricted, board and agent-token sessions, and every automatic approval goes through the person's own approval path and records the permission that allowed it. A permission approves at most 20 proposals an hour (
BLERG_RUNNER_GRANT_HOURLY_CAP), an MCP-tool permission stops when the tool's definition changes, and the same draft filed again within 15 minutes returns the earlier filing instead of a second card. Needs the updated session CLI forticket fileto report a card filed at once. -
Session permissions move into a Permissions dialog with a search: child sessions, board filing (a checkable list of your boards with a selected count and Select all shown), MCP write tools grouped by connection, and everything active with how and when it was given. Changes apply on Save with a one-line summary ("Grant 2, revoke 1"); the dialog is keyboard-first and a full-screen sheet on a phone. Live → Permissions is now a compact summary: the active count, Manage, and a chip with × per permission. The launch sheet's Permissions… opens the same dialog and counts what it will give. The proposal card's link now names Permissions (chat 0.29.1).
-
A session can ask its owner, explicitly, to approve a file or diff it published:
blerg-runner review request <name> --ask "..." [--wait], orpublish/diff ... --request-review "...". The request is pinned to that version (a newer version supersedes it) and shows as "Review: " under Live → Needs you and a card in the chat; the viewer gets a bar with Approve and Request changes (chat 0.29.0). Only the session's owner, signed in, decides; the decision, with the comments made on that version, reaches the session as a message or its waiting command. Runner migration069.
Fixed
- Decisions Blerg relays to an agent (a review request's outcome, a proposal's outcome) show in the chat as a Blerg note, not as the person's message (
@blerglab/chat0.29.2). - A session's first prompt is recorded as written by whoever started the session: a board's card run or board session as the Board, a child's task as its parent session, a cron's prompt as the Cron. The chat draws it under that author, never as You, such a message never answers the agent's open question, and Insights no longer counts it (or a relayed decision) among the person's messages; a person's own launch is unchanged (
@blerglab/chat0.29.3). Sessions started before the upgrade keep what was recorded. No daemon update is needed: daemons since 0.3.0 honor the spawn frame'sinitial_prompt_source, and an older one records the prompt as the person's, as before. - Codex sessions in a cluster pod with native conversation history get their login again, and Claude Code sessions there can write their settings: the history mounts under
~/.codexand~/.claudemade the container runtime create those directories as root, so Codex could not writeauth.json("permission denied") and its app-server kept failing. The pod now prepares each engine home as an agent-owned, pod-ephemeral directory; the login and config stay off the history volume. - A child session's model is resolved against its engine's catalog where it will run: a routing id, a display name or a unique part of an id is accepted and recorded as the routing id, and an unknown or ambiguous name is refused with the available models (
blerg-runner modelslists them), instead of a child that fails on a made-up model route. - A session running in a cluster pod can start child sessions and read
blerg-runner budgetagain: the server recognized a cluster parent only while it sat on the placeholder cluster daemon, which its own pod replaces as soon as it connects, so every start was refused with "children run on the parent's desktop daemon". Cluster rules, grants...
v0.4.2
Upgrade notes
- Desktop: reinstall the daemon and rebuild the sandbox image (
docs/sandbox-image.md) so sandboxed
child sessions can commit in Git worktrees and have Go; existing containers keep their old image.
Fixed
- A child session drawn under its parent in the sidebar no longer repeats "from {parent}".
- A sandboxed child session reports its runtime as
docker(it saiddaemon). - Child-session rows show the token unit once and one clearly labeled revoke control per engine, runtime and desktop.
- Allowing child starts for a session covers every repository, including no repository, on the approved engine, runtime and desktop; duplicate permissions are consolidated without losing their audit records.
Added
- Explicit child-session discard stops and archives workers from the CLI, panel and sidebar while preserving history, Insights totals and direct URL access. Children stay in a stable list until discarded.
- Sandboxed coding children can commit in linked Git worktrees and run Go builds/tests with the default image; shared Git metadata is validated and mounted without adding host Git push credentials. The default sandbox now includes Go 1.26.9 alongside Node.js 22.
v0.4.1
Added
-
Attachments show local image, first-page PDF and text previews before sending; document formatting uses accessible icons with active states (chat 0.26.0).
-
Document reviews support rendered Markdown editing, tracked/clean views, and passage-linked margin comments with Ctrl+Alt+M. Image markup supports selectable annotations with comments, style editing and visibility controls (chat 0.25.0).
-
Resolved and rejected code review threads can be collapsed individually or hidden together.
-
Code review opens directly beside patch lines, with inline threads, general comments, Markdown previews, code suggestions and resolved/rejected replies carried across revisions (chat 0.24.0).
-
Mermaid diagrams and inline-data Vega-Lite charts render in chat, Markdown and the file viewer, with native chat colors that follow theme changes, source, copy and zoom controls (chat 0.23.1).
-
Request code changes on selected diff lines in a session, with desktop and phone selection and the existing review reply flow (chat 0.23.0).
Fixed
- Reopening a document or code review thread requires a new comment, included with the original request and prior answers when sent to the agent (chat 0.26.2).
- Markdown and PDF reviews support collapse, Hide resolved and Reopen, preserving reply history and original passage anchors (chat 0.26.1).
- A browser could be signed out after waking with several Blerg tabs open.
v0.4.0
Upgrade notes
- Reinstall the desktop daemon for child-session recovery and local-engine reports; start a new
session to receive the updated CLI guide. Chat is 0.22.0.
Added
-
Add permitted plugins and bundled skills from a session’s Capabilities panel, with human-approved agent requests and between-turn loading for supported host Claude sessions.
-
A session can start and drive other sessions on its desktop with your approval
(blerg-runner session …), with children in Live, the sidebar and Insights (chat 0.22.0). -
blerg-runner budgetreports the desktop's remaining capacity separately by provider. -
Propose Board cards from Claude or Codex sessions, with editable approval drafts, verified source metadata, and optional administrator-only card details.
-
Choose a Board when launching a session, with verified access, shared MCP/CLI tools, and matching cron board discovery.
-
Session and subagent progress bars show native plans or explicit
blerg-runner progresscounts, with each caller kept separate. -
A "vX.Y.Z available" link beside the version in the runner sidebar, core footer and board top bar when a
newer public release exists, linking to its GitHub release page. Core checks api.github.com every 6 hours
(the check shows the server's IP to GitHub);BLERG_UPDATE_CHECK=0turns it off,BLERG_UPDATE_REPO
changes the repository.
Fixed
-
Authenticated messaging CLI requests refuse redirects, preserving session and board credentials.
-
Keep long shell commands and results compact in the session panel, with scrollable full text and visible status and actions.
-
Codex subagent typing stays separate from the main reply, and a completed subagent message no longer makes the main agent's unfinished text disappear.
-
Ctrl+A (Cmd+A) with a file, code or ticket open over the page selects what is in it, ready to copy,
instead of the whole page behind it; a text field keeps its own select-all (chat 0.21.1). -
A bare file name the agent mentions (
plan.md, no folder) that is a file published in the session
opens that published file, instead of looking for it at the top of the session's folder and saying
"Not found" (chat 0.21.2).
v0.3.1
Upgrade notes
- Desktop: reinstall the daemon (
./daemon/install.sh install) so a background shell command shows its
command line in Running now; until then it shows its description, as before. - Chat (
@blerglab/chat) is 0.21.0, with a new theme token--chat-font-display(section headings;
a theme that does not set it gets a condensed system face);commitUrlis accepted but no longer used (commit chips stay in
Blerg: they open the item's diff or copy the sha).
Added
- On a touch screen, holding a message, code block, ticket card or checklist row opens a sheet with
Copy message, Select text and Cancel; the always-visible Copy buttons are gone there (desktop keeps
the hover button). Nothing is selected by the hold itself, and Select text opens the text full
screen, all of it selected with the phone's own handles, with Copy (the part still selected) and
Done. blerg-runner checklist remove <n|--text …>drops one checklist item; the other items keep their
ticks, commits and diffs (before, removing one meant setting the whole list again).- A published diff of one file with 20 or fewer changed lines shows its hunks in its card, colored
and numbered like the diff viewer, with View kept.
Changed
- The session panel's Live tab no longer has an MCP servers section; the Capabilities tab's MCP servers
group shows each server's status as it is now (connecting, connected, failed, needs sign-in, disabled). - Live's one-line summary is two controls: the ticket chip opens the ticket over the page, the checklist
part goes to the Plan tab. - The checklist's progress bar is a short rounded bar beside the count (green when done), not a thin
line across the panel. - A background shell command in the panel's Running now reads as a command: a
>_glyph, the
command in monospace (the full text on hover), what it is for, and shell, elapsed and status
chips, with no model or effort. Subagents get an agent glyph. The daemon now sends the command
with the task's start (reinstall the daemon; older starts show their description). - The Files list is compact: one ~28 px row per file with a glyph for its kind, the name, and a muted
size, version, time and "you" (for files you attached); Download and Delete are small icons that
show on hover or focus (always on touch), and clicking the row opens the file. Past six files a
filter box, a sort (newest or name) and an origin choice (all, from the agent, from you) appear,
and are remembered per browser. - The file viewer colors code and JSON: a
.go,.ts,.pyand so on opens as numbered, colored
lines, and JSON is pretty-printed and colored (the start of a very large file; the rest plain). - A CSV or TSV is one table style in the viewer and in the inline preview (borders, header row, zebra
rows); the preview is the first rows and columns of the same table. - Markdown files (inline preview, viewer, the review page) read like a README: system UI font, ruled
headings, code chips, padded code blocks, bordered zebra tables. Chat messages keep their compact
scale, with the code chip, table, and quote refined to match (chat 0.18.0). - A pinned ticket reads like an issue in a tracker. Its status chip is tinted by meaning (gray to do,
blue in progress, amber blocked, green done, faded and struck through when canceled) in the chat,
the modal and the session panel. The chat's card is a summary: key, status, title, one line of type,
priority and assignee, the start of the description and Open ticket. The modal has the
description, the acceptance criteria, the comments with avatars and a Details column (chat 0.19.0).
It is laid out like the Board's card sheet: uppercase section headings split by hairlines, Details
as a panel of label/value rows, acceptance criteria as a list of boxes, comments as boxed entries
on a trail, and Open in … as a button beside Close; on a phone the title takes the full width.
A P-scale priority (P0 to P4, also "P1 - Critical") gets the same ↑ → ↓ glyph as High, Medium and
Low (chat 0.21.0). - A checklist item shows its commits' short shas directly (three, then "+N more") instead of an
"N commits" toggle. With the item's diff, a sha opens it in Blerg's diff viewer at that commit;
without one it copies the sha. ± View diff is a real button with the diff's +/− counts. Commit
chips, the History tab's too, no longer link to GitHub or another forge;commitUrlis accepted
and unused (chat 0.19.0).
Fixed
- Pasting code copied from a web page into the message box, inside a code fence you typed, no longer
fences it a second time: inside an open fence the text goes in as copied. A code block copied from
GitHub keeps its language on the fence. - The card of a published diff shows its summary again ("6 files · +58 −11" and the file names); in the
app it was squashed to a thin line because the image-preview style won over it (chat 0.17.2).
v0.3.0
Upgrade notes
- Desktop: reinstall the daemon (
./daemon/install.sh install). 0.3.0 needs it for opening session
files, MCP connection tracking and the first-message wait, Codex plan updates, background-task
reconciliation, child effort reporting, the shared command guidance for Codex sessions, and the
session guide lines that ask agents to pin their ticket, keep a checklist and publish diffs. The
blerg-runnerCLI itself updates with the checkout and works under an older guide; until the
reinstall, the panel simply has less to show. - Runner: migrations 053 to 058 (cron engine, latest capabilities, checklist/ticket/plan and MCP-status
indexes onagent_events,account_preferences) run when the server starts. No manual step. - Chat package:
@blerglab/chatis now 0.17.1. An app that embeds it takes the new version from the
runner's manifest and installs it (Install); ChatView's
onViewCommitDiff(0.15.0) is removed, and a side panel that drew checklist "View diff" passes
onViewDiff(artifactId)instead. A proxy that serves the board's chat may add the optional
GET {prefix}/preferencesroute for code colors. - Contributors: Go database tests need a Postgres user with CREATEDB
(CONTRIBUTING.md). - New optional setting:
BLERG_RUNNER_MCP_PROMPT_WAIT_S(default 30; 0 turns the first-message wait off).
Added
- Chat (
@blerglab/chat0.12.0 to 0.17.1, now 0.17.1):- Code blocks are syntax-colored (a lazily loaded highlighter; diff lines colored) and, over 25
lines, show 15 with Show all and an Open viewer with line numbers; a pasted message over 25 lines
compacts the same way. Markdown, text, code, JSON, CSV and PDF files get small inline previews
(size-capped, fetched when scrolled into view). (0.12.0) checklistrows andticketcards in the transcript; the checklist, the engine's plan and the
pinned tickets inLiveState. (0.13.0)- Code color themes:
codeThemes,applyCodeColoursand friends, and six new code tokens
(variable, built-in, operator, text, background, line numbers). (0.14.0) - MCP and checklist commits:
slots.aboveComposer,commitUrl,McpHoldLine,CommitChips,
mcp_statushelpers. (0.15.0) - Diffs and file links:
DiffView, thediffview,parsePatchand friends;canOpenWorkspaceFiles,
files.workspaceFile,workspaceFromCode/workspaceFromHref. (0.16.0) - Rich copy and paste: every message has a Copy button that copies its Markdown source and its
rendered HTML; selecting text in the chat and copying keeps headings, lists, links, tables and code
as Markdown plus sanitized HTML (card chrome left out); and pasting rich HTML into the message box
inserts it as Markdown (code language kept, images and scripts dropped), with Ctrl/Cmd+Shift+V
still pasting plain text, as does a very large or deeply nested paste. See Copying and pasting.
(0.17.0)
- Code blocks are syntax-colored (a lazily loaded highlighter; diff lines colored) and, over 25
- Diffs.
blerg-runner diff [<range> | <commit>... | --staged | --worktree] [--title T] [-- <paths>]
runs git in the session's folder (hooks, filters, external diff tools and text conversions of the
repository never run) and publishes the patch as<title>.diff;.diffand.patchfiles get the
viewdiff, a card that says "N files · +a −d" with the first names, and a diff viewer (file list,
unified or side by side, line numbers, folded context, the code colors, Copy patch). The session
guide names the command. See Diffs. - Clickable file links in the chat. A relative link or a path in inline code in the agent's text
(README.md,src/a.go:120,docs/a.md#L12) opens that file from the session's folder in the
viewer, scrolled to and marking the line when one was named, with Copy path, Download and
Save a copy to Files. Only human session owners (and administrators, for sessions that are not
private) can open these files, through the daemon, with traversal, symlink, file-identity and
secret-file protections. See Files the agent mentions. - Settings. A Settings entry under Insights in the left bar (a tab on a phone) opens a dialog over
the current page; it holds Show thinking and Compact tool calls, which left the session panel (same
per-browser keys, so earlier choices carry over), the code colors below, and a link to Blerg's main
Settings. The session panel's Settings section is gone; Resume when limit resets, which belongs to
one session, sits in its Session section. - Code colors. Settings has a Code colors section with ten themes
(Blerg, GitHub Dark and Light, One Dark, Dracula, Monokai, Solarized Dark and Light, Nord, Gruvbox
Dark), one for dark mode and one for light, per-color changes under Customize, and a live preview of
real code blocks (ts, go, python, json, diff). The choice is kept per account on the runner
(GET/PUT /api/me/preferences, migration 057account_preferences) and cached in the browser. The
chat's code blocks, viewer and file previews wear it, in the runner and in the board (which reads it
through its chat proxy,GET /api/chat/preferences, and the runner'sGET /api/runner/preferences;
the board has no editor). - The session checklist and pinned tickets.
blerg-runner checklist set|add|tick|untick|clearkeeps
a checklist of the session's work;blerg-runner pin <file.json>pins a ticket from any tracker
(JIRA, Bugzilla, GitHub, GitLab, Linear, a Board card, …) in one source-neutral shape, and
blerg-runner unpintakes it off. The chat draws a compact checklist row and a ticket card (a re-pin
says what changed); the session panel shows them above the engine's own plan.checklist tick|add --commit <sha>names the commits that finished an item (a commit chip per item, linked when the
repository is known) and also publishes the diff of those commits; the chip gets View diff. New
routesPOST /api/sessions/{id}/checklistand/tickets(the session's own token);GET /livegains
checklist,plan,ticketsandticket. Migration 055 adds three partial indexes on
agent_events. Pinning copies the ticket's text into the session. - Engine plans in the session panel. Claude Code's own task list and Codex's native plan updates both
appear as Plan when the agent set no checklist. - MCP servers in the session panel and Send now. Claude and Codex MCP connection state is tracked
natively, with durable live snapshots. The Live tab gains an MCP servers line ("Connecting 2 of
3…", then "2 connected · 1 failed · 1 needs sign-in") that opens to each server's state, source and
tools; the first message is held for up to 30 seconds while the servers connect, the chat shows
"Waiting for MCP servers before sending your first message · 0:12 / 0:30 · Send now" above the
message box, and the session's owner can send it at once (arelease_held_promptmessage;GET /livegainscan_release_prompt). - Reported child configured effort in chat, Live and Insights, with explicit unknown values.
- Adapter-specific tool-definition refresh guidance in capabilities and tool-change review.
- Target-scoped engine/model/effort discovery for browser, REST and MCP callers, including
existing-session catalogs and dynamic launch, cron and Board engine choices. - Board role/card effort settings, effective native session metadata and backend-qualified
recovery; engine changes clear future-launch overrides while preserving existing sessions. - Published artifact links can open the chat viewer directly through a trusted session mapping.
Changed
- The session panel has a Plan tab (Live, Plan, History, Files, Capabilities): pinned tickets,
the checklist or the engine's plan, and the session's published diffs move there, and Live keeps one
summary line ("Checklist · 18 of 23 · Next: ...") that opens it, so a long checklist no longer pushes
Needs you and Running now off screen. The tab shows only when there is something for it. - Go test suites run packages in parallel with isolated template-backed PostgreSQL fixtures and
shorter injected test waits (the runner suite takes about 3 minutes, down from about 10); database
test users need CREATEDB. Fixtures safely clean abandoned helper databases; OAuth, Codex timeout and
webhook tests use controlled clocks and wait for asynchronous work before teardown. Stale Claude
idle timers no longer close a newly rearmed idle window. - Agent-facing launch guidance uses target-scoped engine/model discovery instead of unscoped catalogs.
- Engine integration metadata, customization roots, managed credential access modes and
restriction/limit capabilities use shared registries with explicit adapter boundaries. - REST/MCP and embedded proxies share model controls and optional durable message IDs.
Fixed
- The "Couldn't sign you in · Retry" banner on the board and runner heals itself. After a power cut
or an outage it used to stay until the person pressed Retry; it now tries the quiet hidden-frame
renewal when the network comes back, when the tab is shown, and on a 5 s, 15 s, 30 s, 60 s, then
two-minute backoff (paused while the tab is hidden, one attempt at a time), and a token takes it
down with no page reload (the runner reconnects, the board reloads its data). When core answers
that the sign-in has ended, the banner says "Your sign-in has ended · Sign in" and stops trying;
for that core now sends a renewal frame whose sign-in is gone back to the page's own
/silent-refresh.htmlwith#signin_error=<reason>instead of to its login page. Automatic
full-page redirects to/auth/refreshstay bounded exactly as before. - A long checklist item wraps beside its box instead of dropping the whole text onto the next line.
- The session panel's "Resume when limit resets" ...
v0.2.1
Upgrade notes
- Reinstall the desktop daemon to get the connection check:
git pull, then
./install/desktop/blerg-up.sh(or./install/desktop/daemon/install.sh install). Until then a
0.2.0 daemon keeps working against a 0.2.1 server exactly as before (it is sent nothing new). - Server and daemons can be upgraded in either order. A 0.2.1 daemon against a 0.2.0 server logs
daemon: link to … open for 5s but not confirmed by the serverandinstall.sh statusshows
unconfirmed; that is expected and fine. Session pods pick the change up with the new runner
image; nothing to do. install.sh install(andblerg-up.sh) now exits 6 when the server refuses the daemon
token. Before anything is replaced the running daemon is left alone; after the restart the new
daemon is installed but refused. FixBLERG_RUNNER_DAEMON_TOKENininstall/desktop/.envto
match the server's and run it again. A daemon with a wrong token now retries once a minute (it
used to retry every 2 s) and logs onedaemon: REFUSED:line.- Files are larger now: 100 MiB per file (was 25), 500 MiB of attachments per session (was 200),
and a new 1 GiB total for the files one session's agent publishes (there was none). Check your
runner data volume size (Kubernetesblerg-runner-data,RUNNER_DATA_SIZE, default10Gi;
desktop: theblerg-desktop-runner-dataDocker volume, on the disk Docker uses) against the
sessions you keep, or lower the limits withBLERG_RUNNER_MAX_FILE_MB,
BLERG_RUNNER_MAX_SESSION_UPLOADS_MBandBLERG_RUNNER_MAX_SESSION_ARTIFACTS_MB. - Kubernetes: re-apply the manifests (
deploy.sh). The ingress body limit goes from100mto
128mso a 100 MiB file fits; a controller other than ingress-nginx needs the same change by
hand. The three limit keys are wired, optional, inrunner-deployment.yaml.
Security
- Go 1.26.9 everywhere the build picks a Go: every
go.modandgo.work, the Dockerfiles (pinned
by digest), the CI jobs (which now read the version fromgo.mod), the desktop installer's host
and container builds, and the session images, whose Go toolchain is copied from the devcontainer
build and so moves to 1.26.9 too. This picks up the standard-library fixes released since
1.25.14;govulncheckreports nothing reachable in any module.golang.org/x/cryptomoves to
v0.56.0 in core and runner. core/webtest tooling moves to vitest 4, which clears thenpm auditfindings in its
development dependencies (they never shipped in the built app).
Added
- The daemon keeps the state of its connection (
connecting,connected,unconfirmed,
refused) in~/.blerg-runner-daemon/connection.json(mode 0600, no token), and
install/desktop/daemon/install.sh statusprints it. GET /api/daemon/whoamion the runner: checks a daemon token without connecting a daemon
(200 {"ok":true,"mode":"daemon"|"runtime"}, otherwise401).- Desktop:
install.sh install(andblerg-up.sh) asks the server whether it accepts the daemon
token frominstall/desktop/.envbefore it replaces the running daemon. A refused token stops it
with exit code 6 and leaves the running daemon as it was; an older server (no such check) or a
server it cannot reach only gets a note. After the restart it waits up to 30 seconds for the new
daemon to report its connection and stops with exit code 6 when the server refused it; then
blerg-up.shexits 6 as well. Troubleshooting:install/desktop/DAEMON.md, "Is the daemon
connected?".
Changed
- The session panel no longer repeats what is a click away: its Session section drops the Insights,
Files and Capabilities links (the header's Insights button and the panel's own tabs open them),
and on a wide screen the panel drops its own close button (the header's panel toggle opens and
closes it). The drawer on a narrow screen keeps its ✕. - The desktop installer uses a host Go only if it is 1.26.9 or newer; otherwise it builds the
daemon in a container, as before. make lintrefuses a golangci-lint other than the version CI pins (v2.13.1), and
scripts/check_lint_pin.sh(run by CI) keeps the Makefile and the workflow on the same version.- Removed
runner/Dockerfile.daemonand themake docker-build-daemontarget: the image could not
build (it needs the repository root as context) and nothing used it. - Runner: the file limits are configurable (
BLERG_RUNNER_MAX_FILE_MB,
BLERG_RUNNER_MAX_SESSION_UPLOADS_MB,BLERG_RUNNER_MAX_SESSION_ARTIFACTS_MB, whole MiB; an
invalid value keeps the default and logs one line; a per-file limit above a session total is
lowered to it, also with one line) and passed through by the desktop compose
file, the Kubernetes ConfigMap and the.envexamples. The runner reports the limits in force as
limits(max_file_bytes,max_session_upload_bytes,max_session_artifact_bytes) in
GET /api/sessions/{id}/files,GET /api/runner/sessions/{id}and the browser's
initial_state, so clients can refuse a file that is too big before sending it. A declared size
over a limit is refused before the body is read; the 413 names the file's size and the limit.
Fixed
- The Claude usage meter works on work and enterprise accounts. Their usage answer has no
five-hour or weekly window, only a monthly spend limit, so the Claude row used to vanish. The row
now shows "month" (Monthly spend limit) with the share used, "<1%" while under one percent, and
"capped" once the limit is used up. A subscription with extra usage switched on shows it beside
5h and week. Only the percentage leaves the machine, never an amount, limit or currency. Update the
runner server (it carries the web app) and reinstall the desktop daemon: an older server ignores
the new window. - Lint passes again under Go 1.26: two
//nolint:goseccomments in the runner's artifact code
that the linter now reports as unused are gone. TestCookieSecureFlagmodels Safari's cookie rule itself. Go 1.26's cookie jar sends a Secure
cookie to loopback addresses over http, as Chrome and Firefox do, so the jar no longer stood in
for Safari. The login code was right and is unchanged.- Desktop: a fresh install can store files. The runner image runs as an unprivileged user
but shipped no/data, so the data volume was created owned by root and every publish and
upload failed with "storage error". The image now ships/dataowned by that user, and a
one-shot service in the desktop compose file (blerg-runner-data-init, reusing thepostgres:16
image) repairs a volume an earlier install left behind, keeping its files. The runner also logs
oneSTORAGE NOT WRITABLEline at startup, naming the directory, the user id, the error and the
fix, when it cannot write to its data directory (it still starts). - Desktop: container sessions and the stack work behind a corporate proxy. Docker copies the
proxy settings of~/.docker/config.jsoninto every container, which sent calls to
blerg-runnerandblerg-boardto the proxy. Sandboxed sessions now getNO_PROXYand
no_proxyas the union of the daemon's, your Docker client config's and Blerg's own service and
loopback names (the proxy settings themselves are left alone), and the core, board and runner
services of the desktop compose file list the service names as exceptions, keeping your own
NO_PROXYand thenoProxyof your Docker client config (blerg-up.shpasses it on).
Reinstall the daemon and start new sessions for this to apply; see
install/desktop/DAEMON.md("Troubleshooting the stack"). - The daemon no longer says it is connected when the server refused its token. It logged
daemon: connected to …as soon as it had sent its hello, and the server answered a wrong token
only by closing the connection (4401), so a reinstall that kept a stale token looked fine. The
server now confirms an accepted daemon with adaemon_welcomemessage (sent only to a daemon
whose hello asks for it, so a 0.2.0 daemon sees nothing new; a session pod's carries its
session), and the daemon logsconnectedonly on it. Against a 0.2.0 server, which sends none,
a connection that stays open for 5 seconds is taken as accepted and logged as not confirmed. A
refused token is one louddaemon: REFUSED:line that says where the token comes from (for a
session pod: its runtime token), and it no longer resets the reconnect backoff: a refused daemon
slows to one try a minute instead of retrying every 2 seconds. - Desktop:
blerg-up.sh --no-daemonno longer prints the daemon token in its "do this next" box;
the command it shows reads the token from.env. - Runner: a failed upload, publish, fetch or topic says what happened. Failures of the runner's own
disk or database on these routes answer with one sentence (which step failed; permission
denied, disk full, read-only or missing; what to do) and anerror_idthat is also in the
runner's log line, instead of "storage error" or "query failed". A full disk during an upload is
reported as one, not as "upload interrupted". An attachment whose bytes are gone answers410
to the agent, as it already did to a person. The remaining fragment replies on these routes
("session has ended", "file no longer available", "no database", "invalid JSON body") are
sentences now. - Messaging CLI (
blerg-runner): requests to a local server or board (localhost, a loopback
address, a one-word name such asblerg-runner) no longer go through a proxy from the
environment, so a corporate proxy that Docker injects into a session container cannot swallow
them; other addresses still honour the proxy. Every request goes through one helper, and a
failure ofpublish,fetch,topicand the rest says the HTTP status, the server's sentence
and error id (or an older server's raw reply, trimmed), the address called (without any
user:password), and for a con...