Zedha is a personal-first, public-compatible downstream distribution of Zed.
It follows a VSCodium-style model: this repository does not vendor Zed source. It pins an upstream Zed stable release, fetches that source, applies a small ordered patch set, and packages the result.
| Upstream pin | upstream/stable.json (verified against flake.lock) |
| Published builds | Native Nix package for x86_64 Linux; unsigned and not notarized Apple Silicon DMGs |
| Updates | Homebrew-managed on macOS; no in-app update feed |
| Intel Macs | No published DMG yet |
Native code signing, notarization, and an in-app update feed are deferred until Apple Developer credentials are in place. Merged upstream upgrades publish a new DMG, and the Homebrew tap picks it up automatically.
Zedha publishes a native Nix package for x86_64-linux. CI builds the package
and uploads it to the public zedha.cachix.org binary cache; other Linux
architectures and non-Nix package formats are not currently supported.
For a direct smoke test:
nix build github:rnretirwtsohg/zedha#zedha --accept-flake-config
./result/bin/zedhaFor declarative installation, add Zedha as an input and use its package for the host system:
{
inputs.zedha.url = "github:rnretirwtsohg/zedha";
# In a NixOS or Home Manager module with inputs and pkgs in scope:
home.packages = [ inputs.zedha.packages.${pkgs.system}.zedha ];
}Keep Zedha's own Nixpkgs input: zedha.cachix.org only carries builds against
Zedha's lock, so inputs.nixpkgs.follows compiles Zed locally after every host
Nixpkgs update. Zedha loads the host's graphics driver, so its glibc and
libstdc++ must be at least as new as the host's. The daily upgrade workflow
advances Zedha's Nixpkgs whenever nixpkgs-unstable ships a newer glibc or
libstdc++, and at least every 14 days. Upstream Zed's Nix package follows that
same input.
Trust https://zedha.cachix.org with the public key stored in
nix/zedha-cachix-public-key when configuring the cache outside this flake.
The flake's own nixConfig supplies both values when
--accept-flake-config is used.
Official Zed remains installed separately as zed; Zedha is launched with
zedha. Their configuration namespaces are also separate:
~/.config/zed and ~/.config/zedha. Shared settings or keymaps can be
managed declaratively by linking the same tracked files into both locations.
Homebrew is recommended because it installs subsequent Zedha releases through
the normal brew upgrade flow:
brew install --cask rnretirwtsohg/zedha/zedhaTo install manually instead:
-
Download
Zedha-aarch64.dmgfrom the latest GitHub Release. -
Open the DMG and drag Zedha into Applications.
-
First launch will be blocked by Gatekeeper because the build is unsigned. Either:
-
Right-click Zedha.app → Open → Open, or
-
Clear the quarantine flag:
xattr -dr com.apple.quarantine /Applications/Zedha.app
-
-
Optional CLI: in Zedha, use the built-in Install CLI action. That creates
/usr/local/bin/zedha. You can also invoke the packaged binary directly:/Applications/Zedha.app/Contents/MacOS/cli
Each release publishes a SHA-256 for the DMG. After downloading:
shasum -a 256 ~/Downloads/Zedha-aarch64.dmgCompare the output to the checksum in the release notes. They must match exactly.
App name: Zedha
CLI command: zedha
Bundle ID: me.ghostwriternr.Zedha
URL scheme: zedha://
Zedha also carries a terminal-launcher patch from the personal Zed fork: launcher sessions can create, reuse, and close terminal tabs by session id.
Official Zed remains a separate product and install.
- Product identity is Zedha (name, CLI, bundle ID, URL scheme).
- Includes the terminal launcher behavior described above.
- Does not use Zed’s official update feed.
- Public DMGs are unsigned until signing infrastructure exists.
Zed is developed by Zed Industries. Zedha is an independent downstream distribution and is not affiliated with, endorsed by, or supported by Zed Industries.
- Upstream source and license: https://github.com/zed-industries/zed
- This repository owns the upstream pin, downstream patches, and packaging.
Requirements: macOS, a working Rust toolchain, and the usual Zed native dependencies.
# Script / identity regression tests (no full Zed compile)
./tests/test-scripts.sh
# Fetch the pinned upstream into .work/zed
./scripts/fetch-upstream
# Apply patches/ in order
./scripts/apply-patches
# Confirm product identity on the patched tree
./scripts/check-identity
# Targeted validation (includes terminal launcher tests when configured)
./scripts/test
# Produce a local Apple Silicon DMG under artifacts/
./scripts/build-macos-artifact .work/zed aarch64-apple-darwinTo point fetch-upstream at an existing local Zed checkout:
ZEDHA_UPSTREAM_REPO=~/github/zed ./scripts/fetch-upstreamupstream/stable.json pinned upstream Zed stable release
patches/*.patch ordered downstream patches
scripts/fetch-upstream clone pinned upstream source
scripts/apply-patches apply patches to a Zed checkout
scripts/check-identity verify patched Zedha product identity
scripts/check-nix-pin verify stable.json and flake.lock agree
scripts/sync-nix-pin synchronize the locked official Zed input
scripts/update-upstream-pin detect newer strict stable upstream tags
scripts/update-nixpkgs advance Nixpkgs on runtime drift or age
scripts/release-metadata derive release identity from the upstream pin
scripts/build-macos-artifact build a macOS DMG into artifacts/
scripts/test run targeted validation
nix/zedha.nix native Linux package override
nix/check-package.nix built Linux package identity assertions
nix/zedha-cachix-public-key public binary-cache signing key
tests/test-scripts.sh script behavior tests
.github/workflows/build-linux.yml build and publish the Linux package
.github/workflows/build-macos.yml build and publish the macOS release
.github/workflows/upgrade-upstream.yml opens upgrade PRs for new stables
.github/workflows/advance-nixpkgs.yml opens Nixpkgs advance PRs
Current patches:
0001-terminal-launcher.patch terminal launcher behavior
0002-brand-as-zedha.patch product and distribution identity
0003-brand-linux-as-zedha.patch Linux CLI and desktop identity
A scheduled workflow checks for newer upstream vMAJOR.MINOR.PATCH tags,
updates both upstream/stable.json and the official Zed revision in
flake.lock, and refreshes one rolling upgrade pull request. GitHub merges it
automatically only after the launcher tests, Linux package, identity checks,
and a complete macOS DMG build pass. Failed patch or build gates leave main
untouched and open or update one blocker issue. A successful merge publishes
the Apple Silicon DMG; the Homebrew tap checks for new releases hourly and
updates its cask.
A second scheduled workflow runs scripts/update-nixpkgs and refreshes its own
rolling pull request when nixpkgs-unstable carries a newer glibc or libstdc++
or the locked revision is older than 14 days. It merges after the launcher
tests and Linux package pass, and has its own blocker issue, so a blocked Zed
upgrade does not hold Nixpkgs back.
| Symptom | What to do |
|---|---|
| “Zedha is damaged and can’t be opened” / blocked on first launch | Expected for unsigned builds. Right-click → Open, or run xattr -dr com.apple.quarantine /Applications/Zedha.app. |
zedha: command not found |
Open Zedha and use Install CLI, or call /Applications/Zedha.app/Contents/MacOS/cli directly. |
| No in-app update notifications | Expected. Run brew upgrade --cask zedha; the tap tracks published Zedha releases. |
| Need an Intel Mac build | Not published yet. Build locally with the appropriate target, or wait. |
| Bug that also happens in upstream Zed | Report it to zed-industries/zed. Zedha-only issues belong in this repo. |
Upstream Zed’s license terms apply to the Zed source. Downstream patches and packaging in this repository are provided as-is for a personal-first, public-compatible distribution.