Show HN: Fresh – A new terminal editor built in Rust
sinelaw.github.io40 points by _sinelaw_ 5 hours ago
40 points by _sinelaw_ 5 hours ago
I built Fresh to challenge the status quo that terminal editing must require a steep learning curve or endless configuration. My goal was to create a fast, resource-efficient TUI editor with the usability and features of a modern GUI editor (like a command palette, mouse support, and LSP integration).
Core Philosophy:
- Ease-of-Use: Fundamentally non-modal. Prioritizes standard keybindings and a minimal learning curve.
- Efficiency: Uses a lazy-loading piece tree to avoid loading huge files into RAM - reads only what's needed for user interactions. Coded in Rust.
- Extensibility: Uses TypeScript (via Deno) for plugins, making it accessible to a large developer base.
The Performance Challenge:
I focused on resource consumption and speed with large file support as a core feature. I did a quick benchmark loading a 2GB log file with ANSI color codes. Here is the comparison against other popular editors:
- Fresh: Load Time: *~600ms* | Memory: *~36 MB*
- Neovim: Load Time: ~6.5 seconds | Memory: ~2 GB
- Emacs: Load Time: ~10 seconds | Memory: ~2 GB
- VS Code: Load Time: ~20 seconds | Memory: OOM Killed (~4.3 GB available)
(Only Fresh rendered the ansi colors.)Development process:
I embraced Claude Code and made an effort to get good mileage out of it. I gave it strong specific directions, especially in architecture / code structure / UX-sensitive areas. It required constant supervision and re-alignment, especially in the performance critical areas. Added very extensive tests (compared to my normal standards) to keep it aligned as the code grows. Especially, focused on end-to-end testing where I could easily enforce a specific behavior or user flow.
Fresh is an open-source project (GPL-2) seeking early adopters. You're welcome to send feedback, feature requests, and bug reports.
Website: https://sinelaw.github.io/fresh/
GitHub Repository: https://github.com/sinelaw/fresh
Shameless plug: I did a series a couple years back, before AI was this huge, about writing a Vim-like editor in Rust, in case you want to play with it in the future: https://www.youtube.com/playlist?list=PL9KpW-9Hl_het1V3_dLhG... I'm a little annoyed that for a Rust based tool the recommended installation command is to use npm. Why? Is Cargo not good enough? Cargo seems exceptionally well to me. I get the frustration, but I think the npm option actually makes sense here. A lot of users who’d benefit from a fast Rust tool aren’t Rust developers and won’t have Cargo installed. Shipping it through npm lowers the barrier while still giving everyone the performance benefits. It’s not a knock on Cargo, just a way to make the tool more accessible. Given the fairly shoddy security story with NPM, I genuinely don't understand the hesitation to publish a binary and have a README instruction to curl/wget it into `/usr/local/bin` or `~/.local/bin`. If it's going through NPM that publishing step has to be done already, unless the NPM build is pulling down rust to compile it all as a native extension. Eventually it'd wangle it's way into homebrew or the unstable branch of another package registry. But that's me, because I really dislike installing binaries via a language's package manager, because they don't get updated unless I frequently run the upgrade commands for each package manager. That (security ) is something I also worry about. I'd like to get off npm if only for this reason. It's a hack to get started. The other thing it gives you is the ability to easily upgrade and uninstall so just a script to copy stuff is not on par. Thing is… who is regularly running `npm update` or `cargo update` to keep local software up to date? I wouldn’t, because I might be in a repo and it starts upgrading all my local dependencies, and I’m not gonna add a text editor as a dev dependency. I’ll happily take the binary, or a tar.gz with the binary in it, though. (Btw I love how it’s following the old DOS aesthetic) The npm distribution here is just the binary, you run npm install again and it upgrades to the latest binary. That's convenient I did it because not everybody has cargo installed. I'm using cargo-dist to create this npm package. I've been wanting a generic package manager for a while that is cross-platform. I wonder how one could find funding for such a project. Thinking about users from various OS' installing tools and software from your niche package manager, yeah that bad boy is going to grind to a halt if you have no key funding. Artifactory exists. It's not hard to store packages and metadata somewhere. I tried it, I like it a lot, but I did find an issue straight away. I'm on MacOS and I have remapped the fn and command keys so it can be more like Windows (I can't undo 20+ years of muscle memory, and also I just don't wanna) Anyway, Fresh seems to ignore the remapping - it's back to the command key for copy/paste and the command palette. Is there a way to access the dropdown menus by keyboard? I can see F underlined for File but no modifier key seems to make it happen I'll need to look into this, not sure what remapping does to the incoming key events. Also I'm already working on a ui for customizing the key bindings so you could do whatever you wanted. (Currently managed by undocumented json) Thanks for reporting! > Efficiency: Uses a lazy-loading piece tree to avoid loading huge files into RAM I once started writing a text editor on Linux, and first went down a similar route: a piece table over a mmap()'d file. But I abandoned using mmap, because Linux file systems typically don't have mandatory locking enabled, so you can't be sure that the file data won't be modified by another program. (Then I got bogged down in Unicode handling... so 95% of the code became just about that, and I tired of it) I considered using mmap to help manage the caching but what if your file is hosted on S3 or whatever? (Something I'm planning to support eventually) So I opted for explicit management of chunks, also gives me more control and consistent cross platform behavior. Thanks for this cool project ! I was desperate to find more modern terminal editors with CUA mode. There is micro which is already good, but I wanted something more and hope your editor will fill that space. I hate to be that guy, but did you know about Fresh, Deno's official frontend framework ? [1] If your app wasn't using Deno for extensibility it wouldn't be such a problem but since it is, I think it's gonna make searching for both harder. I took a look--it seems like you can pass a path on the command-line to open to. Can you pass a line number, also?
fcoury - 32 minutes ago
giancarlostoro - 2 hours ago
Barathkanna - an hour ago
ljm - an hour ago
_sinelaw_ - an hour ago
ljm - 34 minutes ago
_sinelaw_ - 24 minutes ago
_sinelaw_ - 2 hours ago
giancarlostoro - an hour ago
venturecruelty - 15 minutes ago
arkensaw - an hour ago
_sinelaw_ - an hour ago
Findecanor - an hour ago
_sinelaw_ - an hour ago
az09mugen - an hour ago
simlevesque - 2 hours ago
ericb - 2 hours ago