Skip to main content

Start

Installation

System requirements, submodule clone instructions, build profiles, artifact paths, macOS code signing, and environment setup for building Land from source.

Land is source-build only. There are no public signed installer packages. Building from source is the single supported path today. The build is a two-step linear flow: compile the VS Code Editor submodule, then build the Land application with the chosen profile.


System Requirements 💻

RequirementMinimumNotes
Operating systemmacOS 12+Primary platform. Windows and Linux in progress.
Rust1.95.0 (MSRV)Install via rustup.rs. Edition 2024.
Node.js24Required for VS Code source step. Use nvm.
pnpmLatest stablenpm install -g pnpm. Used for workspace installs.
GitAny recentGit LFS required: git lfs install.
Disk space~10 GBVS Code source (~2 GB), Rust build cache (~4 GB), Node modules (~2 GB), build artifacts (~1 GB).
RAM8 GB minimum16 GB recommended for parallel Rust compilation.

The workspace Rust toolchain is pinned in Land/rust-toolchain.toml and must not be upgraded without auditing 51 [patch.crates-io] redirects in Cargo.toml that are version-sensitive.


Prerequisites Installation 📦

# Install the Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Install Node.js 24 via nvm
nvm install 24 && nvm use 24

# Install pnpm globally
npm install -g pnpm

# Skip large test binaries (not needed for compilation)
echo 'export ELECTRON_SKIP_BINARY_DOWNLOAD=1' >> ~/.zshrc
echo 'export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1' >> ~/.zshrc
source ~/.zshrc

Note

Node.js 24 is required specifically for the VS Code Editor submodule compilation. Earlier versions produce build failures in npm install.


Repository Clone 📥

Warning

Never run git clone --recurse-submodules. Submodules are on independent branches. Recursive cloning pulls the wrong commits.

Each element is a separate Git repository cloned into Element/<Name>/ inside the Land repository root. Clone the main repo first, then each element individually on the Current branch.

git clone https://github.com/CodeEditorLand/Land.git
cd Land

Element Repository Table

ElementRepositoryPath in Land repo
Commongithub.com/CodeEditorLand/CommonElement/Common
Echogithub.com/CodeEditorLand/EchoElement/Echo
Vinegithub.com/CodeEditorLand/VineElement/Vine
Mountaingithub.com/CodeEditorLand/MountainElement/Mountain
Cocoongithub.com/CodeEditorLand/CocoonElement/Cocoon
Windgithub.com/CodeEditorLand/WindElement/Wind
Skygithub.com/CodeEditorLand/SkyElement/Sky
Outputgithub.com/CodeEditorLand/OutputElement/Output
Restgithub.com/CodeEditorLand/RestElement/Rest
Workergithub.com/CodeEditorLand/WorkerElement/Worker
Mistgithub.com/CodeEditorLand/MistElement/Mist
Maintaingithub.com/CodeEditorLand/MaintainElement/Maintain
Airgithub.com/CodeEditorLand/AirElement/Air
SideCargithub.com/CodeEditorLand/SideCarElement/SideCar
Grovegithub.com/CodeEditorLand/GroveElement/Grove
Editorgithub.com/CodeEditorLand/EditorElement/Dependency/Microsoft/Dependency/Editor

After cloning each element, check out its Current branch:

git -C Element/Mountain checkout Current

Repeat for every element. The repository is usable only when every element is on the Current branch at a compatible commit.


Step 1 - Compile VS Code Source 🔨

cd Land
cd Element/Dependency/Microsoft/Dependency/Editor
nvm use 24
export NODE_ENV=development
git fetch --all
git reset --hard Parent/main
git clean -dfx
npm install
npm run compile
npm run compile-extensions-build

The Editor submodule uses npm, not pnpm. The Land workspace uses pnpm, but the VS Code platform build requires npm for its lockfile and lifecycle hooks.

The compilation takes approximately 5-8 minutes on a modern machine. The output is consumed by the @codeeditorland/output package.


Step 2 - Build Land Application 🔧

cd Land
./Maintain/Debug/Build.sh --profile debug-mountain

Common Build Profiles

ProfileWorkbenchFeature coverageOutput type
debugBrowser70-80%Dev binary
debug-mountainMountain80-90%Dev binary
debug-electronElectron95%+Dev binary
debug-electron-bundledElectron95%+Dev binary with Vite/Astro pre-compiled
debug-electron-unbundledElectron95%+Dev binary, dynamic-import path
debug-mountain-onlyMountainNo Cocoon subprocessDev binary
debug-cocoon-headlessNoneMountain + Cocoon, Wind disabledDev binary
debug-kernelNonePure Mountain, no built-insDev binary
debug-electron-restElectron + OXC95%+ with faster TS compilerDev binary
production-electron-bundledElectronOptimized releaseProd binary
production-electron-unbundledElectronRelease without bundled assetsProd binary

The profile flag controls which workbench variant is compiled, which tier flags are active, and whether assets are pre-bundled. The debug-mountain profile is the fastest viable build for daily development; debug-electron provides the full feature set.


Running After Build ▶️

# Launch the binary directly
./Element/Mountain/Target/debug/Mountain

# Or build and run in one command
./Maintain/Debug/Build.sh --profile debug-electron-bundled --run

Artifact Paths 📁

After a successful build, all artifacts are written inside the Element/ directory tree. Nothing is installed system-wide.

Land/
  Element/
    Mountain/Target/
      debug-electron/
        Mountain          # Native Tauri binary
        Mountain.app/     # macOS .app bundle (signed)
    Air/Target/
      debug/
        Air               # Background daemon binary
    Cocoon/Compiled/
      cocoon-bootstrap.js # Extension host entry point
      bundles/            # Extension host support bundles
    Output/Target/
      @codeeditorland/output/  # Bundled VS Code platform package
    Sky/Target/
      Static/
        Bundled/          # Pre-compiled workbench HTML and JS
        Application/      # Extension assets
    Wind/Target/
      Function/Install/   # Compiled Wind service layer

Important

Never edit files under any Target/ directory. These are build outputs. Source lives in Public/ or Source/ within each element. Edits to Target/ are overwritten on the next build.


macOS Code Signing 🖊️

The debug build is automatically re-signed after the Tauri build step. The signing script at Maintain/Script/SignBundle.sh is invoked automatically by Maintain/Debug/Build.sh. Ad-hoc signing is used for debug builds (no Developer ID required).

To manually re-sign after modifying the bundle:

BundleLevel=debug sh Maintain/Script/SignBundle.sh

Tauri’s tauri.conf.json and the Entitlements.plist file are the single sources of truth for what the FIDDEE binary is permitted to do on macOS — hardened runtime, keychain access, and network client capability — without a separate Xcode project.


Quick Troubleshooting ⚠️

SymptomFix
npm install stallsSet ELECTRON_SKIP_BINARY_DOWNLOAD=1 and PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
Playwright lockfile errorrm -rf ~/Library/Caches/ms-playwright/__dirlock
App crashes on macOSBundleLevel=debug sh Maintain/Script/SignBundle.sh
Compilation errors in Editorgit clean -dfx && rm -rf node_modules && npm install && npm run compile
Rust toolchain mismatchCheck Land/rust-toolchain.toml and rustc --version
git submodule issuesNever use --recursive. Clone each element individually on Current.

Funding 💎

Land’s development is funded by the NLnet NGI0 Commons Fund, a European initiative supporting open-source infrastructure. The project is maintained by PlayForm (Sofia, Bulgaria) as a non-profit effort. All code is dedicated to the public domain under CC0 - no CLA required, no copyright assignment, no restrictions on use.