Nova Helix Fork

September 5, 2026 ยท View on GitHub

This fork tracks Helix's Steel-enabled line. Native changes are limited to capabilities unavailable to Steel; editor behavior belongs in Steel plugins when its APIs can satisfy the contract.

packages.<system>.yazelix_helix_steel installs the isolated yazelix/bridge-actions.scm and yazelix/bridge.scm modules. The bridge validates helix.open_files and helix.open_directory payloads before opening files or a directory picker in the current instance. The managed workspace and picker root remain distinct.

The yazelix/transport built-in module provides the native mechanism Steel cannot own safely. (transport-start token handler) binds an OS-assigned 127.0.0.1 port, (transport-local-addr server) returns that endpoint, and (transport-stop! server) interrupts any active connection and joins the listener. Each connection carries one newline-terminated schema-2 JSON request and response, limited to 64 KiB and authenticated before handoff to the Steel handler on Helix's editor thread. The handler receives only request_id, action, and payload; instance selection, token and endpoint publication, registry state, and managed-session policy remain outside this fork. (yzx-helix-start token) composes that transport with the Steel action handler and returns the caller-owned server object.

Steel plugin integration notes record the plugin APIs that worked and the lifecycle gaps that kept the transport in Rust.

The Yazelix Steel Bridge workflow runs one read-only Ubuntu job on main branch pushes or manual dispatch. It checks lockfile-consistent Steel-enabled compilation, native transport behavior, filesystem-backed Steel composition, optional-feature compilation, and formatting. Superseded runs are cancelled, the job has a 30-minute timeout, and it publishes no artifacts or grammar cache.

The standalone flake pins Nixpkgs at f830e6112b, the upstream change that uses crates.io's static CDN. Nova consumers make this input follow Nova's root Nixpkgs instead.

Grammar source delivery

HELIX-GRAMMAR-SOURCES-001: Nix evaluation and packaged grammar builds do not contact Codeberg. languages.toml owns grammar URLs, revisions, and subpaths; grammar-sources/<revision>.tar.gz contains each selected Codeberg source tree, unmodified, with its upstream license notices. hashes.json records the original Nix source NAR hashes. A fixed-output derivation unpacks and verifies each local archive at build time. Other hosts retain the upstream fetch path, and standalone hx --grammar fetch retains upstream behavior.

The nine archives occupy 1,020,213 bytes compressed. They contain third-party sources, not maintained parser changes, and are excluded from the Rust source build. This replaces evaluation-time Codeberg Git fetches from upstream Steel baseline 5a8635be; fixed-output network fetchers alone would still require a working Codeberg server on a cold build.

When changing a Codeberg revision, fetch the exact upstream Git tree, archive it under a single source/ directory, and record nix hash path for that tree in grammar-sources/hashes.json. Preserve every file and executable bit, including licenses, and remove snapshots no longer referenced by languages.toml. Use deterministic archive metadata (zero timestamps and numeric owners). A missing snapshot fails evaluation instead of falling back to the network. These local snapshots can be removed when upstream provides an immutable source bundle that satisfies the same contract.

Run nix build .#checks.x86_64-linux.codeberg_grammars (or nix build .#checks.aarch64-darwin.codeberg_grammars on macOS). The check rejects Codeberg network fetches during evaluation and compiles every selected Codeberg grammar through the production builder, including grammars with source subpaths. Nova runs this check in its existing Linux and Darwin jobs.

Downstream LOC Scorecard

Measured against upstream Steel tip 5a8635be and excluding documentation:

SurfaceAddedRemovedNet
Config-directory runtime seam190+19
CLI completions124+8
Nix package export10+1
Steel bridge actions150+15
Steel request composition390+39
Steel plugin package60+6
Steel integration test680+68
Native transport seam3840+384
Native transport tests1670+167
Focused CI workflow470+47
Steel component layering16150+111
Pinned grammar source delivery and check381+37
Total95755+902

The source-delivery row includes 11 JSON manifest lines. The nine compressed third-party source archives are counted separately above, not as owned LOC.

Upstream Helix README

Helix

Build status GitHub Release Documentation GitHub contributors Matrix Space

Screenshot

A Kakoune / Neovim inspired editor, written in Rust.

The editing model is very heavily based on Kakoune; during development I found myself agreeing with most of Kakoune's design decisions.

For more information, see the website or documentation.

All shortcuts/keymaps can be found in the documentation on the website.

Troubleshooting

Features

  • Vim-like modal editing
  • Multiple selections
  • Built-in language server support
  • Smart, incremental syntax highlighting and code editing via tree-sitter

Although it's primarily a terminal-based editor, I am interested in exploring a custom renderer (similar to Emacs) using wgpu.

Note: Only certain languages have indentation definitions at the moment. Check runtime/queries/<lang>/ for indents.scm.

Installation

Installation documentation.

Packaging status

Contributing

Contributing guidelines can be found here.

Getting help

Your question might already be answered on the FAQ.

Discuss the project on the community Matrix Space (make sure to join #helix-editor:matrix.org if you're on a client that doesn't support Matrix Spaces yet).

Credits

Thanks to @jakenvac for designing the logo!