A second front door to your own Antigravity — one that fixes the mobile web UI,
keeps the UI off Google's relay, and runs unattended on a cheap Linux box.
| Official remote | Same server, through agy-server |
|---|---|
![]() |
![]() |
No + on a project. No ⋮ on a conversation. |
New conversation per project, and delete / rename / pin / archive per row. |
One headless Linux box, two front doors, minutes apart.
Google now ships an official remote bridge at antigravity.google.com: sign in with the same account and you reach every machine of yours that is running Antigravity with remote access enabled. Reaching your own agent from a phone is no longer something this project has to provide — and a headless Linux server shows up in that list too.
What the official bridge hands your phone is the desktop web bundle, unchanged. That is where agy-server earns its place: it sits in front of the same Antigravity core as a second, direct front door, and rewrites that bundle on the way out so a touch screen can actually use it.
The two are not exclusive. agy-server only enables the same remoteControlEnabled setting the official bridge uses, so one machine can serve both at once — use whichever address suits you.
Official remote (antigravity.google.com) |
Antigravity Server (agy-server) |
|
|---|---|---|
| Mobile web UI | The desktop bundle as-is | 25 named runtime patches for touch |
| Conversation control | No delete, pin, or archive on mobile | Delete, Rename, Pin, Archive from the kebab menu and titlebar |
| Project navigation | No project (+) button; switch via the bottom input |
Restored (+) button in project list headers |
| Message actions | Undo and Copy live behind hover states | Undo (↶) and Copy (📋) always visible on touch |
| iOS keyboard fit | Bottom safe-area gap remains; viewport jumps on focus | Safe-area collapse, top header pinning, and conversation height adaptation above keyboard |
| File uploads | 1MB RPC text limit | Chunked streaming uploader for large logs, HARs, and datasets |
| Connection path | Relayed through Google's servers | Direct — your own domain, LAN, or VPN |
| Access without a Google account | Not possible — the account is the gate | Your own password (PBKDF2), sessions, and rate limiting |
Run Antigravity on a headless Linux instance (Oracle Cloud Free Tier, AWS, DigitalOcean, or a home server):
curl -fsSL https://raw.githubusercontent.com/AFSlayer/antigravity-server/main/scripts/install.sh | bashThe installer:
- Prompts for your domain (e.g.
agy.example.com) and workspace root. - Downloads
language_serverdirectly from Google's official build bucket (storage.googleapis.com). No Google binaries are redistributed. - Configures Caddy for automatic HTTPS, creates a systemd service, and sets access credentials.
When accessing your server for the first time:
- Direct Web Login: Open the Web UI, navigate to Settings, and complete Google authentication directly in your browser.
- Or Copy Existing Token (Optional): If you already logged in on a local desktop, you can copy your token to skip re-authenticating:
scp ~/.gemini/jetski-standalone-oauth-token user@your-server:~/.gemini/
To expose a local desktop Antigravity instance over your local network:
# macOS & Linux
curl -fsSL https://raw.githubusercontent.com/AFSlayer/antigravity-server/main/scripts/install-desktop.sh | bash# Windows (PowerShell)
irm https://raw.githubusercontent.com/AFSlayer/antigravity-server/main/scripts/install-desktop.ps1 | iexagy-server opens a local control panel with a QR code. Scan the code from a phone on the same network to connect without typing a password.
Antigravity Server supports the Progressive Web App (PWA) standard. Adding it to your mobile home screen launches the interface in a fullscreen, standalone view with no browser address bar or navigation buttons:
- iOS (Safari): Tap the Share button (
⎋) → Select Add to Home Screen. - Android (Chrome): Tap the Menu (
⋮) → Select Install app or Add to Home screen.
Tip
Running in standalone PWA mode ensures virtual keyboard transitions and 0px safe-area collapse operate smoothly without browser toolbar jumps.
- Touch-Friendly Controls: Undo (
↶) and Copy (📋) buttons remain permanently visible on mobile message bubbles. - Full Conversation Management: Delete conversations via the titlebar menu and toggle Pin/Archive directly from the history dropdown.
- Precise Keyboard Tracking: Automatically collapses safe area insets to 0px and pins top navigation bar while adapting conversation height.
Standard Antigravity restricts file attachments via a 1MB RPC limit. agy-server injects a chunked streaming uploader to transfer large logs, datasets, or HAR files directly into your workspace:
In addition to mobile devices, Antigravity Server runs smoothly in any modern desktop browser:
On headless Linux servers, agy-server includes a background auto-updater service:
- Checks Google's official release buckets daily for new
language_serverversions. - Downloads and replaces the core binary atomically with zero downtime.
- Manual check & upgrade: run
agy-server update.
Manage your agent instructions (~/.gemini/GEMINI.md, ~/.gemini/config/skills/) and project rules directly within the web UI:
- Open Settings → Customizations.
- Click the native Edit button next to rules or skills to expand an inline code editor.
- Updates are saved atomically to the host filesystem with instant effect.
Antigravity uses Server-Sent Events (SSE), WebSocket connections, and chunked streaming. If running behind a custom reverse proxy, disable proxy buffering and configure WebSocket upgrades:
agy.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:8765 {
flush_interval -1
}
}server {
listen 443 ssl http2;
server_name agy.example.com;
# Allow large chunked streaming uploads
client_max_body_size 0;
location / {
proxy_pass http://127.0.0.1:8765;
proxy_http_version 1.1;
# WebSocket support
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Disable buffering for real-time agent token streaming
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 86400s;
# Forward real client IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Important
When running behind a reverse proxy, pass --trusted-proxies 127.0.0.1/32 (or set AGY_TRUSTED_PROXIES=127.0.0.1/32) so brute-force rate limiters inspect the genuine client IP rather than the proxy.
Antigravity includes a standalone binary named language_server. When run with --standalone, it serves the Antigravity Web UI on 127.0.0.1.
agy-server acts as a reverse proxy to:
- Handle authentication (PBKDF2 hashing, cookie sessions, rate-limiting).
- Apply on-the-fly JS/CSS patches for touch devices.
- Provide a chunked streaming endpoint for large file uploads.
Phone / Tablet / Laptop Browser
│
▼ HTTPS (Port 443 / 8765)
┌──────────────────────────────────────────────┐
│ agy-server (Reverse Proxy & Auth) │
│ - PBKDF2 Session & Rate Limiting │
│ - Chunked Streaming Uploader (/uploads) │
│ - On-the-fly Web Bundle Patcher │
└──────────────────────┬───────────────────────┘
│ localhost
▼
┌──────────────────────────────────────────────┐
│ language_server --standalone │
│ - Official Antigravity Core & Agent Engine │
│ - Terminal, File Tree, Artifacts, Composer │
└──────────────────────┬───────────────────────┘
│ gRPC
▼
Google CloudCode API
The web bundle Antigravity serves — through the official remote bridge or through agy-server — is the desktop one. agy-server rewrites it in flight. The registry in internal/patches/registry.go holds 44 patches, 25 of them touch-specific and the rest covering uploads, sign-in and cache busting. A sample:
| Category | Desktop Bundle Behavior | agy-server Patch |
|---|---|---|
| Navigation | Project (+) button omitted on mobile screens |
Restores the (+) New Conversation button next to each project row |
| Conversation Actions | No delete, pin, or archive on touch | Adds Delete, Pin, and Archive to the ⋮ kebab menu and titlebar |
| Message Actions | Undo and Copy buttons hidden behind hover states | Displays Undo (↶) and Copy (📋) buttons on touch devices |
| Virtual Keyboard & Scroll | iOS Safari viewport bounces and leaves blank gaps on scroll | Dynamic visualViewport offset tracking, 0px safe-area collapse, and pinned conversation layout |
| File Uploads | 1MB RPC payload limit fails on logs or datasets | Streams files asynchronously to disk via chunked streaming endpoint |
| Touch Interaction | 300ms tap delay and double-tap zoom | Sets touch-action: manipulation for immediate touch response |
| Input Behavior | Mobile Enter key sends message instead of newline | Enter creates a newline; Send button or Cmd/Ctrl+Enter submits |
| Model Selection | Tapping a model closes the menu immediately | Opens the reasoning effort submenu on tap |
Run agy-server doctor to inspect the status of all patches against your installed bundle.
agy-server Start in desktop companion mode (local network)
agy-server serve Run as a headless server daemon
agy-server update Check and update language_server to latest upstream
agy-server doctor Verify patch integrity and system status
agy-server passwd [password] Set or reset web access password
agy-server sessions [revoke] List active sessions or revoke all devices
agy-server config [flags] Manage configuration in config.json
All CLI flags can be set via environment variables prefixed with AGY_ (e.g. AGY_PORT=8765, AGY_PUBLIC_URL=https://agy.example.com).
- Password Protection: Passwords are hashed with PBKDF2-SHA256 (200,000 iterations).
- Session Tokens: 256-bit random tokens; only SHA-256 hashes are stored on disk.
- Brute-Force Protection: 5 failed login attempts trigger an IP lockout (5 to 30 minutes).
- Upload Isolation: File uploads are restricted to the configured project directory; path traversal attempts (
../) are rejected. - Trusted Proxies: Set
--trusted-proxieswhen running behind Nginx, Caddy, or Cloudflare to prevent header spoofing.
Google already has an official remote. Do I still need this?
Only if the official mobile web UI gets in your way, or you would rather not relay through Google's servers and would rather gate access with your own password. Both can run on the same machine; nothing here disables the official bridge.
Does this require the Antigravity desktop GUI on Linux?
No. agy-server runs the core language_server binary headlessly.
Will updates from Google break the patches?
Patches use adaptive regular expressions that match structural AST patterns rather than exact variable names. Run agy-server update to pull official upstream releases safely.
Does my code pass through third-party servers?
No. Traffic flows directly between your client browser and your server instance. The only external connection is language_server communicating with Google's API.
Apache-2.0. Not affiliated with or endorsed by Google. See DISCLAIMER.md.





