Skip to content

BetterC0de v0.1.0-beta.7

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Oct 22:24
· 1 commit to main since this release

Security

  • Opening a repository no longer runs its code. On Windows, git, shells and helper tools are resolved to absolute paths and never searched in the workspace folder, so a git.exe, powershell.exe or codex.bat committed to a repository is not executed; the backend also sets NoDefaultCurrentDirectoryInExePath. CLI sync no longer copies a repository's MCP servers, skills or agents into your global lists, and project MCP servers (local or remote), formatters and Claude project hooks run only in a workspace you trusted explicitly. Project servers can't replace one of your own.

  • Workspace trust is opt-in for new installs. Opening a folder no longer trusts it automatically. An Agent turn refused in an untrusted folder offers Trust this workspace, which asks for confirmation and resends the message; Trust project in Settings → Permissions does the same. Existing installs keep a saved choice, and folderless chats still work. Review your MCP list once: servers imported from projects before this release carry no origin and still run in every workspace.

  • MCP secrets stay out of view. Environment values and headers in mcp-servers.json are encrypted on disk and shown as ••••••••; leaving the placeholder keeps the stored value. The system prompt names MCP servers only, never their commands, URLs or credentials.

  • Paired devices have tighter limits. Plain-HTTP LAN pairing gives a one-hour read-only session, also for the WebSocket; full sessions need HTTPS, Tailscale or this computer. A device without the terminal grant can't run Bypass turns or save permanent permission rules. Idle sessions end after 7 days, pairing links last at most one hour, and turning remote access off revokes sessions and unused links. Settings → Remote Access lists unused links with Revoke and Revoke all and labels read-only devices. On the phone, Bypass shows as unavailable until the desktop allows terminal access from remote devices, and approvals offer Allow for this session instead of lasting rules the desktop doesn't save from a phone.

  • Saved commands need a native confirmation. Adding or changing a hook command, saving or importing an MCP server with a new or changed command, and installing a Claude Code or Codex plugin show a native dialog with the exact command; approved hooks then run automatically. Existing hooks run only right after a click or key press until they are saved again; Settings → Hooks shows which commands are approved, and cancelling the approval keeps the form open with “Not saved: the command wasn't approved.” An unreadable hooks.json now stops the send with an error instead of silently skipping blocking hooks. Blocking message hooks now run in the backend for every client, including the remote web UI and every /goal command that starts work, and no longer run twice when a provider plugin fails and the message falls back to a built-in provider, and a message is refused while hooks.json is unreadable or a hook's command isn't approved.

  • Electron hardening. Packaged builds set Electron fuses (NODE_OPTIONS, NODE_EXTRA_CA_CERTS and --inspect are ignored, cookies are encrypted, only app.asar loads, with integrity checks), drop the macOS DYLD entitlement, keep DevTools closed unless started with BETTERC0DE_ENABLE_DEVTOOLS=1, and no longer allow unsafe-eval or inline scripts in the renderer; the page served to remote browsers uses a per-response nonce. Preview pages can't open popups, navigate to file: or browser-internal pages, forward typed keys, or add selected elements to a chat without a user action.

  • Privacy by default. Automatic crash reports and the usage ping are off unless turned on in Settings → Privacy & Diagnostics. When enabled, uploads and logs are redacted, the ping is sent once per start, and the installation ID is deleted while the ping is off.

  • full and full-access permission levels now mean allow-edits for every provider; only an explicit Bypass grants bypass, and a session without a stored mode no longer falls back to bypass. Image generation asks for approval except at Bypass and runs without network or shared temporary-folder access.

  • The unused Sign in with ChatGPT option was removed, and leftover ChatGPT tokens (auth.json) are deleted at startup.

Fixed

  • Agents and providers.

    • On the Claude API and OpenAI-compatible providers, a Write or Edit cut off by the output limit is never run, so it can no longer empty a file. Tool turns get a larger output allowance.
    • Active agent turns are no longer cut off after 30 minutes (10 minutes for direct API turns); only a stretch without any activity ends a turn, and waiting for your approval or answer doesn't count. Approvals and questions no longer resolve or deny on their own after 5 minutes for Claude Code, API, Cursor or Grok agents. BETTERC0DE_PROVIDER_TURN_TIMEOUT_MS, BETTERC0DE_PROVIDER_TURN_MAX_DURATION_MS and BETTERC0DE_PROVIDER_MAX_IDLE_SESSIONS tune the limits.
    • A single 429 or 529 from an API key is retried with backoff before the turn fails. A rate-limited key is set aside for at most 5 minutes, and Retry now in the key settings clears the wait.
    • Claude Code installed through npm on Windows works again: turns no longer fail with EINVAL while the provider status looks healthy.
    • Image attachments reach Claude Code and Grok or Cursor agents that accept images; other attachments show a notice instead of being dropped silently.
    • Stop works reliably on Grok and Cursor and right after sending on Codex, and one very large protocol message no longer ends a Codex, Grok or Cursor session.
    • Agent CLIs keep your non-secret environment (SSH agent, locale, proxy and Windows system variables) while credentials of other tools are removed. On Windows the agent's Bash tool uses Git Bash when it is installed and rejects multi-line commands under cmd.exe instead of running only the first line. Stop and timeouts end the whole process tree.
    • On macOS, apps launched from Finder or the Dock find tools installed with Homebrew, nvm or volta.
    • Claude Terminal finds its transcript on Windows and for project paths with special characters, and trims history so the command line stays within OS limits.
    • Idle agent processes are released after 10 minutes, with at most 4 kept warm per provider instance. The provider status warns about an outdated Codex CLI.
  • App lifecycle.

    • The backend restarts itself after a crash; after repeated crashes a banner offers Restart backend. A crashed window reloads, and a hung window offers Wait or Reload instead of a blocking error box.
    • Closing the window while the app starts no longer shows a failure dialog, and launching again while the app shuts down relaunches it.
    • Terminals and dev servers a window started end when that window crashes, reloads or closes, and windows reconnect to the backend right after the computer wakes from sleep.
    • The first window appears sooner: plugin loading, the settings key and CLI scans no longer block it, and the CLI scanner no longer reads files synchronously on the main thread.
    • Plugins load after the window appears. A plugin that throws from a timer or listener is disabled instead of quitting the app, and plugin calls time out after 120 seconds.
    • In development (npm run dev), a rebuilt shared schema package restarts the backend too, so a new setting is no longer rejected as invalid until the whole app is restarted.
  • Chats, memory and performance.

    • Opening a chat no longer downloads every diff and inline attachment; diffs load when expanded and attachments when shown. Very large tool output keeps its first and last part with the original size, and Show full output loads the rest while the backend still keeps it.
    • Long chats offer Show earlier messages and load older history while you scroll up, so messages before the last turns can be read again and chats over 1,000 messages show their full history. Opening a chat reads the newest 100 messages.
    • A message sent during a reconnect refresh no longer disappears.
    • Autonomous Work runs in the backend. A run keeps going after a window reload or with no window open, comes back paused after a backend restart, and its controls and state are shared across windows and paired devices with full access. Resume sends the next turn as soon as the chat is idle. A run needs conversation auto-save and a provider BetterC0de runs itself, and it can't start while a goal is active in the same chat (or the other way round). Follow-up turns use the model chosen at start or resume.
    • A chat's permission level, model selection and orchestration are stored with the chat in the backend, so they survive restarts, appear on other devices and update other open windows right away. The remote web UI's turns now include your skills, MCP servers, subagents and rules, prepared by the backend exactly like desktop turns.
    • Phone plan approvals show the plan text, also when it arrives after the card opened.
    • Desktop and phone derive open approvals and questions from one shared rule. A question or plan approval closed by a resolution of another kind (for example a question the provider cancelled) no longer stays open on the desktop, a question request without questions offers a free-text answer on both, and the phone lists requests in the desktop's order.
    • Memory stays bounded: the least recently used chats free their messages and activity, checkpoints, closed editor tabs, terminal output and canvas logs are capped, closed tabs release their Monaco models, off-screen canvas previews pause, and the right-panel browser releases its page after 5 minutes hidden.
    • Streaming no longer re-renders the composer, sidebars, title bar or right panel, and providers are polled once per window instead of once per pane.
    • /undo no longer downloads every diff of the thread, and Git status no longer blocks the backend with synchronous git config calls.
    • Rules, skills, MCP servers and hooks are kept in one place owned by the backend, with locked, atomic saves; older values from settings.json are moved there automatically without losing anything. A custom data folder no longer loses hooks, skills or rules, the prompt names exactly the MCP servers a turn attaches, and Settings → Hooks shows the last run of message hooks again. A paired browser on a full session shows your global rules read-only in Settings → Rules; read-only sessions are told why they're hidden.
    • Settings → Skills → Sync from CLI no longer erases your MCP servers or imported Claude plugins, and no longer counts project skills it doesn't import; onboarding import adds to the existing list.
    • Reject in the review bar now restores a file to its state before the turn, using the turn's Git checkpoint; it appears once the turn has finished. Before, it wrote the edited content back and reported success. Outside Git repositories Reject is no longer offered.
    • Typing a / command or @ mention, console output and opening dialogs no longer re-render the whole window.
    • The copy, retry and revert actions under an answer are always visible instead of appearing only on hover, and they and the turn duration use the full muted text contrast.
  • Codex context usage reaches the app. The app-server reports usage as total, last and modelContextWindow, which BetterC0de read as empty, so Codex chats showed no context fill and BetterC0de could compact them on top of Codex's own automatic compaction.

  • Claude is greyed out with a lock in the model menu when Claude Code is not installed or not signed in. Without a claude of its own the desktop app falls back to the Agent SDK's bundled binary, which starts but has no login, and BetterC0de took that as a ready provider. The hover hint now says to install Claude Code or run claude auth login.

  • Grok CLI models now work as orchestration workers. The worker catalog missed the runtime's grok-cli driver spelling, so every orchestrated turn with Grok selected failed with “No available Grok worker models” even though Grok worked as the main model.

  • Orchestration workers no longer offer or run Ultracode. It starts Claude Code's own multi-agent run, which conflicts with a worker's assignment; a saved Ultracode selection now falls back to Auto. The main chat keeps Ultracode.

  • Orchestration controls. A dedicated icon beside permissions brightens when orchestration is on and opens a 300px menu in the model picker's dark chrome with the chat thinking slider. The menu has a switch-style toggle and a live summary of the lead and its delegates, and lays the team out as a tree: connector lines run from the main agent to each provider and on to its models, lighting up for selected ones. Providers expand in place with checkbox rows and per-model thinking chips instead of nested flyouts, with selected/available counts; the footer note shows the selection or any state that needs attention. Provider rows preview selected models; each model's thinking submenu preserves supported effort IDs and can reset to Auto. Centred above the composer footer, an Orchestration heading with the model count sits over a row of the selected models, each showing its provider logo beside its colored thinking-level icon; from the sixth model the rest collapse into a +N count. Hover or keyboard focus reveals each model's name and colored thinking level, including account-specific names and saved selections, and a click opens that model's thinking slider directly from the row. Selection counts, pending changes, and unavailable states remain visible, with keyboard navigation and focus restored when dismissed.

  • Claude Code keeps the Ultracode prompt mode when SDK model discovery refreshes its native effort levels, including Opus 5.5. The mode remains separate from the SDK effort value.

  • Reasoning selection stability. The slider keeps its selected value while preferences catch up, retains keyboard focus, and discards stale previews when switching models or threads. Offered effort levels survive preference reconciliation and use the provider's actual option ID and value in requests, including Cursor reasoning, Grok efforts, and Claude Extra High. Models with a boolean Thinking capability expose On/Off; Claude Haiku now honours that toggle in SDK settings.

  • Cursor shows its cube logo in the model menu, the model chip and everywhere else a provider logo appears, instead of a generic terminal icon.

  • Models in Cursor's and OpenRouter's model menus show their maker's logo (Claude, OpenAI, Grok, Gemini and others) instead of repeating the provider's; Auto and Composer keep the Cursor cube.

  • The composer's Model menu row shows the active provider's logo, matching the selected model chip and respecting the current theme. Reasoning uses a larger ascending level icon, which the compact composer's model chip also shows before the level name (and keeps when a narrow column hides the name), and a compact picker with the selected level and model centred above a rounded slider with snap points and a prominent thumb. High uses orange, Extra High red, Max blue, and Ultra/UltraThink/Ultracode purple across the level name, icon, and slider fill, with light/dark contrast variants. Reset stays in the header; click, drag, and keyboard selection remain available. While Fast mode is on, the model chip leads with a filled purple bolt.

  • Large project file trees. The Explorer loads the workspace root and opened folders directly instead of stopping at a recursive search limit. Very large folders offer Load more files, expanded folders keep their contents when refreshed, and revealing a file loads its ancestors and any required continuation pages. The header count identifies loaded entries rather than claiming a project-wide total.

  • OpenRouter models read like the others: "Gemini 4 Argon" instead of "google/gemini-4-argon" in the model picker, the composer chip, the message header and the model-switch line, with the maker's logo (the exact id stays under the name in the picker). Their thinking shows in the chat: BetterC0de now asks OpenRouter for reasoning through its own reasoning setting, at the level chosen in the composer.

  • MCP servers saved without arguments or environment variables (an HTTP server, or a command with no options) are no longer left out of turns the backend prepares or of agents it starts directly, and the prompt lists them again.

  • Switching a chat to another provider no longer fails when the previous one can't run (for example a Grok CLI that quits on start because one of its MCP servers needs a sign-in). Instead of blocking with "The previous provider could not prepare the handoff summary", the most recent part of the stored conversation is passed on as recorded, and the handoff says so.

  • Sending to OpenRouter and the other API-key providers no longer crashes the local backend ("Error: chat send failed" and an automatic restart). The model picker sends an instance with the model, which the durable send record kept while the accepted turn was bound without one; the two now agree.

  • In Editor mode, Settings and Usage sit in the same rounded card as in Agent and Canvas mode instead of running edge to edge against the sidebar.

  • The Usage activity calendar steps by calendar days. It added fixed 24-hour steps from midnight, so across a daylight-saving change two cells landed on the same date (React warned about the duplicate key 2025-10-26) and a day went missing.

  • The Usage tab loads in well under a second once its cache exists. Claude transcripts that grew since the last visit are read on from where the last scan stopped instead of from the start, which for an active chat's 100 MB transcript took several seconds on every visit; a transcript that was rewritten is still read in full.

  • Every setting does what it says. Each settings row has an icon and a description of what it changes; settings without an effect are gone.

    • Chat → Text: Message Text Size now sizes the messages themselves; before, it only changed the space around them, so its 14px default never showed. The default stays at the 13px messages had, and a size you picked carries over. Compact Messages, moved here from Layout, now tightens the space between messages. Reasoning Summaries is disabled while Thinking Blocks is off.
    • Layout: Workspace Sidebar, Terminal, Chat UI Style, Chat Width and Chat Scale are removed; none of them changed anything. Sidebar Width now sets the real sidebar width, the same one dragging its edge changes. Files View and Review / Diff follow the mode: the right panel in Agent, the left sidebar in Editor and Canvas. In Agent mode, Review / Diff opens the right panel's Diff view and shows whether it is open; before, it switched an inline panel that never appeared.
    • Appearance: Theme Mode Lock (no effect) and Save (changes save on their own) are removed, and Export, Import and Reset sit in a Backup group. An imported theme keeps its own accent color instead of losing it whenever another appearance setting changed, Hue also tints at red, and Reduce Transparency's solid borders now apply in dark themes. Import checks the JSON, applies the theme it contains and says when the text isn't an export; Reset also restores the default theme and mode. Terminal Titles sits next to the terminal font, and the default UI font is named Figtree.
    • Notifications & Sound: system notifications work in the desktop app; the app refused their permission, so they never appeared. The permission row explains its state, and a new In the app group has Error Toasts and Attention Badges, which were saved settings without a switch.
    • General: Confirm Archive and Confirm Delete are honoured. Archiving a chat from a menu asks first (it never did), deleting a chat skips the question when Confirm Delete is off, and deleting all chats of a project always asks.
    • Permissions: Claude Code's rule files show the Claude logo and say when rules are saved, lists show "Loading rules…" instead of "No rules" while they load, and the copy is plainer. Remote Access: the Reachability text is one sentence and the "Test the recommended link" link is gone.
    • Rules: if your rules file can't be read, the editor stays read-only with a Retry button so saving can't overwrite it; save errors are shown; "Use starter rules" asks before replacing your rules. The prompt preview is labelled as approximate, and rule files show which tool reads them (Claude Code, Codex, Cursor). Rules and Compatibility use the chat's worktree when it has one, matching what the agent sees.
    • Docs: "API Reference" (a dead link) is now "Product guide"; Getting Started points to Settings → Providers and corrects its slash command and Diff panel steps.
    • Hooks: event descriptions say exactly when each hook runs, deleting a hook asks first, paired browsers say hooks are managed on the desktop, and an unreadable hooks file shows an error instead of an empty list.
    • Compatibility: one failed request no longer blanks the page; developer reference tables are removed, and instruction, skill and provider rows show tool logos.
    • Experimental: clearer Orchestration and Jev code search descriptions with the providers they apply to, and plainer save errors.
    • Skills, MCP and Plugins: MCP servers, skills and subagents imported from Claude Code or Codex stay removed or hidden; only "Sync from CLI" brings them back. HTTP and SSE MCP servers can be edited without losing their URL or headers, imported servers show where they came from, and "Sync from CLI" lists what it imported and skipped. "Sync from CLI" also imports Claude Code agents and reports failures instead of saving empty copies; skills managed by Claude Code or Codex can be opened or hidden. Plugin config fields no longer drop characters while typing, and install, toggle and remove failures show the reason. All three confirm deletions, warn before replacing an item with the same name, and say in a paired browser that they're managed in the desktop app.

Added

  • Pull requests in the app. The Git panel and the chat header can create a pull request for the current branch, or commit, push and create one in a single step: the title and description are written from the branch's commits and diff, and you can edit them, pick the base branch (the repository's default first) and make it a draft. The branch is published or pushed first when needed. If you are on the default branch, the dialog suggests a new branch name to create; if the branch already has a pull request, it shows that one. The new pull request appears on the chat and in the sidebar right away. A new Pull Requests page (sidebar, or Pull Requests in the command palette) lists the open pull requests of your projects with Mine, Review requested and All open filters, search, checks and review state. Opening one shows its description, checks, changed files and conversation, and lets you comment, approve or request changes, merge with a method the repository allows (optionally deleting the branch), close or reopen it, open it on GitHub, Work on this PR in a new chat on a worktree of its branch, or Ask the agent to review it in a read-only chat. A pull request from a fork opens in an untrusted folder, so its hooks and tools run only after you have read it and trusted the folder. Everything goes through your GitHub CLI login (gh); without it, or signed out, the app says what to install or run.

  • Wake a chat on CI failures and reviews. Turn on Wake on CI failure or review from a chat's pull request in its header. When a check fails on the latest commit, a collaborator on the repository (or a review bot) reviews or comments, or the branch stops merging cleanly, the chat gets a message with the details (for a failed GitHub Actions job, the end of its log) and starts working; if it is busy, the message waits in its queue. Your own comments never wake it, a chat is woken at most once every ten minutes and twelve times a day, and watching stops when the pull request is merged or closed. Wake-ups are turned on from the desktop app.

  • Automations. Scheduled in the Agent sidebar (or Ctrl+Shift+A) now opens an Automations page instead of the hooks settings. An automation runs a prompt in a trusted project with the provider, model, reasoning level and permission preset you choose, in the project folder or in a new Git worktree for each run: once, every few minutes or hours (at least every 5 minutes), daily at a time on the weekdays you pick, on a cron expression, or whenever its webhook URL is called. Each run starts its own chat named after the automation and the date, which says it came from the automation; the page shows the next run, the last 50 runs with a link to each chat, and lets you run now, pause, resume, edit and delete. A run missed while the app was closed runs once at the next start, and a run that comes while the previous one is still going is skipped and listed. Webhook URLs carry a random token (Rotate URL replaces it), accept JSON, form or text bodies up to 256 KB, can check GitHub's X-Hub-Signature-256, are rate limited, keep a log of the last 50 deliveries, and put request values such as {{body.pull_request.title}} into the prompt as clearly marked untrusted data. The page lists the URL for each address Remote Access offers, or says that only this computer can reach it while Remote Access is off. See Automations.

  • Bring your Claude Code and Codex conversations. Setup has a new step after the CLI check, and Settings → General → Chats & History has Import from Claude Code and Codex: both list the conversations those CLIs keep on this computer (the newest 200 of each), grouped by project, so you can pick whole projects or single chats and import them with a progress bar. Each becomes a chat in the project of the folder it ran in, or a chat without a folder when that folder is gone, with its prompts, replies, the reasoning the CLI showed and its tool calls in short form; system prompts and hidden reasoning stay out. A note at the top says where it came from. Continuing an imported chat resumes the original Claude Code or Codex session when it uses the same CLI home and folder; otherwise the earlier messages go along as context. A conversation can be imported only once, and sessions that BetterC0de's own chats ran aren't offered. Import is available in the desktop app only.

  • A real terminal on the desktop. The terminal panel now runs your shell interactively instead of one command at a time, so npm run dev, vim, ssh, Ctrl+C and anything else a terminal does work. Each chat has its own terminals, started in its folder or worktree, in the bottom panel or a pane's Terminal tab: + opens another tab and its chevron picks the shell (cmd, PowerShell, Git Bash, WSL, bash or zsh), a double-click renames a tab, and Ctrl+D or Ctrl+Shift+D splits the focused terminal right or down, up to four per tab, with dividers you can drag. Terminals keep running while the panel is hidden or you switch chats, tabs or panes; closing one ends it, and asks first while something still runs. After a window reload they show as ended, with Restart. Selecting text copies it, Ctrl+Shift+C and Ctrl+Shift+V copy and paste (Ctrl+V too on Windows), right-click pastes (or copies a selection), Ctrl+click (Cmd+click on macOS) opens web addresses, and the colors follow your theme, including an imported theme's terminal colors. Shift+Tab and Alt with the arrow keys go to the shell while it has focus, and Ctrl+D splits instead of ending the shell, so type exit for that. On macOS the splits are Cmd+D and Cmd+Shift+D, and Ctrl chords such as Ctrl+D, Ctrl+R and Ctrl+W stay with the shell. Ctrl+` and Ctrl+J still show and hide the panel, and programs that ask the terminal for its cursor position or colours get their answer even while you aren't typing. The desktop can now run 12 terminals at once instead of 4, and typing no longer counts against the limit for running commands.

  • Visual replies. Agents can answer with a live page, such as a chart, table, diagram or UI mockup, and the chat shows it right in the conversation once the agent has finished writing it. The page follows your light, dark or imported theme and grows with its content up to a scrollable height; its toolbar switches between the page and its code and offers Copy HTML, Save as file and Full screen (Escape closes it). Ordinary HTML code blocks get a Preview toggle next to Copy. Pages run in a sandbox without access to the app or your data and can load scripts, styles and fonts only from a few public CDNs. Turn it off in Settings → Chat → Visual Replies; agents then aren't told about it and such pages show as code.

  • Find in chat. Press Ctrl+F (Cmd+F on macOS) in a chat, or choose Find in Chat in the command palette, to search the open chat. A small bar at the top right of the conversation shows "3 of 12", with previous and next, Match case and close; Enter and Shift+Enter (or F3 and Shift+F3) move between matches and Escape closes it. Matches are highlighted in your messages, the replies and recorded plans, with the current one in a stronger colour, and the chat scrolls to it. It searches the whole chat, including older messages that aren't loaded yet: going to one of those loads that part of the history. Results update as new messages arrive, and past 1,000 matches the count reads "1000+". Ctrl+F in the code editor and the browser preview still opens their own find, in a terminal it stays with the shell, and Ctrl+Shift+F still searches across chats.

  • Compare models. In a new chat, Shift-click or Ctrl-click (⌘-click on macOS) models in the model menu to send one prompt to up to four models at once, each with its own reasoning level. The model chip shows "3 models" with their logos, and a click without a modifier goes back to one model. Sending opens one chat per model with the same prompt, attachments and permission level, titled after the model ("Fix login · GPT-5"). In a Git repository each chat gets its own new worktree; in a folder without Git you're asked first, because the chats would edit the same files. The first chat stays open while the others run in the background, and a Compare switcher in the chat header (with a marker in the sidebar) jumps between them and shows how each one is doing.

  • Edit a message, fork from an answer, merge a fork back. Hover one of your messages and choose Edit and resend (also in its … menu) to change it in place: Enter sends, Escape cancels, and its attachments go along unless you remove them. The chat goes back to just before that message, the agent forgets the later turns, and the edited text goes out as a new turn. When the agent changed files after that point you choose Keep file changes or Revert files too, which restores the folder from its checkpoint and says why it is unavailable outside Git or without a checkpoint; a running turn is stopped first, after you confirm. Fork from here under an answer starts a new chat with the history up to that answer, folded under its parent like /fork, which now also takes a message number as /messages lists them. A forked chat shows which chat it came from, and Merge back (or /merge-back) sends the parent the fork's last answer and the files it changed as a new message, queued if the parent is busy, and opens the parent. Forks work in the same folder or worktree as their parent.

  • Steer a running turn, and edit the queue. While the agent works, a message can go into the running turn right away so the agent changes course, instead of waiting for the turn to end. Settings → Chat → While the agent works, Enter… chooses whether Enter queues the message (the default) or steers, and Ctrl+Enter (⌘Enter on macOS) does the other one; the send button and its tooltip show which. Codex takes the message in the middle of its turn. Other agents can't, so for them steering stops the current step and sends the message as the next turn, and the tooltip says so. A steered message shows in the chat as yours, at the moment you sent it. Queued messages get Steer now and a menu to edit them in place (text, attachments and tagged elements; Enter saves, Escape cancels), move them up or down, or remove them. Drag a queued message to reorder the queue, and press Alt+↑ in an empty composer to edit the last one. The queue is still saved on this computer and pauses after a restart, and a message you are editing waits until you're done.

  • Chats resume by themselves after a usage limit or a restart. When a turn stops because the usage or rate limit of Claude Code, Codex or an API key was reached, the sidebar shows the chat as Limited · resets 14:30 and a card above the composer offers Resume at 14:30, Don't resume and Resume now. With Settings → Chat → Resume chats stopped by a usage limit on (the default), BetterC0de sends "Continue." shortly after the reset, or your first queued message instead when this window has one; without a reset time it tries after 30 minutes, 1 hour and 2 hours. Limited again, it waits for the new reset, and it stops after three tries in a row. Sending a message yourself, pressing Stop or choosing Don't resume cancels it, and a scheduled resume survives a restart. Continue running chats after a restart (also on by default) picks up a chat whose turn was running when the app or its backend quit or crashed: at the next start it gets "The app restarted while you were working. Continue where you left off." once, if its agent can resume the session. A chat that was waiting for your approval waits for you instead. Messages BetterC0de sends on its own show as a note in the chat.

  • Chat status and pull requests in the sidebar. Task feed cards show their branch's pull request next to the branch (#number in the colour of its state: open, draft, merged or closed). In the project list each chat shows its state on the project's guide line: working, waiting for you, its pull request, or idle. Hovering a chat in either layout opens a card with its branch, pull request (opens on GitHub), worktree and model. Pull requests are read through your GitHub CLI login (gh), once per repository every two minutes; without gh the sidebar looks as before.

  • Settings is a page. It opens in the main area like Usage, with a back arrow to the chat and the sections on the left, instead of a large dialog over the app; Escape also returns to the chat. Reset settings under General works again: its confirmation only appeared when the Docs tab was open. The section list has a search field and groups (App, Agents, Access & Privacy, More), and Compatibility no longer shares the Plugins icon. The page grows with the window, so it stays readable on large displays. Settings are sorted by topic instead of one long General tab: General keeps updates, chat history and reset; Appearance has the Dark / Light / System mode (System is new and follows the OS) next to the themes, colors, typography and motion; Layout has the panels and the sidebar width; Chat has the message text and splits the former Behavior list into responses, reasoning, tool output, diffs and context; Notifications & Sound and Privacy & Diagnostics (with the backend logs) have their own tabs. /settings layout, chat, notifications, privacy and permissions open them, and the sidebar's provider update link now opens Providers instead of General.

  • Providers settings are clearer and work as shown. Providers are grouped into CLI accounts, API keys and Local models, each with its logo (Claude Code vs. Anthropic API, Grok CLI vs. xAI API), a CLI / API key / Local chip and a live status. Fixes along the way:

    • Recheck really re-detects a CLI instead of returning a 30-second-old result, and Cursor now shows its real sign-in state instead of always "not signed in".
    • CLI cards no longer show "Installed v" without a version or "Signed in (cli)", and they show the signed-in account when the CLI reports one; install and login commands render as code, and Cursor's login hint is cursor-agent login.
    • The DeepSeek card is gone: there is no DeepSeek backend, so its key was saved and never used (DeepSeek models remain available through OpenRouter).
    • LM Studio shows whether its local server is running and how many models are loaded, instead of a Server URL field the backend ignored, and its no-op Custom/Visible Models rows are gone; OpenRouter's no-op Visible Models row too.
    • OpenRouter's key dot resets on Clear, and a rate limit or network error reads "couldn't verify" instead of "key invalid".
    • "Open provider console" also works in a paired browser, a failed provider list shows Retry instead of "Loading providers…" forever, and failed instance refreshes or updates show a message.
    • Model Visibility uses the same closed cards: each provider shows its logo, how many of its models the picker offers and its own switch, and opens to its models with Show all / Hide all; duplicate context and tier labels are gone.
    • Every provider is a card that starts closed: logo, name, CLI / API key / Local chip, status and a one-line summary (the CLI's sign-in and version, or LM Studio's server) at a glance, and a click opens its settings. API providers have their enable switch on the card itself.
    • CLI instances are compact cards instead of a column of unlabeled fields: logo, name, status, version and what each setup discovered at a glance, with update, switch and refresh on the row. A click opens a labelled form (name, accent color, binary, home paths, extra models as chips, environment variables with a secret toggle); Add instance is a menu, a new instance opens ready to fill in, and removing or resetting an instance asks first.
  • Mode switch in the sidebar footer. Agent, Editor and Canvas sit in a small sunken bar, one click each, instead of a dropdown; the active mode sits on a raised chip with its icon in the mode's colour (violet Agent, blue Editor, rose Canvas) and shows its name when the sidebar is wide enough. Agent has an AI sparkle icon and Canvas an artboard instead of the robot and the palette. Arrow keys switch modes and right-click still opens a mode in a new window. On a narrow sidebar the footer no longer overlaps or cuts off its buttons: it hides the mode's name, then the account name, then the avatar.

  • The sidebar's project list is tighter and clearer: chat titles start under the project name instead of 22px further in, a guide line ties them to their project with a mark at the open chat, an open project shows an open folder and its chat count, the row menus appear on hover or focus, and "Show N more" says how many chats are folded.

  • The Edit, File, View, Window and Help menus sit in the centre of the title bar as toolbar-sized rounded buttons, and the project name moved to its right side. Switching to Editor from the View menu now opens the file tree and, without a project folder, the folder picker, as the sidebar footer already did.

  • Editor mode uses the same frame as Agent mode: code and chat are dark cards on the shell with even 8px gaps, the empty state without a folder no longer runs into the sidebar, and the code editor background matches its card. In Editor and Canvas the left sidebar now runs on from the title bar on the shell surface like Agent mode's, instead of sitting in its own card, and all three modes share one sidebar width (the same range and the same 15% widening above 1080px) that no longer jumps when you switch modes. The footer is the same size in every mode, so the mode switch stays under the pointer. The Files, Search, Git, Diff and Code Map tabs sit in a slightly raised bar whose flat active fill slides to the selected view, instead of a sunken pill on a grey track. Clicking a file in the file tree or in Recent Files opens it in its own tab next to the open ones, instead of an italic preview tab that the next click replaced.

  • The compact composer has a context ring between the model chip and the microphone. Hovering, focusing or clicking it shows how full the context window is as a large percentage with “35K of 950K tokens”, a segmented meter, the remaining and total processed tokens, and who compacts the context: the provider when it does so itself, otherwise BetterC0de. A status reads Plenty of room, Filling up (amber, from 80%) or Almost full (red, from 95%), and the ring and meter take the same color, and the numbers come back after a reload.

  • The composer shows Markdown as you type or paste it: bold, italic, strikethrough, inline and fenced code, headings, quotes, lists and links are styled while the syntax stays visible and dimmed, so the caret and selection still line up. Sent messages keep these styles with the styling syntax hidden; link targets, fences and backslashes remain visible.

  • Pin, snooze and select chats in the sidebar. Every chat menu (also on a right click) has Pin and Snooze. Pinned chats stay at the top of all three chat lists in the order you drag them into, and /pin, /pins and /quick-switch now use the same list, which is saved with your settings. Snooze a chat for 1 hour, 3 hours, until tomorrow 9:00, until next Monday 9:00 or until a time you choose: it leaves the list until then and comes back at the top marked Back, or sooner when it gets a new message, needs your approval or finishes a turn. Snoozed chats wait in a Snoozed section at the bottom, where you can wake them early. Ctrl/Cmd+click and Shift+click select several chats for a bar with Pin, Snooze, Move to folder, Archive and Delete, and dragging a selection into a folder moves them all.

  • Undo in the chat list. Archiving, deleting, pinning, snoozing, moving chats in and out of folders and removing a folder show a toast with Undo, and Ctrl/Cmd+Z undoes the last of these changes while you are not typing. A deleted chat disappears at once but is removed only after a few seconds, so Undo really brings it back.

  • Archived chats. Settings → General → Chats & History and the Chat list menu at the top of the sidebar open your archived chats, with a search and a project filter. Read a chat there without restoring it, restore it, or delete it.

  • Drafts and quick jumps in the chat list. A chat with an unsent message shows Draft, and a new chat you have started typing in appears in the list. Ctrl/Cmd+1…9 opens the first nine chats of the sidebar, pinned ones first; hold Ctrl/Cmd to see the numbers. With split panes, Ctrl+1…8 still switch panes.

  • Merged pull requests settle. In Task cards and Compact list, a chat whose pull request was merged or closed moves to Inactive right away instead of after a day.

  • Chat folders in the compact list. Create your own folders with the folder button at the top of the compact chat list, or with a chat's Move to folder menu. Folders stay pinned above the other chats, and their chats stay where you put them instead of moving by date or going inactive. Drag a chat onto a folder to file it, between two chats to place it, or back onto the list to take it out; drag folders up and down to reorder them. Each folder folds away, and its menu renames, moves or removes it (its chats stay). Folders are saved with your settings.

  • Compact chat list and inactive chats. The list icon at the top of the Agent sidebar now opens a menu with three layouts: Folder list, Task cards and the new Compact list, where every chat takes two lines: its state and title, then repo, branch, pull request and model. It keeps the project filter, the newest-first order and the hover card of the task cards. In Task cards and Compact list, chats untouched for a day move to an Inactive section at the bottom: dimmed, with the project's initials, the title and the age, and beneath them the same repo, branch, pull request and model as in the compact list, scrolling on its own past 300px with a slim scrollbar, and it folds away with one click. A chat that is working or waiting for you stays on top.

  • Tailscale HTTPS for Remote Access. Settings → Remote Access has a Tailscale card: whether Tailscale runs on this computer (with this machine's name and tailnet address, or what is missing: not installed, not signed in, disconnected, the service not running), Check again, and Tailscale HTTPS as the recommended switch. Turning it on publishes the desktop as https://<machine>.<tailnet>.ts.net and waits until the name answers as this desktop while Tailscale issues the certificate; the address then sits under the switch, ready to copy, and becomes the recommended pairing link. MagicDNS or HTTPS certificates being off, and a tailnet that has to allow Serve first, each come with a button to the page that fixes it. A new Local network switch lets Remote Access run on Tailscale HTTPS alone: the backend stays on 127.0.0.1, so nothing listens on the Wi-Fi and the firewall is never asked. The mapping is removed when the app quits and re-applied at the next start.

  • Picked page elements read at a glance in the composer and in sent messages: each chip shows an icon for what the element is (heading, image, link, button, text…), its mention and label, and an image without a label shows its size ("@img 1200 × 630") instead of repeating "img". The "Details" text gave way to a small chevron; clicking a chip still opens the details.

  • A real browser in the workspace panel, also without a folder. It has tabs in the panel header, a start page with a search field and your recent pages, favorites (the star in the address bar) and a history panel with search, grouped by day. Typing words instead of an address searches the web. Tablet and Mobile now show the page at the device's real viewport (768×1024 and 375×812), scaled down to fit the panel with the zoom shown above it, and with a tablet or phone user agent, so breakpoints and mobile site versions appear as on the device; before, they only narrowed the page and did nothing once the panel was narrower than the device. The navigation bar is one quiet row in the panel and in the editor preview, with the element inspector, console, device sizes and DevTools as buttons right next to Select/Browse; a new tab starts on the start page instead of localhost:3000.

  • Usage, redesigned, with Cost, Tokens and Limits. One page shows Claude Code and Codex together instead of one provider per dropdown. Cost and Tokens open with a large chart of the chosen range (7 days, 30 days, 90 days or all time, built with EvilCharts on Recharts): its total, the change against the previous period, provider chips that show or hide each series, and a figure that follows the day under the pointer with each provider's part; a strip sums sessions, active days, the daily average and the peak day. Provider cards show each share as a ring with a sparkline, top model and cache hit rate. Where the tokens go breaks the tokens into cached input, cache writes, uncached input and output next to what the cache saved; Top models ranks every model, Weekly rhythm shows the busiest weekday and Streaks the current and longest run of active days, followed by the activity calendar, highlights and where the numbers come from. Limits opens with one sentence on the tightest window and when it is back to full, next to a countdown to the next reset; each provider's windows are concentric rings beside their numbers, Resets ahead places every coming reset on a timeline, and Pace warns when the rate so far would use a window up before it resets. The sidebar's gauge button opens it, and it updates itself every 30 seconds while open. The backend now prices each day (Claude Code from its transcripts, Codex per session) and reports cache savings, and model lists show up to 20 models per provider.

Changed

  • The image-generation model and the Codex and Claude commit-message models are settings, with the previous models as defaults.

  • Unsigned Windows and macOS builds and Linux deb, rpm and pacman packages check for updates and offer a download link instead of failing silently; Settings → General → Updates shows the version and update status. AppImage keeps automatic updates.

  • The app keeps a rotating log in the data directory's logs folder, available through Open logs folder in Settings. Backend server errors are logged with message, stack and request id, with secrets redacted.

  • npm run package and the build:* scripts build for the current machine through the same release-check pipeline as CI, including the packaged-app smoke test.

  • The app is about 12 MB smaller: code highlighting in chat answers no longer ships a second copy of every language grammar. The build's budget for the startup script is 2.25 MB, up from 1.75 MB, to fit this release's new features.