Important
Remove this line to confirm you've reviewed this PR before submitting.
A customized code editor forked from Zed, focused on mobile development workflows, deeper git tooling, in-editor code review, and theme customization.
Lathe is a personal fork of Zed. I maintain it so I can ship small editor tweaks for my own workflow without waiting on upstream review, and without needing each change to fit Zed's product scope. Upstream Zed is the primary project - this fork tracks it closely and layers on my own changes.
Platforms: macOS (Apple Silicon), Linux (x86_64), and Windows (x86_64; experimental).
Stability: Lathe is maintained for my own daily use. Upstream syncs can occasionally introduce breakage; bug reports are welcome.
Ordered by how much each one differentiates Lathe from stock Zed. Upstream already ships a commit graph, a tabbed git panel, and worktree support; the git section below covers what Lathe adds on top of those rather than restating them.
- Mobile development - Expo and bare React Native panel
- Merge conflicts and interactive rebase - conflict resolution tab, full-file split view, drag-and-drop rebase
- Pull request reviews - GitHub and Bitbucket Cloud, in-editor
- AI agent integration - multi-account sign-in, approval control
- Theme and syntax highlighting - custom theme, live 135+ color customizer
- Git additions - explorer tab, branch tree, undo, Git Flow
- AWS profiles - per-window profile selector
- Terminal, windows, and workspaces - awaiting-input indicator, workspace groups, per-window zoom
Lathe ships a first-class Mobile panel that auto-detects the kind of mobile project you open (Expo or bare React Native) and surfaces only the workflows that apply to it. For bare React Native projects it reads the project's own package scripts and the run hints in its README, offers iOS scheme and Android variant dropdowns that feed those scripts, and installs Android builds reliably with gradlew :app:install<Variant> plus an adb launch (sidestepping the React Native CLI's flavored-APK bug). Long-running processes (Metro, builds, and any script you start) open as interactive terminal tabs with their own scrollback. The panel can also create an Android emulator (AVD) for you without Android Studio, shows a live device list with per-app logcat, drives one-click debug build & run and EAS cloud builds, and installs the whole Android toolchain (JDK 17 plus the Android SDK, licenses accepted) into a Lathe-managed directory. On macOS it covers iOS as well. A drop-in .zed/tasks.json template and a full setup walkthrough live in docs/mobile-development.md.
Both toolchain sections report their own state, so a missing JDK or an unaccepted SDK licence is visible before a build fails rather than after. The action row follows the platform you're targeting: an iOS project offers Boot simulator and Install pods, while an Android one swaps in adb reverse and builds against whichever emulator or device is selected.
When a merge, rebase, cherry-pick, revert, pull, or stash pop stops on conflicts, a notification names the conflicted files and offers Resolve, which opens a tab listing every conflicted file beside the merge editor for the selected one. Resolve a whole file as ours or theirs, stage files as you finish them, and abort or continue the operation from the same header without dropping to a terminal. The same tab is reachable any time from the git panel's Conflicts section or git: resolve conflicts.
Resolve conflicts with Take ours / Take theirs / Take both per conflict, or step through them with previous/next navigation. A Split view toggle switches between per-conflict cards and full-file panes. The split view shows each side as a complete file (every conflict region replaced by that side's kept content), scrolls both panes in lockstep, and highlights the selected conflict across them. "Edit manually" drops you into the buffer when the buttons aren't enough.
The interactive rebase modal supports drag-and-drop reordering of commits and per-row pick / squash / edit / drop actions inline. Dragging a commit or branch onto another in the commit graph shows a confirmation modal with a preview of what the rebase will do before anything runs.
A pull request panel with browser-based auth for GitHub and Bitbucket Cloud: browse PRs, read and leave review comments, see reviewers, and approve or request changes without leaving the editor. Verdict buttons toggle, so clicking Approve again retracts your approval. A separate section lists PRs you authored, with reviewer roll-ups showing where each one stands. Still being polished; the panel button can be hidden via pull_request_panel.button.
Sign in to multiple subscription accounts for the external agents in the Agent Panel (Claude Code, Codex, Gemini) and switch between them from the panel's account chip. Account selection is per-workspace, so a work project and a personal project can each stay on their own identity. An approval selector picks each agent's approval / sandbox level; the level is applied when the agent process spawns, so changes take effect on the next thread. Agents with their own native approval control keep it and skip the selector.
Manage AI Accounts lists every account for each agent alongside its connection status, lets you nominate a default per agent, and can import existing logins from claude-account-switcher. Individual workspaces bind their own account per agent via ai_accounts in .zed/settings.json.
Lathe ships with its own default theme and a refined syntax highlighting palette applied across all supported languages. The theme is tuned for long coding sessions: balanced contrast, distinct-but-not-loud accent colors for keywords, strings, and types, and deliberate choices for diagnostic and git-status colors so the editor stays readable when things go wrong.
A built-in panel for editing all 135+ theme colors, including syntax token colors, with HSLA sliders and live preview. Includes category filters, Lathe-specific color badges, and per-color reset. Open via the command palette: theme customizer: Open.
Zed already ships the commit graph, the tabbed git panel, and worktree support. Everything below is what Lathe layers on top.
Lathe adds a third Explorer tab to the git panel, alongside upstream's Changes and History. It lists branches, worktrees, and stashes for the repository in one filterable tree, and renders Local and Remote branches as a collapsible folder tree that splits names on /. So feature/auth/login and feature/auth/signup collapse under a single feature/auth/ folder you can fold or expand. Folders show counts of contained branches and remember their open/closed state per section. Local branches that exist on the remote get an on-remote indicator. When the filter input is active the tree flattens so filter results stay legible. A multi-repo strip keeps every repository in the workspace one click away, with fetch-all and pull-all actions, plus any external repositories pinned via repository_dashboard_pinned_repos.
Branch resets, deletes, renames, and tag creation record an undo entry, and the resulting toast offers a one-click Undo. Discards stash defensively first, so they can be restored too. Up to 50 entries are kept per repository.
Start and finish feature, release, and hotfix branches from the command palette. Finishing merges with --no-ff into the right target, tags releases and hotfixes, merges back into develop, and deletes the local branch. Failures surface as errors rather than half-completing silently.
git flow: Start Feature/git flow: Finish Featuregit flow: Start Release/git flow: Finish Releasegit flow: Start Hotfix/git flow: Finish Hotfix
From any commit in the history view or graph, create a new branch off that revision without first checking out. Useful for forking experimental work off a specific point.
Check out any commit SHA from the history view into detached HEAD. For inspecting old state without losing your current branch position. Local repositories only for now; collab projects bail with a clear error.
Creating a worktree from a remote branch fetches the latest origin state first, so the new worktree starts from the current remote tip instead of a stale local ref.
Open the full commit history of a single file from the project panel and browse how it changed over time.
Tabs and project panel entries are color-coded by git status: modified, created, deleted, conflict, error, and warning states each get distinct colors.
Expand any file row in the Changes list to see its individual hunks and stage or unstage them one at a time, without opening a diff view.
The status bar shows the active repository's branch with its push/pull state. A separate git activity panel (docked bottom by default) shows in-flight git commands live, so long fetches and clones aren't invisible.
A status-bar AWS profile selector, scoped per window, so two windows can target different accounts at once. Everything Lathe spawns (terminals, tasks) inherits the selected AWS_PROFILE. The menu shows only profiles you've used in this workspace, with the rest behind Show All Profiles, and it polls SSO session status so an expired login is visible before a command fails. A project-local .aws/config takes over from the global one when present. The whole selector stays hidden unless the machine actually has AWS profiles configured.
The same menu creates a new SSO profile through a wizard, opens the AWS config file for editing, appends a credential_process wrapper profile for tooling that still expects SDK v2 credentials, and deactivates the current selection.
Shows a return icon in the terminal tab and title bar when Claude Code or other interactive prompts are waiting for input, with the tooltip distinguishing a general prompt, a confirmation, and a multiple-choice selection.
Terminal tabs get a subtle green background when active, making them easy to spot among editor tabs.
Switching to a terminal tab via ctrl+tab properly activates the cursor without needing to click into the terminal.
Save the set of currently open projects as a named workspace group, then reopen the whole group in a new window later. Each group can optionally be bound to a saved collab account, so opening the group automatically switches to that account first. Groups can also be written to a portable .lathe-workspace file that travels with the project.
Commands (via the command palette):
workspace groups: Save Workspace Groupworkspace groups: Open Workspace Groupworkspace groups: Update Current Workspace Groupworkspace groups: Rename Current Workspace Groupworkspace groups: Bind Workspace Group Accountworkspace groups: Unbind Workspace Group Account
Cmd +, Cmd -, and Cmd 0 adjust the buffer and UI font size of only the active Lathe window, so two windows side-by-side can be zoomed independently. The "Reset Zoom" menu action and Cmd +scroll-wheel (when mouse-wheel zoom is enabled) also stay scoped to the focused window. The persisted variants (the menu's … (persisted) items) still write to settings.json and apply globally.
Sign into more than one Zed Cloud account and switch between them from the avatar menu. Saved accounts are listed under Accounts by their GitHub username, with Add Account… and Sign Out actions.
When generating a shareable collab link, a dialog lets you pick which saved account to link from, which helps when you work across personal and work Zed Cloud accounts.
brew tap paterschris/tap
brew install --cask latheDownload the latest release from Releases:
- macOS: Download the
.dmg, open it, and drag Lathe.app to/Applications. A.zipis also available if you prefer. macOS builds are code-signed and notarized by Apple. - Linux: Download the
.tar.gzand extract it, or use the install script after building from source (see below). Like upstream Zed, the editor needs the host's ALSA runtime (libasound2on Debian/Ubuntu,alsa-libon Fedora/Arch) and working Vulkan drivers; both are preinstalled on typical desktop distros. - Windows: Download the x86_64 setup
.exeor.zip. Windows builds are currently unsigned; see Installing on Windows.
The setup .exe is the simplest option. Because Lathe's Windows builds are unsigned, Microsoft Defender SmartScreen may show a warning. Select More info, verify that the file came from the Lathe GitHub release, then select Run anyway.
For the portable path, download the x86_64 .zip, open PowerShell in a Lathe source checkout, and run:
script/install-fork-windows.ps1 -ArchivePath C:\path\to\Lathe-version-x86_64-windows.zipThe install script removes Mark-of-the-Web from the extracted files, installs Lathe under %LOCALAPPDATA%\Programs\Lathe, adds its CLI to your user PATH, and creates a Start Menu shortcut. If Lathe installs but no window appears, run script/diag-windows.ps1 from the source checkout and include its output in a bug report.
macOS:
git clone git@github.com:paterschris/lathe.git
cd lathe
script/build-fork # ~10-15 min first time
script/install-fork # copies to /ApplicationsLinux:
git clone git@github.com:paterschris/lathe.git
cd lathe
script/build-fork-linux # installs system deps, builds
script/package-fork-linux # creates .tar.gz
script/install-fork-linux # installs to ~/.local/share/lathe, symlinks CLI to ~/.local/binWindows:
git clone https://github.com/paterschris/lathe.git
cd lathe
script/build-fork-windows.ps1 -Architecture x86_64
script/package-fork-windows.ps1 -Architecture x86_64
script/install-fork-windows.ps1Installs as Lathe and runs alongside stock Zed without conflicts.
To run the build without installing to /Applications, launch the bundle directly:
open target/release/bundle/osx/Lathe.appLathe ships on two channels:
- Stable — tagged
vX.Y.Z, the recommended build for daily use. - Beta — tagged
vX.Y.Z-beta, published as GitHub prereleases with a distinct app icon. Beta builds typically contain the latest upstream Zed sync before it's rolled into stable.
Homebrew installs stable by default. To try a beta, grab the -beta asset from Releases.
brew upgrade lathegit pull
script/build-fork
script/install-forkgit pull
script/build-fork-linux
script/package-fork-linux
script/install-fork-linuxLathe periodically merges from upstream Zed to stay current with new features and fixes. Custom changes are kept in separate commits to make merges straightforward.
Last synced with upstream Zed: 2026-07-14.
2026-04-24:
mainwas rewritten to fix a long-standing ancestry tangle that made the fork display as ~37k commits ahead and ~37k behind upstream. The new history is 9 thematic commits on top ofupstream/main, and the source tree is unchanged. Original SHAs are preserved on thearchive/pre-rebuild-20260424branch. Existing clones can recover with:git fetch origin git reset --hard origin/main
Lathe inherits its licensing from upstream Zed:
- The application is licensed under the GNU Affero General Public License v3.0.
gpuiand several foundational crates are licensed under the GNU General Public License v3.0.- Other components are licensed under the Apache License 2.0.
All upstream license terms are preserved. See the individual LICENSE-* files at the repo root.
Lathe is primarily a personal fork, but I want to preserve the open-source feel of Zed. If you hit a bug, want a tweak, or have an idea that fits the spirit of the fork, feel free to open an issue or PR. See CONTRIBUTING.md for the inherited Zed guidelines; Lathe-specific conventions live in CLAUDE.md and .rules.
script/release-forkBuilds, packages, and publishes a GitHub release. Requires the GitHub CLI.
- First builds take significantly longer than incremental rebuilds
- On macOS, the app shares settings and extensions with stock Zed (
~/Library/Application Support/Zed) - On Linux, the app installs to
~/.local/share/lathewith the CLI symlinked to~/.local/bin/lathe cargo-bundleis installed automatically from zed-industries/cargo-bundle









