Antspace: De verborgen Vercel-concurrent van Anthropic

Wat zit er in Claude Code Web? Een niet-gestript Go-binary, het geheime deploymentplatform van Anthropic en de architectuur van een AI-native PaaS.

Het startpunt

Wij bouwen aan ArcBox, een full-stack platform van desktop tot platform, met een positionering die vergelijkbaar is met Railway en E2B. Onze kernfilosofie is lokale-cloud-consistentie: het vervangen van OrbStack door een volledig open-source ArcBox Desktop die lokaal sandbox-mogelijkheden biedt.

Onlangs merkten we op dat steeds meer Coding Agent-platforms webgebaseerde toegangspunten lanceren, en opmerkelijk genoeg kozen bijna al deze platforms voor Firecracker onder de motorkap. Claude Code is daarop geen uitzondering. Als vakgenoten in dezelfde sector leidde nieuwsgierigheid naar de runtime-omgeving tot nader onderzoek. Wat begon als een casual strace -p 1, groeide uit tot een volledige reverse-engineering sessie die niet-uitgebrachte infrastructuur van Anthropic blootlegde, inclusief een volledig ongedocumenteerd platform voor het hosten van applicaties.

Alles wat hier wordt beschreven is ontdekt via standaard Linux-tooling (strace, strings, objdump, go tool objdump) binnen een Claude Code-sessie. Er zijn geen exploits, privilege escalaties of netwerkaanvallen gebruikt. Het binary-bestand was gewoon aanwezig, niet-gestript en voorzien van volledige debug-symbolen.

Laag 1: Een Firecracker MicroVM

De eerste vraag was: wat is deze omgeving precies?

$ dmesg | grep FIRECK
ACPI: RSDP 0x00000000000E0000 000024 (v02 FIRECK)
ACPI: XSDT ... (v01 FIRECK FCMVXSDT ... FCAT 20240119)
ACPI: FACP ... (v06 FIRECK FCVMFADT ... FCAT 20240119)
ACPI: DSDT ... (v02 FIRECK FCVMDSDT ... FCAT 20240119)

De ACPI-tabellen zijn ondertekend met OEM ID FIRECK en creator ID FCAT, beide hardcoded in de broncode van Firecracker. Dit is dezelfde MicroVM-technologie die AWS Lambda en Fargate aandrijft.

Specificaties:

  • CPU: 4 vCPUs (Intel Xeon Cascade Lake @ 2.80GHz)
  • RAM: 16GB
  • Schijf: 252GB
  • Kernel: Linux 6.18.5
  • Virtualisatie: Geen nested virtualization (Firecracker verwijdert opzettelijk vmx/svm-flags van guests).

De procesboom is extreem minimaal:

  • PID 1: /process_api --firecracker-init --addr 0.0.0.0:2024 ...
  • PID 517: /usr/local/bin/environment-manager task-run --session cse_...
  • PID 532: claude (de CLI zelf)

Er is geen systemd, sshd, cron of logging-daemon. PID 1 is een custom binary die fungeert als zowel de init-procedure als een WebSocket API-gateway. De kernel-commandline bevestigt dit:

rdinit=/processapi initon_free=1 -- --firecracker-init reboot=k panic=1 nomodule

Een strace op PID 1 laat zien dat er een epoll-eventloop draait, die periodiek /proc//children en /proc//status controleert om kinderprocessen te monitoren. In feite is het een minimale init-supervisor die luistert op poort 2024 (WebSocket API) en poort 2025 (secundair eindpunt).

De snapshot-architectuur

Sessies worden niet vanaf nul opgestart, maar worden hersteld vanuit bevroren VM-snapshots. De dmesg-output onthult een gat van 48,5 uur tussen de creatie van het template en het herstel van de sessie:

[ 30.731516] Run /processapi as init process ← Template: 2026-03-16 13:53 UTC ~ 48.5 UUUR GAP — VM WAS FROZEN AS SNAPSHOT ~ [174695.927758] virtioblk: [vdc] new size: ... ← Restored: 2026-03-18 14:24 UTC

Tijdens het herstel wisselt de Firecracker-host block-devices uit:

DeviceVoor herstelNa herstelInhoud
vdaplaceholder256 GiB ext4Session rootfs (Ubuntu 24.04)
vdbplaceholder63.7 MB squashfs/opt/claude-code
vdcplaceholder12.1 MB squashfs/opt/env-runner

De initramfs is bewust minimaal: een cpio-archief van 3,1 MB dat alleen /process_api bevat. De eigenlijke Ubuntu rootfs bevindt zich op het ext4-block-device (vda) en wordt geïnjecteerd tijdens het herstel.

Snapstart: Het uitgestelde mount-patroon

Fase 1: Creatie vanHet Template

  1. Firecracker boot: kernel + 3,1 MB initramfs.
  2. process_api voert minimale init uit: mount /proc, /sys, /dev, cgroups; configureert netwerking (IP=192.0.2.2/24, GW=192.0.2.1, MTU=1400).
  3. Geeft SNAPSTART_READY door aan de host.
  4. Host roept PUT /snapshot/create aan → slaat de volledige VM-status op.

Fase 2: Herstel van de Sessie

  1. Host bereidt sessie-specifieke block-devices voor (vda/vdb/vdc).
  2. Host roept PUT /snapshot/load aan met nieuwe device backends.
  3. VM hervat → kernel detecteert device-wijzigingen, reseedt CRNG.
  4. process_api detecteert herstel en voert het volgende uit:
  • Drop page caches (om te voorkomen dat oude template-cache garbage retourneert).
  • Remount devtmpfs (ververs device nodes).
  • Mount ext4 → pivot_root naar nieuwe rootfs.
  • Mount squashfs overlays (claude-code, env-runner).
  • Corrigeert de klok via clock_settime() (anders blijft deze steken op het tijdstip van het template).
  • Drop CAPSYSRESOURCE (beveiligingsharding).
  • Accepteert verbindingen → WebSocket server is klaar.

Beveiligingsmaatregelen

MaatregelDoel
initonfree=1Wissen van vrijgegeven pagina's tussen sessies
CAPSYSRESOURCE dropBeperken van mogelijkheden van PID 1 na init
CRNG reseedVoorkomen van cryptografische voorspelbaarheid bij snapshot forks
--block-local-connectionsBlokkeren van localhost WebSocket-toegang
JWT-authenticatieVerificatie van WebSocket-verbindingen
Token scrubbingVerwijderen van geheimen uit configuraties na gebruik

process_api: Het wire-protocol

PID 1 exposeert twee netwerkinterfaces: een WebSocket API voor procesbeheer en een HTTP API voor containerbeheer. In tegenstelling tot typische init-systemen is process_api een Rust/tokio-binary die een volledige remote proces-supervisor implementeert.

WebSocket API (poort 2024)

De verbinding begint met een handshake: optionele JWT → ProcessConnection JSON → procescreatie of herkoppeling.

Bij de creatie van een proces wordt een CreateProcess struct geaccepteerd met parameters zoals cmd, args, env, cwd, rows, cols, timeout, memorylimitbytes, uid, gid en allowprocessid_reuse.

De I/O maakt gebruik van een tweefasen binair protocol:

  • Stdin: ExpectStdIn (tekst) → binair frame.
  • Stdout/Stderr: ExpectStdOut/ExpectStdErr (tekst) → binair frame → StdOutEOF/StdErrEOF.

Intern beheert processapi per-proces cgroups (v1 op /sys/fs/cgroup/memory/processapi/ en v2 op /sys/fs/cgroup/process_api/), implementeert orphan adoption (reparenting naar PID 1) en draait een configureerbare OOM-polling loop.

HTTP Control API (poort 2025)

Zes endpoints beheren de levenscyclus van de container:

  • GET /status: Health check.
  • POST /fs_sync: Flush van filesystem buffers.
  • POST /shutdown: Graceful shutdown met page cache drop.
  • POST /authpublickeySet: JWT-verificatiesleutel.
  • POST /mount_root: Mount rootfs (snapstart restore).
  • POST /container_name: Identiteit van de container instellen.

Het /mount_root endpoint accepteert een MountRootConfig met netwerkconfiguraties, CA-certificaten, squashfs-mounts, FUSE-mounts en het tijdstip van de muurklok. Tijdens het mounten wordt de root bevroren via FIFREEZE/FITHAW ioctls.

Laag 2: Het niet-gestripte Go-binary

De echte ontdekking was /usr/local/bin/environment-runner (gesymlinked als environment-manager):

$ file /usr/local/bin/environment-runner
ELF 64-bit LSB executable, x86-64, dynamically linked,
Go BuildID=..., with debug_info, not stripped

$ go version -m /usr/local/bin/environment-runner
go1.25.7
path    github.com/anthropics/anthropic/api-go/environment-manager
mod     github.com/anthropics/anthropic/api-go  (devel)
build   -ldflags=-X main.Version=staging-68f0dff496

Dit is een Go-binary van 27MB. Niet-gestript, met volledige debug-informatie en symbolentabellen. Het is gebouwd vanuit de private monorepo van Anthropic op github.com/anthropics/anthropic/api-go/environment-manager/.

Door go tool objdump en strings te gebruiken, kon de volledige interne pakketstructuur worden geëxtraheerd:

  • internal/api/: API-client (sessie-ingress, work polling, retry).
  • internal/auth/: GitHub app token provider.
  • internal/claude/: Installatie, upgrade en executie van Claude Code.
  • internal/config/: Sessiemodi (new/resume/resume-cached/setup-only).
  • internal/envtype/: Implementaties voor anthropic (hosted) en byoc (Bring Your Own Cloud).
  • internal/gitproxy/: Git credential proxy server.
  • internal/manager/: Sessiebeheer, MCP-configuratie, skill-extractie.
  • internal/mcp/servers/: MCP-servers voor onder andere codesign en supabase.
  • internal/orchestrator/: Poll-loop, hooks, whoami.
  • internal/podmonitor/: Kubernetes lease manager.
  • internal/tunnel/actions/deploy/: Het meest interessante onderdeel: deployment-logica.

Belangrijkste afhankelijkheden:

  • github.com/anthropics/anthropic/api-go: Interne Anthropic Go SDK.
  • github.com/mark3labs/mcp-go v0.37.0: Model Context Protocol.
  • github.com/DataDog/datadog-go v5: Metrics reporting.
  • go.opentelemetry.io/otel v1.39.0: Distributed tracing.
  • google.golang.org/grpc v1.79.0: gRPC voor sessie-routing.

Laag 3: Antspace, het verborgen PaaS van Anthropic

Binnen het tunnel/actions/deploy/ pakket zijn functiesymbolen gevonden voor twee deployment-clients. De eerste is de verwachte: VercelClient (met methoden als CreateDeployment, UploadFile en WaitForReady).

De tweede is echter onverwacht: AntspaceClient. Methoden zijn onder andere: deploy.(*AntspaceClient).Deploy, createDeployment, uploadTarball en streamStatus.

Het extraheren van de bijbehorende strings onthulde een compleet deployment-protocol:

  1. Fase 1: Deployment aanmaken. POST naar antspaceControlPlaneURL met app-naam en metadata.
  2. Fase 2: Build-artifact uploaden. POST multipart/form-data van dist.tar.gz. Er is een strikte limiet op de bestandsgrootte.
  3. Fase 3: Status streamen. Respons in application/x-ndjson (streaming) met statusstappen: packaginguploadingbuildingdeployingdeployed.

Een zoektocht naar "Antspace" op het publieke internet leverde niets op: geen website, GitHub, blogs, documentatie of vacatures. Dit platform is nooit publiekelijk genoemd. De naam is waarschijnlijk een combinatie van "Ant" (een interne bijnaam voor Anthropic-medewerkers) en "Space" (hostingruimte).

Antspace vs. Vercel: Architecturale verschillen

AspectVercelAntspace
Bestands-uploadSHA-gebaseerde dedup, per bestandEnkelvoudig tar.gz archief
BuildRemote (Vercel bouwt het)Lokaal npm run build, upload output
StatusPolling-gebaseerdStreaming NDJSON
AuthenticatieVercel API token + Team IDBearer token + dynamische control plane URL
Publieke APIJa, gedocumenteerdNee, volledig intern

Het feit dat Anthropic een volledig deployment-protocol vanaf nul heeft gebouwd, in plaats van simpelweg de Vercel API te wrappen, wijst erop dat dit een strategische investering is in hun eigen platform.

Laag 4: Baku, de webapp-builder

"Baku" is de interne codenaam voor de webapp-builder ervaring op claude.ai. Wanneer je Claude vraagt om een webapplicatie te bouwen, start hij een Baku-omgeving.

Uit de embedded resources in het binary blijkt het volgende:

  • Project Template: Gebruikt Vite + React + TypeScript vanuit /opt/baku-templates/vite-template. Er is een automatisch beheerde dev-server via supervisord.
  • Supabase Auto-Provisioning: Zes MCP-tools zijn automatisch beschikbaar voor het aanmaken van databases, het uitvoeren van SQL-queries, het beheren van migraties en het deployen van Edge Functions. Omgevingsvariabelen (SUPABASE_URL, etc.) worden automatisch naar .env.local geschreven.
  • Stop Hooks: De Baku-omgeving heeft een pre-stop hook die voorkomt dat de sessie eindigt als er niet-gecommitte Git-wijzigingen zijn, als de Vite-log fouten bevat of als tsc --noEmit TypeScript-fouten rapporteert.
  • Default Deploy Target: Antspace, niet Vercel. Hoewel Vercel als alternatief bestaat, gaat het native pad van Baku via het eigen platform van Anthropic.

Laag 5: BYOC (Bring Your Own Cloud)

Het envtype/ pakket bevat twee implementaties: anthropic (hosted op Firecracker MicroVM's) en byoc (Bring Your Own Cloud).

BYOC stelt zakelijke klanten in staat om environment-runner in hun eigen infrastructuur te draaien, terwijl de sessies worden georkestreerd door de API van Anthropic. Kenmerken zijn onder andere:

  • Sessiemodus: resume-cached voor de snelste restarts.
  • Kubernetes-integratie: Het podmonitor pakket implementeert lease-management.
  • API-oppervlak: Bevat endpoints voor identiteitsontdekking, work polling, sessiecontext, code-ondertekening, een worker WebSocket en een Supabase DB query-proxy.

Het strategische plaatje

We kijken hier naar een verticaal geïntegreerd AI-applicatieplatform:

  1. De gebruiker beschrijft wat hij wil (natuurlijke taal).
  2. Claude genereert de applicatie (Baku-omgeving).
  3. De Supabase-database wordt automatisch geprovisioneerd (MCP-tools).
  4. De applicatie wordt gedeployed naar Antspace (het PaaS van Anthropic).
  5. De applicatie is live, zonder dat de gebruiker het ecosysteem van Anthropic heeft verlaten.

Dit is niet zomaar een AI-codeassistent. Het is de architectuur van een AI-native PaaS waarbij de reis van idee naar productie volledig binnen de infrastructuur van Anthropic plaatsvindt. Dit positioneert Anthropic direct als concurrent van Vercel/Netlify (hosting), Replit/Lovable/Bolt (AI-generatie) en Supabase/Firebase (managed backend).

Het structurele voordeel is dat Anthropic de volledige stack bezit: van het LLM dat de intentie begrijpt, tot de runtime die de code bouwt, tot het platform dat de applicatie host.

Methodologie

Alle bevindingen zijn verkregen via standaard Linux-tools binnen een eigen Claude Code-sessie:

  1. Hypervisor identificeren: dmesg | grep FIRECK onthulde de ACPI-tabellen en daarmee Firecracker.
  2. PID 1 identificeren: cat /proc/1/cmdline toonde /process_api als custom init.
  3. Go-metadata extraheren: go version -m op de environment-runner binary gaf de versie, module-pad en afhankelijkheden.
  4. Pakketstructuur herstellen: Omdat het binary niet-gestript was, leverde objdump -t de volledige functienamen en architectuurboom op.
  5. Strings extraheren: Zoeken naar specifieke byte-sequenties (zoals dist.tar.gz) en struct-tag patronen (json:"status") onthulde de wire-protocollen.
  6. Feature mapping: objdump -t binary | grep 'deploy\.' bracht de methoden van de Vercel- en Antspace-clients in kaart.
  7. Runtime observatie: strace -p 1 bevestigde de epoll-eventloop en WebSocket-communicatie.

Slotbeschouwingen

Het versturen van een niet-gestript binary met volledige debug-symbolen naar productie is een opvallende keuze; het maakte deze analyse triviaal. Wat normaal uren aan decompilatie in Ghidra zou vereisen, kon worden gedaan met objdump en grep.

Antspace bevindt zich duidelijk nog in een vroege of interne fase (de versie-string begint met staging-), maar het deployment-protocol is volwassen en production-grade. Of Anthropic dit als publiek product zal lanceren of intern zal houden voor de Claude-ervaring, blijft te zien. Wat duidelijk is, is dat de ambities van Anthropic verder gaan dan alleen LLM's; ze bouwen de infrastructuur voor een wereld waarin applicaties simpelweg "gesproken" worden, en ze willen elke laag van die stack bezitten.

***

Alle analyses zijn uitgevoerd op 18 maart 2026, binnen een Claude Code Web-sessie op een Firecracker MicroVM met kernel 6.18.5, environment-runner versie staging-68f0dff496.