<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>library on tomrochette.com</title>
    <link>https://tomrochette.com/tags/library/</link>
    <description>Recent content in library on tomrochette.com</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>tom@tomrochette.com (Tom Rochette)</managingEditor>
    <webMaster>tom@tomrochette.com (Tom Rochette)</webMaster>
    <copyright>© 2026 Tom Rochette</copyright>
    <lastBuildDate>Sun, 27 Sep 2026 15:58:28 -0400</lastBuildDate><atom:link href="https://tomrochette.com/tags/library/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Sandcastle</title>
      <link>https://tomrochette.com/agents/orchestration/sandcastle/</link>
      <pubDate>Sun, 27 Sep 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agents/orchestration/sandcastle/</guid>
      <category>research-note</category><category>agent-curated</category><category>fully-ai-generated</category><category>llm=deepseek-v4.1-flash</category><category>orchestration</category><category>sandboxing</category><category>typescript</category><category>library</category>
      <description>&lt;p&gt;Sandcastle is an MIT-licensed TypeScript library and CLI that orchestrates coding agents in isolated sandboxes, running them in a worktree, collecting the commits, and merging the branches back.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sandcastle&amp;rsquo;s bet is that the orchestrator should be an npm package, not an app: one &lt;code&gt;sandcastle.run()&lt;/code&gt; call gives you sandboxing, branch strategy, session capture, and merge-back, so teams compose their own pipelines instead of adopting a board.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What it is&#xA;    &lt;div id=&#34;what-it-is&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#what-it-is&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A library from Matt Pocock (Total TypeScript, ex-Vercel and Stately) published as &lt;code&gt;@ai-hero/sandcastle&lt;/code&gt;, with a CLI that scaffolds a &lt;code&gt;.sandcastle/&lt;/code&gt; config directory and a default Dockerfile.&#xA;You call &lt;code&gt;run()&lt;/code&gt; with an agent provider and a sandbox provider: built-in agents are Claude Code, Codex, Pi, Cursor, OpenCode, and Copilot, and built-in sandboxes are Docker and Podman (bind-mount) and Vercel Firecracker microVMs (isolated), plus &lt;code&gt;noSandbox()&lt;/code&gt; and custom providers built on &lt;code&gt;createBindMountSandboxProvider&lt;/code&gt; or &lt;code&gt;createIsolatedSandboxProvider&lt;/code&gt;.&#xA;Sandcastle creates a host worktree under a configurable branch strategy, runs the agent inside the sandbox, and merges the resulting commits back.&#xA;It captures each agent&amp;rsquo;s native session transcript to the host and can resume or fork a prior Claude Code, Codex, or Pi conversation inside a new sandbox, with &lt;code&gt;--resume&lt;/code&gt; rewrites so the provider&amp;rsquo;s own resume command works.&#xA;Hooks are declared per location (&lt;code&gt;host&lt;/code&gt; and &lt;code&gt;sandbox&lt;/code&gt;, for example &lt;code&gt;onWorktreeReady&lt;/code&gt; and &lt;code&gt;onSandboxReady&lt;/code&gt;), and templates plus GitHub-issues, beads, or custom issue trackers are scaffolded by &lt;code&gt;sandcastle init&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Status&#xA;    &lt;div id=&#34;status&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#status&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Small but well-known: about 8,162 stars and 878 forks as of 2026-09-27, created 2026-03-17, and 1,193 commits.&#xA;The warning sign is activity: the last commit and the latest release (v0.12.0) both landed on 2026-06-29, so the project has been quiet for roughly three months as of 2026-09-27, even as stars kept accruing.&#xA;The npm package reached 0.12.0 across 44 versions.&#xA;&lt;strong&gt;A popular library that stops shipping while its category moves daily is a bet on stability over feature parity, and an open issue about broken global &lt;code&gt;npm install&lt;/code&gt; for the Pi and Codex Dockerfiles (#223) has sat unresolved since April 2026.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strengths&#xA;    &lt;div id=&#34;strengths&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#strengths&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sandboxing is first-class, not bolted on: three providers plus a documented custom-provider contract, and &lt;code&gt;noSandbox()&lt;/code&gt; when you want the agent on the host.&lt;/li&gt;&#xA;&lt;li&gt;Session capture, resume, and fork let an agent continue its own conversation across sandboxes, which most GUI tools do not expose.&lt;/li&gt;&#xA;&lt;li&gt;Provider-agnostic and issue-tracker-agnostic, so it fits an existing CI or pipeline rather than dictating one.&lt;/li&gt;&#xA;&lt;li&gt;A real CLI (&lt;code&gt;init&lt;/code&gt;, templates, flags, non-interactive fail-fast) and typed JS API for programmatic orchestration.&lt;/li&gt;&#xA;&lt;li&gt;MIT, by a maintainer with a large TypeScript following, so the docs and examples are unusually good.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cautions&#xA;    &lt;div id=&#34;cautions&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#cautions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No activity since 2026-06-29; treat it as a maintenance risk and pin a version.&lt;/li&gt;&#xA;&lt;li&gt;It is a library, not a product: no board, no diff review UI, no PR flow, no notifications.&lt;/li&gt;&#xA;&lt;li&gt;You must provide and pay for your own sandbox runtime; Vercel sandboxes carry their own usage bill.&lt;/li&gt;&#xA;&lt;li&gt;The default Dockerfile installs Claude Code as a specific non-root &lt;code&gt;agent&lt;/code&gt; user, and the documented Pi and Codex installs are reported broken (#223).&lt;/li&gt;&#xA;&lt;li&gt;Session capture failure fails the run by default, so a provider upgrade can break a pipeline until you retune.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pricing&#xA;    &lt;div id=&#34;pricing&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#pricing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Free and open source under MIT.&#xA;No hosted tier; you pay only for the sandbox runtime you choose (local Docker or Podman, or Vercel usage).&#xA;Agent access runs on your own subscriptions or keys.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Compared to&#xA;    &lt;div id=&#34;compared-to&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#compared-to&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/orchestration/crewplane/&#34; &gt;Crewplane&lt;/a&gt;: a Python workflow runner with on-disk run records; choose Sandcastle when you want an in-process TypeScript API instead of a Markdown workflow engine.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/orchestration/the-perfect-orchestrator/&#34; &gt;The Perfect Orchestrator&lt;/a&gt;: a tmux harness for visible Claude Code workers; choose Sandcastle when you want containers and merge-back rather than interactive panes.&lt;/li&gt;&#xA;&lt;li&gt;Plain Docker plus a shell script: the zero-dependency option; Sandcastle earns its keep once you need branch strategy, session resume, and hooks.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Bottom line&#xA;    &lt;div id=&#34;bottom-line&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#bottom-line&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Recommended for teams that want to script sandboxed coding agents from TypeScript and own the pipeline, not adopt a GUI.&lt;/strong&gt;&#xA;Not for anyone who wants a board, diff review, or a maintained app, given the quiet repository.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Changes&#xA;    &lt;div id=&#34;changes&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#changes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2026-09-27 - Created.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;See also&#xA;    &lt;div id=&#34;see-also&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#see-also&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/orchestration/orchestration-feature-matrix/&#34; &gt;Orchestration Feature Matrix&lt;/a&gt; - the category comparison this note joins&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/orchestration/crewplane/&#34; &gt;Crewplane&lt;/a&gt; - the CLI workflow-runner counterpart&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/orchestration/the-perfect-orchestrator/&#34; &gt;The Perfect Orchestrator&lt;/a&gt; - the tmux-based, no-sandbox alternative&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/harnesses/opencode/&#34; &gt;OpenCode&lt;/a&gt; - one of the harnesses Sandcastle drives&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/harnesses/codex/&#34; &gt;Codex&lt;/a&gt; - another harness with a built-in Sandcastle provider&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;References&#xA;    &lt;div id=&#34;references&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#references&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mattpocock/sandcastle&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/mattpocock/sandcastle&lt;/a&gt; - repository, API, sandbox and agent providers, license, stars, last-commit date&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/mattpocock/sandcastle/HEAD/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=raw.githubusercontent.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://raw.githubusercontent.com/mattpocock/sandcastle/HEAD/README.md&lt;/a&gt; - &lt;code&gt;run()&lt;/code&gt;, branch strategy, hooks, session capture, resume and fork&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://registry.npmjs.org/@ai-hero%2Fsandcastle&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=registry.npmjs.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://registry.npmjs.org/@ai-hero%2Fsandcastle&lt;/a&gt; - package metadata, 0.12.0 latest, 44 versions, version dates and license&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.aihero.dev/open-source&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=www.aihero.dev&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://www.aihero.dev/open-source&lt;/a&gt; - Matt Pocock&amp;rsquo;s framing of Sandcastle among his tools&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/mattpocock/sandcastle/issues/223&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/mattpocock/sandcastle/issues/223&lt;/a&gt; - unresolved broken global install for Pi and Codex agents&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
  </channel>
</rss>
