Portaldocs
Reference

Limits

Every limit Portal applies, with its value and where it is set in Portal's code.

Warnings and limits

  • Your providers' quotas and capacity are limits too, and often the first you meet: Portal does not raise them. See Quotas and capacity.
  • A request over a limit is refused with a sentence that names it. Rate limits answer 429 with Retry-After.
  • Sources are files under src/portal/ in Portal's code, with the constant or function that sets the value. A test checks that each one exists.
  • Portal is open to anyone with an active Clusy account and a verified email address.
  • The limits that decide whether a workload goes through, in words, are on Known limits.

Access and requests

LimitValueSource
Who is admittedPortal is open to anyone with an active Clusy account and a verified email address.platform/api/config.py ADMIT_POLICIES
Console sessionends after 12 hours unused, 7 days at mostgateway/sessions.py SESSION_IDLE_S, gateway/directory.py SESSION_MAX_S
Fresh sign-in for sensitive actionsfrom the last 5 minutesgateway/sessions.py FRESH_S
Device sign-in codelasts 10 minutesservice/auth.py DEVICE_TTL_S
CLI credentialrenews every 15 minutes, lasts until revokedgateway/cli_auth.py ACCESS_S
Agent token1, 7 or 30 daysgateway/tokens.py EXPIRY_DAYS
Sign-in starts30 a minute per clientgateway/signin.py STARTS_PER_MINUTE
Requests in flight128 per workspace, then 429gateway/proxy.py WORKSPACE_REQUESTS_MAX
Request body1 MiBgateway/policy.py BODY_MAX
Request body for a secret, a connection or settings4 MiBgateway/policy.py LARGE_BODY_MAX
A job's form8 MiB (the project goes by upload link)gateway/policy.py UPLOAD_BODY_MAX
A log read's wait10 s at mostgateway/policy.py WAIT_MAX_S
Installer downloads30 requests a minute per clientservice/install.py DOWNLOADS_PER_MINUTE

Connections

LimitValueSource
Connections per workspace24service/connections.py MAX_CONNECTIONS
Connections per cloud8service/connections.py MAX_PER_KIND
A connection's label1 to 24 lowercase letters, digits or hyphensproviders/names.py LABEL
Verification when saved60 sservice/connections.py VERIFY_TIMEOUT_S
An AWS ExternalId waiting to be used24 hoursservice/connections.py EXTERNAL_ID_TTL_S
A secret's nameup to 128 charactersservice/connections.py SECRET_NAME
Secrets per workspace64, and 16 MiB sealed in all; past either, storing one more is refused (409)service/connections.py SECRETS_MAX, SECRETS_BYTES_MAX

Jobs and uploads

LimitValueSource
A file in the uploaded projectleft out over 100 MBui/pack.py LARGE_BYTES
The uploaded projectrefused over 500 MBui/pack.py MAX_BYTES
An upload's archive600 MBservice/api.py WORKSPACE_MAX
An upload linkvalid 1 hourservice/api.py UPLOAD_EXPIRES_S
Uploads no job took2 GB and 64 per workspaceservice/api.py UPLOAD_BUDGET, UPLOAD_COUNT_MAX
A project's name1 to 100 charactersui/jobs.py check_project
Jobs running at once100 per workspace (queued and running jobs; suspended ones do not count), then 429 for a launch or a resumeservice/api.py JOBS_LIVE_MAX
Python3.12 by default, 3.13 or 3.14env/jobenv.py SUPPORTED_PYTHONS
Offers tried when there is no capacity4service/runner.py ALTERNATIVES
A pool that had no capacity ranks last5 minutesservice/runner.py NO_CAPACITY_S
Quotes from one provider45 sservice/placement.py OFFERS_TIMEOUT_S
A plan or quote from the CLI120 sui/api.py PLAN_TIMEOUT_S
StopSIGTERM, then the controller waits 15 sservice/runner.py STOP_GRACE_S
A Modal GPU sandbox waiting for capacity5 minutes when the job is pinned to one GPU type, 3 minutes when another offer follows, else the start timeout of 15 minutesproviders/modal_.py PINNED_GPU_CREATE_S, FALLBACK_CREATE_S, START_TIMEOUT_S
A Modal image build30 minutes for the requirements, 10 for Portal's own layer; a failed build is built once more afreshproviders/modal_.py DEPS_BUILD_TIMEOUT_S, PORTAL_BUILD_TIMEOUT_S
GPUs in one Modal sandbox8providers/modal_.py MAX_GPUS
Out-of-memory rescuesa capture that fails twice in a row for the same reason ends the jobservice/runner.py OOM_CAPTURE_TRIES
The memory cap on Linux CPU machinesa reserve of 10% of the machine's memory, 256 MiB to 1 GiB; PORTAL_MEMORY_TRIPWIRE=0 in the job's environment turns it offruntime/oom.py TRIPWIRE_ENV
Why a move waitssaid again every 5 minutes per reasonservice/runner.py PAUSE_BLOCKED_EVERY_S

Logs and records

LimitValueSource
A job's logthe first 256 MiBservice/runner.py LOG_MAX
One log read256 KiBservice/api.py LOG_LIMIT
Events kept per jobthe newest 20,000service/db.py EVENTS_KEPT
Samples kept per jobthe newest 20,000, one per 10 sservice/db.py SAMPLES_KEPT, SAMPLE_EVERY_S
Samples per answer5,000service/api.py SAMPLES_MAX
Jobs in a listing and in name lookupsthe newest 500service/api.py JOBS_PAGE
The job list and the overviewanswers kept 20 s; a job's creation, status change or deletion drops them at onceservice/api.py JOBS_TTL_S, OVERVIEW_TTL_S

Retention

ItemKeptSource
A job's output7 daysplatform/objects/retention.py OUTPUT_RETENTION_S
A job's log30 days from when each part was writtenstorage/setup.py BACKSTOP_DAYS
A suspended job's checkpoint3 days, a warning 18 hours beforeservice/settings.py DEFAULTS, storage/retention.py warn_s
Checkpoints after an end Portal decided7 daysservice/runner.py KEEP_ENDED_S
A failed move's checkpoint1 hourstorage/retention.py FAILED_MOVE_KEEP_S
A checkpoint that failed verification1 daystorage/retention.py QUARANTINE_KEEP_S
An upload no job took1 dayplatform/objects/retention.py UPLOAD_RETENTION_S

Machines, leases and notices

LimitValueSource
A machine's first lease90 minutesservice/placement.py FIRST_LEASE_MIN
Lease kept ahead1 hour (your own machines 24 hours), renewed every 10 minutesservice/policies.py DEFAULTS, service/placement.py LEASE_AHEAD_S
Modal and Azure Container Apps24 hours at mostservice/placement.py FIXED_LIMIT_MIN
Google Cloud VMs24 hours by default (1 to 2880)service/settings.py DEFAULTS
Ending machines past their leasechecked every 60 s, 2 minutes' graceservice/billing.py REAP_EVERY_S, LEASE_GRACE_S
AWS spot notice2 minutesagent/spot.py watch_aws
AWS Fargate Spot notice120 sproviders/fargate.py STOP_TIMEOUT_S
Google Cloud spot notice120 s asked for, 25 s if refusedproviders/gcp_vm.py instance_body, service/settings.py DEFAULTS
Azure spot VM notice20 s (the event names a time 22 to 27 s out; the node sees it within about a second)providers/azure_vm.py SPOT_NOTICE_S, service/notice_fit.py NOTICE_S, agent/spot.py watch_azure
Azure Container Apps interruption noticenone: when Azure stops the execution it ends the replica at once (a stopped execution's node was gone 0.55 s later, before any checkpoint, 2026-10-31), and progress since the job's last checkpoint is lost; portal interrupt is refused thereservice/notice_fit.py NO_NOTICE, providers/aca.py interrupt
Modal GPU sandbox preemption5 sproviders/modal_.py SANDBOX_GRACE_S
The checkpoint checkat the first pause point, then every 10 minutes; its walk is cut after 5 s; a script that passes no pause point is reported after 30 sruntime/host.py PROBE_EVERY_S, PROBE_BUDGET_S, PROBE_WAIT_S
What a spot notice can saveR x (notice - t0) x 0.5 per provider, vCPU class and route; a measured state above it keeps the job off that spot offerservice/notice_fit.py RATES, NOTICE_S, SAFETY
EC2 waiting for capacity or quota5 minutesproviders/aws_ec2.py CAPACITY_WAIT_S
Lambda launchesone every 12 s; after no capacity, 60 s doubling to 30 minutesproviders/lambda_cloud.py LAUNCH_INTERVAL_S, COOLDOWN_S
A machine given notice, silent past its deadlineasked whether it still runs 2 minutes afterservice/runner.py NOTICE_LOST_AFTER_S
A machine its provider no longer listssettled as ended, unconfirmed, after 2 hours unlistedservice/billing.py UNLISTED_SETTLE_S
What a machine holds against the capits lease (Modal sandboxes, Fargate tasks, VMs); a Container Apps replica its 24 hoursservice/placement.py LEASE_HELD, FIXED_LIMIT_MIN
A Modal create whose reply was lostsettled at $0 once no sandbox exists 60 s after it was askedproviders/modal_.py CREATE_GRACE_S
The Azure registry copy, after a failuretried again after 10 minutesproviders/aca.py MIRROR_RETRY_S
A release's stand-down10 s at most before the lease is releasedplatform/api/lease.py STAND_DOWN_S

Your own machines

LimitValueSource
An enrollment codevalid 10 minutes, onceservice/machines.py ENROLL_TTL_S
Approvalwithin 24 hoursservice/machines.py WAITING_MAX_S
Wrong pairing codesthe fifth revokes the machineservice/machines.py PAIR_FAILURES_MAX
Codes per person10 an hourservice/machines.py MINTS_PER_HOUR
Waiting at once20 codes and unapproved machinesservice/machines.py WAITING_MAX
Machines per workspace50service/machines.py MACHINES_MAX

Policy defaults

PolicyDefaultSource
Idle30 minutes under 5% of a CPU coreservice/policies.py DEFAULTS
Time limit (ttl)72 hours of running time; while a job is suspended, the same hours on the clock from its creation end it, its checkpoint kept 7 days for a resume to continue itservice/policies.py DEFAULTS, evaluate; service/runner.py _expire_parked
Cheaper and returnevery 10 minutes, at least 20% and 3 times the move's cost, 30 minutes after a moveservice/policies.py DEFAULTS
Budgetacts 2 minutes of the machine's price earlyservice/policies.py DEFAULTS
Reclaimed spot poolleft out 30 minutesservice/policies.py DEFAULTS
Spot, state over the noticemoved to on-demand (spot.move_when_over); tried again 10 minutes after a destination could not be hadservice/policies.py DEFAULTS, service/runner.py LEAVE_SPOT_RETRY_S

Every policy and setting, with its default, is on Settings.

On this page