Skip to content

Releases: sinelaw/fresh

fresh-editor 0.4.1

18 Jun 13:33
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.4.1

This is mostly a bug-fix release.

For live updates on Fresh, follow me on X.

Renamed features and clarified docs

This releases introduces new names (in docs, cli, etc) to clarify the ambiguously used word: "session". The new vocabulary:

  • daemon — the persistent background process you attach to and detach from.
  • workspace — the editor's per-project unit. Multiple workspaces are managed by the Orchestrator.
  • backend — where a workspace runs (local / SSH / dev container / Kubernetes).

The cli now supports --cmd daemon, but still accepts the now-deprecated --cmd session as an alias. The new vocabulary also reaches the user-facing surfaces of the editor: the Orchestrator now lists, dives into, and manages workspaces (commands, dialogs, dock chrome, and status messages), and the replace-in-project confirmation refers to files open "in this workspace". Localized strings were updated to match in every supported locale.

Features

  • New language support:
    • Assembly via asm-lsp (opt-in) — GAS and NASM/Intel across x86/x86_64/ARM/RISC-V, with an offer to generate .asm-lsp.toml from the detected dialect (#1964, requested by @viti95).
    • Fish highlighting and auto-indentation (#2272), by @asukaminato0721.
    • Smali highlighting (#2265), by @asukaminato0721.
    • yarn.lock and other well-known lock/config files now highlight by their real format (#2326, reported by @asukaminato0721).
  • Windows on ARM release artifacts (#784, requested by @teobugslayer; by @NihilDigit).
  • CancelMark / ClearMark actions for fine-grained selection-anchor management (#2371, by @masmu).
  • Git Log (Current File) command, plus concurrent git-blame buffers.

Improvements

  • Workspace trust & environments:
    • A single trust prompt for every project — folders with a shell environment (.envrc / mise / .tool-versions) no longer get the env-manager plugin's separate popup; the one prompt names the detected markers and activates on trust.
    • Environment detection is defined once in core and user-extensible (env.detectors, now also covering pipenv and poetry); the activated environment applies uniformly across every backend — integrated terminal, Docker, Kubernetes, SSH.
    • Hardening: plugins can request but never grant trust; a lone .venv no longer silently auto-trusts; venv activation uses a relative source .venv/bin/activate snippet to avoid shell injection (cf. CVE-2024-9287).
  • Settings: distinct, keyboard-reachable [Inherit] / [Reset] / [Clear] per field; the language entry dialog no longer clobbers inherited fields (#2345, reported by @ren-lv).
  • Orchestrator localization: the Orchestrator plugin is now fully internationalized — all 225 user-facing strings go through the editor's i18n mechanism, with translations for the 14 supported locales (cs, de, es, fr, it, ja, ko, pt-BR, ru, th, uk, vi, zh-CN, and en).
  • The Orchestrator New Workspace dialog has a clearer, keyboard-linear focus model (Tab accepts the highlighted completion).

Bug Fixes

  • vi-mode: delete/change/yank update the unnamed register (#2368, by @NihilDigit); the cursor moves one column left on leaving insert mode (#2349, by @ianyepan); % jumps to the matching bracket (#2346, by @ianyepan).
  • Theme inspector & plugin panels (#2321):
    • Opening the theme editor no longer breaks Orchestrator dock clicks/scrolling — plugin panels are scoped to their owning plugin.
    • Ctrl+Right-Click reports accurate theme keys for the status bar, tab bar, scrollbar, file explorer, menus, and dock, drawing above the dock.
    • The plugin bridge no longer corrupts integers larger than 32 bits (timestamps, byte offsets).
  • Java (jdtls) and other Eclipse LSP4J servers: features registered via client/registerCapability now work — their string JSON-RPC ids were misparsed as notifications and dropped (#2340, reported by @maxandersen).
  • LSP/plugin popups follow the active theme's popup_* colors instead of a hard-wired dark background (#2379, by @peanball).
  • Paste falls back to the internal clipboard and works again on Termux (#2343, reported by @nightshade427).
  • npm .cmd/.bat shims resolve on Windows, so npm-installed language servers spawn (#2324, reported by @SupertigerDev).
  • Occurrence highlighting uses a theme-appropriate background in every shipped theme (#2312).
  • Review Diff lists files inside untracked directories (#2315).
  • The embedded terminal forwards the wheel as a mouse report to mouse-tracking programs, so scrolling no longer cycles their history (#2366).
  • Replace toolbar: checked search options are visible in every theme (#2363).
  • Alt+W and other search toggles no longer leak into the close prompt (#2359).
  • Fixed a crash on a stale soft-wrap position in multi-byte text (#2320).
  • Trusting a workspace with a shell or virtualenv environment (.envrc / mise / .venv) no longer restarts the whole editor: other windows keep their running terminals, language servers, and Orchestrator dock; only the active window refreshes to pick up the new environment.
  • A file opened while a split is maximized — for example via an embedded fresh <file> forwarded from a maximized terminal dock — is now revealed instead of rendering hidden behind the maximized split (which previously looked like the terminal had hung).

Internals

  • Refactored the UI element rendering pipeline to make it easier to introduce alternative rendering frontends.

fresh-editor 0.4.0

10 Jun 18:15
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.4.0

For live updates on Fresh, follow me on X.

Features

  • Review Diff, reworked: a file sidebar with per-file status, change counts, and comment badges, grouped by directory; an in-panel side-by-side view that keeps the sidebar; a multi-line comments panel, with commenting available anywhere in the diff; a watch mode (W) that reloads the diff on save; reviewing a git stash; split/stack/auto layout toggles, a / file filter, and reworked keyboard navigation (Tab focus model, cross-file n/p).
  • Workspace trust & environments: a first-class, clickable {trust} element now leads the status bar; virtualenvs activate without a prompt, shell envs get a single combined trust-and-activate prompt, and env pills in the status bar are clickable. Changing the trust level resets only the active session instead of the whole editor.
  • Per-session backends: each session now owns its environment, trust level, and backend (local / SSH / Kubernetes / devcontainer). Remote sessions survive a restart and reconnect when activated; restored agent sessions re-run their agent instead of coming back as a blank terminal, and the New Session dialog gained an agent-command dropdown.
  • Terminal: send the selection (or current line) to the terminal (#1871, requested by @aquasync); Ctrl+Click or Ctrl+hover opens file paths from terminal output, including scrollback; the shell working directory is tracked via OSC 7.
  • Configurable indentation rules per language via [languages.<id>.indent], including VS Code-style regex rules. 14 indent-only tree-sitter grammars were replaced by these rules, shrinking the binary by ~18 MB.
  • GDScript language support (#2238, by @richiehowelll).
  • lsp_enabled master switch to disable all LSP features globally (#1770, requested by @XhstormR).
  • auto_read_only option to turn off automatic read-only mode for foreign files (#2048).
  • Occurrence highlighting toggle with configuration (#2154, by @masmu), and the current-line highlight now hides while text is selected (#2153, by @masmu).
  • Clear Search action and a plugin API exposing the active search state (#2152, by @masmu).
  • File Explorer slot override API for plugins: icons, status, and name color (#2241, by @Agrejus).
  • '+' new-tab button in the tab bar, with a New Terminal / New File popup.
  • A color-transition animation on theme switch, and a wave animation — available as a command and as an optional idle screensaver.

Improvements

  • Live Diff: word-level highlighting inside changed line pairs (#1949, requested by @masapu).
  • Status bar: configurable separator with dedicated theme keys; the default separator is now padding-only and the default left side leads with {trust}.
  • Orchestrator dock: seamless-tab look for the active session, a hover-only overlay scrollbar, a stable session order, keyboard-navigable project dropdown, and clicking an inactive worktree opens it without an extra confirmation.
  • File Explorer: natural-order filename sorting (#2073, requested by @mandolyte).
  • q closes the Keyboard Shortcuts and Fresh Manual viewers (#2165).
  • Undoing a format-on-save or trim rewrite keeps the view in place (#2027, requested by @SolarLune).

Bug Fixes

  • Windows: the TUI attaches to the parent process's stdio instead of failing in -gui builds (#2276, reported and fixed by @mokurin000 in #2277).
  • Right-side status bar elements render with configurable separators (#2088, reported and fixed by @PavelLoparev), and cursor column numbers are grapheme-correct (#2090, reported and fixed by @PavelLoparev).
  • Scroll panels compute focus offsets from the render width when a scrollbar is present (#2175, by @masmu).
  • Restored windows no longer show a blank editor pane from an orphaned split leaf (#2267).
  • Paste reaches Settings/dialog text fields instead of the buffer behind them, and buffer pastes work again after closing the dialog (#2246).
  • Tab bar scroll re-anchors after closing many tabs, keeping the surviving tab visible (#2229, reported by @dmknght).
  • LSP code actions now include diagnostics context, so diagnostic-based fixes appear (#2212).
  • Devcontainer CLI detection works when the CLI is installed via Bun on Windows (#2201, reported by @steve-price-immybot).
  • install.sh / AUR fresh-editor-bin packaging fixed (#2249, reported by @asukaminato0721; #2250, reported by @bandrefilipe).
  • Focusing a restored terminal tab activates terminal mode.

fresh-editor 0.3.12

04 Jun 22:09
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.12

For live updates on Fresh, follow me on X.

Features

  • Orchestrator Dock: a persistent, non-modal left-column session switcher. Alt+O toggles focus; arrows live-switch the active session. Each row shows status (working/idle), project, branch, git summary, and a PR badge. Project dropdown, card/compact view toggle, and a Manage button for the Orchestrator dialog.

  • Create SSH sessions from within the UI: You could already open a remote host from the cli, now you can do it via the Orchestrator: New dialog - it has a type selector (Local / SSH, and experimental Kubernetes / Devcontainer). Like the cli invocation - SSH attaches a full remote session:filesystem, LSP, process spawners, and a terminal on the remote host; switching retargets without a restart.

  • Kubernetes sessions (initial, experimental): connect over kubectl exec to any cluster, with a keepalive heartbeat and reconnect.

  • Go to LSP Symbol: a symbol finder with live preview, a precise jump to the symbol name (line and column), source-line snippets, and preselection of the symbol under the cursor (#1886, by @PavelLoparev).

  • Terminal tab auto-naming: tabs follow the foreground process and OSC title. Setting editor.terminal_auto_title (on by default).

  • Open file from a diff: in the side-by-side and review-diff views, Enter opens the working-tree file (NEW pane) or the read-only HEAD version (OLD pane) at that line.

  • Rainbow bracket colorization for matching brackets across the viewport (#1088, by @asukaminato0721).

  • Minimal static Linux binary release artifact (musl, x86_64 and aarch64) optimized for a small binary size.

Improvements

  • variable.builtin syntax category for this / self / super (#2150, by @masmu).
  • storage.type keywords highlight as keywords rather than types (#2151, by @masmu).
  • Async clipboard paste: paste no longer blocks the editor, and a hung X11/Wayland clipboard owner should no longer freeze it (#2155, reported by @EtienneMaire37)
  • Nested fresh launches ($EDITOR, git commit) inside Fresh's terminal open in the parent editor instead of a second editor; falls back to inline if the parent is unreachable.
  • Python indentation: Enter after return / pass / raise / break / continue dedents out of the block, and an extra indent level after a statement inside a block is fixed (#2192, reported by @WorldChallenge1).
  • Terminal scrollback survives resize, clear, and alternate-screen programs; the scroll-back view soft-wraps long lines.
  • SSH remote editing is documented in fresh --help.

Bug Fixes

  • Inlay hints participate in line wrapping and horizontal scroll (#2190, reported by @TakemiSora).
  • LSP capabilities: dynamic client/registerCapability is now applied, and workspace/configuration and the diagnostic / inlay-hint / semantic-token refresh capabilities are advertised, so more servers pull config and re-pull stale results.
  • No crash on a malformed mouse input sequence (#2234).
  • Failed SSH/Kubernetes connects show their error instead of corrupting the screen.
  • Fixed stuck keyboard input after using a session terminal and then opening a file (#2237, #2234).
  • Fixed a client/server freeze when copying a large terminal-scrollback selection.
  • File Explorer no longer re-roots the wrong window when previewing a restored session.
  • Every session is archivable and deletable, including the launch session and the last window.
  • The dock's working/idle indicator tracks the right session and idles when output stops.
  • A worktree session in a repo with no commits reports git's real error.
  • Text-input fields in dialogs focus on click (#2234).
  • Diff "removed" lines no longer wrap one character per row at narrow widths, or when a language overrides the wrap column to 0 (#2177, reported by @biscuitvicious).
  • LSP hover popups no longer appear while the LSP status popup is open (#2244, reported by @biscuitvicious).
  • editor.scroll_offset is respected (#2162, reported and fixed by @PavelLoparev).
  • Windows: long paths middle-truncate, and short-name / \\?\ path differences no longer reorder the dock.
  • Fixed a marker-tree corruption that could drop edits to markers and highlights.

fresh-editor 0.3.10

28 May 20:52
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.10

A lot of work on bug fixes and polish in this release.

Improvements

  • Live Grep: previews highlight all matches and center on the match in wrapped documents; keyboard nav re-reveals the selection after a wheel scroll; prompt text is readable on all themes (new suggestion_fg theme key) and toolbar labels readable on light themes.
  • The Workspace Trust prompt and the env-manager plugin's commands and status messages are now localized across all 14 supported languages (#2158).
  • Session model reworked: one session per directory, windows.json dropped (sessions are discovered from the per-dir workspace cache), only the foreground window is materialized at startup with the rest lazy-restored, and the base session is no longer magic — it can be deleted like any other.
  • Orchestrator picker hides empty / single-file sessions by default, with a toggle to show them (#2137).
  • The Live Grep => Quickfix (persisted) list is now a Finder dock panel instead of a bespoke buffer: Enter navigates to the match, the dock stays open when jumping, and live_grep_export_quickfix is bound by default (#2124).

Bug Fixes

  • Mouse-wheel scrolling fixed in File Explorer, Live Grep, and Git Log panels (#2119, reported by @brunnerh in #2107).
  • Search highlights no longer grow over adjacent typing (#2053, reported by @mandolyte) and stale matches now clear after edits inside a match (#2133).
  • Search / Replace: panel no longer gets stuck on "Searching…" with zero matches; Search and Replace in Current File now works for unnamed buffers and for files outside the workspace root (#2112).
  • LSP: diagnostics now display in Markdown compose/preview mode (#2146); workspace/configuration is answered per-server instead of with a fixed rust-analyzer blob; newly configured servers default to auto_start = true.
  • Diagnostics panel q / a / r shortcuts work again instead of tripping "Editing disabled" (#2125).
  • Review Diff: Discard hunk now succeeds for files with an unterminated final line (#2117).
  • Macro replay is now a single undo unit instead of per-char (#2062).
  • Submenus align so the first item is inline with the selected parent item (#2118, reported by @RandomGHUser).
  • File Explorer: Ctrl+O works and keeps focus on the opened buffer.
  • Settings: text fields commit and advance focus on Enter; Ctrl+U clears the prompt.
  • Gutter no longer eats text width in non-compose mode when line numbers are off.
  • Windows: the Microsoft Store pwsh App Execution Alias is skipped when opening a terminal (#2077, reported by @ket000), with an opt-out flag.
  • Session working trees stored under the data dir are now editable.

fresh-editor 0.3.9

26 May 14:08
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.9

Features

Universal Search (multi-scope Live Grep)

Live Grep grows into a universal search overlay: search across multiple scopes — project files, open Buffers, and Terminals scrollback — with Word and Regex search modes (each keybindable). The overlay gets a clickable widget toolbar (focusable provider button, toggle controls), a full-width header band, and inline status shown in the overlay itself. Closed-terminal scrollback is retained so it stays searchable (#2099).

Orchestrator & git worktrees

  • Attach sessions to existing git worktrees and discover them automatically (#2095).
  • Multi-select bulk actions, worktree ordering, and a Show all worktrees filter toggle.
  • Draggable scrollbars on the picker lists, with bulk-pane reorder.

Editor

  • Move to Next / Previous Paragraph actions, including translations (#2084, contributed by @PavelLoparev; requested in #2083).

Language Support

  • C3 (.c3) syntax highlighting and LSP (#2101, requested by @data-man).

Plugins & API

  • New getWorkingDataDir() (per-working-dir data root) and getTerminalDir() plugin APIs.
  • Overlay toolbar widget APIs — clickable Toggle/Button controls, toggleOverlayToolbarWidget, and a Row { wrap } layout that reflows toolbars across lines.

Improvements

  • The dashboard no longer opens automatically on startup by default. To re-enable it, open Settings, select Plugin: dashboard, and turn on AutoOpen ("Show the dashboard automatically when Fresh starts with no real files open."). The dashboard remains available any time via the Show Dashboard command.
  • Homebrew install simplified now that fresh-editor is in homebrew-core — brew install fresh-editor, no tap step.

Bug Fixes

  • Plugin getCursorLine() now returns the real cursor line instead of 0 (#2076, reported by @pmburov).
  • Reduced serial-console lag by not repainting on non-visual plugin async events (#2100, reported by @jetpax).
  • Custom theme colours no longer silently ignored for many UI fields (#2080, contributed by @flexiondotorg; reported in #2079).
  • PageDown/PageUp no longer overshoot on a single soft-wrapped line (#2085).
  • Workspace restore no longer mixes tabs from multiple projects in one window (#2056, reported by @mandolyte).
  • Live Grep: Resume keeps the query and opens the selected result; overlay preview and input-box undo/redo corrected; Buffers scope finds unmodified open buffers; non-file-scope previews and read-only data-dir files fixed.
  • getKeybindingLabel resolves correctly for bound plugin actions.

Internal

  • Major window refactor: window-scoped save/restore (Window::from_workspace), WindowId-parameterized persistence, working_dir derived from the active window, and open_file/LSP/watch helpers moved onto Window.
  • Orchestrator bring-up characterization tests and fixtures across persistence layouts.
  • Serial-console lag benchmark/diagnostic scripts; theme-key resolver schema-drift guard.
  • Internal docs excluded from the public docs build.

fresh-editor 0.3.8

21 May 12:55
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.8

Features / Improvements

Remote Development

  • LSP over SSH now runs the language server on the remote host

Orchestrator

  • The Open dialog is now scoped to the current project by default, with a visible scope toggle to reach other projects, a tabular picker, and / to filter.
  • New windows open atomically with their terminal (no [No Name] placeholder), and terminal output shows immediately.

Settings UI

A broad pass on the Settings editor: number fields now accept direct typing instead of [-]/[+] spinners; list editing gets inline [+] Add new / [x] rows, mouse support, and Del to remove; Ctrl+R resets a field to its default; the focused field's description is shown above the dialog buttons; and confirmations are required before deleting or discarding dirty edits.

Editor

  • Next / Previous Window commands to cycle open windows without the Switch-Project picker (#2031).
  • Move File Explorer to Other Side command, persisted to config (#1468, requested by @asukaminato0721).
  • Templ (.templ) syntax highlighting (#463, requested by @TS22082).
  • New editor.confirm_quit setting (default off) to prompt before quitting a clean session.

Plugins & API

  • Built-in editor.httpFetch(url, path) for downloading files — curl is no longer bundled.
  • "Install from URL" accepts direct file:// URLs.

Bug Fixes

  • Quit binding overrides honored (#2030): binding Ctrl+Q to noop/none now actually disables it in every context.
  • Terminals: line-number gutter and current-line highlight no longer leak on terminal exit; scroll-back viewport anchors correctly; Shift+Tab is forwarded to the child as ESC[Z (#2029).
  • File explorer keeps keyboard focus when leaving a live terminal (#2029).
  • Closed terminals no longer reappear, and buffer groups stay visible when a split closes (#2027, reported by @SolarLune).
  • Git Log: selected commit stays aligned with the cursor; selection follows scrolling and row clicks.
  • Adjacent tab indicators no longer double up (#1997, reported by @brunnerh).
  • Theming / Live Diff: light-theme dim fixes, markdown popup body text inherits the terminal fg, and diff lines preserve syntax foreground.
  • Tree-sitter .scm query files are included in the Nix source filter, fixing a source-build failure (#2055, reported by @melekbadreddine).

Preview work (will be enabled in next release)

Environment Managers (venv / direnv / mise)

New built-in environment-manager plugin: it detects a project's environment manager — .venv/venv, .envrc (direnv), or mise.toml/.tool-versions — and, via Env: Activate, injects that environment into every editor-spawned process (LSP, formatters, terminals, spawnProcess). Env: Use System (Deactivate) restores the system environment, and Env: Show Status reports the current state. Activation is on-demand (not automatic) and respects Workspace Trust. Adds an opt-in env status-bar element.

Workspace Trust (groundwork)

Foundational Workspace Trust support — a per-project trust level (persisted in the project state dir), a Set Workspace Trust Level command-palette control, and a workspaceTrustLevel() plugin API. The enforcement gate is off by default this release (no prompt on open; undecided folders are treated as Trusted) while the trust UX is reworked around sandboxed execution — so there is no behavior change unless you set a trust level yourself.

fresh-editor 0.3.7

18 May 08:59
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.7

Introduces an experimental multi-window orchestrator command (Alt+Q) - a UI that manages multiple Fresh windows side by side in a single Fresh process.

Features / Improvements

Orchestrator (early experiment)

The new orchestrator command (Alt+Q) lets one Fresh process juggle several independent windows — switch between sessions, open new ones from a project path / branch, or visit one in a separate Fresh process. This is an early experiment; expect rough edges. Please share your ideas and bug reports!

Search and Replace

Made an effort to improve the search & replace command, tackling several issues:

  • All Files scope toggle + dedicated current-file command.
  • Editor shortcuts (Ctrl+P etc.) pass through the panel.
  • Proper empty / searching / no-results states.
  • Large result sets stay responsive — incremental tree, throttled streaming, capped per-iteration work.

Git Log / Review Diff

  • Performance: Per-commit diffs stream into file-backed buffers with full syntax highlighting, per-line add/delete backgrounds, working scrollbar, and Fold by File / Fold by Hunk commands. Now opens the famous "rewrite bun in rust" commit instantly!
  • Open file at commit (#1962): jump from a diff line in the review-branch detail panel to the file at that commit (read-only, q to go back).

File Explorer

  • Compact directories (#1406, thanks @Nandaleio!): a directory containing a single child directory renders inline as com.example.name, VSCode/IntelliJ-style. On by default; toggle with file_explorer.compact_directories.
  • Configurable tree indicators (#1940, reported by @MicTheSquid): expand/collapse glyphs themable via File Explorer → Tree Indicator Expanded / Collapsed in the Settings UI.

Plugins & API

  • git_statusbar plugin + status-bar token registration API (thanks @PavelLoparev!): show the current git branch in the status bar; plugins register their own tokens via editor.registerStatusBarElement. Add via Settings → Editor → Status Bar → Left / Right.
  • tab_actions plugin (#1844, thanks @PavelLoparev!): close all / to-the-left / to-the-right and move tabs within the current split.
  • Plugins can register their own config items: a new typed registration API lets plugins declare settings that appear in the Settings UI alongside built-in ones (sorted at the bottom of the category list), so users can toggle plugin behaviour from the same place as everything else. The bundled vi_mode plugin uses it to expose an autoStart option.

Editing & Widgets

  • Add Cursors to Line Ends (#1870, reported by @aquasync): places a cursor at the end of every line in the selection.
  • Widget text inputs gain real selection rendering, Shift+arrow / Ctrl+Shift+arrow extension, and Ctrl+C/V/X/A — used by Search & Replace and plugin dialogs.
  • Floating completion popup on widget Text inputs.

Live Diff

  • Word-level underline highlights on deletion lines; similarity threshold and size caps are runtime-tunable, so large diffs render as modified lines rather than paired add/remove blocks.

Bug Fixes

  • init.ts setAutoOpen(false) ignored: dashboard auto-open is now driven by the ready hook so user init.ts runs first.

Git Log / Review Diff

  • Detail panel PageUp / PageDown (action name was wrong); scrollbar now functional on the streamed buffer.

File Explorer

  • UI / navigation shortcuts (#1903): Ctrl+P and friends are no longer swallowed when the file explorer has focus.
  • Switch Project double-click (#1931, reported by @SolarLune): double-clicking a directory navigates into it instead of dismissing the dialog.

Plugins

  • Plugin init scaffold (#1986, @PavelLoparev): new plugins now generate fresh.entry (the current entry-point name) instead of stale fresh.main.
  • Idle CPU from git plugins (#2009, #2012): git_statusbar and merge_conflict no longer spawn idle subprocesses; git_statusbar is driven off watchPath(.git/HEAD).

Editing

  • Smart Home with multiple cursors: now runs for every cursor, not only the primary.
  • Soft wrap at trailing space (#1363, reported by @dragonfyre13): when a trailing space would overflow the wrap column, wrap backs up one word instead of breaking mid-token.
  • Horizontal scroll-to-view on long lines (#1873): the viewport now follows the cursor on long lines.

Live Diff

  • Wrapped overlay backgrounds now extend across every visual row of a wrapped line.

Rendering

  • Highlighter cache preserved across bulk edits (#1958): large pastes and replace-all no longer trigger a whole-file reparse.
  • Phantom cursor offscreen (#1965): a buffer cursor scrolled past the viewport no longer leaves a stray block at the screen edge.
  • Split separator background (#1963): separator cells now paint with editor_bg so split borders blend with the panes.
  • Next / Prev Split un-maximizes (#1961): navigating to another split un-maximizes first.
  • Stable cursor-position indicator (#1967): Ln L, Col C no longer jitters as the column count grows.
  • PTY terminal background now fills the render rect with the editor bg.
  • Nostalgia theme (#1890, reported by @NGRIT41): terminal-pane blue now covers full pane.
  • Column rulers suppressed on virtual buffers (dashboard, PTY panes, etc.).

Misc

  • No more stray .fresh/ directory in your working dir (#1991): orchestrator/cross-restart state now lives under data_dir instead of being dropped next to your project files.
  • Buffer "library path" detection (#1970, reported by @FF-AntiK): only .cargo/registry and .cargo/git are treated as Cargo library paths — local .cargo/config.toml etc. are no longer flagged.
  • Julia grammar (#1852, reported by @goszlanyi): the adjoint operator (') no longer flips the rest of the line into string mode.
  • move_word_end / select_word_end labels (#1878, reported by @sour-dani): translated in all locales.

fresh-editor 0.3.6

14 May 08:01
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.6

This version includes a major internal refactoring to support multiple windows in a single Fresh process. The work will be used to add a multi-window orchestrator in a future version.

Features

  • Go to line with selection (#1764, thanks @PavelLoparev!): New action extends the selection from cursor to target line. Supports absolute and relative (+10) jumps.

  • File explorer "follow active buffer" (#1569, #1803, thanks @ko3n1g!): New file_explorer.follow_active_buffer setting (default off). When on, switching tabs expands and highlights the corresponding file without stealing focus.

  • Live Diff: Near-identical lines now render as modified lines, with new words decorated as underline (instead of two separate add/remove rows). Deletion virtual lines get gutter markers. Fixed live diff colors in terminal theme.

  • Auto-start vi_mode (#1086, reported by @jmcblane): Vi mode plugin now exposes toggle / enable / disable so init.ts can flip vi mode at startup. Add this to your init.ts to enable: editor.getPluginApi("vi-mode")?.enable();.

In the future I plan to add a way for plugins to register custom config sections in the Settings UI, and then enabling vi-mode auto-start will be available through the UI.

Improvements

  • openSUSE install instructions (#1897, thanks @ilmanzo!) added to the README.

  • Quick Open ranking: Matches at the start of a path segment now beat arbitrary substring hits — ts surfaces tsconfig.json and tsc/... before random .ts files.

  • Search & Replace no longer freezes on result sets in the thousands.

  • Rust code actions (#1915): rust-analyzer now returns WorkspaceEdit-based assists like "Fill struct fields" instead of "No code actions available" — Fresh wasn't advertising the capability.

  • Status-bar indicator menus: Clicking another indicator's icon dismisses the currently-open menu instead of stacking a second one on top.

  • LSP-Servers popup is extensible: Plugins (starting with the bundled rust-lsp) can contribute their own rows.

  • terminal built-in theme (#1914): Diff backgrounds no longer collide with syntax foregrounds, so keywords on deletion lines and strings on addition lines stay readable on terminals (e.g. xfce-terminal) where each ANSI palette index renders identically for fg and bg.

  • Dashboard matches the editor background and no longer slides in.

  • AppImage install script has error handling and a /tmp fallback so it no longer silently fails when the target directory isn't writable.

Bug Fixes

  • Crash on startup from a corrupt workspace (#1939, reported by @zdooder): Restoring a session whose persisted split pointed at a buffer no longer in the buffer map crashed in render.rs. The active-buffer pointer is now validated and falls back to a live buffer if it's stale.

  • Completion popup + multicursor (#1901, reported by @dtwilliamson): Typing a word character or Backspace while the popup was open only edited the primary cursor — secondary cursors silently went out of sync after the first keystroke. Accepting a completion now also applies at every cursor.

  • LSP indicator click (#1941): Bugs fixed: plugin popup stacked under the built-in one; plugin popup ignored the active theme's popup_bg; state stayed stale after the LSP process was killed externally; "Disable LSP" didn't actually stop the running server; repeated clicks stacked further popups.

  • Scrollbar theme overrides (#1554, reported by @klonuo): User themes setting ui.scrollbar_track_fg, ui.scrollbar_track_hover_fg, or ui.scrollbar_thumb_hover_fg had their overrides silently dropped.

  • Utility dock routing (#1932): Ctrl+P → filename now opens the file in the editor area instead of inside the bottom dock when the dock has focus. The split tab-bar button now maximizes the split you clicked, not the active one.

  • Tab drag: Dropping a tab onto a fresh split (e.g. a Search & Replace result row) no longer panics on the next keystroke.

  • File explorer: A directory whose .gitignore filters out all its contents (e.g. build/ with * inside) stays visible when expanded.

  • Live Diff visual-line motion: Down/Up no longer freezes when traversing a deletion block that starts with a blank line.

  • S-Tab plugin bindings now register correctly (terminals deliver Shift+Tab as BackTab).

fresh-editor 0.3.5

06 May 11:35
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.5

Improvements

  • Live Grep overlay polish: Surrounding editor is now visibly dimmed; shortcut hints and the active provider moved into a toolbar row with plainer labels; match cap raised from 100 to 1000 (with a 1000+ matches indicator); provider errors render as a disabled result entry instead of a silent "0 matches"; ripgrep provider renamed to rg.

Bug Fixes

  • Live Grep on Windows returned no results: git grep outputs \r\n; splitting on \n left a trailing \r that broke the result regex. Split on \r?\n instead.

  • Plain grep provider was broken: --column is a ripgrep-only flag and was being passed unconditionally. Removed.

Under the Hood

  • Plugin API: setPromptTitle takes styled segments ({ text, style? }[]) instead of a single string, so plugins control hint colouring directly instead of the renderer guessing structure from punctuation.

fresh-editor 0.3.4

06 May 06:12
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.3.4

Features

  • Smaller release binaries: (#1860, contributed by @PanAchy) Updated release profile (lto=fat, codegen-units=1, opt-level=z) shrinks binary size before stripping from 62 MB to 46 MB (-26%). Backtraces are still included in panics.

  • Live Grep floating overlay + Utility Dock (#1796): Live Grep now opens as a centered floating overlay with results on the left and a real-buffer file preview on the right (full syntax highlighting, gutter, soft-wrap). Esc returns you to your prior layout exactly. Resume (Alt+r) reopens the last query with cached results. Export to Quickfix (Alt+M) sends results into a dockable list.

  • New Utility Dock at the workspace root hosts the terminal (Alt+`), Quickfix, Diagnostics, and Find References — they share one pane spanning the full width instead of nesting under whichever split was focused.

  • Pluggable Live Grep providers: Built-in chain is now ripgrep → git-grep (default in repos) → grep, with ag / ack available via plugin registration. Alt+P cycles to the next available provider; the active one shows in the overlay's title bar. Plugins can register custom backends via editor.getPluginApi("live-grep").

  • Settings tree-view: The left category list is now an expandable tree — categories with multiple sections show chevrons, expanding reveals jumpable section rows, and the tree cursor follows scrolling so you can see where you are in the body. Section jumps snap to the top of the section. Toggle controls render as a chip-style [ ✓ ACTIVE ] indicator.

  • HDL language support (#1528, reported by @bqinTT): Syntax highlighting for Verilog (.v left mapped to vlang for compatibility, .vh/.verilog), SystemVerilog (.sv/.svh/.svi/.svp), and VHDL (.vhd/.vhdl/.vho). svls wired as the default LSP for Verilog/SystemVerilog (opt-in per project).

  • New terminal built-in theme (#1457, #1798, reported by @AmethystGosling169 and @BrettKinny): Colors come from your terminal's own palette instead of hard-coded RGB — backgrounds use Default so transparency and your terminal's background show through; accents use ANSI named colors that remap to whatever your terminal colorscheme defines. Selection uses reverse-video so it inverts whatever colors are already on screen.

  • Theme inheritance with extends: User themes can now extends: "builtin://light" (or dark / high-contrast / nostalgia / terminal) and layer overrides on top — the same model VSCode/Helix/Sublime/Zed use. With no extends, an explicit editor.bg triggers luminance-based auto-inference (bright bg → light base, dim → dark), so partial light themes no longer end up with dark UI chrome (#1281, reported by @nico2004444).

  • File explorer context-menu additions (#1576, reported by @RandomGHUser): Duplicate (creates name copy[.ext] next to the source, multi-select supported), Copy Full Path and Copy Relative Path (newline-joined for multi-select). The new entries don't appear on the project root.

  • Distribute clipboard across cursors (#1057, reported by @graphixillusion): With N cursors and an N-line clipboard, paste now gives each cursor one line in top-to-bottom order — VSCode / Notepad++ "column-mode paste" semantics. A block-selected copy/paste round-trip preserves its rectangular shape. Behavior is unchanged when counts don't match.

  • Discard option in quit prompt (#1839, reported by @turkishmaid): With hot_exit on (the default), the unsaved-changes prompt now offers "(d)iscard and quit" so accidental edits no longer require disabling hot_exit globally to throw away. Picking "save" on quit also chains a Save As prompt for each dirty unnamed buffer instead of silently dropping it.

  • Project name in window title (#1793, reported by @dAnjou): Title is now <file> — <project> — Fresh so multiple Fresh sessions in different projects are distinguishable in your taskbar/window list.

  • Cursor-jump animation toggle (#1788): New editor.cursor_jump_animation setting lets you keep ambient animations (tab slides, dashboard) while disabling just the cursor-jump trail. The master editor.animations setting still wins.

Improvements

  • Search & Replace across project no longer hangs on large binary files (#1342, reported by @dragonfyre13): Hardcoded extension fast-path skips known-binary files (compiled artifacts, archives, media, ML weights, fonts) before any I/O. Per-file size cap and stronger header sniff (PNG, ZIP-based archives like .pth, ELF) catch the formats whose first bytes can look text-like.

  • POSIX ACL writability (#1765, reported by @cherouize): A file granted write access via setfacl -m u:NAME:rw is no longer reported read-only — Fresh now asks the kernel via faccessat(W_OK) instead of walking inode mode bits, so ACLs, capabilities, and read-only mounts are all honored.

  • LSP status popup doesn't auto-show: Auto-popping on first file open stole focus and swallowed keystrokes for users who hadn't asked to enable LSP. The LSP indicator is now a manual click target; its Off state (configured but not running) is rendered with a more prominent attention-grabbing color so discoverability isn't lost.

  • Hover popup no longer flickers on mouse moves (#692) inside the editor (gutter, end-of-line, between words). It only dismisses when the mouse leaves the editor area entirely. New hover responses replace the existing popup instead of stacking.

  • Multi-cursor Ctrl-D after substring search (#1697, reported by @dtwilliamson): When the cursor is inside an active search match, "Add cursor at next match" selects the next search match instead of expanding to the surrounding word.

  • JavaScript syntax highlighting (#899, reported by @comesuccingfuccsloot): Routed through tree-sitter, so template literals containing arrow functions or ${expr} no longer leak @string styling across the rest of the file.

  • Smarter auto-indent for Lua / Ruby / Bash / Pascal: Tree-sitter indents.scm is now the single source of truth for keyword-delimited languages, so ( opening a function call no longer gets treated as a block-opening delimiter.

  • Enter at column 0 doesn't push the line right anymore (#1425, reported by @goszlanyi): Auto-indent now detects "cursor at column 0 of a non-empty line" and inserts a bare newline. Closing-delimiter lines still get the established indent-before-close behavior.

  • Live Diff virtual lines soft-wrap (#1787) instead of being truncated at the right edge.

  • Per-workspace hot-exit recovery (#1550, reported by @goszlanyi): Standalone-mode recovery files are now scoped per working directory. Quitting Fresh in folder B no longer wipes folder A's recovered unnamed-buffer state.

  • Terminal PTY resyncs on tab reveal (#1795): Resizing the host while a terminal was hidden behind another tab now correctly forwards SIGWINCH when you switch back — $COLUMNS / stty size stay accurate.

  • Open File dialog scrolls correctly on small terminals (#245): Selection no longer slides past the bottom of the visible list.

  • Keybinding editor scrollbar responds to mouse (#1593, reported by @Kodiak-01): Click and drag both work; wheel scrolls the viewport instead of moving the selection (so a scrollbar drag isn't undone by the next wheel tick).

  • Settings Number controls (#1825, e.g. Tab Size): Tab now commits and exits the input; clicking the value cell enters edit mode (matches Enter).

  • Plugin keybinding labels refresh on every prompt open so plugins surfacing key hints ("Alt+P to cycle", overlay headers, etc.) reflect mid-session rebinds without restart.

  • New plugin hook after_file_explorer_change fires on FS-mutating explorer actions (Duplicate, Paste, New File, Rename, Delete) so plugins like git_explorer can refresh badges immediately.

  • Theme picker consistency: The Theme Editor plugin's picker now shows the same set of themes as the native Select Theme prompt — no more divergence from a separate cwd/themes scan or normalization mismatches. New plugin API editor.getAllThemes() returns the cached map directly so plugins can drop their own filesystem walks.

Bug Fixes

  • Crash fixes: Option::unwrap() panic when pasting in the Theme Editor (event apply used the wrong split). DeleteBackward panics on stale cursor state in vi-mode count prefixes and plugin action batches. Theme editor crash on the new terminal theme's modifier fields. Embedded-plugin extraction race across concurrent test processes.

  • Search (#1537, reported by @pstahle): Find Selection Next/Previous on a non-word character (e.g. } after goto-matching-bracket) no longer hijacks the search query — it now navigates the existing search instead.

  • OpenLine (Emacs C-o): Cursor stays on the original line instead of advancing — was previously indistinguishable from Enter.

  • Markdown compose (#1789, #1790): Wrap budget widened by one column to prevent orphan-word re-wrapping on Windows; current-line highlight now extends across soft-wrapped sub-rows.

  • Viewport (#1794): Popup anchoring counts true visual rows under wrap, so completion popups appear next to the cursor instead of several rows above in heavily-wrapped buffers.

Under the Hood

  • Build performance: oxc and rquickjs now build at opt-level=3 in dev/test profiles to keep iteration fast despite their size.

  • Semantic test framework + ~250 migrated cases: A new "scenario" test layer dispatches Actions straight against an isolated editor instance, skipping plugin loading where the assertion surface (buffer text + caret) can't observe it — about 440 ms saved per test harness. ~250 e2e claims have been migrated across multicursor, block selection, auto-indent, paste, undo/redo, search-modal flows, m...

Read more