Publish from wherever you make games
Your AI tool writes the game; Sentinel gives it a URL. Connect once and say “publish it”. Everything goes through the same checks and the same incremental upload, whichever way you come in.
Connect your AI tool
Adds Sentinel's tools to every Claude Code session, including playtest_game, so Claude can see and play what it built.
claude mcp add --scope user -e SENTINEL_API_URL=https://sentinel.cybercorpresearch.com sentinel -- npx -y https://sentinel.cybercorpresearch.com/cli/sentinel.tgz mcp
“Make a small arcade game in this folder and publish it to Sentinel.” Claude calls deploy_game and gives you the link. The first time, it asks you to approve a sign-in link.
Terminal
Run it in your game folder. No config needed. It finds your build output (and runs your build if needed), skips secrets, and prints a live link.
npx -y https://sentinel.cybercorpresearch.com/cli/sentinel.tgz
sentineldeploy the current folder (builds if needed)sentinel game.zipdeploy a zip, an .html file, or an .apksentinel checkrun every check without uploadingsentinel devpreview in a local player with the SDK mocked, live reloadsentinel --previewnew URL without going livesentinel rollbackmake the previous version livesentinel --jsonmachine-readable output for agents and CIHTTP API
One request for quick jobs (up to 100 MB), or the incremental protocol for big builds. Get a token at Settings › Tokens.
curl -H "Authorization: Bearer $SENTINEL_TOKEN" \ -F file=@game.zip -F name=my-game \ https://sentinel.cybercorpresearch.com/api/v1/publish
POST https://sentinel.cybercorpresearch.com/api/v1/deployments { game, files: [{ path, sha, size }], meta }
→ 409 missing_files { missing: [sha…] }
PUT https://sentinel.cybercorpresearch.com/api/v1/files/<sha> (raw bytes, for each missing sha)
POST https://sentinel.cybercorpresearch.com/api/v1/deployments (same body) → 201 { game, deployment }Full reference for agents: /llms.txt
Game SDK (optional)
Games work without it. Add one script tag for leaderboards, cloud saves, purchases and player identity. It's served from your game's own origin, so it works with every engine. Opened outside Sentinel, it falls back to local storage instead of breaking.
<script src="/__sentinel/sdk.js"></script>
<script>
const { user } = await Sentinel.init(); // { handle } or null
Sentinel.gameplayStart(); // engagement + pause hooks
const { rank } = await Sentinel.submitScore(1200);
const top = await Sentinel.leaderboard({ limit: 10 });
await Sentinel.save("progress", { level: 3 }); // cloud save, falls back to localStorage
const r = await Sentinel.purchase("gold-skin"); // player confirms in a Sentinel dialog
if (r.ok) unlockGoldSkin();
Sentinel.on("pause", pauseGame);
</script>Sell things by declaring products next to your game. They're created on deploy:
{
"products": [
{ "sku": "gold-skin", "title": "Gold skin", "price": 0.99, "kind": "unlock" },
{ "sku": "coins-100", "title": "100 coins", "price": 1.99, "kind": "consumable" }
]
}Payments run in sandbox mode in this prototype (test card 4242 4242 4242 4242). Creators keep 90%. The payment network is a pluggable provider.
How uploads work
- Static output only. Builds run on your machine or in your agent's sandbox. Sentinel hosts the result. What you tested is what ships.
- Every deploy is permanent. It gets its own URL forever. Your game's main URL points at the live one; rollback is instant.
- Only changes upload. Files are identified by their SHA-256. Re-deploying a 200 MB Unity build after a code change sends kilobytes.
- Secrets never leave your machine.
.envand key files are skipped, and API keys found in game code stop the deploy. - Engines just work. Unity, Godot, Construct, GameMaker, PICO-8, Phaser, Three.js and more are detected and served with the headers they need.
- Optional sentinel.json sets title, description, tags, orientation, build command and output folder.