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:
| Device | Voor herstel | Na herstel | Inhoud |
|---|---|---|---|
| vda | placeholder | 256 GiB ext4 | Session rootfs (Ubuntu 24.04) |
| vdb | placeholder | 63.7 MB squashfs | /opt/claude-code |
| vdc | placeholder | 12.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
- Firecracker boot: kernel + 3,1 MB initramfs.
process_apivoert minimale init uit: mount/proc,/sys,/dev, cgroups; configureert netwerking (IP=192.0.2.2/24, GW=192.0.2.1, MTU=1400).- Geeft
SNAPSTART_READYdoor aan de host. - Host roept
PUT /snapshot/createaan → slaat de volledige VM-status op.
Fase 2: Herstel van de Sessie
- Host bereidt sessie-specifieke block-devices voor (vda/vdb/vdc).
- Host roept
PUT /snapshot/loadaan met nieuwe device backends. - VM hervat → kernel detecteert device-wijzigingen, reseedt CRNG.
process_apidetecteert 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_rootnaar 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
| Maatregel | Doel |
|---|---|
initonfree=1 | Wissen van vrijgegeven pagina's tussen sessies |
CAPSYSRESOURCE drop | Beperken van mogelijkheden van PID 1 na init |
| CRNG reseed | Voorkomen van cryptografische voorspelbaarheid bij snapshot forks |
--block-local-connections | Blokkeren van localhost WebSocket-toegang |
| JWT-authenticatie | Verificatie van WebSocket-verbindingen |
| Token scrubbing | Verwijderen 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 vooranthropic(hosted) enbyoc(Bring Your Own Cloud).internal/gitproxy/: Git credential proxy server.internal/manager/: Sessiebeheer, MCP-configuratie, skill-extractie.internal/mcp/servers/: MCP-servers voor onder anderecodesignensupabase.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:
- Fase 1: Deployment aanmaken. POST naar
antspaceControlPlaneURLmet app-naam en metadata. - Fase 2: Build-artifact uploaden. POST multipart/form-data van
dist.tar.gz. Er is een strikte limiet op de bestandsgrootte. - Fase 3: Status streamen. Respons in
application/x-ndjson(streaming) met statusstappen: packaging → uploading → building → deploying → deployed.
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
| Aspect | Vercel | Antspace |
|---|---|---|
| Bestands-upload | SHA-gebaseerde dedup, per bestand | Enkelvoudig tar.gz archief |
| Build | Remote (Vercel bouwt het) | Lokaal npm run build, upload output |
| Status | Polling-gebaseerd | Streaming NDJSON |
| Authenticatie | Vercel API token + Team ID | Bearer token + dynamische control plane URL |
| Publieke API | Ja, gedocumenteerd | Nee, 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 viasupervisord. - 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.localgeschreven. - 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 --noEmitTypeScript-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-cachedvoor de snelste restarts. - Kubernetes-integratie: Het
podmonitorpakket 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:
- De gebruiker beschrijft wat hij wil (natuurlijke taal).
- Claude genereert de applicatie (Baku-omgeving).
- De Supabase-database wordt automatisch geprovisioneerd (MCP-tools).
- De applicatie wordt gedeployed naar Antspace (het PaaS van Anthropic).
- 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:
- Hypervisor identificeren:
dmesg | grep FIRECKonthulde de ACPI-tabellen en daarmee Firecracker. - PID 1 identificeren:
cat /proc/1/cmdlinetoonde/process_apials custom init. - Go-metadata extraheren:
go version -mop deenvironment-runnerbinary gaf de versie, module-pad en afhankelijkheden. - Pakketstructuur herstellen: Omdat het binary niet-gestript was, leverde
objdump -tde volledige functienamen en architectuurboom op. - Strings extraheren: Zoeken naar specifieke byte-sequenties (zoals
dist.tar.gz) en struct-tag patronen (json:"status") onthulde de wire-protocollen. - Feature mapping:
objdump -t binary | grep 'deploy\.'bracht de methoden van de Vercel- en Antspace-clients in kaart. - Runtime observatie:
strace -p 1bevestigde 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.
Groetjes,