Repository navigation
chore(release): 0.4.13 - #1640
Conversation
Fold the changelog.d fragments into 0.4.13 with outside contributors' credits, tell the release in release-summaries.json in en/ko/ja/zh, and raise REMOTE_BUNDLE_VERSION to 32 for the server and shared changes since remote-v31. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Summary
Merge Risk: ⚪ Minimal · up to
|
…nd remove dead registry paths (#1890) Fixes #1582 Fixes #1437 Two follow-ups grouped because both touch `server/prompt.ts`: one commit per issue. ## #1582 (rewind follow-ups) - **State file:** the server removes `claude-rewinds.json` from its state directory on start. Only the unreleased Chat rewind (#1500) wrote it, and nothing has read it since #1577. A failure is logged, and the server still starts. - **List-screen fixture:** the recorded rewind message list (`claude-rewind-2.1.304-select-banana-40.txt`, deleted in #1577) is back. - `dialogs/claude.test.ts` checks it holds Chat sends without offering a card. - `core/claude-rewind-send.test.ts` refuses a send on it and types nothing. - **Comment:** `PaneTerminal.css`'s banner comment now names Claude Code too. - **Inlining:** `chatOwnedInput` only returned `lastChatSubmitted`, so its two callers now call that directly. ## #1437 (dialog reader registry) 1. **Reader order is pinned.** `registry.test.ts` lists, per agent, the order its screen is offered to the readers. Swapping two priorities now fails a test (mutation-checked: `claude-question` priority 10 to 25 fails). The snapshot comment now cites `3df0824e`, #1435's base. 2. **The commit key comes from the chosen answer.** `InteractionPlan.commit(answer)` and `terminalFallback(answer)` read the chosen answer's own key sequence, so the loop executes the plan for the answer it validated. Mutating back to `sequences[0]` fails the new test. 3. **Dead paths removed:** - `InteractionPlan.identity`. - `ReaderContext.fallback`: nothing set it, so the three fallback readers never parsed anything. They now only lend their answer behaviour (`reread`), and `parseFallbackPrompt` still draws those cards. - `modelListWaits`: the fallback card's model-list guard calls `registry.waits`, the same Claude-model, Claude-effort and Codex-model check. Tests call it directly. 4. **Parsers run less often.** - `parsePrompt` returns at the first reader that reads the screen instead of running every reader. - A parser several readers share runs once per read pass, through `onePerPass` keyed by the screen and that pass's context object: Claude's approval, Hermes' clarify, pi's dialog and OmO's forms. The other parsers run at most once each, because the pass stops at the first reader that reads the screen. `ReaderContext` is readonly, so a caller cannot change the context mid-pass and get a cached result. 5. **New interaction-plan test:** a move goes out, then the asking ends, and nothing more is sent. - The `picker-asking-before-commit.md` fragment from the issue comment was already folded into 0.4.13 (#1640), so there is no fragment left to drop. ## Verification - `bun test` of the five changed test files: 96 pass. `server/prompt.test.ts`, `server/dialogs`, `server/core`, `outcome`, `pane-routes` and `conversation`: 828 pass, 0 fail. - **Mutation checks:** each of these makes the new tests fail: - swapping a reader priority; - committing from `sequences[0]`; - dropping the start-up removal; - removing the memo's cache hit. - `bun run typecheck`: passes on each commit. - Code review: `omo-native-code-reviewer` approved with no HIGH or MEDIUM findings; its readonly-context LOW is the third commit. Codex (gpt-6.1-sol, xhigh) found no HIGH, MEDIUM or LOW: the early return matched the old eager evaluation in 1,760 comparisons over 80 fixtures, and `registry.waits` matched the removed condition. - `bun run check fast` (through `dori heavy`) on c707e82: `status: success`, with a clean tree and every step ok (typecheck, build, unit tests, generated types and themes, workflow syntax). --------- Co-authored-by: mp <mp@local>
Change
Release 0.4.13: everything merged since 0.4.12 (136 commits, 109 changelog entries). Metadata only; no code changes in this PR.
Left out of this release on purpose (still open): #1542, #1597, #1598, #1579, and the outside contributors' PRs not yet reviewed or held (#1427 #1442 #1516 #1520 #1521 #1527 #1528 #1530 #1540 #1560 #1629 #1632 #1634).
Metadata
package.jsonandherdr-plugin.toml: 0.4.13.changelog.d/fragments folded into[0.4.13] - 2026-10-22byscripts/changelog-fold.ts, withby @logincredits on the 36 links of outside contributors' PRs;changelog.d/holds only README.md. Docs/test-only PRs without a fragment (docs(readme): align English README with current implementation #1395-docs(readme): align Simplified Chinese README with current implementation #1398, docs(header): phone header section matches the lens switch since #1367 #1439, test(prompt): stale notice regression waits for the restarted poll; waitForTimeout counts as a fixed sleep #1440) are not listed, as before.release-summaries.json: 0.4.13 in en/ko/ja/zh (8 new, 6 improved, 8 fixed; equal in every language, each <= 90 chars). The first line tells that the app is now called Ovis (feat: call the app Ovis everywhere a person reads its name #1454) and installs and updates as before.REMOTE_BUNDLE_VERSION31 -> 32:server/andshared/changed since remote-v31.telemetry/worker.tsandshared/telemetry.tsare unchanged since the recorded deploy, so no Worker redeploy.After merge
remote-v32on the merge commit and wait for Remote PC bundles to publish it.server/,shared/,bun.lockorpatches/until the Release run is done.gh workflow run release.yml --ref main -f version=0.4.13.Validation
bun scripts/release-guards.ts: "Release 0.4.13: remote bundle, telemetry Worker and release metadata are in order."bun scripts/release-notes.ts 0.4.13renders the three English lists and the folded changelog.Changelog (0.4.13)
Added
preserves your draft and opens the pane's terminal with a hint to run the agent's own
/rewind.Chat follows the native conversation when the agent records its new branch.
(#1500)
land in the dialog's own text field.
(#1500)
/goalto Claude Code from Chat now shows its goal status (the condition and howlong it has run, or that no goal is set) in a card with Close, instead of leaving the dialog in
the terminal.
(#1450)
cmd) agent panes now show their conversation in the web UI: transcriptresolution from
~/.commandcode/projects/,/treebranch projection, model and contextwindow from Command Code's catalog, permission prompts, and skill discovery.
(#1399 by @diegolhambi)
accepted, waiting for your answer (with a way to the card), done with what showed it, runs in
the terminal (with Open Terminal), or no result seen. A command the agent keeps no transcript
turn for still shows its sent row. A terminal screen that
changed after the send folds under the chip as an unconfirmed preview, never proof that the
command finished. Terminal-only commands instead leave one quiet row with Ran in terminal and
Open Terminal, without outcome chips or unconfirmed previews. Hermes informational result cards
keep showing what the agent printed.
(#1450)
window,
herdr tab focus, a script), this device opens that pane too. Off by default, and set perdevice, so a phone open on another pane stays there.
(#1432)
/help,/status,/version,/profileand/reload-skillssent from Chat show whatHermes printed in a card closed with Dismiss, which sends nothing to the pane.
(#1450)
folder, refreshed when they change, and settles a command it sent from that session's own events.
The service is only read, never started, and only when it is the process its service.json names.
(#1489)
@skillsent from Chat to OpenCode v2, at once or queued, is typed through OpenCode's ownautocomplete so the skill is attached; when the row does not show, the message says the skill
went as plain text and points to the terminal.
(#1489)
the card.
(#1489)
them (Codex 0.157 or later; on Linux, or when the server's Codex home is set), and a gjc pane's
skills as the SDK broker it is bound to reports them, asked through the gjc CLI in the background.
The daemon and the broker are never started for this; without one, the skills read from disk stay.
(#1489)
agent's command line takes them (Claude Code and Codex:
--modeland the effort level; Codex alsotakes the message as its own argument, behind
--so a message likelogoutis never a command).For Claude Code and every other agent the message is queued on the PC as the pane's first pending
message and sent once when the agent is ready, through the page that started it; it shows as a
pending message that can be discarded or sent now. If that page disconnects, reloads or leaves the tab
first, the message is held, never sent on its own, until someone sends it now or discards it. A message the PC
could not queue, or one an older PC ignores, stays in the new tab's message box and the dialog says
so. Pending first messages are kept in memory: restarting the web UI's server drops them. A Codex
message with a tab or a line break is sent as the first message rather than on its command line,
and the PC refuses launch arguments with control characters, an unknown effort level or a model
that is not one word. Under the message, the agent's skills in the
folder are listed before it runs, each a chip that puts the skill as the agent types it into the
message (
$name,/name, or@namefor OpenCode 2). A first message to OpenCode attaches its@skillas any Chat send does; before OpenCode has a session nothing tells its version, so the@is sent as the plain text it is.
In a desktop window the chat's composer can show a New tab with an agent… button that opens the
dialog on the pane's workspace; it is off until turned on in Settings → Chat → Composer (New tab
button), and the tab menu opens the dialog either way.
(#1512)
/handoffruns from Chat, with or without focus instructions: while omp writes thehandoff document, Chat shows a card that cancels it, and afterwards Chat stays on the same
conversation, which omp compacts in place.
(#1450)
a model and it is picked for the session, the model in use named on the card.
/modelsent froman omp chat opens it: the chat sends it as
/switch, because omp's own/modelopens its rolehub, whose picks are saved as the default for later sessions.
(#1377 by @evanwy0223)
own background service instead of keystrokes, one question at a time with Back to change an earlier
answer, and sent together after the last. Permissions, OpenCode 1 and other prompts keep the
existing generic fallback card and Terminal.
(#1257 by @bardiz12)
records in the app's state directory, so the owner can correlate a response with its request.
(#1558)
folder, read from the agent's own store on the PC, newest first with the title, the first prompt
and the time. Resume starts the agent on that session in a new tab of the workspace; a session a
pane already shows is opened by selecting that pane instead. Picking
/resumein the chat's menuopens the same list, and the terminal command's row offers it. A PC whose bridge cannot list
sessions yet has no such item.
(#1494)
task's progress, in a small dim line under the row. They follow the
$nametokens of your herdr[ui.sidebar.agents]rows (every token where none are set), change live, and say a long valuewhole in the tooltip and in a phone's ⋯ sheet. A line a plugin reports for the agent now updates
as soon as herdr says it.
(#1341)
HERDR_WEB_TAILSCALE_HTTPS_PORTnames the HTTPS port the installer publishes the app on withtailscale serve, so 443 can stay free for something else. Settings → Phone & devices suggeststhat port too. When another service already uses it, the installer stops and says so instead of
taking another port, which would move the address an installed app opens.
(#1433)
Changed
/menu lists the commands that run in the terminal apart, last, under Terminalcommands, each with a Terminal badge, as the PC's command catalog describes them. Pick or type
one and send it normally: once accepted, the pane's own terminal opens over the chat, in this
browser only, while the chat stays where you were reading and the pane stays on Chat. A head
says what ran, with Back to Chat and Keep Terminal; the header's Chat, Ctrl/Cmd+Shift+J and a
phone's Back return too, and Escape goes to the agent. On a desktop the message box stays under
the terminal, dimmed; on a phone the key bar takes its place. Claude Code's panels (
/config,/permissions,/themeand the like) can bring the chat back by themselves when you close them,once Claude records it; other agents' recorded screens do once their input row is back, and the
rest return by hand. A Ran in terminal row's
Open Terminal shows the terminal over the chat again. Busy commands stay queued; only an
explicit Send now opens the terminal, never automatic delivery. Refused sends keep their draft
and note. Watch-only devices never send or open it, and /resume still opens Earlier sessions.
Commands the agent's own menu hides are not listed, but still go when typed by hand.
(#1441)
@attachments, the@menu lists them under Skillsbefore the files, and picking one inserts the skill's id.
(#1441)
repeated work when long chats refresh while preserving tool results, notices and history resets.
Live parser state shares Codex's bounded cache; earlier responses stay unchanged as new records arrive.
(#1561 by @Yoonwoo-Ha)
the phone apps. Existing installs, settings, plugin identifiers and update channels stay the same.
(#1454)
question on screen may have changed.") until a read answers again. Answering stays safe: the
server reads the screen again first and refuses a changed question (Small findings from the v0.4.12 release QA #1335).
(#1360 by @Noobear)
dialogs, each agent with its icon and the chevron spaced as the app's other controls, instead of
a plain select whose arrow sat at the far edge.
(#1573)
on the phone clears its DONE dot on the desktop too, and the other way around.
(#1463)
retaining visible keyboard focus and the explicit second click to remove the registration.
(#1394 by @snowykr)
agy and Grok bring the chat back by themselves when you close the picker or panel it opened,
once the agent's own empty input row is back on the screen. Only the commands each agent was
recorded doing that for count (Codex's
/permissions, omp's/settings, Grok's/resumeandthe like); print forms, toggles, editor handoffs, Codex's
/sideand/btw, OpenCode andanything unrecorded still return by hand.
(#1637)
Fixed
their own names instead of their lowercase ids.
(#1543)
HERDR_WEB_TOKENenvironment variable; they keep the socket path and the rest of their environment.
(#1562)
Switching to Terminal immediately after that choice and returning to Chat no longer restores
the older reading position. This fixes explicit Jump-to-latest intent, not arbitrary upward
restoration on long, active or reasoning-heavy tabs.
(#1346 by @Yoonwoo-Ha)
from the end retain the existing paragraph-and-offset restoration.
(#1346 by @Yoonwoo-Ha)
syntax. Rich-text paste and the whole-answer MD and TXT copy actions remain available.
(#1409)
ordinary send. Claude Code's
/usage,/cost,/status,/help,/memory,/mcpand/add-dir, Codex's/newand/forkin a repository,/cd,/usage,/copyand/side,and the panels, pickers, confirmations and editors of omp, gjc, OmO, Hermes, Devin,
Antigravity, OpenCode and Command Code are now Terminal commands: sent, they open Terminal with
Back to Chat. A value typed with a picker command, such as
/fast offor/export notes.md,stays an ordinary send.
(#1596)
/compact, say) is listedonce in the composer's command menu, as the skill Claude runs, instead of beside the built-in.
(#1441)
server, without recording messages, credentials, addresses or terminal output.
(#1357 by @christi4nity)
naming a parent thread or an agent role), an exec run's, or one whose ids are null or contradict
its file name is no longer read as a pane's conversation or offered to resume, while older
rollouts without those fields still are. A rollout whose first line is longer than the chat or
the history reads is left out instead of read unchecked.
(#1592)
0.163, which starts a thread in the same second as its process; before, both said the
conversation was unavailable about as often as not.
(#1522 by @jiaoew1991)
runs
/new: a thread that pane shows a long answer of under its first prompt, is bound to, orthat herdr reports for it no longer leaves this pane unsure.
(#1522 by @jiaoew1991)
once the other shows its own first exchange, where it said the conversation was unavailable.
(#1522 by @jiaoew1991)
/resumenotice's Earlier sessions, OpenTerminal and Run in Terminal) wrap onto their own line, and its dismiss button stays visible
instead of being cut off at the edge.
(#1543)
collapsing the live input, preserving transcript spacing and the paragraph being read (Multiline composer autosizing temporarily collapses the live field and moves chat scroll #1337).
(#1347 by @Yoonwoo-Ha)
including Korean placeholder wrapping, so localized drafts keep their natural height.
(#1347 by @Yoonwoo-Ha)
now leave timestamped, rate-limited diagnostic records without logging input or credentials.
(#1356 by @christi4nity)
resumes reporting after you sign in again on the same page, and malformed reports can no longer
use up the server's shared report quota.
(#1423)
flushed to disk before they replace the previous file, so a crash or power cut right after the
change is much less likely to bring back a revoked device or make every phone subscribe to
alerts again. How much survives a power cut still depends on the disk and filesystem honouring
the flush; on Windows the folder itself is not flushed.
(#1568)
the server was started with, or wait on a Git listing that never ends: a listing past 16 MiB
or 3 seconds, or one cut off mid-name, falls back to the folder walk.
(#1570)
falsefound onPATHwith Git 2.35 orolder, and reads the repository asked about even when the server was started with
GIT_COMMON_DIRset.(#1570)
bounding their in-memory history instead of repeatedly scanning browser storage.
(#1536)
it quits before the message goes: it is held for Send now or Discard. The same happens when an
agent of the same kind that the user starts later comes up instead, and when the page that sent it
leaves the pane while it is being typed, so the pane's other queued messages are not stuck behind it.
On native Windows the PC sees only the pane's shell, so it cannot tell that the agent quit: there the
message keeps waiting until you discard it.
(#1532)
messages that quote them visible.
(#1535)
instead of only Up, Down, Enter and Esc controls. Moving the cursor preserves the question's
identity and uses the current selection when answering.
(#1553 by @Kinetic27)
ten seconds overall instead of timing out after two seconds per command. Session snapshots
retain the shorter status lookup budget; failed status lookups
are held for 30 seconds without preventing chat reads from retrying.
(#1364 by @sskys18)
instead of restarting the SDK lookup for every pane. Session changes still require SDK validation.
(#1343)
(#1352 by @infowolfe)
terminal lens: the header says Status unknown with the last herdr it saw, and herdr unavailable only
after a second failure in a row.
(#1581)
with a clear error, instead of hanging until the timeout, growing the server's memory or being
taken as another request's answer; event subscriptions report such a frame and close.
(#1584)
/statussent from Chat now shows its result card on the first send in a new pane too, evenwhen the computer is busy. A send whose result was missed no longer leaves every later
/statusinthat pane without a card for ten minutes. The same holds when another device has the terminal
scrolled up.
(#1543)
/status(or another informational command) from Chat again now shows that send'sown result card each time, instead of "Runs in the terminal" once earlier identical results fill
the terminal.
(#1543)
while bounded Herdr calls are still running.
(#1355 by @christi4nity)
oauth2-proxy and the like): the browser now sends its cookies with the manifest request.
(#1332 by @ascandroli)
read-only connections still only pan their local grid.
(#1446 by @Davesaggio)
from Codex's live footer, while the chat shows the terminal output.
(#1374 by @evanwy0223)
supported agent draws it. omp still waits for its transcript to record the model; the bridge
never runs
omp models, which can refresh the CLI's OAuth credentials.(#1374 by @evanwy0223)
(OmO's Claude child is running): sending a message no longer stops on a Claude input-box draft
refusal or tries to clear a Claude draft there.
(#1441)
bracketed paste instead of line by line, so its first line is no longer sent alone.
(#1441)
time / Never…") shows in the chat as a card with its own options again, instead of a "Waiting for
input" card offering only ↑, ↓, Enter and Esc. A pick list that counts down in its title keeps
the same card while it ticks, so an answer tapped a second later is not refused as stale.
(#1495 by @nahwan-kim)
--cwdshows its chat when herdr names no session fileand the directory herdr reports is not omp's own, such as the shell's or a symlink's real path:
the session is still looked up in the directory herdr reports first, then under that
--cwd.(#1594)
in its input box: omp shows the box before it takes an Enter, so the send waits until herdr's omp
integration reports the session (omp does so once it takes input), for an omp started moments ago.
(#1475)
@attachments before its firstsession starts, using the OpenCode version the PC's install reports, instead of listing them as
OpenCode 1
/commands. Once the pane has a session, that session's version decides as before.(#1543)
rejects stale or non-loopback endpoints, bypasses environment proxies, and bounds slow requests.
(#1257 by @bardiz12)
A temporary service outage keeps an already displayed native card and its unsent edits.
(#1257 by @bardiz12)
and custom text. Abandoned drafts are bounded and expire after 30 minutes.
(#1257 by @bardiz12)
questions can be skipped. Unrelated service metadata no longer resets a form's progress.
(#1421)
delivery. Native service connections accept only the loopback addresses 127.0.0.1 and [::1].
(#1421)
auth.jsonOpenCode 1wrote. OpenCode 2 keeps its provider sign-ins in
opencode.dband leaves that file standing withthe key it has since replaced, so the OpenCode card reported "Sign-in expired" for a CLI that was
signed in and working. The store's active key answers first, and a store without one (signed out of
OpenCode 2) shows no card; the file still answers beside OpenCode 1's store, or with none.
(#1329 by @krish-kant)
GET /api/pane/readtakeslinesonly as plain decimal digits from 0 to 4294967295 and refusesany other value (blank, signed, fractional, exponent or too large) with 400
invalid_linesinstead of passing it to herdr; a blank value is no longer read as zero. Every count herdr
takes still goes through unchanged.
(#1571)
are, not the one its file name suggests, and a file that only claims to be one of those images
is refused with its reason instead of being saved for the agent to read.
(#1599)
densities: its options take the density's segmented height, so its track is 34px tall in the 52px bar
and 32px in the compact density's 46px bar, which it used to nearly touch.
(#1519 by @adnankassem)
bottom rule (in compact density it was as tall as the bar). The buttons still take a full
44 px tap.
(#1367 by @Noobear)
store, not only for providers defined in
models.json.(#1391 by @diegolhambi)
answer during the final screen read.
(#1435)
and address, and Settings → Phone & devices says Recovering… meanwhile; a second stop shows the
error with Portal's output instead of leaving the address down without a word or restarting it
again.
(#1587)
server yet, that reloading or closing the page can undo it, and offers Retry. After three failed
saves in a row the browser resends less often (after a minute, then up to every five minutes)
until you press Retry or the connection reopens, and edits made meanwhile are kept. A late resend
of a refused change no longer overwrites a newer value another device saved meanwhile, while a
setting you pick again after the refusal still wins. While the connection is lost it waits for it
to come back instead of resending, and a connection the browser gives up on (for example a proxy
error while the server restarts) is opened again, so alerts and other devices' changes no longer
stop arriving until a reload.
(#1595)
change. Reading never touches it; the first change moves the damaged file, byte for byte, to
preferences.json.badorseen.json.bad(private to you, the latest damaged copy only), a filerepaired by hand while the server runs is kept with the change added to it, and a file that
cannot be read or set aside is not written over, so the change fails instead.
(#1564)
now belongs to another program: startup locks and the bridge registry record the owner's start
identity, and that other program is never signalled.
(#1567)
preserving queued keys, clicks and text and the order of Stop followed by a message.
(#1342)
clears its DONE dot from the screen left over from before: it clears once the terminal shows
current output.
(#1472)
instead of being held whole in memory: connecting, refreshing and the PC proxy stop reading it,
report a short error in the user's language that repeats none of it, and a watching device
never gets a prompt that could not be redacted.
(#1588)
clipboard what a program in the pane copied before; its new copies still reach the clipboard.
(#1600)
published in the meantime installs nothing and is shown to be checked first, and a server whose
supervisor cannot install by revision asks for a restart instead of installing.
(#1590)
a Korean syllable: 한 then four Backspaces now also deletes the character before it.
(#1363)
pane, the earlier session's commands no longer appear. A
/clear,/newor resume sent from Chatkeeps its own row in the conversation it starts, without claiming that it finished. Commands sent
before an agent's first reply stay with that agent while it keeps running, also through a moment
in the background (Ctrl+Z on Linux and macOS); once a different agent takes over the pane, they
are hidden, even if Chat was not open when it happened. A command sent to a restarted agent while
the pane still shows the previous session stays once the agent's own session appears within a
minute, unless Chat started another session after it. Within that minute, a session change typed
in the terminal of an agent that resumed the same session can still keep such a command. Where
Chat cannot find the agent's program at all (native Windows, or an agent started under another
program name), such a command stays with the session that the same agent starts in the same
terminal; a later session, another agent or terminal still hides it. Outside Linux, an agent
restarted under the same process number cannot be told apart from the one before it.
(#1543)
reflow in place, and long labels wrap without clipping.
(#1392 by @snowykr)
actually visible. Covered panes, loading or failed chats, and terminal reconnections keep
unread finishes marked.
(#1342)
after the jump arrives; small scrolls above the end show the way back. Resizing and restoring
a short chat work without an extra scroll.
(#1342)
the dot conservatively; opening their Terminal view can acknowledge the output.
(#1342)
web-server restart or update brings read DONE dots back; read records are not carried across
server restarts.
(#1342)
field's row in a wide sidebar, Remove PC dims like its neighbours while a rename or disconnect
runs, and danger buttons keep their red tint on hover everywhere in the app.
(#1422)
rather than expanding beyond the window and leaving scrolling to the page.
(#1586 by @Kinetic27)
|---|:-:|) shows as a table in thechat, as on GitHub, instead of as its pipe-separated source.
(#1361 by @Noobear)
/btwanswer, a picker left up) no longer lets the next message from the message box be typed into
that screen and do nothing, for Claude Code and the agents above (not OpenCode): the composer
says the command is still open in the terminal, with Show terminal, and Send (or a queued
message's Send now) keeps the message until the screen closes or you choose Send anyway.
(#1637)
dark or single-mode theme (Dracula on the light side stays dark), including System and older saved
palettes, is drawn from the first frame, and the installed app's title bar color matches it at once.
(#1569)
installed update's folder instead of its source checkout: it now says to restart the app from
the source checkout, which is what lets updates run again.
(#1417)
Windows terminal wheel panning stays in place when output arrives, and tapping the terminal
without scrolling no longer changes shared history.
(#1534)
each folder is asked once (
GET /api/fs/favicon), and a folder without an icon is an answer, nota 404. A reverse proxy with a rate limit no longer answers 429 to the burst, and the browser
console no longer fills with red 404 lines on every load. A 429 is no longer remembered as "no
icon" either: the folder is asked again when its row next appears.
(#1339)
before the move, a cached roster or another PC's update cannot undo it, and the first roster
read after the move (another browser's later order included) replaces it. A remote PC does this
once its bridge is updated to the next release; until then it keeps the earlier behaviour.
(#1593)
Maintenance
completion cannot change the transcript during measurements on phone and desktop.
(#1347 by @Yoonwoo-Ha)
native draft and placeholder heights on phone and desktop.
(#1347 by @Yoonwoo-Ha)
🤖 Generated with Claude Code