0.4.10
For live updates on Fresh, follow me on X.
Most options below can be changed in the Settings UI - run Open Settings from the command palette (
Ctrl+P).
Features
- Prettier Markdown Compose / Preview - headings, block quotes, and horizontal rules get nice styling and conceal the literal
#/>/---, lists get bullets and spacing, fenced code blocks are framed with side rails, and the default preview width is a readable centered measure instead of the full pane (#2967, requested by @mommysgoodpuppy). - Review Diff - improved UX - no soft wrap, side panels (file list, comments) can be toggled (use F and C keys), and the sidebar nests files by directory like the File Explorer instead of repeating the full path on every row.
- Review Diff performance improved - a review spanning a hundred commits now lays out completely and stays responsive: cursor movement, hunk jumps, and flipping between the unified and side-by-side views no longer lag behind a stale frame. Further performance improvements are in the works and will come in future releases.
fresh --skill- prints the guide to driving a running editor from an embedded terminal: the script verbs, the calling convention, and worked examples. Coding agents running from within Fresh should have an easier time controlling the Fresh UI at your request.- Selection Highlighting - empty lines are now visibly highlighted within selections, and whitespace indicators are shown (
·/→) even when the indicators are otherwise off - this new behavior is configurable from settings (whitespace_in_selection, on by default) (#2797, reported by @akarinotomoshibi). - Linux musl installs register a desktop entry and icons, so Fresh shows up in your app launcher - continuing 0.4.9's move to a single self-updating musl binary.
Bug Fixes
-
Selection now reaches the buffer edges - Shift+Up on the first line and Shift+Down on the last line extend the selection to the buffer start/end, and dragging the mouse past the top or bottom edge keeps selecting and auto-scrolls instead of stopping dead (#3006, #3017, reported by @akarinotomoshibi).
-
A selection is readable again - while text is selected, the word-under-cursor highlight steps aside and the other occurrences of the selected text are highlighted instead (as in VSCode/Zed), so the extent of the selection is unambiguous. The builtin themes also got occurrence-highlight colours that stay clearly visible against both the editor background and the selection - including on 256-color terminals, where
high-contrastandsolarized-darkpreviously quantized onto their own background and showed nothing at all - and text that would be unreadable on the highlight is nudged to a legible shade while it is marked. Code tours get their ownui.tour_step_bgkey so their step band keeps its previous colour (#3011, reported by @akarinotomoshibi). -
Folding
- A misplaced fold no longer swallows a line's text behind
...- seen as a KDL file'sdebug {vanishing (#3031, reported by @rsramkis). - A collapsed fold's header row stays legible when the folded line itself is empty.
- Deleting the line a fold was folded on now expands the fold instead of leaving a dangling marker.
- A misplaced fold no longer swallows a line's text behind
-
Search & Replace no longer opens with every input field missing when invoked a second time while the panel is still opening (#3019).
-
Git Log: diff colours in the commit detail panel no longer drift off their rows for commits containing non-ASCII text (#3014).
-
Diff files: a hunk header's coloured bar now covers the whole row - the enclosing-section name
git diffappends after the closing@@no longer sits in an uncoloured gap (#3021). -
Markdown
- Heading marks appear on the scrollbar as soon as a file opens, not only after scrolling past them, and stay stable and limited to top-level headings (#2990).
- Compose mode no longer frames the paragraph after a fenced code block as code when the buffer opens or scrolls into view mid-document (#3001).
- Bold, italic, and inline-code markup no longer stay visible as raw
**/`until you click elsewhere (#2968, reported by @mommysgoodpuppy). - Comments inside fenced code blocks are no longer misdetected as Markdown syntax, and scrolling a large file in Compose mode is smooth on the first pass instead of only after it's been scrolled through once.
-
Rendering: the 256-color contrast pass no longer stalls large terminal windows or the Settings dialog, and a dimmed dialog no longer paints a fixed dark gray instead of following the active theme (#2982).
-
Terminals: a focused terminal keeps
Ctrl+B/Ctrl+Efor the shell instead of them toggling/focusing the File Explorer, and File Explorer keys (like Enter) no longer leak into a terminal's PTY sitting behind it. -
File Explorer: the sidebar caret no longer blinks through modal dialogs. With
file_explorer.follow_active_bufferon, the tree now also follows the first file a session opens — previously a code tour's opening step (or any first open into the empty[No Name]buffer) left the explorer parked at the root — and a follow request no longer gets thrown away when it arrives while the tree is still expanding for the previous one (#2988). -
Review Diff:
PageDown/PageUpno longer stalls with the cursor off-screen while paging over a collapsed file (#3029); a panel like the git-log commit view now word-wraps correctly no matter which split shows it. -
Editing near a fold, concealed span, or virtual line no longer corrupts the rendered layout (wrong hidden text, row count, or scrollbar position) after certain edit sequences, or leaves it stuck stale after a file reload or undo past a bulk edit.
-
Whitespace indicators
- Indicators inside a selection are drawn in a subdued colour of their own (
whitespace_indicator_selected_fg, derived from the selection background when a theme doesn't set it) instead of taking the selected text's full-contrast foreground, where they were louder than the code around them. - Toggle Whitespace Indicators (Current Buffer) now marks every space when switched on, so it does something visible in a space-indented file — with the default settings (spaces off, tabs on) both halves of the toggle looked identical. Tab and line-ending indicators still follow the configuration.
- Indicators inside a selection are drawn in a subdued colour of their own (
-
Line numbers
- A per-buffer line-number toggle survives a tab switch in Page View instead of reappearing for one frame and then vanishing on the next keypress (#2931, reported by @mygirleatsmayo).
- Toggle Line Numbers in a Compose/Page View buffer no longer writes a setting the user never chose, leaving no way to turn numbers off while composing.
- Vi's
:set number/:set nonumberare honoured again on a buffer carrying a per-buffer pin, where they had become a silent no-op that still reported success.
-
Rulers: the column guide is drawn on the column it names rather than one cell to its right, and it stays visible where it crosses full-width characters instead of leaving a hole in the bar (#2928, reported by @dhanoosu).
-
Daemon mode: resizing a terminal attached with
fresh -ano longer smears the last-painted colour across the blank cells - seen as a purple/theme-coloured screen fill when dragging a Windows Terminal window between monitors over SSH (#2723, reported by @amirhosseindavoody). -
Starting a coding agent ("Teach Fresh CLI" in Run Agent / New Workspace)
- Choosing codex or opencode no longer writes an
AGENTS.mdinto your repository. The instructions ride the agent's launch prompt instead, so nothing lands in your checkout and anAGENTS.mdyou wrote yourself is left alone. - codex's Auto mode can now actually drive the editor. It used to launch with approvals turned off entirely, which left it no way out of its own sandbox to reach the editor's control socket - so an agent that had been taught the CLI could describe it perfectly and never once use it. Auto mode now escalates on request and has those escalations reviewed automatically, the same posture the checkbox already meant for claude.
- What the agent is told is now a short pointer to
fresh --skillrather than a transcript of the API. The old copy duplicated a declaration file thousands of lines long, drifted out of date as the API moved, and sent agents paging through those declarations instead of searching them.
- Choosing codex or opencode no longer writes an
-
fresh --cmd ...from a sandboxed process now says so. A caller that is denied access to a running editor's control socket - a sandboxed coding agent, or anything in a PID namespace - is told the socket could not be reached and to retry outside the sandbox, instead of being told no editor is running. Relatedly, an inconclusive liveness check can no longer delete a live editor's socket files, which had made it possible for a sandboxed process to knock out the editor you were working in. -
Packages browser
- Package: Install from URL on an already-installed package now upgrades it instead of refusing. The replacement is downloaded and validated before the installed copy is touched, so a bad source leaves the working version intact, and the new code is live in the session rather than only on disk.
- Update is offered for every package with a known source and actually works for packages installed from a monorepo subpath, a local directory, or a direct file - not just plain git clones. The
↑update marker now appears only when the registry is genuinely ahead of what you have. - Closing the browser by the tab's
×, Close Buffer, or a vanishing split no longer makes Package: Packages dead for the rest of the session, and re-running the command while it is open focuses it instead of doing nothing. - The first
Down/Uppress moves the selection by one package, including when the browser is opened before the registry has finished loading; an open browser now shows "Loading..." rather than "No packages found" while that is in flight. - A package installed from a URL is a package like any other: it appears in the open browser the moment it is installed, its detail pane names its kind, and language packs and bundles are covered by Update, Remove, Update All, Show Outdated and the lockfile alongside plugins and themes.
- Install, update and uninstall failures are shown in the browser's own detail panel instead of a status message that anything else overwrites.
-
Emacs keymap now covers the whole editor. It previously replaced the default bindings outright, leaving 139 actions with no key at all - no way to accept a completion, escape a terminal, select all, redo, comment, or use any LSP command. It now inherits the default map and keeps only its own overrides, adds the commands an Emacs user reaches for first (
C-x u/h/b/s/d,C-x C-w,C-r,M-;,M-/,M-./M-,,M-{/M-},M-TAB,C-n/C-pin the minibuffer, popups, menus and the file explorer), fixesM-<,M->andM-%, which never matched a key a terminal sends, and makesC-kkill to end of line rather than delete the whole line. -
The minibuffer and the menu honour their keybindings. The
promptandmenusections of a keymap were decorative - EmacsC-b/C-f/C-d/C-n/C-p/C-gin a prompt, andC-n/C-gin an open menu, did nothing however they were bound. -
Keybinding editor
- Deleting or editing a chord binding (such as Emacs
C-x C-s) no longer destroys it: delete now disables the chord it names, edit keeps the sequence instead of saving an unparseable binding, and removing one custom chord no longer drops the others sharing its action. - A rebound key is listed once, showing what it does under the active keymap, instead of also advertising the inherited binding it replaced.
- The context dropdown covers every context (
searchPrompt,dock,settings,compositeBuffer,fileExplorer), so bindings for those can be authored at all - and editing afileExplorerbinding no longer silently reassigns it toprompton save. The keymap dropdown listsmacos-gui.
- Deleting or editing a chord binding (such as Emacs
-
macOS binaries start on a Mac without Homebrew. The published
aarch64-apple-darwinbuild failed at launch withLibrary not loaded: /opt/homebrew/opt/xz/lib/liblzma.5.dylib; liblzma is now compiled into the binary on every target, and the Linux gnu builds shed the same external dependency.
Internals
- A large rewrite unifies mouse, wheel, and keyboard dispatch across the editor's chrome and panels behind one registration/dispatch model, and lays groundwork with a new backend-independent widget library crate; overlay indexing, plugin-state-snapshot, and Markdown-decoration performance work; flaky-test stabilization across settings, mouse, review-diff, and markdown suites.