{ description = "Warp is an agentic development environment, born out of the terminal (Experimental Nix Support, Linux-only)."; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; crane.url = "github:ipetkov/crane"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, crane, rust-overlay, ... }: let systems = [ "x86_64-linux" "aarch64-linux" ]; forAllSystems = nixpkgs.lib.genAttrs systems; in { packages = forAllSystems ( system: let pkgs = import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; lib = pkgs.lib; rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; rustPlatform = pkgs.makeRustPlatform { cargo = rustToolchain; rustc = rustToolchain; }; craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain; appCargoToml = builtins.fromTOML (builtins.readFile ./app/Cargo.toml); version = "${appCargoToml.package.version}+${self.shortRev or "dirty"}"; src = self; cargoLock = ./Cargo.lock; # Match Zed's approach: derive the main app vendor directory from # Cargo.lock instead of maintaining a top-level cargoVendorHash. cargoVendorDir = let craneVendorDir = craneLib.vendorCargoDeps { inherit src cargoLock; overrideVendorGitCheckout = crates: drv: let hasCrate = crateName: builtins.any (crate: crate.name == crateName) crates; in drv.overrideAttrs (old: { postPatch = (old.postPatch or "") + '' find . -name 'Cargo.toml.orig' -delete ${lib.optionalString (hasCrate "warp_multi_agent_api") '' mkdir -p apis/multi_agent/v1/gen/rust/nix-vendored-protos cp apis/multi_agent/v1/*.proto \ apis/multi_agent/v1/gen/rust/nix-vendored-protos/ substituteInPlace apis/multi_agent/v1/gen/rust/build.rs \ --replace-fail \ 'let proto_path = manifest_dir.parent().unwrap().parent().unwrap();' \ 'let proto_path = manifest_dir.join("nix-vendored-protos");' ''} ${lib.optionalString (hasCrate "warp-workflows") '' mkdir -p workflows/nix-vendored-specs cp -R specs/. workflows/nix-vendored-specs/ substituteInPlace workflows/build.rs \ --replace-fail \ 'println!("cargo:rerun-if-changed=../specs");' \ 'println!("cargo:rerun-if-changed=nix-vendored-specs");' \ --replace-fail \ 'for entry in WalkDir::new("../specs") {' \ 'for entry in WalkDir::new("nix-vendored-specs") {' ''} ''; }); }; in # crane writes a root config.toml; buildRustPackage expects the # cargoDeps layout to include .cargo/config.toml and Cargo.lock. pkgs.runCommand "warp-terminal-experimental-${version}-cargo-vendor" { } '' cp -R ${craneVendorDir}/. "$out" chmod u+w "$out" mkdir -p "$out/.cargo" sed 's|${craneVendorDir}|@vendor@|g' \ "$out/config.toml" > "$out/.cargo/config.toml" rm "$out/config.toml" cp ${cargoLock} "$out/Cargo.lock" ''; linuxRuntimeLibraries = with pkgs; [ alsa-lib curl dbus expat fontconfig freetype libGL libgit2 libxkbcommon openssl stdenv.cc.cc.lib udev vulkan-loader wayland libx11 libxscrnsaver libxcursor libxext libxfixes libxi libxrandr libxrender libxcb zlib ]; buildFeatures = [ "release_bundle" "gui" ]; warp-terminal-experimental = rustPlatform.buildRustPackage { pname = "warp-terminal-experimental"; inherit version; inherit src; cargoDeps = cargoVendorDir; nativeBuildInputs = with pkgs; [ brotli cargo-about clang cmake jq makeWrapper patchelf pkg-config protobuf python3 ]; buildInputs = linuxRuntimeLibraries; cargoBuildFlags = [ "-p" "warp" "--bin" "warp-oss" ]; inherit buildFeatures; # The application test suite is large and GUI/integration-heavy; this # flake's package check is the Nix build plus a launch smoke test. doCheck = false; env = { APPIMAGE_NAME = "WarpOss-${pkgs.stdenv.hostPlatform.parsed.cpu.name}.AppImage"; LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib"; PROTOC = "${pkgs.protobuf}/bin/protoc"; PROTOC_INCLUDE = "${pkgs.protobuf}/include"; CARGO_PROFILE_RELEASE_DEBUG = "false"; }; postInstall = let installDir = "$out/opt/warpdotdev/warp-terminal-experimental"; resourcesDir = "${installDir}/resources"; releaseChannel = "oss"; libraryPath = lib.makeLibraryPath linuxRuntimeLibraries; executablePath = lib.makeBinPath (with pkgs; [ xdg-utils ]); in '' install -Dm755 "$out/bin/warp-oss" "${installDir}/warp-oss" rm -f "$out/bin/warp-oss" patchShebangs \ ./script/prepare_bundled_resources \ ./script/copy_conditional_skills SETTINGS_SCHEMA_EXECUTABLE="${installDir}/warp-oss" ./script/prepare_bundled_resources \ "${resourcesDir}" \ "${releaseChannel}" install -Dm644 \ "${resourcesDir}/THIRD_PARTY_LICENSES.txt" \ "$out/share/licenses/warp-terminal-experimental/THIRD_PARTY_LICENSES.txt" install -Dm644 LICENSE-AGPL "$out/share/licenses/warp-terminal-experimental/LICENSE-AGPL" install -Dm644 LICENSE-MIT "$out/share/licenses/warp-terminal-experimental/LICENSE-MIT" install -Dm644 app/channels/oss/dev.warp.WarpOss.desktop \ "$out/share/applications/dev.warp.WarpOss.desktop" substituteInPlace "$out/share/applications/dev.warp.WarpOss.desktop" \ --replace-fail "Exec=warp-terminal-oss %U" "Exec=warp-terminal-experimental %U" for size in 16x16 32x32 64x64 128x128 256x256 512x512; do icon="app/channels/oss/icon/no-padding/$size.png" if [ -f "$icon" ]; then install -Dm644 "$icon" \ "$out/share/icons/hicolor/$size/apps/dev.warp.WarpOss.png" fi done wrapProgram "${installDir}/warp-oss" \ --prefix LD_LIBRARY_PATH : "${libraryPath}" \ --prefix PATH : "${executablePath}" mkdir -p "$out/bin" ln -s "${installDir}/warp-oss" "$out/bin/warp-oss" ln -s "${installDir}/warp-oss" "$out/bin/warp-terminal-experimental" ''; postFixup = lib.optionalString pkgs.stdenv.isLinux '' wrapped="/opt/warpdotdev/warp-terminal-experimental/.warp-oss-wrapped" if [ -e "$out$wrapped" ] && ! patchelf --print-needed "$out$wrapped" | grep -q '^libfontconfig\.so\.1$'; then patchelf --add-needed libfontconfig.so.1 "$out$wrapped" fi ''; meta = { description = "Warp is an agentic development environment, born out of the terminal (Experimental Nix Support, Linux-only)."; homepage = "https://www.warp.dev"; license = lib.licenses.agpl3Only; mainProgram = "warp-terminal-experimental"; platforms = systems; sourceProvenance = with lib.sourceTypes; [ fromSource ]; }; }; in { inherit warp-terminal-experimental; } ); devShells = forAllSystems ( system: let pkgs = import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; lib = pkgs.lib; rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; nativeBuildInputs = with pkgs; [ brotli cargo-about cargo-nextest clang cmake jq lld makeWrapper patchelf pkg-config protobuf python3 rustToolchain rust-analyzer ]; buildInputs = with pkgs; [ alsa-lib curl dbus expat fontconfig freetype libGL libgit2 libxkbcommon openssl stdenv.cc.cc.lib udev vulkan-loader wayland libx11 libxscrnsaver libxcursor libxext libxfixes libxi libxrandr libxrender libxcb zlib ]; in { default = pkgs.mkShell { inherit nativeBuildInputs buildInputs; APPIMAGE_NAME = "WarpOss-${pkgs.stdenv.hostPlatform.parsed.cpu.name}.AppImage"; LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib"; PROTOC = "${pkgs.protobuf}/bin/protoc"; PROTOC_INCLUDE = "${pkgs.protobuf}/include"; LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs; }; } ); formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.nixfmt); };}
{
description = "Warp is an agentic development environment, born out of the terminal (Experimental Nix Support, Linux-only).";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
crane.url = "github:ipetkov/crane";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
crane,
rust-overlay,
...
}:
let
systems = [
"x86_64-linux"
"aarch64-linux"
];
forAllSystems = nixpkgs.lib.genAttrs systems;
in
{
packages = forAllSystems (
system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ rust-overlay.overlays.default ];
};
lib = pkgs.lib;
rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
rustPlatform = pkgs.makeRustPlatform {
cargo = rustToolchain;
rustc = rustToolchain;
};
craneLib = (crane.mkLib pkgs).overrideToolchain rustToolchain;
appCargoToml = builtins.fromTOML (builtins.readFile ./app/Cargo.toml);
version = "${appCargoToml.package.version}+${self.shortRev or "dirty"}";
src = self;
cargoLock = ./Cargo.lock;
# Match Zed's approach: derive the main app vendor directory from
# Cargo.lock instead of maintaining a top-level cargoVendorHash.
cargoVendorDir =
let
craneVendorDir = craneLib.vendorCargoDeps {
inherit src cargoLock;
overrideVendorGitCheckout =
crates: drv:
let
hasCrate = crateName: builtins.any (crate: crate.name == crateName) crates;
in
drv.overrideAttrs (old: {
postPatch = (old.postPatch or "") + ''
find . -name 'Cargo.toml.orig' -delete
${lib.optionalString (hasCrate "warp_multi_agent_api") ''
mkdir -p apis/multi_agent/v1/gen/rust/nix-vendored-protos
cp apis/multi_agent/v1/*.proto \
apis/multi_agent/v1/gen/rust/nix-vendored-protos/
substituteInPlace apis/multi_agent/v1/gen/rust/build.rs \
--replace-fail \
'let proto_path = manifest_dir.parent().unwrap().parent().unwrap();' \
'let proto_path = manifest_dir.join("nix-vendored-protos");'
''}
${lib.optionalString (hasCrate "warp-workflows") ''
mkdir -p workflows/nix-vendored-specs
cp -R specs/. workflows/nix-vendored-specs/
substituteInPlace workflows/build.rs \
--replace-fail \
'println!("cargo:rerun-if-changed=../specs");' \
'println!("cargo:rerun-if-changed=nix-vendored-specs");' \
--replace-fail \
'for entry in WalkDir::new("../specs") {' \
'for entry in WalkDir::new("nix-vendored-specs") {'
''}
'';
});
};
in
# crane writes a root config.toml; buildRustPackage expects the
# cargoDeps layout to include .cargo/config.toml and Cargo.lock.
pkgs.runCommand "warp-terminal-experimental-${version}-cargo-vendor" { } ''
cp -R ${craneVendorDir}/. "$out"
chmod u+w "$out"
mkdir -p "$out/.cargo"
sed 's|${craneVendorDir}|@vendor@|g' \
"$out/config.toml" > "$out/.cargo/config.toml"
rm "$out/config.toml"
cp ${cargoLock} "$out/Cargo.lock"
'';
linuxRuntimeLibraries = with pkgs; [
alsa-lib
curl
dbus
expat
fontconfig
freetype
libGL
libgit2
libxkbcommon
openssl
stdenv.cc.cc.lib
udev
vulkan-loader
wayland
libx11
libxscrnsaver
libxcursor
libxext
libxfixes
libxi
libxrandr
libxrender
libxcb
zlib
];
buildFeatures = [
"release_bundle"
"gui"
];
warp-terminal-experimental = rustPlatform.buildRustPackage {
pname = "warp-terminal-experimental";
inherit version;
inherit src;
cargoDeps = cargoVendorDir;
nativeBuildInputs = with pkgs; [
brotli
cargo-about
clang
cmake
jq
makeWrapper
patchelf
pkg-config
protobuf
python3
];
buildInputs = linuxRuntimeLibraries;
cargoBuildFlags = [
"-p"
"warp"
"--bin"
"warp-oss"
];
inherit buildFeatures;
# The application test suite is large and GUI/integration-heavy; this
# flake's package check is the Nix build plus a launch smoke test.
doCheck = false;
env = {
APPIMAGE_NAME = "WarpOss-${pkgs.stdenv.hostPlatform.parsed.cpu.name}.AppImage";
LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib";
PROTOC = "${pkgs.protobuf}/bin/protoc";
PROTOC_INCLUDE = "${pkgs.protobuf}/include";
CARGO_PROFILE_RELEASE_DEBUG = "false";
};
postInstall =
let
installDir = "$out/opt/warpdotdev/warp-terminal-experimental";
resourcesDir = "${installDir}/resources";
releaseChannel = "oss";
libraryPath = lib.makeLibraryPath linuxRuntimeLibraries;
executablePath = lib.makeBinPath (with pkgs; [ xdg-utils ]);
in
''
install -Dm755 "$out/bin/warp-oss" "${installDir}/warp-oss"
rm -f "$out/bin/warp-oss"
patchShebangs \
./script/prepare_bundled_resources \
./script/copy_conditional_skills
SETTINGS_SCHEMA_EXECUTABLE="${installDir}/warp-oss" ./script/prepare_bundled_resources \
"${resourcesDir}" \
"${releaseChannel}"
install -Dm644 \
"${resourcesDir}/THIRD_PARTY_LICENSES.txt" \
"$out/share/licenses/warp-terminal-experimental/THIRD_PARTY_LICENSES.txt"
install -Dm644 LICENSE-AGPL "$out/share/licenses/warp-terminal-experimental/LICENSE-AGPL"
install -Dm644 LICENSE-MIT "$out/share/licenses/warp-terminal-experimental/LICENSE-MIT"
install -Dm644 app/channels/oss/dev.warp.WarpOss.desktop \
"$out/share/applications/dev.warp.WarpOss.desktop"
substituteInPlace "$out/share/applications/dev.warp.WarpOss.desktop" \
--replace-fail "Exec=warp-terminal-oss %U" "Exec=warp-terminal-experimental %U"
for size in 16x16 32x32 64x64 128x128 256x256 512x512; do
icon="app/channels/oss/icon/no-padding/$size.png"
if [ -f "$icon" ]; then
install -Dm644 "$icon" \
"$out/share/icons/hicolor/$size/apps/dev.warp.WarpOss.png"
fi
done
wrapProgram "${installDir}/warp-oss" \
--prefix LD_LIBRARY_PATH : "${libraryPath}" \
--prefix PATH : "${executablePath}"
mkdir -p "$out/bin"
ln -s "${installDir}/warp-oss" "$out/bin/warp-oss"
ln -s "${installDir}/warp-oss" "$out/bin/warp-terminal-experimental"
'';
postFixup = lib.optionalString pkgs.stdenv.isLinux ''
wrapped="/opt/warpdotdev/warp-terminal-experimental/.warp-oss-wrapped"
if [ -e "$out$wrapped" ] && ! patchelf --print-needed "$out$wrapped" | grep -q '^libfontconfig\.so\.1$'; then
patchelf --add-needed libfontconfig.so.1 "$out$wrapped"
fi
'';
meta = {
description = "Warp is an agentic development environment, born out of the terminal (Experimental Nix Support, Linux-only).";
homepage = "https://www.warp.dev";
license = lib.licenses.agpl3Only;
mainProgram = "warp-terminal-experimental";
platforms = systems;
sourceProvenance = with lib.sourceTypes; [ fromSource ];
};
};
in
{
inherit warp-terminal-experimental;
}
);
devShells = forAllSystems (
system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ rust-overlay.overlays.default ];
};
lib = pkgs.lib;
rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
nativeBuildInputs = with pkgs; [
brotli
cargo-about
cargo-nextest
clang
cmake
jq
lld
makeWrapper
patchelf
pkg-config
protobuf
python3
rustToolchain
rust-analyzer
];
buildInputs = with pkgs; [
alsa-lib
curl
dbus
expat
fontconfig
freetype
libGL
libgit2
libxkbcommon
openssl
stdenv.cc.cc.lib
udev
vulkan-loader
wayland
libx11
libxscrnsaver
libxcursor
libxext
libxfixes
libxi
libxrandr
libxrender
libxcb
zlib
];
in
{
default = pkgs.mkShell {
inherit nativeBuildInputs buildInputs;
APPIMAGE_NAME = "WarpOss-${pkgs.stdenv.hostPlatform.parsed.cpu.name}.AppImage";
LIBCLANG_PATH = "${pkgs.llvmPackages.libclang.lib}/lib";
PROTOC = "${pkgs.protobuf}/bin/protoc";
PROTOC_INCLUDE = "${pkgs.protobuf}/include";
LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs;
};
}
);
formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.nixfmt);
};
}