Fly.io가 공개한 Sprites.dev는 체크포인트/복원을 지원하는 상태 유지형 샌드박스 환경으로, 코딩 에이전트를 안전하게 돌리는 개발 환경과 신뢰할 수 없는 코드를 실행하기 위한 샌드박스 API를 한 번에 제공한다.
URL: https://simonwillison.net/2026/Jan/9/sprites-dev/
Title: Fly’s new Sprites.dev addresses both developer sandboxes and API sandboxes at the same time
2026년 1월 9일
오늘 Fly.io에서 새로 공개한 것: Sprites.dev. 관련 자료로는 그들의 블로그 포스트와 YouTube 데모가 있다. 설명하기가 꽤 어려운 흥미로운 신제품인데, Fly는 이를 “체크포인트 & 복원을 갖춘 상태 유지형 샌드박스 환경(Stateful sandbox environments with checkpoint & restore)”이라고 부른다. 나는 이걸 내가 요즘 특히 좋아하는 두 가지 문제를 동시에 겨냥한 것으로 본다. 코딩 에이전트를 돌리기 위한 안전한 개발 환경이면서, 신뢰할 수 없는 코드를 보안 샌드박스에서 실행하기 위한 API이기도 하다.
공개: Fly는 내가 하는 일부 작업을 스폰서한다. Sprites에 대해 글을 써 달라고 요청하지 않았고, 출시 전 미리 볼 수 있는 접근 권한도 받지 않았다. 여기서의 열정은 진심이다.
나는 이번 주 초에, 대부분의 사람들이 Claude Code나 Codex CLI 같은 코딩 에이전트를 무섭게도 사용하는 방식 때문에 “코딩 에이전트 보안과 관련해 챌린저(Challenger)급 재난이 날 때가 됐다”고 예측했다. --dangerously-skip-permissions 모드(일명 YOLO 모드—에이전트가 매번 승인 요청을 먼저 하지 않고 행동하는 모드)로 실행하면 훨씬 강력해지지만, 실수나 악의적인 프롬프트 인젝션 하나로도 시스템과 데이터에 온갖 피해를 입힐 수 있다는 뜻이기도 하다.
YOLO 모드를 안전하게 돌리는 방법은 견고한 샌드박스에서 실행하는 것이다. 최악의 경우 샌드박스가 엉망이 되면 버리고 새로 하나 받으면 된다.
Sprites가 해결하는 첫 번째 문제는 바로 이것이다:
curl https://sprites.dev/install.sh | bash
sprite login
sprite create my-dev-environment
sprite console -s my-dev-environment
이게 전부다. 그러면 약 8GB RAM, 8 CPU 서버에서 돌아가는 새 환경에 SSH로 연결된다. 그리고… Claude Code와 Codex, Gemini CLI, Python 3.13, Node.js 22.20, 그 밖의 다양한 도구들이 이미 설치되어 있다.
처음 claude를 실행하면 기존 Anthropic 계정으로 깔끔하게 로그인까지 처리해 준다. Sprites VM은 영속적이어서 이후에 sprite console -s를 실행하면 이전에 작업하던 상태 그대로 돌아올 수 있다.
… 그리고 포트 포워딩도 자동으로 설정해 주기 때문에, Sprite에서 로컬호스트 서버를 띄워 두고 내 컴퓨터의 localhost:8080에서 접근할 수 있다.
또 Sprite에 공개 URL을 할당하는 명령도 있는데, 비밀 URL을 알고 있는 사람이라면 누구든 접속할 수 있다.
블로그 포스트에서 Kurt Mackey는 일시적(ephemeral)이고 폐기 가능한(disposable) 샌드박스가 코딩 에이전트에 최적의 궁합은 아니라고 주장한다:
에이전트 격리의 최첨단은 읽기 전용 샌드박스다. Fly.io에서는 그 이야기를 수년간 팔아 왔고, 이제는 말하겠다: 일시적 샌드박스는 구식이다. 사용할 때마다 샌드박스를 죽이는 걸 멈춰라. [...]
에이전트가 필요하다면 컨테이너화를 우회해서라도 일을 해낼 것이다. 하지만 그렇게 강제한다고 해서 에이전트에게 도움이 되는 건 아무것도 없다. 그들은 컨테이너를 원하지 않는다. “샌드박스”를 원하지 않는다. 그들이 원하는 건 컴퓨터다.
[...] 실제 컴퓨터가 있으면 Claude는 내가 PR을 다시 집어 들 때마다 내 전체 개발 환경을 재구성할 필요가 없다.
각 Sprite는 세션 사이에도 유지되는 “제대로 된 파일시스템”을 갖는다. Sprite 자체는 비활성 상태가 되면 종료되더라도 파일시스템은 유지된다. 여기에는 뭔가 영리한 파일시스템 트릭이 쓰인 것 같은데, 나중에 더 자세히 알아볼 수 있길 기대한다.
홈페이지에 몇 가지 단서가 있다:
빠르고 직접 연결된 NVMe 스토리지에 읽고 쓴다. 그 다음 데이터는 내구성이 있는 외부 오브젝트 스토리지에 기록된다. [...]
할당된 파일시스템 용량에 대해 비용을 내는 것이 아니라, 실제로 쓴 블록에 대해서만 비용을 낸다. 그리고 전부 TRIM 친화적이라서, 삭제하면 청구액이 내려간다.
정말 영리한 기능은 체크포인트다. 사용자(또는 코딩 에이전트)가 체크포인트를 트리거하면 약 300ms 정도 걸리며, 디스크 상태 전체를 캡처해 둔다가 나중에 그 시점으로 롤백할 수 있다.
작동 방식에 대해 더 알아보려면 Sprite 안에서 다음을 실행해 보라:
cat /.sprite/docs/agent-context.md
관련 섹션은 다음과 같다:
## Checkpoints
- Point-in-time checkpoints and restores available
- Copy-on-write implementation for storage efficiency
- Last 5 checkpoints mounted at `/.sprite/checkpoints`
- Checkpoints capture only the writable overlay, not the base image
또는 체크포인트를 관리하는 명령의 --help를 보려면 다음을 실행하면 된다:
sprite-env checkpoints --help
출력은 대략 이렇게 생겼다:
sprite-env checkpoints - Manage environment checkpoints
USAGE:
sprite-env checkpoints <subcommand> [options]
SUBCOMMANDS:
list [--history <ver>] List all checkpoints (optionally filter by history version)
get <id> Get checkpoint details (e.g., v0, v1, v2)
create Create a new checkpoint (auto-versioned)
restore <id> Restore from a checkpoint (e.g., v1)
NOTE:
Checkpoints are versioned as v0, v1, v2, etc.
Restore returns immediately and triggers an async restore that restarts the environment.
The last 5 checkpoints are mounted at /.sprite/checkpoints for direct file access.
EXAMPLES:
sprite-env checkpoints list
sprite-env checkpoints list --history v1.2.3
sprite-env checkpoints get v2
sprite-env checkpoints create
sprite-env checkpoints restore v1
나는 Skills의 열렬한 팬이다. Claude Code(그리고 점점 더 많은 다른 에이전트들)에게, 특정 디렉터리 구조에 맞춰 Markdown 파일로 추가 능력을 설명해 주면 그 능력을 부여할 수 있는 메커니즘이다.
영리한 설계로, Sprites는 미리 설치된 스킬을 사용해 Claude에게 “Sprites 자체가 어떻게 동작하는지”를 가르친다. 덕분에 그 머신에서 Claude에게 포트를 여는 방법 같은 것을 물어보면, 절차를 단계별로 안내해 준다.
그 머신의 /.sprite 폴더에는 흥미로운 것들이 잔뜩 들어 있다. 거기를 파고들어 보는 건 Sprites가 어떻게 동작하는지 더 알아보는 훌륭한 방법이다.
이번 주 초에 쓴 예측 글에서 또 하나: “드디어 샌드박싱을 해결하게 될 것이다”. 나는 이 문제에 집착하고 있다. 개인 기기에서도, 다른 사람들이 쓰도록 만들고 있는 웹 서비스에서도, 신뢰할 수 없는 코드를 안전하게 실행할 수 있길 원한다.
사용자나 LLM, 혹은 사용자가 조종하는 LLM이 만들어낸 신뢰할 수 없는 코드를 받아서, 무언가 잘못되더라도 피해 반경(blast radius)이 단단히 통제되는 샌드박스에서 실행할 수 있어야만 가능한 것들이 정말 많이 있다.
Sprites는 이를 정확히 수행할 수 있는 깔끔한 JSON API를 제공한다. 또한 Go와 TypeScript 클라이언트 라이브러리, 그리고 곧 나올 Python, Elixir도 제공한다.
퀵스타트에서:
# Create a new sprite
curl -X PUT https://api.sprites.dev/v1/sprites/my-sprite \
-H "Authorization: Bearer $SPRITES_TOKEN"
# Execute a command
curl -X POST https://api.sprites.dev/v1/sprites/my-sprite/exec \
-H "Authorization: Bearer $SPRITES_TOKEN" \
-d '{"command": "echo hello"}'
API로 체크포인트와 롤백도 할 수 있다. 즉, 환경을 딱 원하는 상태로 맞춰 두고 체크포인트를 찍은 다음, 신뢰할 수 없는 코드를 잔뜩 실행하고, 끝나면 깨끗한 체크포인트로 되돌릴 수 있다.
네트워크 접근을 관리하는 것은 좋은 샌드박스를 유지하는 데 중요한 요소다. Sprites API는 다음과 같은 DNS 기반 allow/deny 리스트로 네트워크 접근 정책을 구성할 수 있게 해 준다:
curl -X POST \
"https://api.sprites.dev/v1/sprites/{name}/policy/network" \
-H "Authorization: Bearer $SPRITES_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"rules": [
{
"action": "allow",
"domain": "github.com"
},
{
"action": "allow",
"domain": "*.npmjs.org"
}
]
}'
Sprites는 아키텍처에 스케일-투-제로가 내장되어 있다. 30초 동안 비활성 상태면 잠들고, 필요할 때 빠르게 깨어난다. Sprite가 깨어 있는 동안 사용한 CPU 시간, RAM 시간, 스토리지 GB-시간에 대해서만 과금된다.
Fly는 추정으로 4시간짜리 고강도 코딩 세션 비용이 약 46센트, 월간 깨어 있는 시간이 30시간인 저트래픽 웹 앱 비용이 약 4달러라고 한다.
(내가 계산해 보니, 8 CPU와 8GB RAM을 한 달 내내 24/7 전부 다 쓰는 웹 앱이라면 ((7센트 * 8 * 24 * 30) + (4.375센트 * 8 * 24 * 30)) / 100 = 월 $655.2 정도가 나온다. 그러니 CPU와 RAM을 있는 대로 다 빨아먹는 앱의 기본 웹호스팅으로 쓰기에는 꼭 맞는 선택이 아닐 수도 있다!)
나는 Fly가 개발자 친화적인 샌드박스 API 시장에 진입하길 바라고 있었다. 특히 Cloudflare, Modal, E2B 같은 회사들이 이미 뛰어들고 있는 상황이라 더 그랬다.
하지만 그들이 개발자 샌드박스 문제까지 동시에, 그것도 같은 제품으로 해결하려 할 줄은 예상하지 못했다!
우려되는 점이 하나 있다면, 이 때문에 제품 자체가 설명하기 조금 더 어려워졌다는 것이다.
나는 이미 예전부터 만들고 싶었던 샌드박스 인접(prototype of sandbox-adjacent)한 것들을 몇 가지 프로토타이핑하고 있고, 초기 징후는 매우 고무적이다. 이것들이 유용한 프로젝트로 발전하면 더 자세히 쓰겠다.
업데이트: Hacker News에서 Thomas Ptacek이 남긴 추가 코멘트:
이건 꽤 오랫동안 준비해 온 작업입니다. 우리는 “생성은 느리게, 시작/정지는 빠르게(slow create fast start/stop)”라는—실행 환경으로서 정말 흥미롭고 유용한 형태—에 크게 베팅했지만, 샌드박서(sandboxer)들에게는 말이 되지 않았습니다. 그래서 “빠른 생성(fast create)”은 1년 넘게 Fly.io에서 집착해 온 화이트 웨일(White Whale)이었죠.