Promigence vs Modal
How Promigence and Modal compare for batch agent work and long-running agents. Each Modal fact comes from Modal's own pages, with a link and the date it was read.
Also as markdown: /compare/promigence-vs-modal.md
Modal and Promigence both start sandboxes from an API and run agent code inside them. Everything around the sandbox differs. This page compares the two on two kinds of work: batches of identical sandboxes (evals, rollouts, test fan-out), and agents that run for a long time and spend much of it waiting.
Every Modal cell comes from Modal's own documentation or pricing page and links to it, read on 25 Oct 2026. Where those pages do not cover a row, the cell says so instead of guessing. The Promigence cells describe features that are built today, named by the command that does the work.
Batch work#
| Criterion | Promigence | Modal |
|---|---|---|
| Start N copies of one environment | promigence run --count N, each copy with PROMIGENCE_INDEX and PROMIGENCE_SEED | Each Sandbox is created with Sandbox.create, and several can start from the same Image or Filesystem Snapshot, which Modal's snapshots guide calls forking (Modal Sandboxes, Modal snapshots, read 25 Oct 2026); a count option is not stated on Modal's site (25 Oct 2026) |
| Know the cost first | promigence run quote prices the run before anything starts | Per-second rates are published (Modal pricing, read 25 Oct 2026); a quote for a run before it starts is not stated on Modal's site (25 Oct 2026) |
| Hard ceiling | --cap: a run quoted above it is refused, or --allow-partial starts what fits | A monthly Workspace budget and a Workspace spend limit, plus monthly Environment budgets on Team and Enterprise (Modal budgets, read 25 Oct 2026); a cap per run is not stated on Modal's site (25 Oct 2026) |
| Check the environment before the task | A snapshot built with --verify runs its verify command when it is built, and every sandbox starts from that checked snapshot | Readiness probes: a TCP probe that waits for a port, or an exec probe whose command must exit 0, and wait_until_ready() blocks until one passes (Modal Sandboxes, read 25 Oct 2026) |
| Who failed: environment or task | The validity report, plus exit 3 for the environment and exit 4 for the task | Exit codes for each command and for the Sandbox, and an Exit Reasons metric for Sandboxes evicted over their memory request (Modal Sandboxes, Modal sandbox pricing and resources, read 25 Oct 2026); a split of environment failures from task failures is not stated on Modal's site (25 Oct 2026) |
| Retry broken environments | promigence run replay, only when asked, reported apart from the run's own figures | Not stated on Modal's site for Sandboxes (25 Oct 2026) |
| Inspect a failure | run open reopens a failed sandbox in the state it was in when it failed; run report --sandbox SID --repro prints a command that runs it again | modal shell connects to a running Sandbox by ID (modal shell, read 25 Oct 2026), and the snapshots guide lists backing up a Sandbox's state for debugging (Modal snapshots, read 25 Oct 2026); an experimental exit snapshot, in Modal's JavaScript and Go SDK references, saves a Sandbox's filesystem when it exits, an abrupt exit included, and a new Sandbox can start from it (Modal JS SDK: Sandbox, Modal Go SDK: Sandbox, read 25 Oct 2026); reopening a Sandbox with its processes at the moment it failed is not stated on Modal's site (25 Oct 2026) |
| Grading in a clean copy | --grade CMD runs your grader in a fresh copy of the snapshot with the agent's file changes applied, after the agent's process has ended; --holdout CMD reports the gap to a second test set | Not stated on Modal's site (25 Oct 2026) |
| Safe retries from a script | --idempotency-key: repeating a command with the same key within 24 hours returns the first result | Named Sandboxes: a name is unique within an App, only one running Sandbox can use it at a time, and creating a second one with it raises an error (Modal Sandboxes, read 25 Oct 2026) |
| Name the exact environment later | Snapshot IDs, and snapshot export writes a portable bundle | Images and Filesystem Snapshots have IDs; Filesystem and Directory Snapshots are kept 30 days by default unless you set another TTL or opt out of expiry (Modal snapshots, read 25 Oct 2026); a portable export is not stated on Modal's site (25 Oct 2026) |
Long-running agents#
| Criterion | Promigence | Modal |
|---|---|---|
| Full environment ready at start | Snapshots of a repository with its services and build, checked by a verify command | Custom Images built ahead with Image.build and published as named Images, plus readiness probes (Modal Sandboxes, read 25 Oct 2026) |
| Waiting without paying by the second | sandbox pause and sandbox autopause --after DUR; paused time is not billed | A pause call for Sandboxes is not stated on Modal's site (25 Oct 2026). Memory Snapshots, in alpha, save a Sandbox's memory and files and end it; a new Sandbox restored from one has the same processes running, and the snapshot expires after 7 days (Modal snapshots, read 25 Oct 2026). idle_timeout ends an idle Sandbox, and Filesystem Snapshots keep its files for a new Sandbox later (Modal Sandboxes, Modal snapshots, read 25 Oct 2026) |
| More time for a live sandbox | sandbox extend sets a longer timeout, within the run's spend cap | The lifetime is set at creation, 5 minutes by default and up to 24 hours; for longer work, Modal suggests saving the state as a Filesystem Snapshot and restoring it in a new Sandbox (Modal Sandboxes, read 25 Oct 2026); extending a running Sandbox is not stated on Modal's site (25 Oct 2026) |
| Save progress as a new starting point | sandbox snapshot SID, without stopping the sandbox | snapshot_filesystem() returns an Image that new Sandboxes start from, and Directory Snapshots save one directory (Modal snapshots, read 25 Oct 2026) |
| Network boundary | An allow-list per run (--allow HOST) or no network (--network none); sandbox network lists the hosts a sandbox was refused, and --cut ends its outbound access for good | block_network, an IP-range allowlist and a domain allowlist (beta, TLS on port 443), with an alpha way to replace the outbound policy of a running Sandbox (Modal networking and security, read 25 Oct 2026) |
| Credentials | Stored secrets by name, given per run or per command; a secret bound to a host can be kept out of the sandbox (secrets set --host, --no-raw) | Secrets as environment variables (Modal Sandboxes, read 25 Oct 2026); secret injection (beta) adds headers to outbound HTTPS requests outside the Sandbox, so the key never appears inside it (Modal secret injection, read 25 Oct 2026) |
| Human access | sandbox shell for an interactive terminal, sandbox ssh for SSH, scp and sftp | modal shell with a Sandbox ID (modal shell, read 25 Oct 2026) |
| Reach a port in the sandbox from outside | sandbox ssh forwards a port with -L | Tunnels give a port a public URL, and Sandbox Connect Tokens authenticate HTTP and WebSocket requests (Modal networking and security, read 25 Oct 2026) |
| Rebuild when the code moves | snapshot create --track rebuilds on every push to a connected GitHub repository | Image.build runs from your deploy flow, a scheduled job or CI (Modal Sandboxes, read 25 Oct 2026), and Modal's continuous deployment guide gives a GitHub Actions workflow that deploys on every push to main (Continuous deployment, read 25 Oct 2026); a rebuild that Modal starts on its own when you push is not stated on Modal's site (25 Oct 2026) |
Account and access#
| Criterion | Promigence | Modal |
|---|---|---|
| Billing unit | Per second | Per second, on the higher of the resource request and actual use (Modal sandbox pricing and resources, read 25 Oct 2026) |
| List price | $0.0504 per vCPU-hour and $0.0162 per GiB-hour, metered per second | Sandbox CPU $0.00003942 per physical core (2 vCPU equivalent) per second and memory $0.00000667 per GiB per second (Modal pricing, read 25 Oct 2026) |
| Plans | Free, Pro at $50 a month, Max at $250 or $500 a month, Enterprise at a custom price | Starter at $0 plus compute, Team at $250 a month plus compute, Enterprise at a custom price (Modal pricing, read 25 Oct 2026) |
| Sign-up and free credit | Sign up for free; every plan starts with $50 of free credit | $30 of free credits a month on Starter and $100 a month on Team (Modal pricing, read 25 Oct 2026) |
| Sandboxes at once | 20 on Free, up to 100 on Pro, up to 500 or 1,000 on Max | 100 containers on Starter and 5,000 on Team (Modal pricing, read 25 Oct 2026) |
| Organization structure | Organizations hold projects; each API key belongs to one project | Workspaces with Owner, Manager and Member roles, divided into Environments that each have their own Secrets (Modal workspaces, Modal environments, read 25 Oct 2026) |
| Monthly limit | promigence project cap | Workspace budget and spend limit; Environment budgets on Team and Enterprise (Modal budgets, read 25 Oct 2026) |
| Run in your own cloud | On the Enterprise plan: talk to us | Not stated on Modal's site (25 Oct 2026); Enterprise customers can use committed spend through the AWS and GCP marketplaces (Modal pricing, read 25 Oct 2026) |
Where Promigence fits#
Promigence fits batches whose results have to be trusted: the run is quoted and capped before it starts, every snapshot is checked by its verify command when it is built, and the report keeps environment failures apart from task failures. Long agents that wait most of the time fit too, since a paused sandbox is not billed.
To try it, start from the quickstart. Every plan starts with $50 of free credit.
Sources#
The Modal pages behind this comparison, all read on 25 Oct 2026, are networking and security, pricing, Sandboxes, snapshots, secret injection, sandbox pricing and resources, budgets, workspaces, environments, continuous deployment, modal shell, and the JavaScript and Go SDK references for Sandbox. The Promigence cells come from the CLI reference, the errors and exit codes page and the pricing section.
If anything on this page is out of date or wrong, write to support@promigence.ai and we will correct it and note the date.