
Sandboxes Linux leves e seguros para processos não confiáveis. Funciona no navegador e no servidor.
Vpod vpod ?Um vpod é um sandbox leve e portátil que oferece a um processo não confiável um ambiente Linux instantâneo. Ele usa arquitetura RISC‑V e é executado inteiramente dentro do WebAssembly.
Um vpod executa um sistema RISC‑V completo (RV64GC, uma única vCPU) compilado para WebAssembly. Dentro dele, inicializa um kernel Linux real com um userspace real, então shells, ferramentas e daemons se comportam exatamente como fariam em hardware real.
Snapshots. Em vez de inicializar o Linux do zero, um vpod restaura um snapshot: um estado de máquina salvo (registradores de CPU, RAM, sistema de arquivos) capturado logo após a inicialização. Restaurar um leva bem menos de um segundo. A suspensão funciona da mesma forma, ao contrário: apenas páginas de memória sujas são gravadas de volta no disco, permitindo pausar um sandbox e retomá-lo depois, até mesmo de outro processo.
Tradução antecipada (AOT). A emulação puramente instrução por instrução é lenta, e o WebAssembly descarta um JIT em tempo de execução. Então, no momento da construção do snapshot, os caminhos de código convidado mais "quentes" são traduzidos de RISC‑V para código nativo que é compilado dentro do próprio módulo WASM. Em tempo de execução, o emulador despacha para esses blocos traduzidos quando o código convidado corresponde e volta para o interpretador quando não corresponde. Isso gera aproximadamente 5x em trabalho com uso intenso de CPU, sem nenhum efeito sobre o isolamento: o código traduzido passa pelas mesmas verificações de MMU e memória que o código interpretado.
O limite do WASI. O componente WASM fala com o host exclusivamente por meio do WASI 0.2. O convidado nunca vê descritores de arquivo, sockets ou memória do host: o acesso ao sistema de arquivos passa por diretórios explicitamente montados, e a rede passa por uma pilha de rede em modo usuário dentro do componente que apenas solicita ao host sockets de saída simples. Todo o resto (kernel convidado, processos, memória) vive dentro da memória linear do WASM e morre com ela.
G (Extensões de propósito geral)
C (Instruções compactadas) Reduz o tamanho do código em 30%, melhorando a velocidade de busca de instruções e a eficiência de memória. Isso é importante ao executar um userspace Linux completo dentro do nosso ambiente WASM com restrição de memória.
[!NOTE] A extensão V (vetorial) não está implementada. As instruções RVV seriam executadas como RISC-V emulado; não há passagem SIMD para a CPU host. Adicionar V aumentaria a sobrecarga de emulação sem nenhum benefício de desempenho para cargas de trabalho vetorizadas.
pip install vpod
from vpod import Sandbox
# Run a command
sandbox = Sandbox.create()
result = sandbox.commands.run("whoami")
print(result.stdout) # root
sandbox.close()
# Persistent session — state preserved across calls
with Sandbox.create() as sandbox:
sandbox.commands.run("export API_KEY=secret")
result = sandbox.commands.run("echo $API_KEY")
print(result.stdout) # secret
# Python REPL — variables persist
with Sandbox.create() as sandbox:
sandbox.code.run("import requests")
sandbox.code.run("data = [1, 2, 3]")
result = sandbox.code.run("print(sum(data))")
print(result.text) # 6
[!IMPORTANT] A primeira chamada a
Sandbox.create()baixa o snapshot padrão (alpine) e o armazena em cache localmente se ainda não estiver presente.
curl -fsSL https://install.vpod.sh | sh
Ou instale via PowerShell (windows)
irm https://install.vpod.sh | iex
# Pull a snapshot
vpod pull alpine:latest
# Start an interactive shell
vpod
Visite a documentação do Vpod.
Contribuições são bem-vindas, desde relatórios de bugs até suporte a novos dispositivos. Abra uma issue para discutir qualquer coisa substancial antes de implementá-la.
wasm32-wasip2: rustup target add wasm32-wasip2# One-time: generate the AOT stub (a fresh clone has no translated blocks)
./scripts/aot-stub.sh
# Build the WASM component (library + CLI)
./scripts/build-wasm.sh
# Install the host CLI
cargo install --path crates/vpod
# Install the Python SDK in dev mode
pip install -e "sdks/python[dev]"
A CI executa estes em todo PR, então execute-os antes de enviar:
cargo fmt --all -- --check # formatting
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all # Rust tests
# Python SDK integration tests (needs the WASM library in place)
cp target/wasm32-wasip2/release/vpod_wasi_lib.wasm sdks/python/vpod/
pytest sdks/python/tests/ -v -m integration
O projeto usa snapshots Alpine pré-construídos de registry.vpod.sh, então normalmente você não precisa disso. Para criar um localmente:
./scripts/build-default-snapshot.sh # dist/alpine-3.23.0-256mb.snap
./scripts/build-data-snapshot.sh # 512 MB variant with numpy/pandas/scipy
[!IMPORTANT] Para usar um snapshot construído localmente, descomente as linhas em
resolve_snapshot()emcrates/vpod/src/main.rs.
As compilações de snapshot também podem executar o passe AOT (scripts/aot-snapshot.sh <snapshot>), que rastreia uma carga de trabalho representativa, traduz os blocos "quentes" e reconstrói o emulador com eles incorporados. Isso demora um pouco; o stub de aot-stub.sh é suficiente para o desenvolvimento diário, tudo funciona igual, apenas mais devagar.
fmt, clippy e a suíte de testes devem passar (a CI exige os três).Este projeto está licenciado sob a Apache License 2.0. Veja o arquivo LICENSE para detalhes.