Skip to main content ホーム クリエイター 420company artemis vercel-sandbox
vercel-sandbox Vercel Sandbox guidance — ephemeral Firecracker microVMs for running untrusted code safely. Supports AI agents, code generation, and experimentation. Use when executing user-generated or AI-generated code in isolation.
インストールへ移動 Skills Marketplace コミュニティが作成したAIスキルを発見・探索
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/420company/artemis --skill vercel-sandboxコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
Zipをダウンロード ダウンロード中... このリポジトリの他の Skills spotify-ads-api-reference This skill should be used when the user asks to "call the Spotify Ads API", "create a Spotify ad campaign", "manage Spotify ads", "pull Spotify ad reports", "set up ad sets or ads", "upload ad assets", "target audiences on Spotify", "check campaign status", "get ad account info", "look up API schema or fields", "check what targeting options exist", or asks about Spotify advertising endpoints, request/response formats, enum values, or authentication.
Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge.
Accessibility audit skill for scanning, fixing, and verifying WCAG 2.2 Level A and AA compliance across React, Next.js, Vue, Angular, Svelte, and plain HTML codebases. Use when auditing accessibility, fixing a11y violations, checking color contrast, generating compliance reports, or integrating accessibility checks into CI/CD pipelines.
name vercel-sandbox description Vercel Sandbox guidance — ephemeral Firecracker microVMs for running untrusted code safely. Supports AI agents, code generation, and experimentation. Use when executing user-generated or AI-generated code in isolation. metadata {"priority":4,"docs":["https://vercel.com/docs/sandbox"],"sitemap":"https://vercel.com/sitemap/docs.xml","pathPatterns":[],"importPatterns":["@vercel/sandbox"],"bashPatterns":["\\bnpm\\s+(install|i|add)\\s+[^\\n]*@vercel/sandbox\\b","\\bpnpm\\s+(install|i|add)\\s+[^\\n]*@vercel/sandbox\\b","\\bbun\\s+(install|i|add)\\s+[^\\n]*@vercel/sandbox\\b","\\byarn\\s+add\\s+[^\\n]*@vercel/sandbox\\b"],"promptSignals":{"phrases":["@vercel/sandbox","sandbox","code sandbox","vercel sandbox","isolated environment","sandboxed execution"],"allOf":["[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]"],"anyOf":["sandbox","isolated","isolation","untrusted","safely","microvm","ffmpeg","playground"],"noneOf":["iframe sandbox","sandbox attribute","codesandbox.io","stackblitz"],"minScore":4}} retrieval {"aliases":["code sandbox","microvm","isolated execution","safe code runner"],"intents":["run untrusted code","execute code safely","create sandbox","isolate code execution"],"entities":["Vercel Sandbox","Firecracker","microVM","isolated execution"]} chainTo [{"pattern":"from\\s+['\"\"]vm2['\"\"]|require\\s*\\(\\s*['\"\"]vm2['\"\"\\)]|new\\s+VM\\(","targetSkill":"vercel-sandbox","message":"vm2 detected — it has known security vulnerabilities. Reloading Vercel Sandbox guidance for Firecracker microVM-based safe execution."},{"pattern":"child_process.*exec\\(|execSync\\(|spawn\\(.*\\{.*shell:\\s*true","targetSkill":"ai-sdk","message":"Shell exec for code execution detected — loading AI SDK guidance for tool-calling patterns that pair with Vercel Sandbox for safe agent execution."}]
Browser Automation with Vercel Sandbox
Run agent-browser + headless Chrome inside ephemeral Vercel Sandbox microVMs. A Linux VM spins up on demand, executes browser commands, and shuts down. Works with any Vercel-deployed framework (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.).
Dependencies
pnpm add @vercel/sandbox
The sandbox VM needs system dependencies for Chromium plus agent-browser itself. Use sandbox snapshots (below) to pre-install everything for sub-second startup.
Core Pattern
import { Sandbox } from "@vercel/sandbox" ;
const CHROMIUM_SYSTEM_DEPS = [
"nss" , "nspr" , "libxkbcommon" , "atk" , "at-spi2-atk" , "at-spi2-core" ,
"libXcomposite" , "libXdamage" , "libXrandr" , "libXfixes" , "libXcursor" ,
"libXi" , "libXtst" , "libXScrnSaver" , "libXext" , "mesa-libgbm" , "libdrm" ,
"mesa-libGL" , "mesa-libEGL" , "cups-libs" , "alsa-lib" , "pango" , "cairo" ,
"gtk3" , "dbus-libs" ,
];
function getSandboxCredentials ( ) {
if (
process.env .VERCEL_TOKEN &&
process.env .VERCEL_TEAM_ID &&
process. .
) {
{
: process. . ,
: process. . ,
: process. . ,
};
}
{};
}
withBrowser<T>(
: <T>,
): <T> {
snapshotId = process. . ;
credentials = ();
sandbox = snapshotId
? . ({
...credentials,
: { : , snapshotId },
: ,
})
: . ({ ...credentials, : , : });
(!snapshotId) {
sandbox. ( , [
,
,
]);
sandbox. ( , [ , , ]);
sandbox. ( , [ , ]);
}
{
(sandbox);
} {
sandbox. ();
}
}
env
VERCEL_PROJECT_ID
return
token
env
VERCEL_TOKEN
teamId
env
VERCEL_TEAM_ID
projectId
env
VERCEL_PROJECT_ID
return
async
function
fn
(sandbox : InstanceType <typeof Sandbox > ) =>
Promise
Promise
const
env
AGENT_BROWSER_SNAPSHOT_ID
const
getSandboxCredentials
const
await
Sandbox
create
source
type
"snapshot"
timeout
120_000
await
Sandbox
create
runtime
"node24"
timeout
120_000
if
await
runCommand
"sh"
"-c"
`sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" " )} 2>&1 && sudo ldconfig 2>&1`
await
runCommand
"npm"
"install"
"-g"
"agent-browser"
await
runCommand
"npx"
"agent-browser"
"install"
try
return
await
fn
finally
await
stop
Screenshot The screenshot --json command saves to a file and returns the path. Read the file back as base64:
export async function screenshotUrl (url : string ) {
return withBrowser (async (sandbox) => {
await sandbox.runCommand ("agent-browser" , ["open" , url]);
const titleResult = await sandbox.runCommand ("agent-browser" , [
"get" , "title" , "--json" ,
]);
const title = JSON .parse (await titleResult.stdout ())?.data ?.title || url;
const ssResult = await sandbox.runCommand ("agent-browser" , [
"screenshot" , "--json" ,
]);
const ssPath = JSON .parse (await ssResult.stdout ())?.data ?.path ;
const b64Result = await sandbox.runCommand ("base64" , ["-w" , "0" , ssPath]);
const screenshot = (await b64Result.stdout ()).trim ();
await sandbox.runCommand ("agent-browser" , ["close" ]);
return { title, screenshot };
});
}
Accessibility Snapshot export async function snapshotUrl (url : string ) {
return withBrowser (async (sandbox) => {
await sandbox.runCommand ("agent-browser" , ["open" , url]);
const titleResult = await sandbox.runCommand ("agent-browser" , [
"get" , "title" , "--json" ,
]);
const title = JSON .parse (await titleResult.stdout ())?.data ?.title || url;
const snapResult = await sandbox.runCommand ("agent-browser" , [
"snapshot" , "-i" , "-c" ,
]);
const snapshot = await snapResult.stdout ();
await sandbox.runCommand ("agent-browser" , ["close" ]);
return { title, snapshot };
});
}
Multi-Step Workflows The sandbox persists between commands, so you can run full automation sequences:
export async function fillAndSubmitForm (url : string , data : Record <string , string > ) {
return withBrowser (async (sandbox) => {
await sandbox.runCommand ("agent-browser" , ["open" , url]);
const snapResult = await sandbox.runCommand ("agent-browser" , [
"snapshot" , "-i" ,
]);
const snapshot = await snapResult.stdout ();
for (const [ref, value] of Object .entries (data)) {
await sandbox.runCommand ("agent-browser" , ["fill" , ref, value]);
}
await sandbox.runCommand ("agent-browser" , ["click" , "@e5" ]);
await sandbox.runCommand ("agent-browser" , ["wait" , "--load" , "networkidle" ]);
const ssResult = await sandbox.runCommand ("agent-browser" , [
"screenshot" , "--json" ,
]);
const ssPath = JSON .parse (await ssResult.stdout ())?.data ?.path ;
const b64Result = await sandbox.runCommand ("base64" , ["-w" , "0" , ssPath]);
const screenshot = (await b64Result.stdout ()).trim ();
await sandbox.runCommand ("agent-browser" , ["close" ]);
return { screenshot };
});
}
Sandbox Snapshots (Fast Startup) A sandbox snapshot is a saved VM image of a Vercel Sandbox with system dependencies + agent-browser + Chromium already installed. Think of it like a Docker image -- instead of installing dependencies from scratch every time, the sandbox boots from the pre-built image.
This is unrelated to agent-browser's accessibility snapshot feature (agent-browser snapshot), which dumps a page's accessibility tree. A sandbox snapshot is a Vercel infrastructure concept for fast VM startup.
Without a sandbox snapshot, each run installs system deps + agent-browser + Chromium (~30s). With one, startup is sub-second.
Creating a sandbox snapshot The snapshot must include system dependencies (via dnf), agent-browser, and Chromium:
import { Sandbox } from "@vercel/sandbox" ;
const CHROMIUM_SYSTEM_DEPS = [
"nss" , "nspr" , "libxkbcommon" , "atk" , "at-spi2-atk" , "at-spi2-core" ,
"libXcomposite" , "libXdamage" , "libXrandr" , "libXfixes" , "libXcursor" ,
"libXi" , "libXtst" , "libXScrnSaver" , "libXext" , "mesa-libgbm" , "libdrm" ,
"mesa-libGL" , "mesa-libEGL" , "cups-libs" , "alsa-lib" , "pango" , "cairo" ,
"gtk3" , "dbus-libs" ,
];
async function createSnapshot ( ): Promise <string > {
const sandbox = await Sandbox .create ({
runtime : "node24" ,
timeout : 300_000 ,
});
await sandbox.runCommand ("sh" , [
"-c" ,
`sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" " )} 2>&1 && sudo ldconfig 2>&1` ,
]);
await sandbox.runCommand ("npm" , ["install" , "-g" , "agent-browser" ]);
await sandbox.runCommand ("npx" , ["agent-browser" , "install" ]);
const snapshot = await sandbox.snapshot ();
return snapshot.snapshotId ;
}
Run this once, then set the environment variable:
AGENT_BROWSER_SNAPSHOT_ID=snap_xxxxxxxxxxxx
A helper script is available in the demo app:
npx tsx examples/environments/scripts/create-snapshot.ts
Recommended for any production deployment using the Sandbox pattern.
Authentication On Vercel deployments, the Sandbox SDK authenticates automatically via OIDC. For local development or explicit control, set:
VERCEL_TOKEN=<personal-access-token>
VERCEL_TEAM_ID=<team-id>
VERCEL_PROJECT_ID=<project-id>
These are spread into Sandbox.create() calls. When absent, the SDK falls back to VERCEL_OIDC_TOKEN (automatic on Vercel).
Scheduled Workflows (Cron) Combine with Vercel Cron Jobs for recurring browser tasks:
export async function GET ( ) {
const result = await withBrowser (async (sandbox) => {
await sandbox.runCommand ("agent-browser" , ["open" , "https://example.com/pricing" ]);
const snap = await sandbox.runCommand ("agent-browser" , ["snapshot" , "-i" , "-c" ]);
await sandbox.runCommand ("agent-browser" , ["close" ]);
return await snap.stdout ();
});
return Response .json ({ ok : true , snapshot : result });
}
{ "crons" : [ { "path" : "/api/cron" , "schedule" : "0 9 * * *" } ] }
Environment Variables Variable Required Description AGENT_BROWSER_SNAPSHOT_IDNo (but recommended) Pre-built sandbox snapshot ID for sub-second startup (see above) VERCEL_TOKENNo Vercel personal access token (for local dev; OIDC is automatic on Vercel) VERCEL_TEAM_IDNo Vercel team ID (for local dev) VERCEL_PROJECT_IDNo Vercel project ID (for local dev)
Framework Examples The pattern works identically across frameworks. The only difference is where you put the server-side code:
Framework Server code location Next.js Server actions, API routes, route handlers SvelteKit +page.server.ts, +server.tsNuxt server/api/, server/routes/Remix loader, action functionsAstro .astro frontmatter, API routes
Example See examples/environments/ in the agent-browser repo for a working app with the Vercel Sandbox pattern, including a sandbox snapshot creation script, streaming progress UI, and rate limiting.