
AI एजेंटों के लिए क्षणिक microVM सैंडबॉक्स जिसमें नेटवर्क अनुमति सूची, MITM प्रॉक्सी के माध्यम से गुप्त इंजेक्शन, और VM स्तर पर अलगाव शामिल है। एक सेकंड से भी कम समय में बूट होता है, Go/Python/TypeScript SDKs का समर्थन करता है।
प्रायोगिक: यह परियोजना अभी भी सक्रिय विकास में है और इसमें ब्रेकिंग चेंजेस हो सकते हैं।
मैचलॉक AI एजेंटों को अस्थायी माइक्रोवीएम में चलाने के लिए एक CLI उपकरण है - जिसमें नेटवर्क अनुमति-सूची, MITM प्रॉक्सी के माध्यम से सीक्रेट इंजेक्शन, और वीएम-स्तरीय आइसोलेशन शामिल है। आपके सीक्रेट कभी भी वीएम में प्रवेश नहीं करते।
AI एजेंटों को कोड चलाने की आवश्यकता होती है, लेकिन उन्हें आपकी मशीन तक अप्रतिबंधित पहुँच देना जोखिम भरा है। मैचलॉक आपको एक एजेंट को एक पूर्ण लिनक्स वातावरण देने की अनुमति देता है जो एक सेकंड से भी कम समय में बूट होता है - पृथक और डिस्पोज़ेबल।
जब आप --allow-host या --secret पास करते हैं, तो मैचलॉक नेटवर्क को सील कर देता है - केवल स्पष्ट रूप से अनुमत होस्ट्स पर ट्रैफिक ही गुजरता है, और बाकी सब कुछ ब्लॉक हो जाता है। जब आपका एजेंट किसी API को कॉल करता है तो वास्तविक क्रेडेंशियल्स होस्ट द्वारा फ्लाइट में इंजेक्ट किए जाते हैं। सैंडबॉक्स केवल एक प्लेसहोल्डर देखता है। भले ही एजेंट को कुछ दुर्भावनापूर्ण चलाने के लिए धोखा दिया जाए, आपकी कुंजियाँ लीक नहीं होतीं और डेटा के जाने की कोई जगह नहीं होती। अंदर, एजेंट को वह सब कुछ करने के लिए एक पूर्ण लिनक्स वातावरण मिलता है जो उसे चाहिए। वह पैकेज इंस्टॉल कर सकता है, फ़ाइलें लिख सकता है, और गंदगी कर सकता है। बाहर, आपकी मशीन को कुछ महसूस नहीं होता। वॉल्यूम ओवरले माउंट अलग-थलग स्नैपशॉट होते हैं जो आपके काम समाप्त होने पर गायब हो जाते हैं। चाहे आप लिनक्स सर्वर पर हों या मैकबुक पर, एक ही CLI और एक ही व्यवहार।
पूर्ण स्थापना विवरण के लिए docs/install.md देखें।
त्वरित स्थापना
नीचे दिया गया स्क्रिप्ट OS का पता लगाता है, और macOS पर Homebrew का उपयोग करके matchlock स्थापित करता है, और Debian/RHEL स्वाद वाले Linux वितरणों पर rpm/deb का उपयोग करता है।
curl -fsSL https://raw.githubusercontent.com/jingkaihe/matchlock/main/scripts/install.sh | bash
# Or install a specific release
curl -fsSL https://raw.githubusercontent.com/jingkaihe/matchlock/main/scripts/install.sh | bash -s -- --version 0.2.4
Homebrew
Homebrew-आधारित स्थापना macOS और Linux दोनों पर समर्थित है:
brew tap jingkaihe/essentials
brew install matchlock
Debian / Ubuntu (.deb)
sudo dpkg -i ./matchlock_<version>_linux_amd64.deb
sudo apt-get install -f
matchlock diagnose
Fedora / RHEL / CentOS Stream (.rpm)
sudo dnf install ./matchlock_<version>_linux_amd64.rpm
matchlock diagnose
यदि matchlock diagnose होस्ट सेटअप गायब होने की रिपोर्ट करता है, तो चलाएँ:
sudo matchlock setup linux
किसी विशिष्ट उपयोगकर्ता को स्पष्ट रूप से नामांकित करने के लिए, चलाएँ:
sudo matchlock setup user <name>
# Basic
matchlock run --image alpine:latest cat /etc/os-release
matchlock run --image alpine:latest -it sh
matchlock run --image alpine:latest --no-network -- sh -lc 'echo offline'
# Network allowlist
matchlock run --image python:3.12-alpine \
--allow-host "api.openai.com" python agent.py
# Keep interception enabled even with an empty allowlist,
# so hosts can be added/removed at runtime.
matchlock run --image alpine:latest --rm=false --network-intercept
matchlock allow-list add <vm-id> api.openai.com,api.anthropic.com
matchlock allow-list delete <vm-id> api.openai.com
# Secret injection (never enters the VM)
export ANTHROPIC_API_KEY=sk-xxx
matchlock run --image python:3.12-alpine \
--secret [email protected] python call_api.py
# Long-lived sandboxes
matchlock run --image alpine:latest --rm=false # prints VM ID
matchlock run --image nginx:latest -d # same as above, detached
matchlock exec vm-abc12345 -it sh # attach to it
matchlock port-forward vm-abc12345 8080:8080 # forward host:8080 -> guest:8080
# Publish ports at startup
matchlock run --image alpine:latest --rm=false -p 8080:8080
# Lifecycle
matchlock list | kill | rm | prune
# Build from Dockerfile (uses BuildKit-in-VM)
matchlock build -f Dockerfile -t myapp:latest .
# Pre-build rootfs from registry image (caches for faster startup)
matchlock build alpine:latest
# Image management
matchlock image ls # List all images
matchlock image rm myapp:latest # Remove a local image
docker save myapp:latest | matchlock image import myapp:latest # Import from tarball
मैचलॉक आपके एप्लिकेशन में सीधे सैंडबॉक्स एम्बेड करने के लिए Go, Python और TypeScript SDK प्रदान करता है। आप VMs लॉन्च कर सकते हैं, कमांड निष्पादित कर सकते हैं, आउटपुट स्ट्रीम कर सकते हैं, और प्रोग्रामेटिक रूप से फ़ाइलों का प्रबंधन कर सकते हैं।
Go
package main
import (
"context"
"fmt"
"os"
"github.com/jingkaihe/matchlock/pkg/sdk"
)
func main() {
ctx := context.Background()
client, err := sdk.NewClient(sdk.DefaultConfig())
if err != nil {
panic(err)
}
defer client.Close(0)
defer client.Remove()
sandbox := sdk.New("alpine:latest").
AllowHost("dl-cdn.alpinelinux.org", "api.anthropic.com").
AddSecret("ANTHROPIC_API_KEY", os.Getenv("ANTHROPIC_API_KEY"), "api.anthropic.com")
if _, err := client.Launch(sandbox); err != nil {
panic(err)
}
if _, err := client.Exec(ctx, "apk add --no-cache curl"); err != nil {
panic(err)
}
// The VM only ever sees a placeholder - the real key never enters the sandbox
result, err := client.Exec(ctx, "echo $ANTHROPIC_API_KEY")
if err != nil {
panic(err)
}
fmt.Print(result.Stdout) // prints "SANDBOX_SECRET_a1b2c3d4..."
curlCmd := `curl -s --no-buffer https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-haiku-4-5-20251001","max_tokens":1024,"stream":true,
"messages":[{"role":"user","content":"Explain TCP to me"}]}'`
if _, err := client.ExecStream(ctx, curlCmd, os.Stdout, os.Stderr); err != nil {
panic(err)
}
}
Go SDK में निजी-IP व्यवहार (10/8, 172.16/12, 192.168/16):
.WithBlockPrivateIPs(true) (या .BlockPrivateIPs()) कॉल करें।.AllowPrivateIPs() या .WithBlockPrivateIPs(false) कॉल करें।sandbox := sdk.New("alpine:latest").
AllowHost("api.openai.com").
AddHost("api.internal", "10.0.0.10").
WithNetworkMTU(1200).
AllowPrivateIPs() // explicit override: block_private_ips=false
// SDK network interception (request/response mutation, body shaping, SSE data-line transform)
sandbox = sandbox.WithNetworkInterception(&sdk.NetworkInterceptionConfig{
Rules: []sdk.NetworkHookRule{
{
Phase: sdk.NetworkHookPhaseBefore,
Action: sdk.NetworkHookActionMutate,
Hosts: []string{"api.openai.com"},
SetHeaders: map[string]string{"X-Trace-Id": "trace-123"},
},
{
Phase: sdk.NetworkHookPhaseAfter,
Action: sdk.NetworkHookActionMutate,
Hosts: []string{"api.openai.com"},
BodyReplacements: []sdk.NetworkBodyTransform{
{Find: "internal-id", Replace: "redacted"},
},
},
},
})
यदि आप बिल्डर के बिना सीधे client.Create(...) का उपयोग करते हैं, तो सेट करें:
BlockPrivateIPsSet: trueBlockPrivateIPs: false (या true)पूरी तरह से ऑफ़लाइन सैंडबॉक्स (कोई गेस्ट NIC / कोई ईग्रेस नहीं) के लिए, उपयोग करें:
--no-network.WithNoNetwork().with_no_network().withNoNetwork()Python (PyPI)
pip install matchlock
# or
uv add matchlock
import os
import sys
from matchlock import Client, Sandbox
sandbox = (
Sandbox("python:3.12-alpine")
.allow_host(
"dl-cdn.alpinelinux.org",
"files.pythonhosted.org", "pypi.org",
"astral.sh", "github.com", "objects.githubusercontent.com",
"api.anthropic.com",
)
.add_secret(
"ANTHROPIC_API_KEY", os.environ["ANTHROPIC_API_KEY"], "api.anthropic.com"
)
)
SCRIPT = """\
# /// script
# requires-python = ">=3.12"
# dependencies = ["anthropic"]
# ///
import anthropic, os
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
with client.messages.stream(
model="claude-haiku-4-5-20251001",
max_tokens=1024,
messages=[{"role": "user", "content": "Explain TCP/IP."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print()
"""
with Client() as client:
client.launch(sandbox)
client.exec("pip install --quiet uv")
client.write_file("/workspace/ask.py", SCRIPT)
client.exec_stream("uv run /workspace/ask.py", stdout=sys.stdout, stderr=sys.stderr)
client.remove()
TypeScript
npm install matchlock-sdk
import { Client, Sandbox } from "matchlock-sdk";
const SCRIPT = `import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
const stream = anthropic.messages
.stream({
model: "claude-haiku-4-5-20251001",
max_tokens: 1024,
messages: [{ role: "user", content: "Explain TCP/IP." }],
})
.on("text", (text) => {
process.stdout.write(text);
});
await stream.finalMessage();
process.stdout.write("\\n");
`;
const client = new Client();
try {
const sandbox = new Sandbox("node:22-alpine")
.allowHost("registry.npmjs.org", "*.npmjs.org", "api.anthropic.com")
.addSecret("ANTHROPIC_API_KEY", process.env.ANTHROPIC_API_KEY ?? "", "api.anthropic.com");
await client.launch(sandbox);
await client.exec(
"npm init -y >/dev/null 2>&1 && npm install --quiet --no-bin-links @anthropic-ai/sdk",
{ workingDir: "/workspace" },
);
await client.writeFile("/workspace/ask.mjs", SCRIPT);
await client.execStream("node ask.mjs", {
workingDir: "/workspace",
stdout: process.stdout,
stderr: process.stderr,
});
} finally {
await client.close();
await client.remove();
}
examples/ निर्देशिका में और उदाहरण:
graph LR
subgraph Host
CLI["Matchlock CLI"]
Policy["Policy Engine"]
Proxy["Transparent Proxy + TLS MITM"]
VFS["VFS Server"]
CLI --> Policy
CLI --> Proxy
Policy --> Proxy
end
subgraph VM["Micro-VM (Firecracker / Virtualization.framework)"]
Agent["Guest Agent"]
FUSE["/workspace (FUSE)"]
Image["Any OCI Image (Alpine, Ubuntu, etc.)"]
Agent --- Image
FUSE --- Image
end
Proxy -- "vsock :5000" --> Agent
VFS -- "vsock :5001" --> FUSE| प्लेटफ़ॉर्म |
|---|
MIT
| विवरण | उदाहरण |
|---|
| गुप्त इंजेक्शन के साथ Anthropic API प्रतिक्रिया स्ट्रीम करता है (Go) | examples/go/basic/ |
| ExecInteractive का उपयोग करके PTY के साथ इंटरैक्टिव टर्मिनल (Go) | examples/go/exec_modes/ |
| नेटवर्क इंटरसेप्शन हुक के माध्यम से API कुंजी इंजेक्ट करता है (Go) | examples/go/network_interception/ |
| फ़ाइल संचालन म्यूटेशन के लिए VFS इंटरसेप्शन हुक (Go) | examples/go/vfs_hooks/ |
| Anthropic API प्रतिक्रिया स्ट्रीम करता है (Python) | examples/python/basic/ |
| स्ट्रीम, पाइप और इंटरैक्टिव निष्पादन मोड (Python) | examples/python/exec_modes/ |
| नेटवर्क इंटरसेप्शन हुक के माध्यम से API कुंजी इंजेक्ट करता है (Python) | examples/python/network_interception/ |
| फ़ाइल संचालन म्यूटेशन के लिए VFS इंटरसेप्शन हुक (Python) | examples/python/vfs_hooks/ |
| Anthropic API प्रतिक्रिया स्ट्रीम करता है (TypeScript) | examples/typescript/basic/ |
| स्ट्रीम, पाइप और इंटरैक्टिव निष्पादन मोड (TypeScript) | examples/typescript/exec_modes/ |
| नेटवर्क इंटरसेप्शन हुक के माध्यम से API कुंजी इंजेक्ट करता है (TypeScript) | examples/typescript/network_interception/ |
| GitHub बूटस्ट्रैप के साथ माइक्रो-VM में Claude Code CLI | examples/claude-code/ |
| SDK के माध्यम से सैंडबॉक्स के अंदर Docker के साथ Claude Code | examples/claude-code-with-docker/ |
| सैंडबॉक्स में Claude Pro/Max सब्सक्रिप्शन के साथ Claude Code | examples/claude-danger/ |
| GitHub बूटस्ट्रैप के साथ माइक्रो-VM में OpenAI Codex CLI | examples/codex/ |
| systemd के साथ सैंडबॉक्स के अंदर Docker डेमन | examples/docker-in-sandbox/ |
| एजेंट क्लाइंट प्रोटोकॉल का उपयोग करके Streamlit चैटबॉट | examples/agent-client-protocol/ |
| Kodelet और Playwright MCP के साथ ब्राउज़र ऑटोमेशन | examples/playwright/ |
| मोड |
|---|
| तंत्र |
|---|
| Linux | पारदर्शी प्रॉक्सी | पोर्ट 80/443 पर nftables DNAT |
| macOS | NAT (डिफ़ॉल्ट) | Virtualization.framework अंतर्निहित NAT |
| macOS | इंटरसेप्शन (--allow-host/--secret के साथ) | L4 पर gVisor उपयोगकर्ता-स्थान TCP/IP |