Skip to main content
OpenComputer sandboxes can change size at runtime. There are three knobs: CPU follows memory per the platform’s tier table. You don’t pick CPU separately.

How the three interact

  • Manual scale() disables autoscale on the sandbox as a side effect — explicit user intent overrides the loop. Re-enable autoscale with setAutoscale({ enabled: true, ... }) after if you want.
  • Setting a scaling lock disables autoscale at the same time (single-knob: “I don’t want this scaling, period”). While locked, both scale() and setAutoscale({ enabled: true }) reject with ScalingLockedError. Unlocking does NOT auto-re-enable autoscale.
  • Plan caps apply everywhere. Free-tier orgs are capped at 4 GB. Calls above the cap throw PlanLimitError.

sandbox.scale(opts)

Manually resize the sandbox. HTTP API →
number
required
Target memory in MB.
Returns: Promise<{ sandboxID: string; memoryMB: number; cpuPercent: number }> Throws:
  • ScalingLockedError — sandbox has a scaling lock active.
  • PlanLimitErrormemoryMB exceeds the org’s plan cap.

sandbox.setAutoscale(opts)

Enable or disable per-sandbox autoscale.
boolean
required
Whether autoscale should be active.
number
Lower bound when enabled=true.
number
Upper bound when enabled=true. Must be ≥ minMemoryMB.
Returns: Promise<{ sandboxID: string; enabled: boolean; minMemoryMB: number; maxMemoryMB: number }> Throws:
  • ScalingLockedError — sandbox has a scaling lock active.
  • PlanLimitErrormaxMemoryMB exceeds the org’s plan cap.
When enabled=true, the platform watches the sandbox’s memory pressure and resizes it within the bounds:
  • Scale up on a single 1-min sample above 75% memory utilization. Cooldown 60s between up-scales.
  • Scale down only when 1-min, 5-min, AND 15-min averages all sit below 25%. Cooldown 5 min between down-scales.
The asymmetry matches user perception: rapid response when the user notices lag, conservative shrink after sustained idle. The 15-min window is the dominant constraint on shrink, so a sandbox that briefly idles and resumes won’t sawtooth.
To turn off:

sandbox.getAutoscale()

Get the current autoscale configuration. Returns: Promise<{ sandboxID: string; enabled: boolean; minMemoryMB: number; maxMemoryMB: number }>

sandbox.setScalingLock(locked)

Lock or unlock the sandbox’s resources against any size change.
boolean
required
true to freeze, false to allow scaling again.
Returns: Promise<{ sandboxID: string; locked: boolean }> While locked:
  • scale() rejects with ScalingLockedError.
  • setAutoscale({ enabled: true }) rejects with ScalingLockedError.
  • The platform autoscaler skips this sandbox entirely.
Locking ALSO disables autoscale (single knob — “I don’t want this scaling”). Unlocking does not re-enable autoscale; call setAutoscale({ enabled: true, ... }) explicitly if you want it back.

sandbox.getScalingLock()

Get the current scaling-lock state. Returns: Promise<{ sandboxID: string; locked: boolean }>

Errors

ScalingLockedError

Thrown when the sandbox has a scaling lock active. Has a code property of "scaling_locked" for parity with the HTTP API’s error code.

PlanLimitError

Thrown when the requested size exceeds the org’s plan cap. The HTTP API returns 402 Payment Required for this case.