[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme:forkd":3},"\u003Cbr \u002F>\u003Cdiv align=\"center\">\n  \u003Cpicture>\n    \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs\u002Flogo-dark.svg\">\u003C\u002Fsource>\n    \u003Cimg alt=\"forkd\" src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fdeeplethe\u002Fforkd\u002FHEAD\u002Fdocs\u002Flogo.svg\" width=\"220\" \u002F>\n  \u003C\u002Fpicture>\n\u003C\u002Fdiv>\u003Cbr \u002F>\n\u003Cbr \u002F>\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Factions\" rel=\"nofollow ugc noopener\">\u003Cimg alt=\"CI\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fdeeplethe\u002Fforkd\u002Fci.yml?branch=main&amp;style=flat-square&amp;label=ci\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Freleases\" rel=\"nofollow ugc noopener\">\u003Cimg alt=\"Release\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fdeeplethe\u002Fforkd?style=flat-square&amp;color=4c956c\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fforkd\u002F\" rel=\"nofollow ugc noopener\">\u003Cimg alt=\"PyPI\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fforkd?style=flat-square&amp;color=3776ab&amp;logo=pypi&amp;logoColor=white\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Fblob\u002FHEAD\u002FLICENSE\" rel=\"nofollow ugc noopener\">\u003Cimg alt=\"License\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache--2.0-blue?style=flat-square\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Fblob\u002FHEAD\u002FREADME-zh.md\" rel=\"nofollow ugc noopener\">\u003Cimg alt=\"中文 README\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FREADME-%E4%B8%AD%E6%96%87-red?style=flat-square\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Fstargazers\" rel=\"nofollow ugc noopener\">\u003Cimg alt=\"Stars\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fdeeplethe\u002Fforkd?style=flat-square&amp;color=eab308&amp;logo=github\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\u003Cbr \u002F>\u003Ch2>Fork 100 microVMs in 101 ms. BRANCH a live VM in 56 ms (v0.4 live mode).\u003C\u002Fh2>\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"forkd: pull a portable snapshot from the hub, then fork 100 microVMs\" src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fdeeplethe\u002Fforkd\u002FHEAD\u002Fdocs\u002Fassets\u002Fquickstart-fork-100.gif\" width=\"760\" \u002F>\n  \u003Cbr \u002F>\n  \u003Cem>Unedited: `forkd pull` a portable snapshot, then fork 100 microVMs — 100\u002F100 alive, ~200 ms wall-clock. \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Fblob\u002FHEAD\u002Fdocs\u002Fassets\u002Fquickstart-fork-100.cast\" rel=\"nofollow ugc noopener\">asciicast\u003C\u002Fa>. (First pull also fetches the rootfs sidecar once; cached here.)\u003C\u002Fem>\n\u003C\u002Fdiv>\u003Cbr \u002F>\u003Cp>A microVM sandbox runtime for \u003Cstrong>AI agent fan-out\u003C\u002Fstrong>. Children fork\nfrom a warmed parent snapshot, inheriting its address space\ncopy-on-write instead of cold-booting their own kernel.\u003C\u002Fp>\n\u003Cp>forkd is built on Firecracker. The parent VM boots once, imports\nyour runtime (Python + your dependencies, a JIT-warmed JVM, an\nalready-loaded ML model) and is paused to disk. Each child is a\nseparate Firecracker process that \u003Ccode>mmap\u003C\u002Fcode>s the parent's memory image\nwith \u003Ccode>MAP_PRIVATE\u003C\u002Fcode>; the kernel implements copy-on-write at the page\nlevel, so children share the parent's resident memory until they\ndiverge.\u003C\u002Fp>\n\u003Cp>The result is two properties at once: per-child KVM isolation, and a\nspawn cost that's closer to \u003Ccode>fork(2)\u003C\u002Fcode> than to a cold-boot VM.\u003C\u002Fp>\n\u003Cp>forkd also supports \u003Cstrong>BRANCH\u003C\u002Fstrong>: pause a running sandbox, snapshot its\nin-flight state, and resume — all in ~150 ms — so an agent can fork\nmid-thought, not only at warm-up. v0.3.4 fixed a slow-path regression\nwhere repeated BRANCHes on the same parent ballooned from 150 ms to\n2.7 s (\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Fissues\u002F146\" rel=\"nofollow ugc noopener\">#146\u003C\u002Fa>); the\nchain now stays flat (17.6× faster on the 6th consecutive BRANCH).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>v0.4 live BRANCH\u003C\u002Fstrong> collapses the source-pause window from ~200 ms\n(Diff) to \u003Cstrong>56 ms p50 \u002F 64 ms p90\u003C\u002Fstrong> on a 1.5 GiB source — measured\non a real BRANCH workload, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdeeplethe\u002Fforkd\u002Fblob\u002FHEAD\u002Fbench\u002Flive-fork-pause-window\u002FRESULTS-v0.4.md\" rel=\"nofollow ugc noopener\">\u003Ccode>bench\u002Flive-fork-pause-window\u002FRESULTS-v0.4.md\u003C\u002Fcode>\u003C\u002Fa>.\n\u003Cstrong>3.6× faster pause\u003C\u002Fstrong> vs v0.3 Diff at p50, and the gap \u003Cem>widens\u003C\u002Fem> on\nslower storage because Live's pause is disk-independent (memory\ncopy runs after resume, not during). With \u003Ccode>wait: false\u003C\u002Fcode> the caller\nreturns in ~70 ms while the background copy completes asynchronously\n— a \u003Cstrong>200×\u003C\u002Fstrong> RT improvement for fire-and-forget BRANCH from agent\ncode. Pass \u003Ccode>--live\u003C\u002Fcode> \u002F \u003Ccode>--no-wait\u003C\u002Fcode> on the CLI, \u003Ccode>mode: \"live\"\u003C\u002Fcode> \u002F\n\u003Ccode>wait: false\u003C\u002Fcode> on REST, or the same on the Python \u002F TypeScript \u002F MCP\nSDKs.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">from forkd import Controller\nc = Controller()\n# Source must boot with live_fork=True (memfd-backed RAM, the prereq\n# for UFFD_WP to see writes from the running parent).\nparent = c.spawn_sandboxes(\"pyagent\", n=1, live_fork=True)[0]\n# ... drive parent ... then BRANCH live + fire-and-forget:\nbranch = c.branch_sandbox(parent[\"id\"], mode=\"live\", wait=False)\n# Returns after ~10 ms with status=\"writing\"; poll list_sna\n\u003C\u002Fcode>\u003C\u002Fpre>\n",1784853422499]