O Google Antigravity IDE possui uma versão oficial para Linux em formato .tar.gz, mas ainda não conta com um instalador .deb específico para Ubuntu e Linux Mint. Por isso, depois de baixar o pacote, pode ser necessário configurar manualmente o programa, o atalho no menu e as permissões do chrome-sandbox.
Para facilitar esse processo, preparei um pequeno gerenciador em Bash. Ele permite:
- instalar o Antigravity em
/opt/antigravity; - criar o atalho no menu de aplicativos;
- tentar extrair e instalar o ícone do programa;
- corrigir as permissões do
chrome-sandbox; - atualizar o programa usando um novo arquivo
.tar.gz; - desinstalar o Antigravity, com opção de apagar também configurações e cache.
Importante: baixe o arquivo somente na página oficial do Google Antigravity, na seção Antigravity IDE. O procedimento abaixo é voltado ao pacote oficial para Linux em formato
.tar.gz, não ao aplicativo independente Antigravity 2.0.
Criando o script
Crie um arquivo chamado antigravity-manager.sh:
nano antigravity-manager.sh Cole o conteúdo abaixo:
#!/usr/bin/env bash
#
# antigravity-manager.sh — instala, atualiza ou remove o Google Antigravity
# em qualquer distro Linux/x86_64 baseada em FHS + freedesktop (Ubuntu, Mint, etc).
#
# Uso:
# ./antigravity-manager.sh install /caminho/para/Antigravity.tar.gz
# ./antigravity-manager.sh update /caminho/para/Antigravity.tar.gz
# ./antigravity-manager.sh uninstall
# ./antigravity-manager.sh uninstall --purge # remove também config/cache do usuário
#
set -euo pipefail
INSTALL_DIR="/opt/antigravity"
DESKTOP_FILE="$HOME/.local/share/applications/antigravity.desktop"
ICON_DIR="$HOME/.local/share/icons/hicolor/512x512/apps"
ICON_FILE="$ICON_DIR/antigravity.png"
TMP_ICON="/tmp/antigravity-icon.png"
DETECTED_BINARY_NAME="antigravity"
log() { printf '\033[1;34m[antigravity]\033[0m %s\n' "$1" >&2; }
err() { printf '\033[1;31m[erro]\033[0m %s\n' "$1" >&2; }
die() { err "$1"; exit 1; }
load_nvm_if_present() {
# Scripts rodados como './script.sh' são shells NÃO-interativos e não
# carregam ~/.bashrc, então o nvm (que só é adicionado lá) fica de fora
# do PATH mesmo que funcione normalmente no seu terminal.
if ! command -v npx >/dev/null 2>&1; then
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
if [[ -s "$NVM_DIR/nvm.sh" ]]; then
# shellcheck disable=SC1091
source "$NVM_DIR/nvm.sh" >/dev/null 2>&1 || true
fi
fi
}
check_deps() {
command -v tar >/dev/null 2>&1 || die "tar não encontrado."
load_nvm_if_present
if ! command -v npx >/dev/null 2>&1; then
err "npx não encontrado no PATH (mesmo tentando carregar nvm de \$HOME/.nvm)."
err "A instalação vai continuar SEM ícone customizado. Rode 'nvm use' e"
err "reexecute o script depois, se quiser corrigir o ícone."
return 1
fi
return 0
}
extract_tarball() {
local tarball="$1"
[[ -f "$tarball" ]] || die "Arquivo não encontrado: $tarball"
local workdir
workdir="$(mktemp -d)"
log "Extraindo $tarball em $workdir ..."
tar -xzf "$tarball" -C "$workdir"
# Procura por um binário cujo nome comece com "antigravity" (qualquer caixa),
# já que o app desktop usa 'antigravity' mas a IDE pode vir como
# 'Antigravity-IDE', 'antigravity-ide', etc.
local candidates
candidates="$(find "$workdir" -maxdepth 3 -type f -iname 'antigravity*' \
! -iname '*.so' ! -iname '*.json' ! -iname '*.png' \
! -iname '*.pak' ! -iname '*.dll' ! -iname '*.dat' \
! -iname '*.bin' ! -iname '*.desktop')"
if [[ -z "$candidates" ]]; then
err "Estrutura extraída (para depuração):"
find "$workdir" -maxdepth 3 >&2
die "Não encontrei nenhum binário começando com 'antigravity' dentro do tarball."
fi
local count
count="$(echo "$candidates" | wc -l)"
local chosen
if [[ "$count" -eq 1 ]]; then
chosen="$candidates"
else
# Múltiplos candidatos (ex: 'bin/antigravity-ide' vs 'antigravity-ide'
# na raiz). O que importa é achar a raiz REAL do app Electron, que é
# a pasta que também contém 'chrome-sandbox' ao lado do binário.
# Entre os que atendem isso, prefere o de caminho mais curto (mais
# próximo da raiz do tarball).
chosen="$(echo "$candidates" | while read -r f; do
d="$(dirname "$f")"
if [[ -e "$d/chrome-sandbox" ]]; then
# imprime profundidade + caminho para ordenar por rasos primeiro
depth="$(echo "$f" | tr -cd '/' | wc -c)"
echo "$depth $f"
fi
done | sort -n | head -n1 | cut -d' ' -f2-)"
if [[ -z "$chosen" ]]; then
err "Nenhum candidato tem chrome-sandbox ao lado; usando o primeiro da lista."
chosen="$(echo "$candidates" | head -n1)"
fi
err "Vários candidatos encontrados, usando: $chosen"
err "Candidatos completos:"
echo "$candidates" >&2
fi
chmod +x "$chosen" 2>/dev/null || true
printf '%s|%s\n' "$(dirname "$chosen")" "$(basename "$chosen")"
}
fix_sandbox() {
log "Ajustando permissões do chrome-sandbox..."
sudo chown root:root "$INSTALL_DIR/chrome-sandbox"
sudo chmod 4755 "$INSTALL_DIR/chrome-sandbox"
local perms
perms="$(stat -c '%a' "$INSTALL_DIR/chrome-sandbox")"
[[ "$perms" == "4755" ]] || die "Falha ao aplicar permissões setuid no chrome-sandbox."
log "chrome-sandbox OK (4755, root:root)."
}
extract_icon() {
if ! command -v npx >/dev/null 2>&1; then
err "npx indisponível — pulando extração de ícone."
return 1
fi
log "Extraindo ícone do app.asar..."
rm -f "$TMP_ICON"
npx --yes asar extract-file "$INSTALL_DIR/resources/app.asar" icon.png 2>/dev/null || true
if [[ -f "./icon.png" ]]; then
mv "./icon.png" "$TMP_ICON"
fi
if [[ ! -f "$TMP_ICON" ]]; then
err "Não consegui extrair /icon.png do app.asar. O app funcionará, mas sem ícone customizado."
return 1
fi
return 0
}
install_icon() {
mkdir -p "$ICON_DIR"
if [[ -f "$TMP_ICON" ]]; then
mv "$TMP_ICON" "$ICON_FILE"
log "Ícone instalado em $ICON_FILE"
fi
}
write_desktop_entry() {
mkdir -p "$(dirname "$DESKTOP_FILE")"
cat > "$DESKTOP_FILE" <<EOF
[Desktop Entry]
Name=Antigravity
Comment=Google Antigravity IDE
Exec=$INSTALL_DIR/$DETECTED_BINARY_NAME %U
Terminal=false
Type=Application
Icon=antigravity
Categories=Development;IDE;
StartupNotify=true
StartupWMClass=Antigravity
MimeType=x-scheme-handler/antigravity;
EOF
chmod +x "$DESKTOP_FILE"
log "Entrada de menu criada em $DESKTOP_FILE"
}
refresh_desktop_db() {
update-desktop-database "$HOME/.local/share/applications" 2>/dev/null || true
gtk-update-icon-cache -t "$HOME/.local/share/icons/hicolor" 2>/dev/null || true
if command -v desktop-file-validate >/dev/null 2>&1; then
if desktop-file-validate "$DESKTOP_FILE"; then
log "Arquivo .desktop validado com sucesso."
else
err "desktop-file-validate encontrou problemas no .desktop (veja acima)."
fi
fi
}
do_install_or_update() {
local tarball="$1"
local mode="$2" # "install" ou "update"
check_deps || true
local extracted_result extracted_dir
extracted_result="$(extract_tarball "$tarball")"
extracted_dir="${extracted_result%%|*}"
DETECTED_BINARY_NAME="${extracted_result##*|}"
if [[ "$mode" == "update" ]]; then
log "Removendo instalação anterior em $INSTALL_DIR ..."
sudo rm -rf "$INSTALL_DIR"
elif [[ -d "$INSTALL_DIR" ]]; then
die "$INSTALL_DIR já existe. Use 'update' para substituir a instalação atual."
fi
log "Movendo para $INSTALL_DIR (requer sudo)..."
sudo mv "$extracted_dir" "$INSTALL_DIR"
fix_sandbox
if extract_icon; then
install_icon
fi
write_desktop_entry
refresh_desktop_db
log "Instalação concluída. Procure por 'Antigravity' no menu de aplicativos."
log "Se não aparecer de imediato, saia e entre na sessão novamente, ou rode: gtk-launch antigravity.desktop"
}
do_uninstall() {
local purge="${1:-}"
log "Removendo $INSTALL_DIR (requer sudo)..."
sudo rm -rf "$INSTALL_DIR"
rm -f "$DESKTOP_FILE" "$ICON_FILE"
refresh_desktop_db
if [[ "$purge" == "--purge" ]]; then
log "Removendo config/cache do usuário (--purge)..."
rm -rf "$HOME/.config/Antigravity" \
"$HOME/.cache/Antigravity" \
"$HOME/.config/antigravity-updater"
fi
log "Desinstalação concluída."
}
usage() {
cat <<EOF
Uso:
$0 install <caminho-para-Antigravity.tar.gz>
$0 update <caminho-para-Antigravity.tar.gz>
$0 uninstall [--purge]
install - primeira instalação (falha se já existir)
update - substitui a instalação existente pelo tarball novo
uninstall - remove app, ícone e .desktop; use --purge para também
apagar config/cache do usuário
EOF
}
main() {
local cmd="${1:-}"
case "$cmd" in
install)
[[ $# -eq 2 ]] || { usage; exit 1; }
do_install_or_update "$2" "install"
;;
update)
[[ $# -eq 2 ]] || { usage; exit 1; }
do_install_or_update "$2" "update"
;;
uninstall)
do_uninstall "${2:-}"
;;
*)
usage
exit 1
;;
esac
}
main "$@" Salve o arquivo e dê permissão de execução:
chmod +x antigravity-manager.sh Instalando o Antigravity
Considerando que o pacote esteja na pasta Downloads, execute:
./antigravity-manager.sh install "$HOME/Downloads/Antigravity.tar.gz" Troque Antigravity.tar.gz pelo nome exato do arquivo baixado. O terminal solicitará sua senha porque a aplicação será instalada dentro de /opt.
Ao terminar, procure por Antigravity no menu de aplicativos.
Atualizando
Baixe a versão mais recente do .tar.gz e rode:
./antigravity-manager.sh update "$HOME/Downloads/Antigravity.tar.gz" O script substituirá a instalação anterior e manterá as configurações do usuário.
Desinstalando
Para remover apenas o programa, o ícone e o atalho:
./antigravity-manager.sh uninstall Para remover também as configurações e o cache do usuário:
./antigravity-manager.sh uninstall --purge Use --purge com cuidado, pois essa opção apaga as preferências locais do Antigravity.
Observação sobre o ícone
O npx é usado somente para tentar extrair o ícone de dentro do arquivo app.asar. Caso o Node.js ou o npx não estejam instalados, o Antigravity continuará funcionando, mas poderá aparecer no menu sem o ícone personalizado.
Essa é uma solução prática para instalar e administrar manualmente a versão compactada do Antigravity IDE enquanto não existe um pacote .deb específico para Ubuntu e distribuições derivadas.
Referências:download oficial e versões anteriores.