Independent project: Cageforge is not affiliated with, sponsored by, or endorsed by OpenAI.
Cageforge Python binding
cageforge provides a typed Python API for the Cageforge sandbox on Linux,
macOS, and Windows. It loads the selected profile and uses the native backend
provided by the installed wheel.
The package is built with PyO3 and maturin. The published package name is
cageforge.
Use the published cageforge crate as the project-level reference for the sandbox API. See the shared configuration guide for the complete Linux/macOS/Windows profile shape, including the resources a first restricted launch must declare separately from local IPC.
Install
python -m pip install cageforge
Each wheel contains the Python extension and the native resources for one operating-system and architecture target. Linux wheels include the pinned Bubblewrap resource. Applications do not need to install a separate native helper or provide a host-specific resource path.
The release also includes free-threaded CPython 3.14 wheels for each supported
operating-system and architecture target. Standard CPython 3.10 and newer
builds use the stable abi3 wheel for their platform.
Quick start with the repository smoke profile
The repository already contains one runnable profile for each supported OS.
This example selects the profile for the current host and uses
Cageforge.from_toml_file to run it. Run it from the repository root:
import platform
from pathlib import Path
from cageforge import Cageforge, PermissionApprover, RuntimeContext
platform_name = platform.system().lower()
profile_name = {
"linux": "linux",
"darwin": "macos",
"windows": "windows",
}[platform_name]
profile = (
Path("crates")
/ "cageforge-config"
/ "examples"
/ "runnable"
/ profile_name
/ "smoke.toml"
).resolve()
context = RuntimeContext(profile.parent)
toml = profile.read_bytes().decode("utf-8")
Cageforge.check_toml(toml, context=context)
request = Cageforge.permission_request(toml, context=context)
grant = PermissionApprover().approve(request)
with Cageforge.from_toml_file(
profile, context=context, grant=grant, request=request
) as runtime:
with runtime.launch() as process:
print(process.read_stdout(4096).decode().strip())
assert process.wait().exit_code == 0
The three profiles are linux/smoke.toml,
macos/smoke.toml,
and windows/smoke.toml.
They use the current Cageforge TOML schema, include minimal read access,
declare a workspace root, allow writes to workspace-root, and disable the
network. The Windows profile uses cmd.exe; the POSIX profiles use /bin/echo.
Profiles with approval.mode = "preflight" require a trusted host grant before
launch. PermissionRequest is descriptive; only PermissionApprover can
issue the opaque PermissionGrant. A grant never changes an already-running
process.
When permission_request is called with custom identity or digest arguments,
pass that same PermissionRequest to from_toml or from_toml_file; the
runtime then authorizes the grant against the exact identity that was approved.
PermissionRequest.local_ipc() returns frozen typed LocalIpcEndpoint values.
Their kind is unix_socket or windows_named_pipe, and value is the
validated native endpoint. The platform overlay selects which endpoint kind
is present; a Windows named-pipe request remains fail-closed if the native
backend cannot prove the required isolation.
Persistent grants and store paths
The permission store is host state, not TOML policy. Choose its absolute path explicitly and use a persistent grant when the approval should survive a new process:
from pathlib import Path
from cageforge import PermissionApprover, PermissionStore
store = PermissionStore.open(Path("/var/lib/my-tool/permissions.json"))
toml = profile.read_bytes().decode("utf-8")
request = Cageforge.permission_request(toml, context=context)
grant = PermissionApprover().approve(request, scope="persistent")
store.put(grant, request)
cached = store.get(request)
assert cached is not None
with Cageforge.from_toml_file(
profile, context=context, grant=cached, request=request
) as runtime:
...
PermissionStore protects the file with owner-only permissions on Unix and an
owner-only DACL on Windows. It uses a versioned JSON document, a kernel file
lock, and atomic replacement. A missing store record is not an
approval; preflight remains deny-by-default.
Persistent grants can be inspected and revoked by stable ID without exposing their approved capability payload:
page = store.list_page(page_size=50)
for summary in page.entries:
print(summary.id, summary.tool_id)
if page.next_cursor is not None:
page = store.list_page(page_size=50, cursor=page.next_cursor)
result = store.revoke(request.grant_id())
assert str(result) in {"revoked", "not-found"}
GrantPageCursor is opaque and becomes stale when the store changes. The
binding exposes stable store exception subclasses for invalid IDs, invalid
cursors, page size, stale cursors, lock, read, write, and format failures. All
digest and store validation is performed by the shared Rust implementation.
When profile_name is omitted, Cageforge.from_toml and check_toml use the
TOML document's default_profile. Cageforge.from_toml_file reads a file and
uses its parent directory as the default current directory. RuntimeContext()
uses the Python process directory and lets the native adapter provide the
platform's default minimal paths. Passing a path in RuntimeContext does not
grant access unless the selected profile contains the corresponding rule.
The minimal selector is symbolic. Linux adapters supply the executable and
loader paths needed by the selected backend, macOS supplies its system runtime
paths, and Windows supplies the system root and System32 paths. Use the
separate files under
cageforge-config/examples/runnable/
when the command or path syntax is OS-specific.
The macOS runtime.executable_roots overlay is passed through the same
preflight request; its filesystem capabilities expose map-executable
separately from read.
Processes, asyncio, and errors
SandboxProcess provides try_wait, wait, wait_for, kill, and close,
as well as read_stdout, read_stderr, write_stdin, and close_stdin. The
wait_for method is a compatibility alias for wait. Blocking native waits
and stream operations release the GIL.
For asyncio applications, wait_for_async(process) waits in a worker thread
so the event loop remains responsive. Cancelling the coroutine terminates the
process boundary and then propagates asyncio.CancelledError.
Configuration, initialization, launch, process, stream, and Windows setup
failures use typed exceptions under CageforgeError, including
CageforgeConfigurationError, CageforgeLaunchError, and
CageforgeProcessError:
from cageforge import Cageforge, CageforgeConfigurationError
try:
Cageforge.check_toml("not valid = [")
except CageforgeConfigurationError as error:
print(f"invalid Cageforge configuration: {error}")
Windows setup and native resources
Windows provisioning is explicit because installation can require UAC. Before launching on Windows, an application can reconcile and verify the owner-scoped setup:
from cageforge import WindowsSetup
if WindowsSetup.is_supported():
if WindowsSetup.status() != "ready":
WindowsSetup.install()
WindowsSetup.verify()
install() is the only operation in this sequence that may request elevation.
Creating a runtime does not silently install Windows components. Linux wheels
prefer a compatible system Bubblewrap and fall back to the bundled Bubblewrap
resource shipped in the wheel. macOS uses the packaged native helper.
Development
From this directory, install maturin and the Python development tools, then
use maturin develop, pytest, mypy --strict, and ruff check. The committed
_cageforge.pyi stub is generated by running cargo run --bin stub_gen from
this crate directory. The Java and Python bindings share the same native policy
contract; binding-specific contract checks live with their respective tests.
Release files for cageforge 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cageforge-0.6.0.tar.gz | 903.9 kB | Details |
Built distributions (wheels)
Total release size: 84.2 MB
Release files / cageforge-0.6.0.tar.gz
| Download URL | cageforge-0.6.0.tar.gz |
|---|---|
| Size | 903.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4e2ccd2a93a4e0035821b4ba8034dee64466cf8438cfc2358a7c921af1232e99
|
|
BLAKE2b-256 checksum How to use checksums |
3853eca563e0232483987ce70d57fbdcd2ac95f3c65ff65ce3c50b16f809e72e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp314-cp314t-win_arm64.whl
| Download URL | cageforge-0.6.0-cp314-cp314t-win_arm64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Windows ARM64 |
|
SHA-256 checksum How to use checksums |
b8266924d555e0d94f3608c932b88f44542ae916286d41ad03e7a39667301268
|
|
BLAKE2b-256 checksum How to use checksums |
07783a997dbf8045dffeb1426da5d3ead2ace3999908741f55b331a4ed1f363f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp314-cp314t-win_amd64.whl
| Download URL | cageforge-0.6.0-cp314-cp314t-win_amd64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Windows x86-64 |
|
SHA-256 checksum How to use checksums |
56a99f0e3658a0cb44a7341c754e6056d94756ba09badffa9cb26207a77105a8
|
|
BLAKE2b-256 checksum How to use checksums |
e6543b8d0572747c3cbf16c8414993ce4c63d4c81515f1673e971c17b97e7823
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | cageforge-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 7.4 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
b35a3e7028e886673174c349e7ed2948523c5ef9a883f297de381e830a8d744e
|
|
BLAKE2b-256 checksum How to use checksums |
2af38211eddb369952d72b823388a2e2b00aef4f4dbec6c2e5379cac3c80d95a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | cageforge-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
7551f37bcc4ac72a7678d6072efb47b38d6c002d71856d7a10bf7d53246a8cfe
|
|
BLAKE2b-256 checksum How to use checksums |
d5726667aa94dbf499285d7eb482bc1598c1d0f51d5151502aa957751768bc22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl
| Download URL | cageforge-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.3 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0da6a061ed9d3053d895697444fbacbb009a7d73172a1e7c4a4ae7d1b0476625
|
|
BLAKE2b-256 checksum How to use checksums |
590103fa2f9f522a04fbdda223be472d4e0449b56ee9613fe63b45b3695ed86b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl
| Download URL | cageforge-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
952d3a7d457a471dbd68b4f6a889c3c547513b653fa2b00e2aeb3d68d1a3a4b1
|
|
BLAKE2b-256 checksum How to use checksums |
9c3c74ca639bdf98c72982cd54dff569ad0a705ca150838c5724b4040e494b99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp310-abi3-win_arm64.whl
| Download URL | cageforge-0.6.0-cp310-abi3-win_arm64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | CPython 3.10 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
e03ba11c1eb168c147d4c1a138c1e083d8c448f04778b01973c8396f9be2437b
|
|
BLAKE2b-256 checksum How to use checksums |
5e561203fcfb09e3419c33ef1d880d09b13388c65f3fdbae51227a8ea74beca6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp310-abi3-win_amd64.whl
| Download URL | cageforge-0.6.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
2c0eac94ef5fb97bd0a213c0f7cfd24828b64888c688017052f45d90b54bea49
|
|
BLAKE2b-256 checksum How to use checksums |
02a66251393246216388da0d9b0409b3befcb08bb8be0693e55f5194463f83f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | cageforge-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 7.4 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
02c8fb876fea02848d81bdbf985f3f5493f9534f89896c8277f7017158cc353d
|
|
BLAKE2b-256 checksum How to use checksums |
d95d8851f9f9d934936b78746a1c358b1c69461e18573b8167fb193c911881bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | cageforge-0.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
945c5ebb543d7570a521bf7889609d45900f42937914f3e38e24475eb091edea
|
|
BLAKE2b-256 checksum How to use checksums |
2ec193b625ed025d733d11b701320b1d3a19cdff1ac026901bc2e5eb799acb4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | cageforge-0.6.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.3 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b00cda7174b361a91a0d756ed55338015c5fa950cf78a46cd7bd59ce19b4f7e0
|
|
BLAKE2b-256 checksum How to use checksums |
64469fb75adcaa7be020c7a57b04b0ed036965609e27dc53165fec261c02bde8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency logRelease files / cageforge-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | cageforge-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ed7bfca086a61a3d40b7158a02b5eddab4f8db3a54385b594d32a01aa256133f
|
|
BLAKE2b-256 checksum How to use checksums |
fe9120513b6fcc9ff81b64d0a0165827aaefe1fe943bf7be15a3a3826214fd4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.
Transparency log