# Changelog All notable changes to Open Walnut are documented here. This project follows [Semantic Versioning](https://semver.org/) (pre-1.0: minor versions may include breaking changes). ## [Unreleased] ## [0.6.30] - 2026-11-10 ### Added - Remote Hosts keeps what you typed, and a host's own settings live with it - Remote Hosts is one list of machines - Remote Hosts reads at a glance, and a draft row never replaces a saved host - The rail's Agenda and Scratchpad open beside any page - A low disk tells each open task whose own directory is over 5 GB to clear it - Code blocks get a language label, syntax colors, Copy and Wrap on web and iOS - What was open last opens next: the tab, the page over an Org chat, the shelves and filters - The Action Button listens without opening Walnut, and only the person sends - Permission prompts remember for the session or the project, deny with a note, answer by number keys - Open owner-scoped dialogs without replacing active work - Design C with a side bar for Chat, Passwords, Browser control and Settings - The first page is New task over the task list, with the relay in its header - The task panel and the draft composer can be hosted in a narrow desktop frame - A new task with no folder can start in its own task directory - Network capture, upload by selector, resize, console and muted agent tabs, so the old relay can retire - Live Browser view in the task, window and tab in every answer, no second sign-in on a site the person has open - One conversation per agent, the extension hands its Walnut page a browser key, and the third review round's fixes - A lock reaches every open Walnut page at once, approvals show in Ask, and the second review round's fixes - One unlock reaches Walnut's web pages too, the panel opens real in about 0.6 s, and the first review round's fixes - The side panel and popup open as Walnut's regular Ask, with the vault behind a key - One unlock on this computer reaches its browser extension, and a lock reaches an open popup at once - Settings offers a generic Add a source before naming Bitwarden - One switch turns filling and saving on web pages off, for a browser where another password manager fills - An unlock that holds 48 hours everywhere, a master password hint, Bitwarden as its own source, and the second review round's fixes - Org chart cards show names only and open for detail - Walnut as the iPhone's password app - A plugin's settings and sign-in live on its page in Apps, never in Settings - Per-host start slots, file-aware placement, and starts that either start or fail with the reason - A host daemon tells the server whether the process on its gateway socket is in the session - Show why, the task's goal and last steps, check the asking process, and ask-and-end mode - Consume signed steps once within their bound context - A click on a zoomed tall picture fills the width, and the zoom scrolls - Trigger_list takes name, state, task and limit, and answers one short row per trigger - Ask here in the Changed tab opens the question card beside the diff passage - The file page reads like a document: one quiet line, saving always live - Tree Mode keeps up to three pages side by side, with a sibling page and light composers - An App brief for the AI only, told once per session and after each compaction - Talk to Walnut, press the Action Button and speak to the CEO chat - The Side threads pop-up goes full screen like the session panel - An outside reminder that owns sign-in holds Walnut's sign-in letters while it runs - Config ssh_cert_letter false hands the certificate warning to another reminder - Hide status sentences unless enabled in Display - Draw Claude Code's error reply as its error row, as the web does - Organize Home work by pin tier and project - Home's taskbar keeps minimized sessions one click away ### Fixed - A signal to the push gate ends its poll sleep too, so its output closes at once - The notice corner drops a page's room when the page changes, and judges a left column without the room it took itself - The scrollbar's room is measured once the global stylesheets are in, so code blocks no longer keep 6px of dead space under their track - A spec that switches to WebKit in a Chromium project starts it without Chromium's --mute-audio - Launch parity names the extension's own-task-dir start and the permission decisions read, so the ratchet passes - On a phone, Show more and the Changed tab's compare and review controls are 44px targets with 12px text - A death found by a send waits for that send's answer - A store whose data home is gone opens afresh too - A wiped store opens its fresh handle before it closes the old one - A wiped data home no longer serves the previous test's SQLite rows - A stop's ride-along save can be awaited, and status-push tests wait for it - A turn generation is never reused, so a lane never takes the previous answer - The leak audit scans the push gate sweep's logs too - The push gate runs on a hidden ref and sweeps what a killed hook left - A notice beside a full-screen sheet never folds the kanban to its narrow sections - The board's sorts and the launch log fields type in steps, and slow expressions are flagged - The phone's Board button is a 44px target; C68 reads "1 Needs you" - The Org Threads transcript is stamped before its turn ends, and the reader double has every real method - The own-share load reads give each blank-headed ps column its own -o - The iOS job skips TalkRealServerUITests, which drives the home screen and needs a paired server - Closing Changed raises no ResizeObserver loop error, and its scroll spec follows the chat rule - A clone of another checkout never takes that checkout's branch as the default - The comparison button and Hide whitespace are finger-sized on a phone - A secret's Save that runs keeps its form, and a field put right drops its refusal - Remote Hosts says each thing once, and a secret's form lands where Add's does - Remote Hosts answers every press, in WebKit too - Add host offers both ways in and lands on what it made - Go there on a Scratchpad still saving opens it in a sheet at phone width - The Org page settles its default node once the tasks are in, and keeps it - The scratchpad keeps the first edit after a focus reload, and a stale first read never wins - The moved scratchpad fills and scrolls, waits in the document, opens only once read - One scratchpad editor per window; full screen starts beside the side bar - A plugin's job bundle finds the packages Walnut carries - The phone's direct send reads a daemon's error answer as no answer, never a death - A move or switch leaves exactly one live session per task - The darwin-arm64 daemon tests and the real-ps sweep test run only on a Mac - Count the size walk in the daemon version hash and list the size notice's send - Size notices skip org nodes while the org is off, never starve a directory, never block the daemon - A low disk prunes old build output of tasks still running - The kept Org page comes back only with a launch's restore; Threads retry waits out the companion's beat - A phone that leaves while the stream to the Mac still opens is no mark against it either - A Threads read the companion could not pass on is tried once more before the page says so - A call the phone cancels is no mark against the Mac - The Org node page's id no longer hides its view picker's own - An Org node's chat keeps the screen at the accessibility text sizes - The queue card shows what the person typed, where each line stands, and pictures as pictures - The update test makes its DMG with the release build's sized, retried create, so one failed hdiutil create no longer fails a signed app - Excuse only the lines Walnut recorded writing, not lines in its shape - Hold only the writer's own lines to the Brief limit - Idle open tasks lose their build output too; a full disk lets host commands through - A received message's fold stays shut under a reader near the bottom - A task settling another's ask reads the user's words there first - His message outdates a thread's summary until the node rewrites it - The session header's fit never changes boxes above it inside a ResizeObserver callback - A stopped question's "Turn interrupted" stays on the question's page - A task whose session host is gone is never stuck - A trigger's name is a short label, never its prompt's opening - Work a target runs after its turn (background jobs, a team, a wakeup) is a sign it took up the work - A target that took up the work since the ask is never told silent - A worker handed back while its own subtask or asked reply is at work waits on that task, not its lead - Time Walnut was not running never counts against a reply deadline - The Chinese certificate letter sets the user's renew step apart after a colon - Memory saves take the shared file lock and refuse a stale hash before sending - Memory_write takes exact-string edits and says whether the file changed - One -o per blank-headed column, so Linux procps 3.3.10 reads every column - The CLI's own window reading is lifted to what the session holds - Judge an answer for the user where it really goes, up to the write - An answer for the user never wakes a stopped or finished task - The first page reads its tasks through a committed ref, and the relay panel's placing visibility is listed with main's highlight guard - The key popover keeps a typed master password across a redraw too, and a guard lists every password field - The agents switch's line in Browser control says what it does in the state it is in - The first page hands over only the tab Send was pressed in, keeps a failed handoff's words, keeps task links inside the panel, and saves a todo once - One holding per tab, a sign-in yes fills once on its site, and network answers judge the request they read - Network reads keep site rules and masking, the live view and Stop answer only the owner, a fresh sign-in needs the person - A popup redraw keeps the master password, Secret Key and server address the person typed - A shrunk list keeps its room in the taker shape the column-aware stack reads - Ask rows read their latest words from chat history too, an answer counts as read only on interaction, and the fourth review round's fixes - Side panel hides a parked task by Home's own rule instead of reading the phase - Side panel Tasks counts Focus as Home does, and a Needs you row says what the task asked - Unlock to approve follows main's one-line approval rows - A card folds its new answers behind one line under the summary - Every card leads with a summary line, and the node is asked for a missing one - Show a thread only once it has a real reply, one summary per card, and wake a node that left a thread too long - Every GitHub read of the leak audit is tried again after a failure, so one HTTP 500 on a release asset no longer ends the audit - The idle notice's new words move the history cache, and the recovery's compaction shares the quiet store - The inline share clamps as Settings does; the opened row reads calmer - The context share drops as soon as a compaction lands; a closed idle run stays closed - Idle compaction never reads as Working, opens to its reason, and Compact context goes out once - An opened project counts its tasks' asks, not its VP's threads - Org chart detail ids are one to one with their row keys - An opened org chart card lists its tasks' asks; narrow layout and empty VP stay names only - The Minimize dash draws on the header row's middle, with a guard on every window button's icon - A move for its files sets the repository up in its own window - Review fixes for the window source - A [1m] request caches its window apart from the plain model - The window comes from what Claude Code reported, kept on disk; a name rule is only an estimate - No text sends anyone to Settings for a plugin any more - A part's own panels show on its parent's page, and a host row with a port stays remembered - The turn readout names every model a switched turn ran on - Typing after a space keeps a note's own bytes too - Hash the caller-proof modules into the daemon version, run its twin test on Node, and keep the hello capability order the parity test pins - Judge each asking process by its start time, from the daemon's own record - A picture pasted from the clipboard is read from the paste's files - Reads under a task that its record cannot answer go to the Mac - The Action Button opens Walnut already listening, with no Live Activity - Keep dense tasks reachable and body drags aligned - A message an installed App sends through its own op call is named as that App - An app update or a restart no longer turns the work card off for the stretch - Ask here never covers its passage, quotes the file's line breaks, and never does nothing - The selection bar opens its menus away from the words, and fits a narrow column - Ask here in the Files tab opens its card on every view, at once - The selection menu's Ask choice and Comment box are normal menus over the conversation - Typing keeps a note's own bytes even where the editor cannot spell them back; phone tree-head name is a 44 px target - An overloaded run lets the fixture port go before it stops - A Playwright run never starts on a machine still overloaded after the wait - A Playwright run never starts beside a live holder of the fixture port - Every artifact download has its own step limit, and the binary matrix downloads a release's assets again when the first download hangs or ends without them - Keep thread asks readable without faded clipping - The iOS job restarts the simulator service once when xcodebuild still cannot see its booted iPhone, and a leg with no result bundle says so in one line - A list that fills its column ends above the corner, so no row sits under a notice - A brief handed to an earlier queued row keeps the order its notes were made in - The App brief leads a batched line, reaches ACP starts, and moves with its row - Keep the App brief out of tool results and parses, and tell it on every path - The Threads jump bar stays when the last card for him is gone - The session that asked hears the answer - The chip flow's width types in steps, and the session-state tests know the boot window - A cold resume past its cache runs on the current prompt; a person is answered first - The reply language leaves the hints for the prompt; the org notes say one line - A hint goes out only by its own triggers; the reply language never rides every message - The Threads jump chip counts every closed thread, and the closed fold says it lists the newest - Keep the drag preview under the grabbed point - A full-screen sheet moves its whole left edge past the corner, and a task link keeps its arrow - The corner stays bottom left in full screen, and an approval opens the task that asked - A picture's HTML form sets loading before src - Exact image names keep a pipe; failed pictures recover everywhere - A pasted or cut image names the exact file it drew - Images in a note show inline, with click to zoom - A Talk card leaves the Lock Screen once its take is sent or deleted - The phone's Threads list and its count come from one rule, and a failed read is never an empty list - Every GitHub read of the test gate has a time limit, and the log says when it last heard - The taskbar's card takes pictures, its scrollbar keeps the WebKit look, and Minimize joins the "..." menu - Pin the folded file so compaction cannot reuse its identity - The Changed button shows no count badge - Focus Bar writes hold their rows until answered, and overlapping writes end in one pull - Pinned thread jumps, a letter's task link on its own line - A request keeps the fingerprint of the first answer that reached its asker - A start killed while its CLI boots waits for it, and a machine-killed start recovers by itself - A write still waiting for a connection when the page goes is sent at once - Tappable Try Again, chip lines that never cover the rows below - A sign-in ask is this machine's, a part of an answer keeps its order and direction - One sign-in is one ask, checked against the live sign-in; an answered ask stays answered - One notice per answer, cause and expiry; open error cards survive a full feed - The iOS job waits until xcodebuild lists its booted simulator, and says so when it never does - A rename or delete holds its moved task rows until the write answers - Readable letter task row, retry feedback, kept task section folds - Claude Code's own error reply is its error line, not an answer, and notice lines read at 13px in a darker grey - A turn that ended on "Prompt is too long" never closes the work, and a restart mid-compaction resends what was owed - Review round 7 fixes for the Org pages and task details - The phone's page read of a session its host cannot read answers 503, not 404 - A model with a 1M window reads 1M, and the model list shows each model once - An import an older build kept as Walnut's is put right, and an import that appears during a long read counts as outside ## [0.6.29] - 2026-11-08 ### Fixed - Sessions Walnut imported because they began outside stay outside, the Walnut and Outside average counts the days that have usage - Keep git status out of every task row - Reopening a running session shows its turn once; queue list gets a cross; stranded edits are kept - Undo keeps the queue steady, Interrupt & send asks first, smaller rough edges from the last review round - Folders with the same two-part name read apart, an imported terminal session never moves the bill cutoff - A failed compaction reads as failed live as on reload, and Walnut's notice says only the cause - Put right an outside look kept for a Walnut session on the server side, and keep the full read repeating while a transcript has not named its entrypoint yet - Re-list sessions before routing a page, no throttle on the first look, count older transcripts that named no entrypoint - Walnut's compaction notice says what it asked for, and its row says the size once - A known session on a Walnut entrypoint is Walnut's even over an older outside look, a re-listed session of another name is not stored twice, label Codex VS Code and Walnut helper - A Walnut session begun mid-pass is not Outside, SDK server sessions are Walnut's, the older overview honors the bill rule, big first messages keep their entrypoint, plainer bill note ## [0.6.28] - 2026-11-07 ### Added - A task tap opens its conversation, and Org nodes get Threads, Tasks and Brief pages - By project folds completed tasks once, at the bottom - Count Claude Code sessions no Walnut session started, and leave out what a cloud bill already covers - Session.tag_requests also tags Walnut's one-shot calls, its server-side model calls and every ACP engine - Session.tag_requests tags every model request of a Walnut session with its task id - Codex sessions use the configured provider and model on every host, and ACP sessions take the task's permission posture - Count Codex runs no Walnut session started, with their account and a Started by filter - One decision shows once across a team, and an ask answered above leaves Needs you - Import from Claude Code points Pi at Claude Code's gateway - Refuse a Codex model run with no provider override after the subcommand - A phone browser's sign-in renews itself, with a refresh token only the renewal sees - Org side bar puts Threads first and opens a node on it - WALNUT_EPHEMERAL_IDLE_MINUTES sets how long an idle ephemeral server lives - No cold-cache line: once the cache expired, compacting is the user's call - A message lined up for after the running turn is held in the queue until the turn ends; iOS fixes from the last review round - The task panel keeps the tab the user is on - Glanceable git state on task and session rows, live Changed tab - Idle compaction at 85% of the session's auto-compaction limit, editable on its row - Status groups fold by one rule: folded by default, folded again 15 minutes after opening - Every notice shows in one bottom-left corner; an approval is one card with its buttons - A phone Follow up names its thread on POST /api/v1/sessions/:id/messages - Autofill on par with the big password managers, one extension for agents, and agent access the person sets ### Fixed - Walnut's recovery compaction names itself on its row, and a cached history picks up the new notice - Say that All also counts an imported usage bill, and that Started by covers Claude Code sessions too - A reloaded panel never draws Walnut's queued /compact, and the recovery says which compaction runs - A full outside read that fails between pages falls back too; name more Claude entrypoints; say what Billed directly is - Walnut's own /compact reads as its notice, never the user's message - A word that starts with digits is an opaque id, never read for a term in its parts - An Org thread's Follow up takes pictures, and the inbox guards read the one task opener - An outside Codex pass stops when its time budget is used up, also when a page took no time - New ids work on a plain-http address, where crypto.randomUUID does not exist - The selection bar hangs off the whole passage, and one guard checks the menu in every view - A full read of a host's outside sessions that a lost link cut off falls back to the normal collection - A session never stays stuck on "Prompt is too long" - A usage scan a lost link cut off goes on, and the same request asked again takes it up - Claude-outside-core is in both daemon hash lists - The notice corner keeps inside a narrow left column too - Selection pill boxes open in room the text makes, never over words - Session panels stay readable in a narrow column - Session menu Columns row shows numbers, not bars to count - An isolated server starts, adopts and records no voice process unless WALNUT_STT_AUTO_SETUP=1 - The transcript head cache entry may be absent before it is read - The notice corner sits next to the sidebar, over the page's left column - Outside GETs try again past a 5xx for minutes, and a failure with no walnut of its own prints one scenario's logs - A death this computer's shutdown causes is held as a restart loss, never handed back - Every corner notice shows its whole message, with its command copyable - Copy session.tag_requests to replicas - Read Codex runs by engine capability and each machine once - A person's picks run one at a time and the newest wins; picking the current engine again withdraws an unanswered pick - A page with no token asks the renewal path only when its refresh cookie's mark is there - A newer pick ends an older pick's retries, and a resume keeps the context it never read - A rule with only a subject pattern reads "Subject matches ..." - Run subject patterns in a linear-time matcher instead of guessing their cost - A cut status question never answers the user's next message, and a switch never runs over a turn it could not stop - Carried context is never lost between switches, and a stuck turn is stopped before the read - An opaque id is matched whole, never by its letter and digit parts - A switch with nothing to say runs no turn, survives a restart, and never resumes a broken session - Fold checkpoints move to format 6 for the local-command echo rule - A stop finds the recorded CLI gone when its pid now runs another program - A test server ends with the process it works for, and its snapshot is copy-on-write - Every mic in a phone task detail is a 44 px box - An engine switch runs when the picker closes, and every panel follows the task's session - The running-subtask cap counts on the started task's lead, whoever starts it - The off-view note's Show runs the locate again on the tab it opens - The notice corner sits at the bottom on a phone and keeps clear of the page's work - A remote host's reboot resumes its sessions instead of handing them back first - The empty filter row a removed chip leaves goes once the user moves on - Mail and task detail on a phone keep 44 px targets - A later check of the same conflict keeps Save's warning - A start the user asked for is not held back by older plain starts the lower cap refuses - A status fold waits only for a reader of the panel; the panel keeps a tab picked in a project jump - The host's letter check takes same_ask_reason, as human_inbox_send does - A message lined up for after the turn is also held during a turn only the session record knows - The off-view note keeps its sentence whole and dismisses with the shared close icon - One decision shows once when a task and its subtask ask the same - A hook turned back on is in the list PATCH /api/hooks answers before it - A right-click menu and its picker stay open when a live update above the row scrolls its list without moving it - A status fold judges "on screen" by the panel's list area, and an on-screen heading keeps its place - A revoke or the hard stop while a call waits starts nothing, and a call can run under one named grant - An install past a tarball npm does not serve yet runs again, and a failure prints its own logs - A Stop stays visible in the transcript, several withdrawals undo together, and a held-back queue can be sent in one tap - New task draws its whole draft in the first frame - Idle compaction threshold stays 45K under the limit; inline save reads fresh config - The queue tray keeps the model name readable, shrinks with the keyboard at large text, and its times tick - Idle compaction off by default (measured cost), stopped compaction hands back - A Mac on a call is busy, and an owner's queue can lend a lane - The first review round's findings, from login matching to agents that ask before they buy - Undo restores a withdrawn message in its place, and the queue tray reads clearly - A failed keychain probe also pauses secret reads, and the pause ends after six hours - One gated reader for the keychain items the password manager reads back, registered in the keychain guard - An Undo tap cannot become a second tap on the row that moves under it; the queue seat shows a tray - Idle compaction says what it does, and runs before an idle reap - A right-click menu stays open through a scroll that left its row in place; C50 judges the drag without other workers' frames - Stop stays within reach while a draft is typed and asks before it sets waiting messages aside - A message a Stop set aside can be corrected; the queue tray gets edit hints, an undo that says where it returns, and guards against double taps - A run that waits its turn cleans up after itself and survives a dropped fleet read - A fleet iOS run waits its turn when every Mac is busy, instead of failing ## [0.6.27] - 2026-11-06 ### Added - One tray for queued messages, a card where Stop landed, no stray stop on a double tap - Compact big idle sessions before their prompt cache expires - Stop a running session turn, steer it with a message, and manage the queue - The phone can stop a running turn and interrupt it with a message - A connection journal that tells a server restart from a failed node - The side panel gets Ask, Tasks and Passwords tabs - Host_exec strict stops at the first failing command and names it - Agents reach every open tab, use any site without an ask, and Walnut's notes ride as hints - A session creates a trigger while its Walnut server is away - A node's turn in an old letter meets the one-place rule too - Set up in Chrome from Settings, and the extension keeps up with every Walnut update - A thread that waits on the user buzzes his phone - Walnut in the browser side panel, asking about the page and acting in a tab the person hands it - The phone link shows its QR code again - One place per update, a thread's news never also a letter - Task_history reads short: compact, limit, since ### Fixed - A bulk result line's Retry and Undo act on its own job; specs wait out a cold fixture and a leaving lead row - The interrupt route and Send now follow the boot-policy, agent-parity and picture-box rules - The reader's own scroll back to the end turns following on again - Daemon.pid is written before daemon.port - Probe cli-fast's call path in a clean env, place import.meta.url reads by the source map - Cli-fast runs strict, keeps import.meta.url to Walnut's files, and is probed before it lands - Bun builds dist/cli-fast.js as CommonJS with bytecode, a data command starts ~5-10x faster - The Browser extension pane is a settings section; the Devices spec counts only DELETEs - The side panel's task reply is Walnut's answer box - A retry of an interrupting send stops the turn only once - A Connect press only dials; the host is read once on its new link - The session host change meets its ratchets - A fleet run reports when it started, not its simulator's UDID - One place per update is prompt text only, no server refusal - The shipped skill, the launch parity list and the hints e2e follow the object-context hint - A fleet run says when it ran (UTC), how long, and its counts - A strict pipe that failed in its middle is named by its line and member - An edit to ios-fleet-test.sh during a run no longer breaks the run - A fleet iOS run goes to the other Macs first, and to this Walnut's own Mac only when none can take it - Side panel tabs keep a held selection, follow the page, hide a shown password - A deploy no longer asks again to allow Walnut on the local network - The extension setup's clipboard write hears its child's stdin - A phone stays signed in past Safari's 7-day storage rule - The compiled walnut file starts from bytecode, so every walnut call is ~650 ms faster - The daemon version hash lists host-exec-clt.ts too - A host that connects is read once, so its Overview card and profile fill without a press - Host_exec at its cap waits for a slot instead of refusing, and a burst can no longer pass the cap - A Mac without the Command Line Tools never shows their install dialog from host_exec - A machine away during a relay change is still dialled on the relay it was last seen on - Uninstall forgets the restart mark, so walnut calls stop waiting 45 s for a daemon that never comes - An offline host network machine says it is offline, not that its daemon failed - A shown value stays until a newer one comes, across failures, restarts and reopens - One npm install at a time per Walnut, the server's own and `walnut update`'s - A line the CLI read but never answered is sent again once - A phone pan up while a reply streams stays where the finger left it - Parenthesized noun lists and enumeration-comma items are not several things - A thread's buzz holds the absence only while it still waits on him - A decision is a thread's only through a task that one open thread went to - A field rehearsal skips a start point published after its release was picked, and a failed field-start runs nothing - The Org page's own overlays are solid, never see-through - A host card never shows a bare "?": sessions from Walnut's records, every unknown says why ## [0.6.26] - 2026-11-05 ### Added - Drop the switch that refused Main's or a VP's 4th command - Walnut agents use the person's own browser through the Walnut extension - Deploys queue up, so production restarts at most once per 10 minutes - A Walnut browser extension for Chrome and Firefox that fills and saves logins - Phones & Cloud is four tabs, each saying what its way is - A recovery code for a forgotten master password; agent choice moves to Settings - Pin a thread to the top of the Threads view - The Org page opens the org settings in place, beside Org chart - Every box that writes to an AI takes pictures - Remind Main and the VPs to hand work on instead of refusing their 4th command - Tree Mode splits into two halves with a path bar, so the question and the level it was asked in sit side by side - One daemon keeps each Walnut's settings apart - Agents use vault items with the person's approval - An encrypted password vault with its own app in Walnut - A task keeps the user's unanswered messages, and Threads read their answers right - Host_exec that stays out of the way, host_copy, Install that works on every host, and joined hosts that update their daemon - One letter when macOS blocks Walnut from the local network - Run the iOS tests on a Mac of the fleet from any task - The Overview shows what it read at once and reads on a click - A new import project goes under the VP of the other import projects - The invite line names the coding agents and installs none - Each Mac app release updates the previous release's app to itself first, and a failed automatic download is tried again - The Org list puts a node's Threads first and counts them once, with no "N open" - Talk to CEO opens a box for your words first, New task focuses the draft - Main and a VP never do the work themselves: a 3-command rule Walnut enforces - A click on a task row's project name shows every task of that project - Only link tags fold into the header's tags control; Trigger, Worker and Leader stay on the row - One phone link with its code inside, plugin-named tunnels, login retry for host uploads - Talk to CEO opens a box first and sends only on Send - A running Walnut installs a new release itself and restarts when the person is away - A Thread waiting on the user is the CEO's or a VP's Needs you, and threads come first - An Ask here answer is filed only from its own tag, with the thread id and name the question was sent with - The full-screen sheet grows outward while its review column is open, so the chat keeps its width - A kept row open beside the page wears a light tint, never a frame - To read sits under Needs you, and every Needs you row says what to do with it - To read sits under Needs you; every Needs you row says what to do with it - The task and session menu, redesigned: Open, Window and Panels lead; Pin to, Dates and plugin fields are each their own group - A tunnel plugin installs its tool by itself; found hosts wait for a yes - A task with a locked session panel hangs under its row too, with an eye or a lock - Every box that writes to an AI takes pictures - Ask here asks in the view on screen, a reply is only its own question's answer, and long conversations get named outline sections - VPs start by themselves in the background; Settings → Org turns the whole org off - On the Mac too, as Needs you and a system notification - Every email item offers Talk to CEO and New task - Store plugins keep themselves current - Waiting is only a real wait; a task's own build is Working; a finished result is To read - `walnut approve` pauses a script until a person approves, with a tap or Face ID / Touch ID - The Org page's Pinned is Home's Watching, one list - The session header folds every label into one control and shows no run status - Snooze a thread until a time, with a Snoozed section on Threads - A task opens on Home from anywhere; the separate task page is gone - POST /api/v1/content/draft gives a client without the web bundle the New task draft words - Every pane split on the Org page drags - Snooze until is the task menu's first row, with Watch beside it - Every plugin's content offers Talk to CEO and New task, and nothing turns it into a task on its own - The Org side bar opens into the full-screen sheet instead of widening - Walnut for Windows, a one-file installer and its own window ### Fixed - Every rehearsal's daemon outlives a restart of its server, as a person's does - A self-call made for a caller elsewhere never counts as a private link - A host network machine that comes back is dialled again - A walnut call the exiting daemon never read waits for the next one - A daemon update that meets a call in flight is asked again, not dropped - A landing in Tree Mode measures under the gutter the reader will see - A transcript is read whole once, not after every restart, eviction or 4 MB - Gcc and dtach set up on a new host never read "Installing Claude Code" - A walnut call the server still has when its daemon stops gets an answer - A walnut call from outside any session is its host's one Walnut's, so it is answered while the Mac sleeps - A session that starts while every panel is pinned keeps its column - A read cut off by a server restart goes to the next server run - A UI run writes its xctestrun with a python whose plistlib loads - A walnut call's waiting notices go only to a terminal - A fleet run's results come back through a Walnut restart - A walnut call made while its host's daemon is replaced waits for the next one - Every surface the user reads says the task's status in user-status words, never a phase name - The CEO's and a VP's red is its threads, "0 threads" in grey, never its own Needs you - The endpoint wait never continues over a Stop, a closed task, a stopped team or a message sent during its probe - A turn that could not reach the model endpoint waits on its machine and continues by itself - A session's own work after its turn is one list, and its drain is no turn end - A host that does not answer is a 503 or 504, never a 500 card - The companion's tunnel daemon is replaced by a newer build; extracted daemon harnesses name every free name they read - A list drawn under a resting pointer holds still once its rows arrive - Install moves an npm launcher aside so the native claude takes its place - A fleet iOS run whose Mac replaced its daemon reads its result from the job's log - A walnut call on a host waits out a server restart and a broken link, and runs once - The terminal status pill shows words, never a raw status code - The first launch waits for the server that owns the data dir, and nothing runs on in an ended login session - Handlers act on the task list the page committed, never an interrupted render's - A hidden Home chat's question marks no longer paint on the open page's title in WebKit - A markdown table in a narrow pane keeps its words whole and scrolls sideways - A scanned .dmg that will not detach is tried again, and then a warning, never a skip - A compaction keeps the user's recent words, answered ones too, and task_history pages back - A card's Decide line opens the Page at its choice; panel-count specs take turns - Two Walnuts of different builds no longer swap a shared daemon back and forth - The build clone reuses the checkout's built SQLite, so a deploy never downloads it again - The question map's list grows to its longest title, so its rows show more - Closing the split's left half in Safari keeps the typing focus, moving it to the composer that stays - A compaction's summary or a hook's context starts no turn, so a question answered after a compaction keeps its answer - A commit that adds a dependency installs its lockfile in the build clone - A message's sender is its task's title, and a fork names its source once - A daemon update waits for the host_exec runs on its host - A fleet iOS run keeps its results when they cannot be fetched, and names its Xcode - A letter note's answer read from its letter replaces the chat words an older Walnut kept - A letter's thread holds only its own news, never a line naming another letter - The Talk to CEO box is an AnswerBox with a kept draft and pictures - The rehearsal's system PATH without Node is made again in the same dir on macOS 26 - One machine is one choice in every host picker - A coding agent is installed only when the user asks - The VP's command count resets only at a turn's end, and a long message has a free way out - A Walnut notification's title attribute is its folded title - A live install waits for one already running, and a server that cannot restart offers no Restart - A drop between two rows lands on the row, never on the tier around them - Every lifecycle wait has a deadline and a clear result - A deploy's few seconds of failed recovery-status reads show no "Recovery status unavailable" - A stop the host did not confirm is sent again instead of blocking the session for good - Background checks on a Mac never read a keychain secret - Launch parity no longer lists the outline's turn-titles route, which is gone - The outline lists only what the user marked, never one row per message - Found hosts read the server role, and the ssh sweep test waits for a yes - A session's close never leaves the user's own items behind a clean Done - The folder and project menus' pickers keep the row they were opened on - A server restart's few seconds of failing host reads show no Reconnecting banner - A deploy that changes the daemon keeps remote sessions connected - The outline's turn-titles call is listed in the launch parity map - A status section row renames from its title like every task row - A task parked on its own build wears Working in its header and rows, never the hourglass - Instruction notices are few and small, and a note in front of the user's words never hides them - A session menu's Details opens the task even before Home's list has it - No white scrollbar bar under code blocks in the Mac app - A folded Needs you still shows its waiting approvals - A closed overlay never takes Escape from the Ask drawer - A machine found in ~/.ssh/config that joined is listed once - The compiler hint names the host's own package manager - The join waits for the network key while a new machine downloads walnut-net - A new machine joins while the release cannot, with the preview build from npm - The task kebab draws its three dots, so its ink sits on the header's line in every font - The approval sheet stacks its buttons at accessibility text sizes, names Face ID or Touch ID by device, and the simulator signs with its software key - A session writes its user_kind reason in the user's language - Bring main's guard tests and two browser specs back to green - One transfer for every reader of the same remote file at the same stat - Mail receipts and thread titles in the user's language; a rewrite example is the line itself - A path or a letter in agent text opens from every surface; proof stays where the user reads the result - Take another change's unfinished link hunks back out of the task-page commit - The Chat tab comes back to the chat you left - A pipe whose reader went away never ends the daemon or the server - Setup waits for the console without printing each refused try - Walnut installs into Programs\walnut, and a replaced page load is no error - The app installs with Bun from its own bun.lock - A model catalog fetched before the settings read names the settings model too - A waiting row's wait sentence is a third line under its title - Every word Walnut writes onto a letter follows the user's language - Default runs the user's settings model, never the CLI's own default - A dev box found in ~/.ssh/config is dialled when Walnut runs a server there - A read-only test server declares itself a probe so the daemon never hands it the real Walnut's calls - A VP's task is titled " VP", and open ones an older build named " lead" are renamed - Full screen is the pop-up sheet with margins again, not the whole window - A transcript sweep the throttle turns away runs when its window ends - A full pull that did not show an item never deletes its task - A locate keeps its task shown wherever it lands or moves - An open letter of a kind Walnut sends no more settles itself - Other sessions' mail is never a person's word, and a progress-only turn end no longer settles requests - One letter per question, triggers stop with their task, Walnut writes in the user's language, every turn is corrected - A Windows PC joined over SSH keeps Walnut running after the SSH session ends - End terminal says so when it could not confirm the terminal ended ## [0.6.25] - 2026-11-04 ### Added - Every view comes back as it was left, plugin pages included - A Windows PC joins with one PowerShell line, and Walnut runs there in WSL - Stop a whole project syncing, a batch at a time - Send waits for the words still being spoken, then sends them once - Send waits for the dictation in every composer with a mic - One header and a side bar beside the chat; Changed, Files, Terminal and Board move into the kebab - A tapped path opens from the host that has it, through GET /api/v1/files/locate - The Task / Brief / Threads panel closes and comes back per node; the Threads tab shows a dot for news - A clickable org, under-the-hood scenes and a small Walnut demo - A minimal dark landing page with one download button - Task providers lives under Tasks, a task plugin's page links to its rules, and the AI rule field fits its text - Walnut-net 0.2.0 downloads are checked against pinned checksums - Task providers cards: the plugin's tile and a one-line summary, hard rules as chips, a clear pass or fail line - A turn-end ask names which of the user's kinds it is, or reads as a report to the lead - The host network picks its relay, and a Mac with no companion takes machines in itself - Import a Claude Code setup into pi, and name an ACP session's walnut calls - A question reaches the user only when it is theirs, and Walnut checks the line - The Threads view shows a thread only when it has something for the user; his reply sends it out at once - Settings > Task providers: per-provider hard rules and an AI rule, pass or fail with a reason - Walnut-net downloads are checked against pinned checksums - The host network: a machine with no SSH joins with one link - A focus block turns on Mac Do Not Disturb until it ends, quiet hides every rail badge, and Focus or Rest is the person's choice - Local choice on create and Make local in the task menu for projects that sync - Every doc comment shows in every view of the doc, the HTML preview included - The task board's status sections: Watching on top, Waiting / snoozed by soonest wake - A Threads card never echoes the user's own unanswered message back to him - Google Docs style comments on a document, kept in a sidecar the AI replies and resolves in - Private tasks stay local in projects that sync to an outside service - A thread with nothing new for the user is pending and out of sight; one reply to two threads stays off both cards - The session command is Ask Walnut, the hub is Tell Main - Quote and Comment stay marked on the passage and wait above the composer; selection matches go with the selection - Name the two chat commands by what answers: Quick Answer and Ask Claude Code - A Threads card holds only its summary and what the user has not seen ### Fixed - The service install asks a busy daemon again instead of giving up - Step 2 of a join says why the login service did not install - Stop dtach masters by their recorded pid, never by command-line pattern - The last host network error that said this Mac says this machine - The view-state scan judges a state by how it is set, not by its name - Rewriting an unchanged kept view writes nothing, so two panels stop ping-ponging - Each tab keeps its own view, and plugin drafts get walnut.ui.useDraft - The Windows join checks the Ubuntu download without Get-FileHash - Rehearsals pick their server port below the OS's ephemeral range - The Windows join job builds its daemon, and net errors name this machine - A session whose Walnut is on another machine runs that Walnut's walnut - Stop processes by the pid that was recorded, never by name, pattern or port - A build as root no longer reads Bun's /$bunfs/root/ paths as its own - A doc comment's hover card follows pointer events, not mousemove - The Windows join job builds its Linux file outside /root - The Windows join job checks out the tree with LF endings - The iOS locate route asks the server role, not CLOUD_MODE - The companion applies security updates from the latest release daily and reboots when one needs it - Full screen fills the page area edge to edge, not a bigger pop-up - A highlight taken away repaints its words in WebKit, so a given-up comment leaves no paint - A machine that joins keeps another Walnut's walnut command - A daemon whose /tmp files were swept is found and handed over - A person's own NEED_ACTION reads Needs you; browser specs follow the real-ask rule - A new Mac finishes the join, and an older Walnut there is left alone - A test run's request never starts a focus block, quiets the user or touches the Mac - A doc comment opens in place, under its words, and the side column is gone - Full screen is one state of the tab, so leaving it anywhere leaves it everywhere - Only a test run's window takes its toggle's answer, and it rereads its view on a published change - A test run's Quiet toggle stays in its own copy, so it never silences the user - SentBy "person" holds only for text a person typed; every other line is framed at the send - Only a real ask reaches Needs you, and every agent task read carries the live status - A task under a new project name makes a Local project - A machine that joins shows Connected at once, and connects by itself - Ask for the reply language in the user's own language - A host's name no longer starts or stops its Walnut server; a guard keeps every toggle label to its own words - A live turn's fold keeps the saved fold's form, so nothing in it moves when the turn is saved - A returned call last in the stream gives way to its saved twin, so a mid-turn save never shows it twice - Pi's ACP adapter runs on the Node that runs pi, not on a second boot of the walnut file - A clicked path missing on the session's host opens from the host that has it - A task provider's name no longer flips its sync check; only the switch does - Search keys follow the hit by path, wait out IME and the first answer, and every close drops a late answer - The sidebar search starts at the top, a click previews a hit and keeps the search, a double click opens and closes it - A message written during the turn-end status question waits for it instead of killing the worker - A pi session starts without a version probe and reports its status at the turn end - No script picks a simulator for its user; one helper resolves it - A task kept out of a service asks the user nothing; Main hears one line a day - A refresh restates only the Needs you items that changed since the node last told the user - What the reader opened stays open across every handover, and a subagent's reader is one timeline - The AI rule field is seven lines tall, so Walnut's default rule shows whole - A Question stack push or pop stays under 50 ms of main thread (C38) - A host whose daemon is the compiled walnut file runs ACP engines again - A project move never sends a task to a new service - A bulk result with failures keeps its Retry and Undo working for as long as its line shows, and the specs press a group tool through one hover-and-click - On a slow phone a drawer opened before the page is drawn stays open, and its Ask Walnut goes home - A history read asked after a turn boundary never joins a read started before it, and an opened notice stays open when its persisted row lands - A streamed reply's own elements become its saved row, so a script block never reloads - A settled reply keeps its cards and islands in the web views that drew them - The no-end-time warning names only today's shortcut - One painter for the selected-word echo, which ends when the user leaves the selection - Do Not Disturb always ends with the block, and a test copy never touches the Mac - A repository no host can clone moves from its bundle, and a shell edit counts as the session's change - The host network survives bad configs, version bumps and a cut-short Remove - A service only the user reads is never checked; kept tasks share one letter - The tree snapshot never trusts a folder changed in the clock step its scan began in, so a note added right after a scan shows on a coarse clock - The column follows a turn's last text when it lands in the commit that ends the turn - A reply looks the same while it streams and after its persisted row replaces it - Every notes search result leads with its file name and folder, and a file name's words find it - The private tasks fields pass their ratchets: rows redraw on a sync hold, the draft's Sync chip maps to task_create local, the words stay on the Mac, and the skill is regenerated - The Inbox shows only the inbox; the per-project strip is gone - A message whose reply was not found, sent before that reply covered a later one, joins its exchange - A pending thread is never called back by the tidy reminder; quiet threads are asked once and last - A Threads card leaves out messages older than its last answer, and a click on a link in an answer stays a link ## [0.6.24] - 2026-11-03 ### Added - Import per-day token sums from a provider bill for the days before Walnut kept usage - Import per-day token sums from a provider bill for the days before Walnut kept usage - A task on a host the user registered uses the other hosts without a letter - A picture reaches the model in the message, not as a path to Read - Every page keeps the view it was left on - Every new Claude Code session gets the Walnut tools, served by its own host daemon - Threads read as conversations, and each node keeps them clean itself - Comment beside Quote in the selection pill, and quotes stack in the composer until one send - A picked task, note or file is drawn as a pill in the input bar, not as raw @[text] - Styles and e2e scaffolding for the task-pill overlay (early draft) - Draw @ task references as pills over the textarea (early draft) - No chat shows a message hint; the raw view still does - A compact brief_read for refreshes - Session mode is a normal Claude Code session in Walnut - Every hint says whose words it is, Walnut's built-in or the user's own - A VP and Main follow the tasks that report to them the way a leader follows its workers - ACP engines list Walnut's core tools, with tool_help and tool_call for the rest - The tasks a reply is about, as live pills under Main's and a lead's replies - Costs by week and month, by token type and kind of work, kept after transcripts go - Switch the music during a block, and preview each choice first - The model picker no longer has a custom model ID box - The speed readout shows each subagent's model as its own row - The Threads follow-up is an AnswerBox, and a reply names the task it made - One answer box, cards for every Needs you, and the tasks a reply is about - Pin tasks to an Org node, and a resizable Task rail - Walnut AI with tools, and follow-ups in the Raycast chat - A host offers MCP servers to other hosts only, and a tool's images land in the calling task's directory - A task calls another host's MCP servers and web services, under the grant host_exec uses - Threads view of the user's own requests to Main and the leads - The overview charts each host's last 12 hours, and shows disk as a ring - Message a found task, search notes and send a copied screenshot from Raycast - A finished task's directory sheds its clean clones and build output after a day - Pick the block's length and music at Start, Spotify included - Pick the block's length and music at Start, Spotify included - The Remote Hosts overview becomes a fleet dashboard with a diagram - The wait is a header chip, fullscreen keeps side margins, and the folded question bar is a slim band - Reach Walnut from a key anywhere on the Mac: Spotlight, Raycast and Alfred - A task's status words are asked at its turn end, and status moves go up one level - Run a command on another host under the user's grant, and secrets the Mac copies to the hosts the user picks - A host's daemon starts again after a reboot, with no root - Off until you press Start; a run is one block and its break, then it asks once - The Brief is a document its node keeps current, and org nodes never read Needs you ### Fixed - A person's own message carries the reply language, and his turn is corrected at its first wrong-language line - A session process that exits with an error makes one card, not a second from its log line - The sidebar holds the row being read when the smart group lands above it, in WebKit too - The unsubscribe checklist hears Escape in WebKit; clipboard checks run in both engines - The grouped inbox says an account stopped syncing, and a cold open reads each page once - The add-account dialog never takes the caret back from a field being typed in - A CLI that exited but is not reaped yet no longer holds its session - A completed task's worker is stopped again after its turn-end summary - Completing a task stops its ACP worker, and a long ACP turn is not cleared as stuck - The keyword ask shows its answer: a script sits between the Script Filter and the Conditional - Drop two stale routing tests a mis-staged commit brought back; name the import label through the host-label hook - A test run's drafts stay in its own copy, and a cleared box reaches the server at once - The JS twin sets its picture folders beside DAEMON_DIR, not in the send section - The Comment box is an AnswerBox whose words are kept as a draft, and the pill memo keys on the query span's numbers - The Walnut MCP mount asks isCompanion(), not raw CLOUD_MODE - Answer only on the leader, read through role() - A reload opens straight on the kept node and view, with no Task flash first - The companion's Caddy admin API is root and caddy only, and Walnut listens on loopback - The cloud companion gets its own hard-stop switch in Tasks using other hosts - The mic no longer stalls mid-speech in the Mac app: echo cancellation is off for dictation - A thread's older messages read their answers from the node's live session - Fold checkpoint format 5, for the fold that reads the rotation's carry line - Host bounds use plain aliases, not double-quoted ones the macOS SQLite refuses - The wait chip reads the park through one helper, listed in the task-state ratchet - A session on an already titled task is named after the task - Task_list with a scope and no calling task follows the filters given - A status question is answered in text, never with tools - A write made as the page hides or leaves is sent with keepalive, at once - An ACP engine's persona carries the skills index in a short form - The Focus music screen keeps an action's answer until the block moves on - A hand-back with no report asks in the words its last turn ended with - Needs Action holds only live session asks, never letters - A cron replay whose watcher starts behind the new process reads nothing, not a cut stream - Review fixes for the wait-on-user and lead-ask commits - An ask a worker addresses to its lead reads Waiting on its lead, not Needs you - A wait on the user reads Needs you, a wait on a lead or task reads Waiting on it - A trigger parks its task only with wait:true, and a turn that answered the user reports needs-you - A data home with no git repo is unpaired, not a failed bridge push - A model the local server lacks falls back to the main model - An unknown argument key names its usual other name or the keys the op takes - Regenerate the walnut skill's ops table, org_pin in registry order - Threads card keeps a CJK title readable and reads the state names from the shared map - Host_mcp_list and host_exec_stop wait for their route's answer, not the 10 s default - A few seconds of stalled audio no longer says the mic is dead - A not-started Board card has Start, and a narrowed Board closes its chat - A folded host row is one line again, and the card holds still - A wait a worker told its lead itself is not news in the lead's team note - A stream file rotates while its session has a loop armed, carrying the loop - A task whose status the server derives just after a park leaves Working - A compiled Mac sets up a host's boot start from the walnut file in its daemon slot - A word typed short anywhere in the query finds the title that names it in full - A short word in a binary counts only where the bytes around it read as words - A turn that answered the user never parks its task from its report - The Spotlight task picker lists open tasks, and intents keep a path's query - A machine stop in a lead's team note waits for the hour like the rest - The pattern-kill guard passes the signal-call ratchet - Needs you has its own heading, and every section heading wears its mark - The host_exec redaction test builds its key armour from parts, and the scan allowlists it - Keep only the build in use and the one before it in the host file cache - A CLI's command line carries file paths, and a kill by name pattern is refused - Host_exec runs under the session shell rule, not a bare $SHELL - The iOS UI leg leaves the classes that drive the home screen to the Mac - The notes in front of a person's message join the fold before it - Home task sections are each task's user status, and a Waiting row says why ## [0.6.23] - 2026-11-02 ### Added - One cost chart with a Break down by switch, every breakdown per day - The @ picker searches every source in All, and each reference tells the model what it is - One link to every host; features ask link(host) instead of building an SSH target - Every host says what it can do, and a task asks for a host by it - A task named beside its written title reads its name once - A task named beside its written title reads its name once - While the user is away from Main's or a lead's chat, what needs him goes to his inbox in one thread; a report on request - The Task rail beside the chat, every ask answered in its row - Every hint reads in plain words, visible by default, never raw on any screen - Ask here cards show the whole thread with their own scroll, and a vertical bar folds the pane - A fleet overview of every host, for the user and for agents - Every task a chat names reads as its name and opens the task - Every task a chat names reads as its name, with its live status - A named host never takes another machine's folder; a move clears what it carried from a shared checkout; placement weights - Plugin jobs run under the daemon of the machine the user picks - Keep Home and Org layout on disk, lock Org side panels, never reopen an overlay on load - A Needs you ask comes in a one-click shape: yes or no, a choice, or text - Each task writes what it waits on next; its lead, VP, Main or a person may change it - @ sources: plugin-declared picker sources with tabs, Notes and Mail built in, source refs as reference cards - One place decides a task's user state; snooze is first class; one set of names - The home task panel opens Flat, its status sections in two-line rows - Move a task to another host in one step, and place first starts by load - The Brief is the AI's letter alone, in three sections; the Task view holds the asks - A session whose working folder is gone continues in its task's directory ### Fixed - Every take marker names the rows its line carries, and the fold spec reports its takes - A fold line counts its messages and names no one - The replica config copy names the capability tags, and an unknown capability reads by name - A binary matrix row whose artifact download fails downloads once more - Three regressions the browser and unit suites caught - The continue-in-new-folder session action is mapped in the launch parity table - A reply to the user in the wrong language is named on the next message, and every line he saw is judged - A lead's team note comes at most hourly and carries no worker progress - Fleet host cards sit in their Settings group as rows do, not as a card inside a card - A newer push cancels only a pull request's run, so main gets a finished CI verdict again - The fleet view asks server-role who it is, and its twin test keeps the exec guard on PATH - The iOS job skips only the timed methods of TasksDerivedPerfTests - History cache sees a transcript that grew under the same mtime - The iOS job leaves wall-clock perf gates and fixture-server UI classes to the Mac - The @ picker draws its row icons with the app's icons, not emoji - The iOS job logs its failed tests instead of uploading its result bundle - Opening a question's card moves the timeline once, and a grown card reveals itself after its glide - The PDF page count shows the page a link jumped to - A task row click hands on the task as it is now - A turn that folds never moves a reader scrolled up into it - Buffered reply text lands before the next event, in its own turn - A page of older turns re-renders only its new rows - A test run's preference writes stay in its own copy, never the user's files - The tail window keeps raw bytes, a budget, and only for the sweep; a missing transcript is looked for once a minute - The tail window of a big transcript is kept and grown by what was appended - An opened send lists every task it reached, each a link to the task - A transcript is stat-ed where it is, so a symlinked cwd no longer re-reads the whole file each minute - A step made while the link is down shows on its return, and only an install keeps going without it - The host's read copy goes gzipped, a tenth of the bytes on the shared SSH link - A host server upgrade reads as the upload it is, and sends its build a few chunks at a time - Home never draws nothing: with nothing else open, the task panel shows - Tools call refuses a word after its arguments instead of dropping it - GET /hosts/load is answered again: the move router mounts before the fleet view's /hosts/:host - Fleet cards say phases in words, count short spans in minutes, and give reboot advice that works - A send the server named never hides in "Ran a command" on the phone, and each name on a fold line keeps its own word - The home panel's status sections read the shared user status, snooze included - The jobs status read answers 200 where a plugin has no jobs - A connected phone previews an HTML file whole, frames included - A call still running folds with the steps before it, and the phone reads a send's tasks from the transcript - Published installs patch codex-acp too; a restore load that does not answer fails the start - A Codex session survives a Stop and a failed reload, and a fast send is never sent twice - A sent message sits where Claude Code took it, on every chat surface - The chat under the Task or Brief panel starts below its own header - A move never removes what the target held, holds messages instead of waiting, and shows a refusal - A snoozed ask reads its task's own start date; a sub-item that changes section is its own item - A send delivered on its target's own host names its task, and a title never reads as the line's separator - Refuse a walnut call the shell would cut a "$" amount from - One fold rule: a failed call and the runtime's lines fold with the steps around them - A read whose link dropped under it goes to the Mac once more - A handed-on answer goes straight to the original asker; the reply language rides every org turn - An instruction change is never longer than its block, and lines past USER.md's budget are never told as removed - A trigger on the user's own ask never reads as an outside watch - A task parks as Waiting only for a wait outside Walnut and the user - The session menu gets back the rows its regroup dropped - The real-CLI startup failure check runs in the live tier - A host's SSH master says why it ended - The quick tier is green on a busy Mac again, each cause fixed as a class - The Mac app's DMG is sized with room and its create is retried ## [0.6.22] - 2026-11-01 ### Added - The lines the CLI put into a conversation show on the phone, one closed row each - An html-app block draws its layout while it streams and becomes the running block in place - An engine switch stays on the task's host, which runs ACP engines itself - An html-app block shows its layout while it streams, runs its script only once complete - What Walnut added to a message is hidden by default, shown from the bubble's long press - Home task panel status sections, Watch, per-project counts and an Inbox project strip, with three layouts on trial - Switch a task's engine inside the task, and resume the earlier session on the way back - What Walnut added to a message is hidden by default, one click away, and each hint has its switch - Plugins first in two groups, built-in apps last with their own switch - A leak scan hit stops the release before npm and the GitHub Release ### Fixed - No job runs on the retired macos-14 image; the port hold releases after the lane stops - A finished reply waits for its question however slow history is - A reply never shows without its question while a session opens - The server holds its port before its daemon starts, so the daemon never takes it - Main is green again: a request on its way is never settled, the new twin test runs on Node - Drop the second copy of claudeCodeNotNeeded in local-daemon.ts - Instruction notices send only what changed, and one session gets one notice once - Test connection works for Ollama, no Claude Code warnings or seeded Claude defaults on a local setup - A resumed CLI that fails at startup reads as exit 1 with its own message - A fork's compaction no longer marks rules, place and hints told to the main conversation - Two quick-tier tests red on macOS read what bun and SQLite actually do - News reaches the user once: a lead that passed a result to Main says one line - A session is titled from the person's words, never from the blocks Walnut put around them - The send-boot-wait twins test gives its daemons a guarded PATH - A start still spawning past the response budget says starting - The AI title replaces a session title the launch made from the first message - Background model calls wait for a busy local model server, and a timeout is named as one - An ACP turn's result carries its answer; a worker leaves with its adapter; a loaded session follows the engine default model - A data home inside another git repository gets a repository of its own - The browser suite is green on a clean checkout, and three product errors it hid are fixed - A second user on one machine gets their own runtime dir instead of a crash at start - Test connection works for Ollama, no Claude Code warnings or seeded Claude defaults on a local setup - The send-boot-wait twins test runs its JS twin on Node with the others - Test connection works for Ollama, no Claude Code warnings or seeded Claude defaults on a local setup - A remote host gets the real ACP worker, never the compiled file's placeholder - A single tier keeps its rows when a status section under it opens - A host chip click hands focus back to the search box, so typing and Escape still work in WebKit - Status sections stay on when the Status pick adds Waiting or Complete to Open, and older completed tasks stay reachable under a chip - The staged plugin source carries package.json and packages/ - A CLI still booting is not reaped for reading its first line late - A second user on one machine gets their own runtime dir instead of a crash at start - The quick and e2e reds the last bulk push left, and a draft scan that a comment blinded - External plugins bundle against the deployed commit's own source - Host chips wrap instead of scrolling so every chip takes a click; the picker picks folder and host only - An open question over its review row never scrolls the timeline - A worker lands in its lead's project unless the user named another - Answered requests, overdue hand-ons, wake sources, re-checks, and the bug-fix rule - A Mac that slept is not five minutes into an outage; agents' refused offline writes stop lettering the user - An open question over its review row is most of the box tall - Ask here review cards are one row until opened, open readable, and go full screen in place - A status note's card reads "Status changed" - Rendered bodies keep their DOM across re-renders; the Org chat stops flashing - A person's words behind a status note keep their bubble, on the web and iOS - One report per result, settled decision letters, reply language for leads, quoted approval - A reconnect to the same daemon sends what it lacks, after the link's first seconds - A session whose result saw its CLI gone stays stopped; two flaky tests made deterministic - A publish that fails outside Walnut is tried again before the release stops ## [0.6.21] - 2026-10-31 ### Added - Run Walnut on your own models: with Ollama (or LM Studio/vLLM) as the AI provider and OpenCode, Goose, Codex or a custom ACP agent as the engine, nothing asks for Claude Code; watchers and AI task search run on your model, and every engine gets Walnut's session instructions ([Getting Started](GETTING_STARTED.md#path-d-models-on-your-own-machine-ollama-lm-studio-vllm)). ### Changed - Walnut installs as one compiled file with everything inside, for macOS and for Linux with glibc or musl (Alpine, with `apk add libstdc++ libgcc`), on arm64 and x64. The one-line `install.sh`, Homebrew and the Mac app install it with nothing else on the machine, not even Node. `npm install -g open-walnut` installs a small launcher and only the package built for your machine (`@open-walnut/`), with nothing to build. install.sh keeps each version in `~/.local/share/open-walnut/versions/` and switches with one link, so the version before stays for a rollback ([Getting Started](GETTING_STARTED.md#updating-and-rolling-back)), and `walnut web` and `walnut update` install new versions the same way. A new version that exits before it serves is gone back from on its own and skipped until a newer release. Homebrew installs update with `brew upgrade open-walnut`. An install from the self-contained Node archive keeps updating itself onto the new packages, and the archives are published for two more releases. - Walnut runs on one runtime, bun, from a checkout to production. The server, its build, the tests and the dev scripts all run on bun; Node stays only under the Playwright test runner. To work on Walnut you install git and bun 1.4.4 or newer, then `bun install` and `bun run start`: nothing is compiled on install, and no Node is needed. Repo commands are `bun run