A modern, full-featured terminal text editor, with zero configuration. Familiar keybindings, mouse support, and IDE-level features — no learning curve required.
Official Website  · Documentation  · Discord  · Contributing
Quick Install: Â curl https://raw.githubusercontent.com/sinelaw/fresh/refs/heads/master/scripts/install.sh | sh
Fresh brings the intuitive UX of VS Code and Sublime Text to the terminal. Standard keybindings, full mouse support, menus, and a command palette — everything works the way you'd expect, right out of the box. No modes, no memorizing shortcuts.
Built for real-world performance: Fresh handles multi-gigabyte files with negligible memory overhead and delivers consistently low-latency input, regardless of file size.
One shortcut to find files, run commands, switch buffers, and jump to any line.
Select and edit multiple occurrences simultaneously — the same workflow you know from graphical editors.
Browse and apply color themes instantly. Full settings UI and interactive keybinding editor included.
See more feature demos: Editing (search & replace, block selection, sort lines, ...) · Productivity (file explorer, split view, integrated terminal, ...) · Themes
| Category | Features |
|---|---|
| File Management | open/save/new/close, file explorer, tabs, auto-revert, git file finder |
| Editing | undo/redo, multi-cursor, block selection, smart indent, comments, clipboard |
| Search & Replace | incremental search, find in selection, query replace, git grep |
| Navigation | go to line/bracket, word movement, position history, bookmarks, error navigation |
| Views & Layout | split panes, line numbers, line wrap, backgrounds, markdown preview |
| Language Server (LSP) | go to definition, references, hover, code actions, rename, diagnostics, autocompletion |
| Productivity | command palette, menu bar, keyboard macros, git log, diagnostics panel |
| Extensibility | TypeScript plugins (sandboxed Deno), color highlighter, TODO highlighter, merge conflicts, path complete, keymaps |
| Internationalization | Multiple language support (see locales/), plugin translation system |
Quick install (autodetect best method):
curl https://raw.githubusercontent.com/sinelaw/fresh/refs/heads/master/scripts/install.sh | sh
Or, pick your preferred method:
| Platform | Method |
|---|---|
| macOS | brew |
| Bazzite/Bluefin/Aurora Linux | brew |
| Windows | winget |
| Arch Linux | AUR |
| Debian/Ubuntu | .deb |
| Fedora/RHEL | .rpm, Terra |
| FreeBSD | ports / pkg |
| Linux (any distro) | AppImage, Flatpak |
| All platforms | Pre-built binaries |
| npm | npm / npx |
| Rust users (Fast) | cargo-binstall |
| Rust users | crates.io |
| Nix | Nix flakes |
| Developers | From source |
On macOS and some linux distros (Bazzite/Bluefin/Aurora):
Note: On macOS, see macOS Terminal Tips for recommended terminal configuration.
brew tap sinelaw/fresh
brew install fresh-editorwinget install fresh-editorAlternatively, Windows users can use npm.
Arch Linux (AUR)
Binary package (recommended, faster install):
git clone https://aur.archlinux.org/fresh-editor-bin.git
cd fresh-editor-bin
makepkg --syncdeps --installBuild from source:
git clone https://aur.archlinux.org/fresh-editor.git
cd fresh-editor
makepkg --syncdeps --installUsing an AUR helper (such as yay or paru):
# Binary package (recommended, faster install)
yay -S fresh-editor-bin
# Or build from source
yay -S fresh-editorDownload and install the latest release:
curl -sL $(curl -s https://api.github.com/repos/sinelaw/fresh/releases/latest | grep "browser_download_url.*_$(dpkg --print-architecture)\.deb" | cut -d '"' -f 4) -o fresh-editor.deb && sudo dpkg -i fresh-editor.debOr download the .deb file manually from the releases page.
Download and install the latest release:
curl -sL $(curl -s https://api.github.com/repos/sinelaw/fresh/releases/latest | grep "browser_download_url.*\.$(uname -m)\.rpm" | cut -d '"' -f 4) -o fresh-editor.rpm && sudo rpm -U fresh-editor.rpmOr download the .rpm file manually from the releases page.
Download the .AppImage file from the releases page and run:
chmod +x fresh-editor-VERSION-x86_64.AppImage
./fresh-editor-VERSION-x86_64.AppImageFor faster startup (recommended): Extract the AppImage instead of running it directly. This avoids the FUSE mount overhead on each launch (~10x faster):
./fresh-editor-VERSION-x86_64.AppImage --appimage-extract
mkdir -p ~/.local/share/fresh-editor ~/.local/bin
mv squashfs-root/* ~/.local/share/fresh-editor/
ln -sf ~/.local/share/fresh-editor/usr/bin/fresh ~/.local/bin/freshEnsure ~/.local/bin is in your PATH. Available for x86_64 and aarch64 architectures.
Download the .flatpak bundle from the releases page and install:
flatpak install --user fresh-editor-VERSION-x86_64.flatpak
flatpak run io.github.sinelaw.freshSee flatpak/README.md for building from source.
Download the latest release for your platform from the releases page.
npm install -g @fresh-editor/fresh-editorOr try it without installing:
npx @fresh-editor/fresh-editorTo install the binary directly without compiling (much faster than crates.io):
First, install cargo-binstall if you haven't already
cargo install cargo-binstallThen install fresh
cargo binstall fresh-editorRun without installing:
nix run github:sinelaw/freshOr install to your profile:
nix profile add github:sinelaw/freshcargo install --locked fresh-editorgit clone https://github.com/sinelaw/fresh.git
cd fresh
cargo build --release
./target/release/fresh [file]- User Guide
- macOS Tips - Terminal configuration, keyboard shortcuts, and troubleshooting for Mac users
- Plugin Development
Thanks for contributing!
-
Reproduce Before Fixing: Always include a test case that reproduces the bug (fails) without the fix, and passes with the fix. This ensures the issue is verified and prevents future regressions.
-
E2E Tests for New Flows: Any new user flow or feature must include an end-to-end (e2e) test. E2E tests send keyboard/mouse events and examines the final rendered output, do not examine internal state.
-
No timeouts or time-sensitive tests: Use "semantic waiting" (waiting for specific state changes/events) instead of fixed timers to ensure test stability. Wait indefinitely, don't put timeouts inside tests (cargo nextest will timeout externally).
-
Test isolation: Tests should run in parallel. Use the internal clipboard mode in tests to isolate them from the host system and prevent flakiness in CI. Same for other external resources (temp files, etc. should all be isolated between tests, under a per-test temporary workdir).
-
Required Formatting: All code must be formatted with
cargo fmtbefore submission. PRs that fail formatting checks will not be merged. -
Cross-Platform Consistency: Avoid hard-coding newline or CRLF related logic, consider the buffer mode.
-
LSP: Ensure LSP interactions follow the correct lifecycle (e.g.,
didOpenmust always precede other requests to avoid server-side errors). Use the appropriate existing helpers for this pattern. -
Regenerate plugin types and schemas: After modifying the plugin API or config types:
- TypeScript definitions (
plugins/lib/fresh.d.ts): Auto-generated from Rust types with#[derive(TS)]. Run:cargo test -p fresh-plugin-runtime write_fresh_dts_file -- --ignored - JSON schemas (
plugins/config-schema.json,plugins/schemas/theme.schema.json): Auto-generated from Rust types with#[derive(JsonSchema)]. Run:./scripts/gen_schema.sh - Package schema (
plugins/schemas/package.schema.json): Manually maintained - edit directly when adding new language pack fields
- TypeScript definitions (
-
Type check plugins: Run
crates/fresh-editor/plugins/check-types.sh(requirestsc)
Tip: You can use tmux + send-keys + render-pane to script ad-hoc tests on the UI, for example when trying to reproduce an issue.
Fresh checks for new versions daily to notify you of available upgrades. Alongside this, it sends basic anonymous telemetry (version, OS/architecture, terminal type) to help understand usage patterns. No personal data or file contents are collected.
To disable both upgrade checks and telemetry, use --no-upgrade-check or set check_for_updates: false in your config.
Copyright (c) Noam Lewis
This project is licensed under the GNU General Public License v2.0 (GPL-2.0).