How to Install Google Antigravity on Debian 13, 12 and 11

PublishedAuthorJoshua JamesRead time12 minGuide typeDebian

Debian does not package Google Antigravity in its default repositories, and the current Google product split matters before you install anything. To install Google Antigravity on Debian, choose between the Antigravity 2.0 desktop app, the separate Antigravity IDE tarball, the user-local agy CLI, or Google’s older APT package when you specifically need the legacy 1.x IDE.

The current desktop and IDE builds are Linux tarballs from Google’s download page. The legacy APT repository still resolves for Debian, but its newest antigravity package currently remains on 1.23.2. Debian’s AppArmor behavior also differs from the current Ubuntu path: AppArmor can be enabled while the Ubuntu-specific unprivileged user namespace sysctl simply prints MISSING, so avoid importing Ubuntu profile workarounds unless Debian logs prove AppArmor is blocking the launch.

Choose a Google Antigravity Install Path on Debian

Google’s Antigravity download page lists Antigravity 2.0, Antigravity CLI, Antigravity SDK, and Antigravity IDE as separate downloads. Debian users should treat those as separate install surfaces because each one has a different launcher, update owner, cleanup path, and troubleshooting branch.

Install pathUse it whenUpdate owner
Antigravity 2.0 desktop appYou want the current standalone agent platform for projects, artifacts, scheduled work, and visual orchestration.sudo update-antigravity
Antigravity IDE tarballYou want the current editor-first Antigravity surface with code editing, the agent manager, and workspace-aware commands.sudo update-antigravity-ide
Antigravity CLIYou want terminal-first work with the agy command in local projects, SSH sessions, and scripts.agy update or update-antigravity-cli
Legacy APT packageYou specifically need the older package-managed IDE path currently exposed as antigravity 1.x.sudo apt install --only-upgrade antigravity if Google publishes a newer APT build

Use only one antigravity desktop owner at a time. The Antigravity 2.0 helper creates /usr/local/bin/antigravity and antigravity.desktop, while the legacy APT package creates /usr/bin/antigravity and its own antigravity.desktop. Remove the legacy package before installing the current desktop helper on the same Debian system.

Install Antigravity 2.0 Desktop App on Debian

Refresh APT first, then install the small helper toolset used by the desktop tarball workflow. ca-certificates keeps HTTPS downloads working on minimal Debian installs, and the other packages handle download parsing, extraction, and desktop integration:

sudo apt update
sudo apt install ca-certificates curl tar desktop-file-utils python3

These commands use sudo because they install packages and write under system paths. If your account is not ready for administrative commands, add a user to sudoers on Debian before continuing.

The helper reads Google’s download bundle, selects the x86_64 or ARM64 Linux tarball, installs the app under /opt/antigravity, creates the friendly antigravity command, extracts the upstream icon, and writes a Debian desktop launcher with the window identity the app expects.

The helper uses Google’s download page instead of the older auto-updater endpoint. If an existing /usr/local/bin/update-antigravity helper still reports 2.0.1 as current, overwrite that saved helper with this version before updating.

sudo tee /usr/local/bin/update-antigravity > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

if [ "$(id -u)" -ne 0 ]; then
	echo "Run with sudo: sudo update-antigravity" >&2
	exit 1
fi

download_page="https://antigravity.google/download"
install_root="/opt/antigravity"
command_link="/usr/local/bin/antigravity"
desktop_file="/usr/share/applications/antigravity.desktop"
icon_file="/usr/share/icons/hicolor/512x512/apps/antigravity.png"
old_icon_file="/usr/share/icons/hicolor/scalable/apps/antigravity.svg"

case "$(uname -m)" in
x86_64 | amd64) platform="linux-x64" ;;
aarch64 | arm64) platform="linux-arm" ;;
*)
	echo "Unsupported architecture: $(uname -m)" >&2
	exit 1
	;;
esac

for required_command in curl tar python3; do
	if ! command -v "$required_command" >/dev/null 2>&1; then
		echo "$required_command is required to install Antigravity." >&2
		exit 1
	fi
done

if [ -L "$command_link" ]; then
	command_target=$(readlink -f "$command_link" || true)
	case "$command_target" in
	"$install_root"/*) ;;
	*)
		echo "$command_link points to $command_target. Move it before rerunning this helper." >&2
		exit 1
		;;
	esac
elif [ -e "$command_link" ]; then
	echo "$command_link exists and is not a symlink. Move it before rerunning this helper." >&2
	exit 1
fi

tmp_parent="${TMPDIR:-/var/tmp}"
mkdir -p "$tmp_parent"
tmpdir=$(mktemp -d "$tmp_parent/antigravity.XXXXXX")
trap 'rm -rf "$tmpdir"' EXIT
download_html="$tmpdir/download.html"
download_js="$tmpdir/download.js"
archive="$tmpdir/Antigravity.tar.gz"
archive_list="$tmpdir/archive-list.txt"
icon_staged="$tmpdir/antigravity.png"

curl -fsSL --compressed --retry 3 -o "$download_html" "$download_page"
main_js_url=$(
	python3 - "$download_html" "$download_page" <<'PY'
import re
import sys
from pathlib import Path
from urllib.parse import urljoin

html = Path(sys.argv[1]).read_text()
page_url = sys.argv[2]
matches = re.findall(r'(?:src|href)="([^"]*main-[^"]+\.js)"', html)
if not matches:
    raise SystemExit("Could not find the Antigravity download bundle")
print(urljoin(page_url, matches[-1]))
PY
)

curl -fsSL --compressed --retry 3 -o "$download_js" "$main_js_url"
download_fields=$(
	python3 - "$download_js" "$platform" <<'PY'
import re
import sys
from pathlib import Path

bundle = Path(sys.argv[1]).read_text(errors="replace")
platform = sys.argv[2]
start = bundle.find('id:"antigravity-2"')
end = bundle.find('},{name:"command",id:"antigravity-cli"', start)
if start == -1 or end == -1:
    raise SystemExit("Could not find Antigravity 2.0 downloads")

section = bundle[start:end]
match = re.search(r'href:"([^"]+/' + re.escape(platform) + r'/Antigravity\.tar\.gz)"', section)
if not match:
    raise SystemExit(f"Could not find a download for {platform}")

url = match.group(1)
version_match = re.search(r'/antigravity-hub/([^/]+)/', url)
if not version_match:
    raise SystemExit("Could not parse Antigravity version from download URL")

print(version_match.group(1).split("-", 1)[0], url)
PY
)
read -r version download_url <<<"$download_fields"

if [ -z "$version" ] || [ -z "$download_url" ]; then
	echo "Could not parse the Antigravity download page." >&2
	exit 1
fi

case "$platform" in
linux-x64) expected_top_dir="Antigravity-x64" ;;
linux-arm) expected_top_dir="Antigravity-arm64" ;;
esac

expected_target="$install_root/$expected_top_dir/antigravity"
sandbox_path="$install_root/$expected_top_dir/chrome-sandbox"
installed_version=$(cat "$install_root/.linuxcapable-version" 2>/dev/null || true)
desktop_matches=no
if [ -f "$desktop_file" ] &&
	grep -q '^Icon=antigravity$' "$desktop_file" &&
	grep -q '^StartupWMClass=Antigravity$' "$desktop_file"; then
	desktop_matches=yes
fi
if [ "$installed_version" = "$version" ] &&
	[ -x "$expected_target" ] &&
	[ -L "$command_link" ] &&
	[ "$(readlink -f "$command_link")" = "$expected_target" ] &&
	[ "$desktop_matches" = yes ] &&
	[ -f "$icon_file" ]; then
	if [ ! -e "$sandbox_path" ] || [ "$(stat -c '%U:%G:%a' "$sandbox_path")" = "root:root:4755" ]; then
		printf 'Antigravity %s is already installed at %s\n' "$version" "$install_root/$expected_top_dir"
		exit 0
	fi
fi

printf 'Downloading Antigravity %s for %s...\n' "$version" "$platform"
curl -fsSL --retry 3 -o "$archive" "$download_url"
tar -tzf "$archive" >"$archive_list"
top_dir=$(sed -n '1{s#/.*##;p;q}' "$archive_list")
case "$top_dir" in
Antigravity-*) ;;
*)
	echo "Unexpected archive layout: $top_dir" >&2
	exit 1
	;;
esac
if [ "$top_dir" != "$expected_top_dir" ]; then
	echo "Unexpected archive directory: $top_dir" >&2
	exit 1
fi

tar -xzf "$archive" -C "$tmpdir"
if [ ! -x "$tmpdir/$top_dir/antigravity" ]; then
	echo "The Antigravity launcher was not found in the archive." >&2
	exit 1
fi

python3 - "$tmpdir/$top_dir/resources/app.asar" "$icon_staged" <<'PY'
import json
import struct
import sys
from pathlib import Path

asar = Path(sys.argv[1])
output = Path(sys.argv[2])
with asar.open("rb") as archive:
    archive.read(4)
    header_size = struct.unpack("<I", archive.read(4))[0]
    archive.read(4)
    json_size = struct.unpack("<I", archive.read(4))[0]
    header = json.loads(archive.read(json_size).decode())

icon = header["files"]["icon.png"]
with asar.open("rb") as archive:
    archive.seek(8 + header_size + int(icon["offset"]))
    output.write_bytes(archive.read(int(icon["size"])))
PY

staging_root=$(mktemp -d "$(dirname "$install_root")/.antigravity-install.XXXXXX")
chmod 0755 "$staging_root"
promoted=no
cleanup_staging() {
	if [ "$promoted" != yes ]; then
		rm -rf "$staging_root"
	fi
}
trap 'rm -rf "$tmpdir"; cleanup_staging' EXIT

cp -a "$tmpdir/$top_dir" "$staging_root/"
printf '%s\n' "$version" >"$staging_root/.linuxcapable-version"
if [ -f "$staging_root/$top_dir/chrome-sandbox" ]; then
	chown root:root "$staging_root/$top_dir/chrome-sandbox"
	chmod 4755 "$staging_root/$top_dir/chrome-sandbox"
fi
if [ -d "$install_root" ]; then
	rm -rf "${install_root}.previous"
	mv "$install_root" "${install_root}.previous"
fi
mv "$staging_root" "$install_root"
promoted=yes
ln -sfn "$install_root/$top_dir/antigravity" "$command_link"

mkdir -p "$(dirname "$icon_file")"
install -m 0644 "$icon_staged" "$icon_file"
rm -f "$old_icon_file"

tee "$desktop_file" >/dev/null <<DESKTOP
[Desktop Entry]
Name=Antigravity
Comment=Google Antigravity 2.0 agent platform
Exec=$command_link %U
Icon=antigravity
Terminal=false
Type=Application
Categories=Development;IDE;
StartupNotify=true
StartupWMClass=Antigravity
DESKTOP

if command -v update-desktop-database >/dev/null 2>&1; then
	update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
fi

if command -v gtk-update-icon-cache >/dev/null 2>&1; then
	gtk-update-icon-cache -q /usr/share/icons/hicolor 2>/dev/null || true
fi

printf 'Installed Antigravity %s at %s\n' "$version" "$install_root/$top_dir"
EOF

sudo chmod +x /usr/local/bin/update-antigravity

Run the helper to install or refresh the Antigravity 2.0 desktop app. The current Linux x64 download prints output in this shape:

sudo update-antigravity
Downloading Antigravity 2.0.6 for linux-x64...
Installed Antigravity 2.0.6 at /opt/antigravity/Antigravity-x64

Verify the command link, desktop entry, icon, and Chromium sandbox helper before launching the app:

readlink -f /usr/local/bin/antigravity
test -x "$(readlink -f /usr/local/bin/antigravity)" && echo "Antigravity launcher is installed"
grep -E '^(Name|Exec|Icon|Categories|StartupWMClass)=' /usr/share/applications/antigravity.desktop
test -f /usr/share/icons/hicolor/512x512/apps/antigravity.png && echo "Antigravity icon is installed"
stat -c '%U %G %a %n' /opt/antigravity/Antigravity-*/chrome-sandbox
/opt/antigravity/Antigravity-x64/antigravity
Antigravity launcher is installed
Name=Antigravity
Exec=/usr/local/bin/antigravity %U
Icon=antigravity
Categories=Development;IDE;
StartupWMClass=Antigravity
Antigravity icon is installed
root root 4755 /opt/antigravity/Antigravity-x64/chrome-sandbox

Check Debian AppArmor and sandbox state

Debian can run AppArmor without exposing the Ubuntu kernel.apparmor_restrict_unprivileged_userns knob. A MISSING result for that sysctl is normal on Debian 13, 12, and 11. The important desktop check is that the helper-owned chrome-sandbox file is root-owned with mode 4755 and no Antigravity profile has appeared under /etc/apparmor.d.

cat /sys/module/apparmor/parameters/enabled 2>/dev/null || echo MISSING
systemctl is-active apparmor 2>/dev/null || true
sysctl -n kernel.apparmor_restrict_unprivileged_userns 2>/dev/null || echo MISSING
stat -c '%U %G %a %n' /opt/antigravity/Antigravity-*/chrome-sandbox
sudo find /etc/apparmor.d -maxdepth 1 -iname '*antigravity*' -print
Y
active
MISSING
root root 4755 /opt/antigravity/Antigravity-x64/chrome-sandbox

No output from the final find command means no Antigravity AppArmor profile is installed. Do not create a custom AppArmor profile or disable AppArmor globally unless a fresh Debian log entry names Antigravity as the blocked executable and a retest proves the fix.

Install Antigravity IDE on Debian

The current Antigravity IDE is a separate 2.x editor build from Google’s download page, not the package currently exposed by the legacy APT repository. Keep it under its own prefix and launcher so it can coexist with the Antigravity 2.0 desktop app without taking over the antigravity command.

Install the helper prerequisites if you skipped the desktop app section:

sudo apt update
sudo apt install ca-certificates curl tar desktop-file-utils python3

The IDE helper resolves the Linux x64 or ARM64 IDE tarball, installs it under /opt/antigravity-ide, creates /usr/local/bin/antigravity-ide, installs the upstream IDE icon, and writes a separate desktop launcher.

sudo tee /usr/local/bin/update-antigravity-ide > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

if [ "$(id -u)" -ne 0 ]; then
	echo "Run with sudo: sudo update-antigravity-ide" >&2
	exit 1
fi

download_page="https://antigravity.google/download"
install_root="/opt/antigravity-ide"
command_link="/usr/local/bin/antigravity-ide"
desktop_file="/usr/share/applications/antigravity-ide.desktop"
icon_file="/usr/share/icons/hicolor/512x512/apps/antigravity-ide.png"

case "$(uname -m)" in
x86_64 | amd64) platform="linux-x64" ;;
aarch64 | arm64) platform="linux-arm" ;;
*)
	echo "Unsupported architecture: $(uname -m)" >&2
	exit 1
	;;
esac

for required_command in curl tar python3; do
	if ! command -v "$required_command" >/dev/null 2>&1; then
		echo "$required_command is required to install Antigravity IDE." >&2
		exit 1
	fi
done

if [ -L "$command_link" ]; then
	command_target=$(readlink -f "$command_link" || true)
	case "$command_target" in
	"$install_root"/*) ;;
	*)
		echo "$command_link points to $command_target. Move it before rerunning this helper." >&2
		exit 1
		;;
	esac
elif [ -e "$command_link" ]; then
	echo "$command_link exists and is not a symlink. Move it before rerunning this helper." >&2
	exit 1
fi

tmp_parent="${TMPDIR:-/var/tmp}"
mkdir -p "$tmp_parent"
tmpdir=$(mktemp -d "$tmp_parent/antigravity-ide.XXXXXX")
trap 'rm -rf "$tmpdir"' EXIT
download_html="$tmpdir/download.html"
download_js="$tmpdir/download.js"
archive="$tmpdir/Antigravity-IDE.tar.gz"
archive_list="$tmpdir/archive-list.txt"

curl -fsSL --compressed --retry 3 -o "$download_html" "$download_page"
main_js_url=$(
	python3 - "$download_html" "$download_page" <<'PY'
import re
import sys
from pathlib import Path
from urllib.parse import urljoin

html = Path(sys.argv[1]).read_text()
page_url = sys.argv[2]
matches = re.findall(r'(?:src|href)="([^"]*main-[^"]+\.js)"', html)
if not matches:
    raise SystemExit("Could not find the Antigravity download bundle")
print(urljoin(page_url, matches[-1]))
PY
)

curl -fsSL --compressed --retry 3 -o "$download_js" "$main_js_url"
download_fields=$(
	python3 - "$download_js" "$platform" <<'PY'
import re
import sys
from pathlib import Path

bundle = Path(sys.argv[1]).read_text(errors="replace")
platform = sys.argv[2]
start = bundle.find('id:"antigravity-ide"')
end = bundle.find('},{name:"download",id:"antigravity-sdk"', start)
if start == -1 or end == -1:
    raise SystemExit("Could not find Antigravity IDE downloads")

section = bundle[start:end]
match = re.search(r'href:"([^"]+/' + re.escape(platform) + r'/Antigravity%20IDE\.tar\.gz)"', section)
if not match:
    raise SystemExit(f"Could not find an IDE download for {platform}")

url = match.group(1)
version_match = re.search(r'/stable/([^/]+)/', url)
if not version_match:
    raise SystemExit("Could not parse Antigravity IDE version from download URL")

print(version_match.group(1).split("-", 1)[0], url)
PY
)
read -r version download_url <<<"$download_fields"

if [ -z "$version" ] || [ -z "$download_url" ]; then
	echo "Could not parse the Antigravity IDE download page." >&2
	exit 1
fi

archive_top_dir="Antigravity IDE"
install_top_dir="Antigravity-IDE"
expected_target="$install_root/$install_top_dir/antigravity-ide"
sandbox_path="$install_root/$install_top_dir/chrome-sandbox"
installed_version=$(cat "$install_root/.linuxcapable-version" 2>/dev/null || true)
desktop_matches=no
if [ -f "$desktop_file" ] &&
	grep -q '^Icon=antigravity-ide$' "$desktop_file" &&
	grep -q '^StartupWMClass=antigravity-ide$' "$desktop_file"; then
	desktop_matches=yes
fi
if [ "$installed_version" = "$version" ] &&
	[ -x "$expected_target" ] &&
	[ -L "$command_link" ] &&
	[ "$(readlink -f "$command_link")" = "$expected_target" ] &&
	[ "$desktop_matches" = yes ] &&
	[ -f "$icon_file" ]; then
	if [ ! -e "$sandbox_path" ] || [ "$(stat -c '%U:%G:%a' "$sandbox_path")" = "root:root:4755" ]; then
		printf 'Antigravity IDE %s is already installed at %s\n' "$version" "$install_root/$install_top_dir"
		exit 0
	fi
fi

printf 'Downloading Antigravity IDE %s for %s...\n' "$version" "$platform"
curl -fsSL --retry 3 -o "$archive" "$download_url"
tar -tzf "$archive" >"$archive_list"
top_dir=$(sed -n '1{s#/.*##;p;q}' "$archive_list")
if [ "$top_dir" != "$archive_top_dir" ]; then
	echo "Unexpected archive directory: $top_dir" >&2
	exit 1
fi

tar -xzf "$archive" -C "$tmpdir"
if [ ! -x "$tmpdir/$top_dir/antigravity-ide" ]; then
	echo "The Antigravity IDE launcher was not found in the archive." >&2
	exit 1
fi

icon_source="$tmpdir/$top_dir/resources/app/resources/linux/code.png"
if [ ! -f "$icon_source" ]; then
	echo "The Antigravity IDE icon was not found in the archive." >&2
	exit 1
fi

staging_root=$(mktemp -d "$(dirname "$install_root")/.antigravity-ide-install.XXXXXX")
chmod 0755 "$staging_root"
promoted=no
cleanup_staging() {
	if [ "$promoted" != yes ]; then
		rm -rf "$staging_root"
	fi
}
trap 'rm -rf "$tmpdir"; cleanup_staging' EXIT

cp -a "$tmpdir/$top_dir" "$staging_root/$install_top_dir"
printf '%s\n' "$version" >"$staging_root/.linuxcapable-version"
if [ -f "$staging_root/$install_top_dir/chrome-sandbox" ]; then
	chown root:root "$staging_root/$install_top_dir/chrome-sandbox"
	chmod 4755 "$staging_root/$install_top_dir/chrome-sandbox"
fi
if [ -d "$install_root" ]; then
	rm -rf "${install_root}.previous"
	mv "$install_root" "${install_root}.previous"
fi
mv "$staging_root" "$install_root"
promoted=yes
ln -sfn "$install_root/$install_top_dir/antigravity-ide" "$command_link"

mkdir -p "$(dirname "$icon_file")"
install -m 0644 "$icon_source" "$icon_file"

tee "$desktop_file" >/dev/null <<DESKTOP
[Desktop Entry]
Name=Antigravity IDE
Comment=Google Antigravity IDE
Exec=$command_link %U
Icon=antigravity-ide
Terminal=false
Type=Application
Categories=Development;IDE;
MimeType=x-scheme-handler/antigravity-ide;application/x-antigravity-workspace;
StartupNotify=true
StartupWMClass=antigravity-ide
DESKTOP

if command -v update-desktop-database >/dev/null 2>&1; then
	update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
fi

if command -v gtk-update-icon-cache >/dev/null 2>&1; then
	gtk-update-icon-cache -q /usr/share/icons/hicolor 2>/dev/null || true
fi

printf 'Installed Antigravity IDE %s at %s\n' "$version" "$install_root/$install_top_dir"
EOF

sudo chmod +x /usr/local/bin/update-antigravity-ide

Run the helper and confirm the installed path:

sudo update-antigravity-ide
Downloading Antigravity IDE 2.0.3 for linux-x64...
Installed Antigravity IDE 2.0.3 at /opt/antigravity-ide/Antigravity-IDE

Verify the IDE command, desktop file, icon, and sandbox helper:

readlink -f /usr/local/bin/antigravity-ide
test -x "$(readlink -f /usr/local/bin/antigravity-ide)" && echo "Antigravity IDE launcher is installed"
grep -E '^(Name|Exec|Icon|Categories|StartupWMClass)=' /usr/share/applications/antigravity-ide.desktop
test -f /usr/share/icons/hicolor/512x512/apps/antigravity-ide.png && echo "Antigravity IDE icon is installed"
stat -c '%U %G %a %n' /opt/antigravity-ide/Antigravity-IDE/chrome-sandbox
/opt/antigravity-ide/Antigravity-IDE/antigravity-ide
Antigravity IDE launcher is installed
Name=Antigravity IDE
Exec=/usr/local/bin/antigravity-ide %U
Icon=antigravity-ide
Categories=Development;IDE;
StartupWMClass=antigravity-ide
Antigravity IDE icon is installed
root root 4755 /opt/antigravity-ide/Antigravity-IDE/chrome-sandbox

Install Antigravity CLI on Debian

The Antigravity CLI is the terminal surface named agy. Google’s installer is user-local, so run it from the Debian account that will use the CLI. It writes the binary under ~/.local/bin instead of creating a system package.

Install curl and certificate support first if your Debian image does not already have them:

sudo apt update
sudo apt install ca-certificates curl

Run Google’s official CLI installer as your normal user:

curl -fsSL https://antigravity.google/cli/install.sh | bash

The current shell still needs ~/.local/bin on PATH before it can find agy. Export it before verifying the command:

export PATH="$HOME/.local/bin:$PATH"
command -v agy
agy --version
/home/username/.local/bin/agy
1.0.2

The export only affects the current terminal. For Bash sessions, add the same directory to ~/.bashrc once if the installer reports that agy is installed but not on your active PATH:

grep -qxF 'export PATH="$HOME/.local/bin:$PATH"' "$HOME/.bashrc" 2>/dev/null || printf '\nexport PATH="$HOME/.local/bin:$PATH"\n' >>"$HOME/.bashrc"

Open a new terminal after adding the line. Zsh and Fish users should add the equivalent ~/.local/bin entry to their own shell startup file instead of editing ~/.bashrc.

Check the core CLI flags and subcommands after installation:

agy --help | sed -n '1,24p'
Usage of agy:
  --add-dir                       Add a directory to the workspace (repeatable) (default [])
  -c                              Short alias for --continue
  --continue                      Continue the most recent conversation
  --conversation                  Resume a previous conversation by ID
  --dangerously-skip-permissions  Auto-approve all tool permission requests without prompting
  -i                              Short alias for --prompt-interactive
  --log-file                      Override CLI log file path
  -p                              Short alias for --print
  --print                         Run a single prompt non-interactively and print the response
  --print-timeout                 Timeout for print mode wait (default 5m0s)
  --prompt                        Alias for --print
  --prompt-interactive            Run an initial prompt interactively and continue the session
  --sandbox                       Run in a sandbox with terminal restrictions enabled

Available subcommands:
  changelog       Show changelog and release notes
  help            Show help for subcommands
  install         Configure environment paths and shell settings
  plugin          Manage plugins (install, uninstall, list, enable, disable)
  plugins         Alias for plugin
  update          Update CLI

Create a user-local update helper if you want one repeatable command for first install and later updates:

mkdir -p "$HOME/.local/bin"

tee "$HOME/.local/bin/update-antigravity-cli" > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

export PATH="$HOME/.local/bin:$PATH"

if [ ! -x "$HOME/.local/bin/agy" ]; then
	curl -fsSL https://antigravity.google/cli/install.sh | bash
else
	"$HOME/.local/bin/agy" update
fi

"$HOME/.local/bin/agy" --version
EOF

chmod +x "$HOME/.local/bin/update-antigravity-cli"

Run the helper whenever you want to refresh the CLI. A no-op update ends with the installed version:

update-antigravity-cli
Checking for updates... (current version 1.0.2)
You are already on the latest version.
1.0.2

Install Legacy Antigravity IDE APT Package on Debian

The APT path is legacy for Debian right now. Google’s APT metadata still exposes antigravity, but the newest package branch is 1.23.2, not the current Antigravity 2.0 desktop app or the current Antigravity IDE tarball.

Install the repository tools only if you need the older package-managed IDE:

sudo apt update
sudo apt install ca-certificates curl gpg

Store Google’s Artifact Registry signing key in a dedicated keyring:

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSLo antigravity-repo-key.asc https://us-central1-apt.pkg.dev/doc/repo-signing-key.gpg
gpg --dearmor --yes -o antigravity-repo-key.gpg antigravity-repo-key.asc
sudo install -m 0644 antigravity-repo-key.gpg /etc/apt/keyrings/antigravity-repo-key.gpg
rm -f antigravity-repo-key.asc antigravity-repo-key.gpg

Verify the key fingerprint before enabling the repository:

gpg --quiet --show-keys --with-fingerprint /etc/apt/keyrings/antigravity-repo-key.gpg | sed -n '1,4p'
pub   rsa2048 2021-05-04 [SC]
      35BA A0B3 3E9E B396 F59C  A838 C0BA 5CE6 DC63 15A3
uid                      Artifact Registry Repository Signer <artifact-registry-repository-signer@google.com>

Create a DEB822 source file for Google’s fixed antigravity-debian suite:

sudo tee /etc/apt/sources.list.d/google-antigravity.sources > /dev/null <<'EOF'
Types: deb
URIs: https://us-central1-apt.pkg.dev/projects/antigravity-auto-updater-dev/
Suites: antigravity-debian
Components: main
Signed-By: /etc/apt/keyrings/antigravity-repo-key.gpg
EOF

Refresh APT and confirm the package branch before installing. A 1.23.2 candidate means this is the legacy IDE package, not Antigravity 2.0.

sudo apt update
apt-cache policy antigravity | sed -n '1,7p'
antigravity:
  Installed: (none)
  Candidate: 1.23.2-1776332190
  Version table:
     1.23.2-1776332190 500
        500 https://us-central1-apt.pkg.dev/projects/antigravity-auto-updater-dev antigravity-debian/main amd64 Packages

The build suffix can differ by architecture. The meaningful part is that the branch remains 1.23.2 before you treat this method as the legacy IDE path.

Install the package if you still need that older IDE:

sudo apt install antigravity

The legacy package installs under /usr/share/antigravity, creates /usr/bin/antigravity, and ships a root-owned Chromium sandbox helper. It does not install an Antigravity profile under /etc/apparmor.d.

dpkg-query -W -f='${db:Status-Abbrev} ${binary:Package} ${Version}\n' antigravity
command -v antigravity
readlink -f /usr/bin/antigravity
find /usr/share/antigravity -maxdepth 2 -name chrome-sandbox -exec stat -c '%U %G %a %n' {} \;
sudo find /etc/apparmor.d -maxdepth 1 -iname '*antigravity*' -print
ii  antigravity 1.23.2-1776332190
/usr/bin/antigravity
/usr/share/antigravity/bin/antigravity
root root 4755 /usr/share/antigravity/chrome-sandbox

Launch and Use Google Antigravity on Debian

The graphical Antigravity surfaces need a logged-in Debian desktop session. Debian Server, WSL, and minimal remote shells can hold the files, but the desktop app, current IDE, and legacy IDE are meant to open from GNOME, KDE Plasma, Xfce, or another graphical session. Use agy when you want a terminal-first workflow.

Open Antigravity 2.0 from the Debian app menu

  • Open the application overview or app menu.
  • Search for Antigravity.
  • Select the Antigravity launcher to start the desktop app.

A desktop terminal can launch the same app directly:

antigravity

Use the desktop app when you want the standalone project surface, visual task management, artifacts, and scheduled or multi-agent work outside a traditional editor window.

Open Antigravity IDE on Debian

  • Open the application overview or app menu.
  • Search for Antigravity IDE.
  • Select the Antigravity IDE launcher to open the editor.

A desktop terminal can start the IDE helper directly:

antigravity-ide

Use the IDE when you want normal file editing, tab completion, code commands, an activity bar, and the agent manager in the same editor surface. Use the Antigravity 2.0 desktop app when you want the standalone project and task orchestration surface.

Open the legacy APT IDE when installed

If you chose the legacy APT package instead of the current desktop helper, confirm which owner is active before launching when you have switched methods. The package installs a VS Code-style /usr/bin/antigravity command wrapper, while the graphical desktop entry starts the real IDE binary under /usr/share/antigravity.

command -v antigravity
readlink -f "$(command -v antigravity)"
awk '
  /^\[/ { section = $0 }
  section == "[Desktop Entry]" && /^(Name|Exec|StartupWMClass)=/ { print }
' /usr/share/applications/antigravity.desktop
/usr/bin/antigravity
/usr/share/antigravity/bin/antigravity
Name=Antigravity
Exec=/usr/share/antigravity/antigravity %F
StartupWMClass=Antigravity

A /usr/share/antigravity target means the legacy APT package owns the wrapper and menu entry. A /opt/antigravity target means the Antigravity 2.0 helper owns the current desktop app instead. Open the legacy IDE from the app menu, or run the desktop-entry executable from an already logged-in graphical terminal:

/usr/share/antigravity/antigravity

Do not use the package’s /usr/bin/antigravity wrapper when checking a launch problem; it is the command wrapper, not the desktop-entry executable.

Start Antigravity CLI from a terminal

Run agy from a project directory when you want the terminal interface. The current directory becomes the main workspace unless you add more paths with --add-dir.

cd ~/projects/example
agy

Authenticate Antigravity CLI on Debian

When no saved session exists, Antigravity CLI uses browser-backed Google sign-in. On a local Debian desktop, agy can open your default browser. In an SSH session, it prints an authorization URL, asks you to open that URL in a local browser, and then prompts for the returned code.

To clear saved CLI credentials later, open agy and run /logout from the prompt.

Run first Antigravity CLI commands

Use print mode for one-shot output from the current directory:

agy --print "Summarize this project and list the safest next setup step."

Seed an interactive session with an initial task:

agy --prompt-interactive "Review this repository and ask before changing files."

Add another directory when a task spans more than one checkout:

agy --add-dir ../shared-library --prompt-interactive "Use both folders as context for this task."

Use sandbox mode when you want stricter terminal restrictions for a read-only review or a cautious first pass:

agy --sandbox --print "Run a read-only project health check and report findings."

Use Antigravity CLI prompt controls

Several controls are typed inside the agy prompt after launch:

Prompt controlPurpose
?Show help inside the CLI.
@Reference files or paths from the workspace.
!Run a shell command from the CLI context.
/config or /settingsOpen CLI configuration.
/permissionsReview approval and tool-permission behavior.
/agentsOpen the subagent panel.
/mcpReview MCP configuration.
/resumeResume an earlier conversation.
/logoutClear the current signed-in CLI session.

If the Debian workstation still needs Git, install Git on Debian first, then configure Git username and email before cloning repositories inside Antigravity.

Official Google Antigravity resources

Update Google Antigravity on Debian

Update Antigravity 2.0 desktop app

The desktop helper checks Google’s download page every time it runs. When the helper-managed install is current, it exits before downloading another tarball. When a newer build is available, it keeps the previous copy under /opt/antigravity.previous after a successful replacement.

sudo update-antigravity
Antigravity 2.0.6 is already installed at /opt/antigravity/Antigravity-x64

Update Antigravity IDE

The IDE helper follows the same pattern and keeps the older IDE copy under /opt/antigravity-ide.previous after a successful replacement:

sudo update-antigravity-ide
Antigravity IDE 2.0.3 is already installed at /opt/antigravity-ide/Antigravity-IDE

Update Antigravity CLI

Use the user-local helper when you want one command for install and later updates:

update-antigravity-cli

After agy is installed, the direct updater is available too:

agy update
Checking for updates... (current version 1.0.2)
You are already on the latest version.

Update the legacy Antigravity IDE APT package

APT can update the legacy package only if Google publishes another build to the APT repository:

sudo apt update
sudo apt install --only-upgrade antigravity

For normal Debian workstation maintenance, update APT-managed packages together:

sudo apt update
sudo apt upgrade

Troubleshoot Google Antigravity on Debian

Antigravity APT still shows version 1.23.2

A 1.23.2 result means APT is reading Google’s legacy repository, not the current desktop or IDE tarball downloads. Use sudo update-antigravity for the Antigravity 2.0 desktop app, use sudo update-antigravity-ide for the current IDE, or rerun apt-cache policy antigravity later if Google starts publishing a 2.x APT package.

Desktop helper reports Antigravity 2.0.1 is already installed

That message usually means the local helper is an older saved copy that still queries Google’s previous auto-updater endpoint. The current desktop helper resolves the Linux tarball from Google’s download page instead.

if [ -f /usr/local/bin/update-antigravity ] && grep -Fq 'antigravity-auto-updater-974169037036' /usr/local/bin/update-antigravity; then
  echo "Old desktop helper detected"
elif [ -f /usr/local/bin/update-antigravity ]; then
  echo "Current download-page helper or a different helper is installed"
else
  echo "No desktop helper is installed"
fi

If the old helper is detected, recreate /usr/local/bin/update-antigravity with the current desktop helper definition and run sudo update-antigravity again.

Desktop or IDE helper fails with a download error

A download 404 or empty resolver result usually means Google’s download page changed or an old helper constructed the wrong URL. Check whether the download page still exposes a JavaScript bundle:

curl -fsSL --compressed https://antigravity.google/download | grep -o 'main-[^"]*\.js' | sed -n '1p'

If the command prints a bundle name, replace the affected helper with the current helper definition and rerun the update. If it prints nothing, check Google’s download, release, and support pages before retrying.

Desktop or IDE helper runs out of temporary space

The helpers stage archives under /var/tmp by default because some systems mount /tmp as a smaller temporary filesystem. If you set TMPDIR yourself, check both paths before rerunning the helper:

if [ -n "${TMPDIR:-}" ]; then
  df -h /var/tmp "$TMPDIR"
else
  df -h /var/tmp
fi

Antigravity desktop or IDE version check fails over SSH

The desktop and IDE binaries initialize graphical components. A headless SSH shell can make antigravity --version or antigravity-ide --version fail with display, X server, or GPU messages. Verify the install with the helper output, readlink -f, desktop file fields, icon files, and sandbox mode checks instead.

Check AppArmor before changing sandbox settings

If Antigravity reports a sandbox or permission error, check the sandbox helper and fresh kernel logs before changing AppArmor or kernel settings. A healthy helper install keeps chrome-sandbox root-owned with mode 4755:

stat -c '%U %G %a %n' /opt/antigravity/Antigravity-*/chrome-sandbox
stat -c '%U %G %a %n' /opt/antigravity-ide/Antigravity-IDE/chrome-sandbox
cat /sys/module/apparmor/parameters/enabled 2>/dev/null || echo MISSING
systemctl is-active apparmor 2>/dev/null || true
sysctl -n kernel.apparmor_restrict_unprivileged_userns 2>/dev/null || echo MISSING
sudo journalctl -k --since "10 minutes ago" --no-pager | grep -iE 'apparmor=.*antigravity|operation=.*userns.*antigravity|profile=.*antigravity' || echo "No recent Antigravity AppArmor entries"

If a sandbox helper is not root root 4755, rerun the matching helper: sudo update-antigravity for the desktop app or sudo update-antigravity-ide for the IDE. Do not make --no-sandbox your normal launcher unless Google documents that as a required workaround and you accept the reduced browser-process isolation.

On Debian 13, 12, and 11, the user-namespace sysctl can print MISSING even while AppArmor is active. That is not the same failure mode as Ubuntu’s newer user-namespace restriction, so do not add an Ubuntu-style IDE AppArmor profile unless a fresh Debian denial names antigravity or antigravity-ide.

Fix a black window or GPU process error

VMs and desktops without working 3D acceleration can fail before Antigravity finishes drawing the window. The common log signs are VMware: No 3D enabled, vaInitialize failed, GPU process launch failed, or GPU process isn't usable. Those messages point to graphics acceleration, not an AppArmor denial.

journalctl --user --no-pager -n 300 | grep -iE 'antigravity|gpu|vaapi|swiftshader' || echo "No recent Antigravity graphics messages"

Start by enabling 3D acceleration for the VM, updating guest tools, or testing from a normal desktop session with working OpenGL. You can try GPU-disabled launches as diagnostics, but keep them separate from the normal launcher unless they prove stable for your session:

antigravity --disable-gpu
antigravity-ide --disable-gpu
ELECTRON_OZONE_PLATFORM_HINT=x11 antigravity --disable-gpu
ELECTRON_OZONE_PLATFORM_HINT=x11 antigravity-ide --disable-gpu

If a diagnostic command works, create a separate fallback desktop launcher instead of editing the normal launcher. Remove the fallback after a Google, Debian, Mesa, VMware, or GPU-driver update fixes the graphics path.

Fix agy command not found

The CLI installer writes agy under ~/.local/bin. Open a new terminal, or add that directory to the current shell before trying again:

export PATH="$HOME/.local/bin:$PATH"
command -v agy

Fix Antigravity CLI sign-in over SSH

If agy cannot open a browser from an SSH session, use the authorization URL printed in the terminal. Open that URL in a local browser, sign in, then paste the returned code back into the SSH terminal when the CLI asks for it.

Fix Antigravity sign-in opening the wrong app

If a sign-in URL opens in a text editor or another wrong application, check Debian’s user-level URL and HTML handlers first. Debian GNOME normally uses firefox-esr.desktop for these handlers when Firefox ESR is installed.

xdg-mime query default x-scheme-handler/https
gio mime text/html | sed -n '1,6p'

Set Firefox ESR as the default browser and HTML handler when those checks point somewhere else:

for mime in x-scheme-handler/http x-scheme-handler/https text/html application/xhtml+xml application/xml text/xml; do
  gio mime "$mime" firefox-esr.desktop
  xdg-mime default firefox-esr.desktop "$mime"
done

xdg-settings set default-web-browser firefox-esr.desktop

If you use another browser, substitute that browser’s desktop file and confirm it exists under /usr/share/applications or ~/.local/share/applications.

Fix legacy APT source or key conflicts

Older examples or manual experiments can leave duplicate Antigravity source files or keyrings behind. Remove the known legacy paths, recreate the current DEB822 source if you still need the legacy package, then refresh APT:

sudo rm -f /etc/apt/sources.list.d/antigravity.list /usr/share/keyrings/google-antigravity.gpg
sudo apt update

Remove Google Antigravity from Debian

Remove Antigravity 2.0 desktop app

Delete the helper-managed desktop app, command link, update helper, desktop launcher, icon files, and saved previous copy:

This removes the system-wide desktop app files under /opt/antigravity. Antigravity profiles, IDE settings, and CLI state live under your home directory and are handled separately so you can keep account and workspace data if needed.

if [ -L /usr/local/bin/antigravity ] && readlink /usr/local/bin/antigravity | grep -q '^/opt/antigravity/'; then
  sudo rm -f /usr/local/bin/antigravity
fi

if [ -f /usr/share/applications/antigravity.desktop ] && grep -q '^Exec=/usr/local/bin/antigravity ' /usr/share/applications/antigravity.desktop; then
  sudo rm -f /usr/share/applications/antigravity.desktop
fi

sudo rm -rf /opt/antigravity /opt/antigravity.previous /opt/antigravity.new /opt/.antigravity-install.*
sudo rm -f /usr/local/bin/update-antigravity \
  /usr/share/applications/antigravity-x11.desktop \
  /usr/share/icons/hicolor/512x512/apps/antigravity.png \
  /usr/share/icons/hicolor/scalable/apps/antigravity.svg

if command -v update-desktop-database >/dev/null 2>&1; then
  sudo update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
fi
if command -v gtk-update-icon-cache >/dev/null 2>&1; then
  sudo gtk-update-icon-cache -q /usr/share/icons/hicolor 2>/dev/null || true
fi
hash -r
if [ ! -e /usr/local/bin/antigravity ]; then
  echo "Antigravity 2.0 command link is removed"
fi

Remove Antigravity IDE

Delete the tarball-managed IDE, previous copy, command link, update helper, desktop launcher, and icon file. This Debian workflow does not create an AppArmor profile, so the main removal command leaves any manually created profile for separate review.

sudo rm -rf /opt/antigravity-ide /opt/antigravity-ide.previous /opt/antigravity-ide.new /opt/.antigravity-ide-install.*
sudo rm -f /usr/local/bin/antigravity-ide \
  /usr/local/bin/update-antigravity-ide \
  /usr/share/applications/antigravity-ide.desktop \
  /usr/share/applications/antigravity-ide-x11.desktop \
  /usr/share/icons/hicolor/512x512/apps/antigravity-ide.png

if command -v update-desktop-database >/dev/null 2>&1; then
  sudo update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
fi
if command -v gtk-update-icon-cache >/dev/null 2>&1; then
  sudo gtk-update-icon-cache -q /usr/share/icons/hicolor 2>/dev/null || true
fi
hash -r
test ! -e /usr/local/bin/antigravity-ide && echo "Antigravity IDE command link is removed"

If you manually created an Antigravity IDE AppArmor profile from another workaround, remove it only after confirming no Antigravity install still uses that local profile:

if [ -f /etc/apparmor.d/antigravity-ide ]; then
	sudo apparmor_parser -R /etc/apparmor.d/antigravity-ide 2>/dev/null || true
	sudo rm -f /etc/apparmor.d/antigravity-ide
fi

if [ -f /etc/apparmor.d/local/antigravity-ide ]; then
	sudo rm -f /etc/apparmor.d/local/antigravity-ide
fi

Remove Antigravity CLI

Remove the user-local CLI binary and update helper:

rm -f "$HOME/.local/bin/agy" "$HOME/.local/bin/update-antigravity-cli"
hash -r
command -v agy || echo "agy command is removed"

Leave the general ~/.local/bin Bash PATH line in place if other user-local tools use it. Remove that shell-profile line only when Antigravity CLI was the only command that needed it.

Remove the legacy Antigravity IDE APT package

Purge the legacy package when it is installed or has residual package state, then remove the Google Antigravity source and keyring files:

if dpkg-query -W -f='${db:Status-Abbrev}\n' antigravity 2>/dev/null | grep -Eq '^(ii|rc)'; then
  sudo apt purge antigravity
fi

sudo rm -f /etc/apt/sources.list.d/google-antigravity.sources /etc/apt/sources.list.d/antigravity.list
sudo rm -f /etc/apt/keyrings/antigravity-repo-key.gpg /usr/share/keyrings/google-antigravity.gpg
sudo apt update

Confirm the legacy package and source file are gone:

dpkg-query -W -f='${db:Status-Abbrev} ${binary:Package}\n' antigravity 2>/dev/null | grep -q '^ii' || echo "antigravity APT package is not installed"
test ! -e /etc/apt/sources.list.d/google-antigravity.sources && echo "google-antigravity.sources is removed"

Delete Antigravity user data

User-data cleanup permanently deletes Antigravity desktop settings, IDE settings, CLI state, cached files, and updater data from your home directory. Back up anything you may need before removing these paths.

Review matching Antigravity paths before deleting anything:

find "$HOME/.config" "$HOME/.cache" "$HOME/.gemini" "$HOME/.antigravity" "$HOME/.antigravity-ide" -maxdepth 2 \( -iname '*Antigravity*' -o -iname '*antigravity*' \) -print 2>/dev/null

Remove the known desktop, IDE, CLI, and migrated agent-state paths when you are ready to discard them:

rm -rf "$HOME/.config/Antigravity" \
  "$HOME/.config/Antigravity IDE" \
  "$HOME/.antigravity" \
  "$HOME/.antigravity-ide" \
  "$HOME/.cache/antigravity" \
  "$HOME/.cache/antigravity-updater" \
  "$HOME/.gemini/antigravity" \
  "$HOME/.gemini/antigravity-ide" \
  "$HOME/.gemini/antigravity-backup" \
  "$HOME/.gemini/antigravity-cli"

Conclusion

Google Antigravity on Debian is cleanest when each surface keeps its own owner: tarball helpers for the current desktop app and IDE, agy for terminal work, and APT only for the legacy 1.x IDE package. For a fuller development workstation, install GitHub Desktop on Debian for graphical Git work or install Docker on Debian for disposable project environments.

Share this guide

Help another Linux user troubleshoot faster

Share this guide with someone troubleshooting Linux systems or saving it for later.

Follow LinuxCapable

Want more LinuxCapable guides in Google?

Add LinuxCapable as a preferred source so Google can show more of our fresh Linux tutorials in Top Stories and From your sources when relevant.

Add LinuxCapable as a preferred source on Google
Search LinuxCapable

Need another guide?

Search LinuxCapable for package installs, commands, troubleshooting, and follow-up guides related to what you just read.

Found this guide useful?

Support LinuxCapable to keep tutorials free and up to date.

Buy me a coffeeBuy me a coffee
Before commenting, please review our Comments Policy.
Formatting tips for your comment

You can use basic HTML to format your comment. Useful tags currently allowed in published comments:

You type Result
<code>command</code> command
<strong>bold</strong> bold
<em>italic</em> italic
<blockquote>quote</blockquote> quote block

Got a Question or Feedback?

We read and reply to every comment - let us know how we can help or improve this guide.

Let us know you are human: