Neomacs
NEO Emacs: A GPU-powered Emacs written in Rust with a modern display engine. Aiming for modern design/multi-threaded Elisp, 10x performance and 100% Emacs compatibility. 🚀 Inline 4K images/4K videos/WPEWebKit using GPU acceleration, DMA-BUF, ZERO-COPY. Rich animation effects support.
Install / Use
/learn @eval-exec/NeomacsREADME
"I started Neomacs because I love Emacs, I respect Emacs, and I want to evolve the legendary Emacs into the ultimate modern powerhouse." — Eval Exec
<p align="center"> <img src="assets/banner.svg" alt="NEOMACS banner"/> </p> <p align="center"> <a href="#features"><img src="https://img.shields.io/badge/status-alpha-blueviolet?style=for-the-badge" alt="Status: Alpha"/></a> <a href="#building"><img src="https://img.shields.io/badge/rust-1.93.1-orange?style=for-the-badge&logo=rust" alt="Rust 1.93.1"/></a> <a href="#license"><img src="https://img.shields.io/badge/license-GPL--3.0-blue?style=for-the-badge" alt="License: GPL-3.0"/></a> </p>✨ "While other editors can save your files, only Emacs can save your soul." ✨
❤️ Sponsor Neomacs
Neomacs is a long-term project that takes significant ongoing work to build, test, and maintain. If you want to support its development, please consider sponsoring it on ❤️ GitHub Sponsors.
Note: Neomacs is in active alpha development. Expect rough edges, breaking changes, and missing features. Contributions and bug reports are very welcome!
Fork notice: Neomacs is a hard fork of GNU Emacs, forked from commit
705c0e3729. The changes are too invasive to ever be accepted upstream, so we did not preserve the original git history to keep the repository lightweight. If you need the full Emacs git history for reference, open an issue, and we can re-add it.
Why a fork, not from scratch? Neomacs aims for 100% compatibility with official GNU Emacs — every config, package, and workflow should just work. By forking, we keep the original Emacs C code as a reference and test oracle: we can verifying that each Rust rewrite produces identical behavior, ensuring nothing breaks as subsystems are replaced one by one.
The Problem
Emacs is a 40-year-old C codebase that hasn't kept up with modern hardware or software engineering:
- Display engine — ~50,000 lines of C in
xdisp.c, designed for text terminals in the 1980s. CPU-only rendering, no GPU acceleration, no native video/animations, no smooth visual effects- Large images — rendering slows down significantly
- Video playback — not natively supported
- Modern animations — no smooth cursor movement, buffer transitions, or visual effects
- Web content — limited browser integration
- GPU utilization — everything runs on CPU while your GPU sits idle
- Elisp performance — no inline caching, stop-the-world GC, dynamic dispatch overhead. Even with native-comp (AOT), Elisp lacks runtime JIT optimization, speculative inlining, and concurrent GC — leaving significant performance on the table
- Unsafe C codebase — ~300,000 lines of unsafe C with manual memory management, monolithic architecture (runtime and editor entangled), single-threaded design that prevents real concurrency
The Solution
Throw it all away and start fresh.
Neomacs is rewriting Emacs from the ground up in Rust — starting with the display engine and expanding to the core:
- GPU display engine (done) — ~4,000 lines of Rust replacing ~50,000 lines of legacy C, powered by wgpu (Vulkan/Metal/DX12/OpenGL)
- Rust layout engine (done) — bypasses
xdisp.centirely, reads buffer text via FFI and computes layout in Rust - Inline video/images/WebKit (done) — 4K video, GPU-decoded images, and WPE WebKit browser views embedded directly in buffers
- 21 scroll effects, 8 cursor modes, 10 buffer transitions (done) — GPU-accelerated animations running on the render thread at display refresh rate
- Zero-copy DMA-BUF (done) — efficient GPU texture sharing (Linux)
- Rewrite entire Emacs core in Rust (in progress) — replacing all ~300,000 lines of C with safe, modern Rust: Elisp runtime, evaluator, bytecode VM, GC, buffer/window/frame subsystems, and all editor internals
- True multi-threaded Elisp (planned) — real concurrency for the Lisp machine, not just cooperative threading
- 10x performance, and 100% Emacs compatibility. (planned) — Rust-optimized Lisp machine with JIT compilation and inline caching
Showcase
🎬 Neomacs youtube video
Animations (Cursor, Buffer Switch, Scroll)
https://github.com/user-attachments/assets/85b7ee7b-3f4a-4cd2-a84f-86a91d052f11
GPU Text with Rounded Box Faces
<img width="1868" alt="Round corner box face attribute" src="https://github.com/user-attachments/assets/65db32f0-8852-4091-bd99-d61f839e0c95" />Inline 4K Images
GPU-decoded directly — no CPU cost, won't block Emacs main thread.
<img width="1447" alt="Inline 4K images in Emacs buffer" src="https://github.com/user-attachments/assets/325719dc-dac4-4bd8-8fd9-e638450a489f" />Inline Web Browser (WPE WebKit)
GPU backend, DMA-BUF zero-copy.
<img width="1851" alt="Inline WPE WebKit browser in Emacs buffer" src="https://github.com/user-attachments/assets/10e833ca-34b2-4200-b368-09f7510f50d0" />Inline Terminal (Alacritty)
GPU-backed terminal emulator embedded in Emacs buffer.
<img width="1448" alt="Inline Alacritty terminal in Emacs buffer" src="https://github.com/user-attachments/assets/175ffd75-78b5-46c9-9562-61cfd705e358" />Inline 4K Video Playback
DMA-BUF zero-copy, GPU backend — no CPU cost.
https://github.com/user-attachments/assets/275c6d9a-fced-44f6-8f43-3bbd2984d672
Features
Working Now
| Feature | Description | |---------|-------------| | GPU Text Rendering | Hardware-accelerated text via wgpu (Vulkan/Metal/DX12/OpenGL) | | Video Playback | GStreamer + VA-API hardware decode with DMA-BUF zero-copy | | Cursor Animations | 8 modes with 7 movement styles and configurable spring trail | | Scroll Animations | 21 scroll effects with 5 easing functions | | Buffer Transitions | 10 buffer-switch effects (crossfade, slide, page-curl, etc.) | | DMA-BUF Zero-Copy | GPU-to-GPU texture sharing via Vulkan HAL (no CPU readback) | | Inline Images | GPU-accelerated image rendering in buffers | | Inline WebKit | WPE WebKit browser views embedded in buffers |
Animations
All animations run on the GPU render thread at display refresh rate, independent of the Emacs redisplay. Configure everything from Elisp.
Cursor
8 particle/visual modes (Neovide-inspired):
| Mode | Description |
|------|-------------|
| none | No animation, instant movement |
| smooth | Smooth interpolated movement (default) |
| railgun | Particles shoot backward from cursor |
| torpedo | Comet-like trail follows cursor |
| pixiedust | Sparkly particles scatter around cursor |
| sonicboom | Shockwave ring expands from cursor |
| ripple | Concentric rings emanate outward |
| wireframe | Animated outline glow |
7 movement styles controlling how the cursor interpolates between positions:
| Style | Description |
|-------|-------------|
| exponential | Smooth deceleration, no fixed duration (uses speed param) |
| spring | Critically-damped spring, Neovide-like feel (default) |
| ease-out-quad | Gentle deceleration curve |
| ease-out-cubic | Stronger deceleration curve |
| ease-out-expo | Sharp deceleration curve |
| ease-in-out-cubic | Smooth S-curve |
| linear | Constant speed |
The spring style also supports a 4-corner trail effect where leading corners snap ahead and trailing corners stretch behind, controlled by a trail-size parameter (0.0-1.0).
Buffer Switch (Crossfade/Transition)
10 buffer-switch effects triggered when the visible buffer changes:
| Effect | Description |
|--------|-------------|
| none | Instant switch |
| crossfade | Alpha blend between old and new (default) |
| slide-left/right/up/down | Directional slide transitions |
| scale-fade | Scale and fade |
| push | New buffer pushes old buffer out |
| blur | Blur transition |
| page-curl | 3D page-turning effect |
Scroll
21 scroll animation effects organized into categories:
| # | Effect | Category | Description |
|---|--------|----------|-------------|
| 0 | slide | 2D | Content slides in scroll direction (default) |
| 1 | crossfade | 2D | Alpha blend between old and new positions |
| 2 | scale-zoom | 2D | Destination zooms from 95% to 100% |
| 3 | fade-edges | 2D | Lines fade at viewport edges |
| 4 | cascade | 2D | Lines drop in with stagger delay |
| 5 | parallax | 2D | Layers scroll at different speeds |
| 6 | tilt | 3D | Subtle 3D perspective tilt |
| 7 | page-curl | 3D | Page turning effect |
| 8 | card-flip | 3D | Card flips around X-axis |
| 9 | cylinder-roll | 3D | Content wraps around cylinder |
| 10 | wobbly | Deformation | Jelly-like deformation |
| 11 | wave | Deformation | Sine-wave distortion |
| 12 | per-line-spring | Deformation | Each line springs independently |
| 13 | liquid | Deformation | Noise-based fluid distortion |
| 14 | motion-blur | Post-process | Vertical blur during scroll |
| 15 | chromatic-aberration | Post-process | RGB channel separation |
| 16 | ghost-trails | Post-process | Semi-transparent afterimages |
| 17 | color-temperature | Post-process | Warm/cool tint by direction |
| 18 | crt-scanlines | Post-process | Retro scanline overlay |
| 19 | depth-of-field | Post-process | Center sharp, edges dim |
| 20 | typewriter-reveal | Creative | Lines appear left-to-right |
5 scroll easing functions:
| # | Easing | Description |
|---|--------|-------------|
| 0 | ease-out-quad | Standard deceleration (default) |
| 1 | ease-out-cubic | Stronger deceleration |
| 2 | spring | Critically damped spring with overshoot |
| 3 | linear | Constant speed |
| 4 | `ease-in-out-

