# Headless Chromium with GPU acceleration # # For pre-warmed browser pools via fork (warm-state preservation, the required # --no-zygote/--no-sandbox flags, persistent-workload setup, and CDP access), # see README.md in this directory. # # Guest Vulkan (Venus/virtio-gpu) forwards calls over the virtio-gpu transport # to the host GPU. ANGLE inside Chromium uses Venus as its Vulkan backend, so # WebGL and compositing run on real hardware — no SwiftShader fallback. # # Confirmed GL renderer: # ANGLE (Intel, Vulkan 1.4.307 (Virtio-GPU Venus (Intel(R) UHD Graphics 620 # (KBL GT2)) (0x00005917)), venus) # # ── Setup (one time) ───────────────────────────────────────────────────────── # # smolvm machine create --name browser -s examples/headless-browser/browser.smolfile # smolvm machine start --name browser # # ── Take a screenshot ──────────────────────────────────────────────────────── # # smolvm machine exec --name browser -- \ # chromium --headless=new --no-sandbox --disable-dev-shm-usage \ # --use-gl=angle --use-angle=vulkan \ # --screenshot=/tmp/out.png --window-size=1280,800 \ # https://example.com # # # Copy screenshot to host # smolvm machine exec --name browser -- base64 /tmp/out.png | base64 -d > out.png # # ── Verify GPU renderer ─────────────────────────────────────────────────────── # # smolvm machine exec --name browser -- sh -c ' # vulkaninfo --summary 2>/dev/null | grep deviceName # ' # # → deviceName = Virtio-GPU Venus (Intel(R) UHD Graphics 620 ...) # # ── Stop ───────────────────────────────────────────────────────────────────── # # smolvm machine stop --name browser # # ───────────────────────────────────────────────────────────────────────────── # mesa-vulkan-virtio (the guest virtio Vulkan ICD) is not in Alpine 3.21 stable. # Use edge until Alpine 3.22 is released. image = "alpine:edge" cpus = 4 memory = 4096 gpu = true gpu_vram = 2048 net = true # Venus Vulkan ICD — tells the Vulkan loader where to find the virtio GPU driver. # The path is architecture-specific. Change x86_64 → aarch64 on ARM hosts. # # x86_64: VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/virtio_icd.x86_64.json # aarch64: VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/virtio_icd.aarch64.json env = [ "VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/virtio_icd.x86_64.json", ] [dev] # Install Chromium and the Mesa Venus Vulkan driver. # apk is idempotent — subsequent starts skip packages already on disk. init = [ "apk add --no-cache chromium chromium-angle mesa-vulkan-virtio vulkan-loader font-opensans", ]