Help
Changelog
What changed for Portal's users, release by release.
Warnings and limits
- Dates are UTC. Each entry lists what a user can see; fixes inside Portal that change nothing for you are left out.
- What is built but not released yet is on Coming soon.
2026-10-31: the night after launch
- A job whose node is not connected is no longer told it goes on. A suspend or move refused because the node is not connected says since when, that Portal is checking whether the provider ended the machine, and that the job's state is kept only if its last checkpoint landed; the job keeps its state with its node unreachable. While the provider says the machine is gone, the events say what Portal waits for (a second gone read at the next check, the node still silent) and how much silence a loss takes, instead of "gone, which is not certain yet". An Azure VM Azure evicted or deleted is billed to that moment, read from Azure's records, not to the minute Portal declared the job lost, and so is a checkpoint the eviction cut short. A lost job whose checkpoint is incomplete is told that it cannot be resumed from and is kept for inspection. See Spot and checkpoints.
- Azure Container Apps gives no interruption notice, and Portal says so in every Container Apps quote, in the plan when one is chosen, and in the job's events when it lands there: if Azure stops the execution, progress since the job's last checkpoint is lost, and Portal parks the job only on your suspend, a move or a policy.
portal interruptis refused on Container Apps, since stopping the execution ends the replica at once (a job interrupted that way on 2026-10-31 was lost); test resilience there with a suspend or a move. A Container Apps replica Azure ended is billed to Azure's end, not to the minute Portal declared the job lost, and a lost job that wrote no checkpoint is no longer told that stored checkpoint objects were left behind. See Azure. - An exact GPU type counts as the GPU machine it is.
--on aws:g4dn.xlargeand--on lambda:gpu_1x_a10quoted no GPU, so a GPU job's move there was refused as a move to a CPU machine. The quote, the plan, the move's check and the savings record now see the type's GPU, its memory, vCPUs and memory. A move to a real CPU machine is refused as "SPEC is a CPU machine; the job needs a GPU (A10, 24 GB)". - A move after the program exits is refused, never dropped in silence. While a job's machine is still shutting down,
portal moveandportal suspendanswer "the job already finished"; a move still queued when the job ends is dropped with "move dropped: the job finished before it started" in the job's events andportal explain. portal movesays the outcome. It waits up to 15 s and prints where the job landed, or why it did not move;--no-waitreturns at once.--jsonreturns at once withoutcomeacceptedunless--waitis given; the MCPmoveanswers the same fields, following the move only withwait.- A resume refused for room says what to choose. "the target needs about 35.75 GiB of disk free for ~31.59 GiB of state (rule: ...); it has 34.65 GiB; choose a machine with at least 36 GiB of disk free", for memory and for disk, instead of two sizes without the rule.
- Scripts with in-memory streams move. A
StringIOorBytesIOin a global no longer keeps a script from pausing: both move by value with their positions. A closed socket moves too. - Why a move waits is said. When a running thread, an open file, a long native call or another construct keeps the program from pausing, the job's events say so (
pause, once per reason in 5 minutes), and a failed move's reason carries it. A move's paused time now counts from the pause itself; the wait before it is shown separately. - Moves to exact destinations are quoted first. A region AWS lacks, an instance type with no price, more than 8 GPUs on Modal, or a GPU job's move to a machine without a GPU is refused when asked, with the reason, instead of failing a minute later. Modal quotes stop at 8 GPUs.
- Modal jobs hold only their lease against your cap, not their 24-hour limit. 20 small sandboxes had committed $198.94 of a $200 cap with $2.78 spent.
- A reclaimed spot machine is checked 2 minutes past its deadline, so a job whose checkpoint failed under a notice no longer reads
runningfor 10 minutes. - Your pins win. The job's environment installs Portal's own dependencies as compatible ranges, so a project that pins
datasets,dillorcloudpicklebuilds again. Requirements that cannot resolve fail the build with uv's reason in the job's error. - A failed Modal image build is built once more afresh, then the job fails with uv's reason, instead of every later job meeting the same cached failure.
- Azure VM quotes check your subscription's vCPU quotas (the region's, the family's, the low-priority ones for spot) and list an offer that does not fit as unavailable, with the quota named. An interruption a provider refuses answers
400with the provider's code. - Several Google Cloud launches at once no longer abort on "quota unknown".
- Setup goes on to quotas.
set up https://portal.clusy.io/SKILL.mdconnects your clouds, then reads their GPU and spot quotas and usage and asks the provider for the minimum increase your workload needs, with your agreement. - The console's setup page matches the Portal page, and Portal has a page of its own for a wrong address.
- Azure spot notices are seen within a second. Portal's node no longer waits on an answer Azure holds back (15 s and 30 s were measured), so a spot VM's eviction notice reaches the checkpoint with the whole notice. The notice itself is shorter than Azure documents: the event names a time 22 to 27 s out, so plans and warnings for Azure spot VMs count 20 s, not 30. A job with more state than 20 s can save is told so in its plan: keep the state small, or take an on-demand machine or a provider with a longer notice.
2026-10-30: launch day patches
- Savings, measured against one machine. The saving is what the job would have cost without Portal (the dearest machine it used, at its standard price, for all the machine time paid, plus the work a spot interruption or an out-of-memory crash would have thrown away) less what you paid. It is never negative: what you paid beyond rate times time is Portal overhead, on its own line. The console's head shows one number, "Saved $X", with the parts behind Details. This replaces the launch morning's model below. See Savings.
- Finishing. A run whose program has ended reads Finishing in the console while its machine shuts down, with what it waits for; its charge stops at the program's exit.
- Azure VMs on hosted Portal. An Azure connection runs Azure VMs (
--providers azure) as well as Container Apps (aca). See Azure. - Container Apps jobs pull from a registry in your subscription. Portal makes a Basic container registry in the resource group
somaat your first Container Apps job and copies its node image there, so the public registry's pull limit no longer refuses the job. Azure bills the registry. - No capacity ends with choices. A job that finds no capacity ends
no_capacitywith the same machine on-demand, spot in pools it did not try, or, for a GPU on Modal, Modal's other GPU types, each with its price and an exacton=spec, in the job's error and events. Portal never switches on its own. - Modal GPU jobs say what they wait for every minute, a job pinned to one GPU type ends
no_capacityafter 5 minutes without it, and image builds are bounded (30 minutes for the requirements). A GPU move from Modal to a VM restores onto the same torch build. A create whose reply was lost is settled at $0 once Modal proves it made nothing. - Moves and suspensions are strict. A value the checkpoint cannot carry refuses the move or suspension, with the value's name, and the job stays where it is, instead of failing later.
- Out of memory on a Linux CPU machine pauses the job for a rescue instead of the operating system killing it. A rescue whose capture fails twice for the same reason ends the job with the capture's message.
- Billing ends when the provider stops billing. On EC2 at the accepted terminate; a machine the provider reported ended is billed to that end; a machine its provider no longer lists settles two hours later. Machines say since when they are stopping.
- A spot instance taken back while it boots is no capacity, not a failed job.
- A small budget can start a spot job on AWS. The budget is fitted at the price the provider reserves.
- A move from Modal or Container Apps counts the source against your cap only for the move's window.
- Releases no longer interrupt you. A request Portal accepted before a release is kept and runs after it, and a release pauses Portal for a few seconds rather than a minute.
- Lists answer at once. The job list and the overview come from a cache kept 20 s; a job's creation, status change or deletion shows at once.
- CLI.
portal --versionprints the full build, the CLI tells you about updates andportal updateinstalls one; a job named by its whole id is read directly; the MCPmovetakesonasto. - Setup in one line:
set up https://portal.clusy.io/SKILL.md. - Docs. This site, at portal.clusy.io/docs; install on Windows through WSL; the Limits page cites Portal's code.
- Console fixes. An emptied spend cap no longer saves as $0 when scrolled over; reopening "Verify it's you" keeps the code already sent; the run's cost line no longer climbs past its estimate; the sidebar choice is kept.
- A program's exit survives a restart of Portal, and so does lost detection: a job whose program had ended when a restart cut its end short ends with the program's exit.
- Malformed input is refused with a
400in Portal's words, never a500.
2026-10-30: launch
- Delete ended jobs from your history.
portal rmand the MCP tooldelete_jobsshow what they will delete, then delete it once you confirm. Costs and savings totals keep counting deleted jobs. - Savings, part by part. Portal now credits itself only for what it did, against the standard price of the machine you chose, and splits each saving into spot, moves, rescues and overhead. Replaced the same day by the one-machine model above.
- Checkpoints kept after an end Portal decided. When a job fails, is lost, finds no capacity or is stopped by a policy, its checkpoints are kept 7 days instead of being deleted.
- A job is lost only when its state is certainly gone. A provider that once says a machine is gone, or a store that cannot be read for a moment, no longer ends a job.
- Errors inside Portal no longer end jobs. Portal retries the step instead.
- Modal jobs start again, after a certificate in Modal's image stopped them.
- Lambda launches no longer stop at a key an earlier Portal host left in your account.
- AWS request throttling is waited out instead of ending the job.
- Failed launches keep the end of the provider's error, where the cause usually is.
- Per-workspace limits: at most 100 running jobs, and 64 secrets (16 MiB in all).
- Open sign-up. Portal is open to anyone with an active Clusy account and a verified email address.
2026-10-30: the landing page
- Portal's page is at portal.clusy.io, and the console moved to portal.clusy.io/app. Old console links still work.
- A job parked after a notice stays parked when a person suspends or moves it at the same time.
2026-10-29
- AWS role connections use an ExternalId that Portal issues for your workspace;
portal connect aws --from-cliasks for it.