Operating model
Managed GPU
Prepaid GPU balance, launch jobs, published rates, and worker operation.
Reviewed 2026-09-06
Managed GPU is an opt-in tier for GPU sessions in Chalupa's DigitalOcean account. It requires an active Solo or Crew plan and a separate prepaid USD balance per organization. The balance does not replace the managed hours included in your plan.
Availability and privacy
The CLI supports queued provisioning when the console has Managed GPU enabled. Review the plan and confirm each launch; adding balance alone does not launch a host. Availability depends on the console rollout and provider capacity.
The console accepts managed launch jobs and validates plan eligibility, concurrent host limits, the prepaid balance, and current GPU capacity before queueing work. A separate always-on Bun worker provisions compute; this phase supplies its API, not the worker process. Adding balance does not launch a host. Session metering and automatic refunds are not yet implemented by the job API.
The managed privacy posture is: our account, isolated per organization, destroyed at the end; BYOC keeps your-account guarantees. Managed hosts will be destroyed at the deadline, including powered-off hosts, rather than parked. Use BYOC when the cloud account must remain yours.
Capacity and launch overrides
Before queueing a launch, the console checks DigitalOcean's current size/region capacity. It caches the result for 60 seconds and gives the probe 10 seconds. A failed probe leaves capacity unknown and allows the launch to proceed. Capacity can change between the check and provisioning; this is not a reservation.
If your tier has no capacity in your region, no launch job is created. In an
interactive terminal, chalupa up offers other regions for the same tier and
other tiers with capacity, cheapest first (your region first for equal prices).
Each option shows its hourly rate and estimated cost for your session. GPUs that
cannot fit your model's estimated VRAM are disabled with a reason.
Choose an alternative to retry the launch, Wait to check every 60 seconds for
up to 20 minutes, or Cancel. Waiting starts the launch when capacity returns.
The console checks plan, host limit and balance again on every launch attempt.
With --json or outside a TTY, an unavailable launch prints
{ "code": "no_capacity", "alternatives": [...] } and exits 1 without prompting.
Scripts need --yes or CHALUPA_YES=1 to authorize a launch.
Override the YAML for one launch:
chalupa up --model llama3.1:70b --tier gpu-max --region ams3
chalupa up --model qwen3.8:27b --tier gpu-large --region tor1
All three flags are optional. Tiers are gpu-small, gpu-large, and gpu-max;
regions are tor1, nyc2, ams3, and atl1. The model must be a local Ollama
tag with a known VRAM estimate that fits the selected tier; otherwise the CLI
refuses before making requests. The header shows the overrides. YAML stays
unchanged, including when you select a capacity alternative.
The successful launch saves model, tier, region and the worker's weight-size ceiling in
~/.config/chalupa/managed/<slug>.json. launch, tunnel and status use the
record's model when present, so an agent targets the model the host pulled.
Older records fall back to the YAML model. If provisioning still loses the
capacity race, the failed job advises: Run chalupa up again: it now checks capacity first.
Rates
Rates effective September 6, 2026 use the default DigitalOcean sizes from the Chalupa GPU catalogue. Multiply the provider list price by 1.25 and round up to the next whole cent. All balances and ledger amounts are stored in integer cents.
| Tier | GPU | VRAM | Provider list / hour | Managed / hour |
|---|---|---|---|---|
| gpu-small | RTX 4000 Ada | 20 GiB | $0.76 | $0.95 |
| gpu-large | RTX 6000 Ada | 48 GiB | $1.57 | $1.97 |
| gpu-max | H100 | 80 GiB | $4.41 | $5.52 |
Model cache storage uses the same calculation: $0.10/GiB-month provider list becomes $0.13/GiB-month. Rates include the provider price and Chalupa's margin. Sessions will be billed per minute from your balance, rounded up to the cent, with a five-minute minimum. Sessions will stop when the balance runs out.
Top-ups and refunds
Top up $10, $25, or $50 through Stripe Checkout from the billing page. An active Solo or Crew plan is required; Community organizations can still read their balance. Only paid Checkout sessions credit the balance. Repeated payment notifications do not credit it twice.
Balance is refundable within 30 days. Contact support to request a refund; self-service refunds are not available in this phase.
From the CLI
Start in your project directory:
chalupa setup
chalupa balance --top-up 10 # only if the balance is empty
chalupa up
chalupa launch
chalupa down
Setup defaults to managed GPU and writes the starter config with gpu-large,
a 60-minute session, qwen3.8:27b, a 60 GiB cache and OpenCode as the default
agent. Existing configs and valid account sessions are reused. No provider
token, provider SSH registration, or reaper token is needed. The local SSH
identity is ~/.config/chalupa/ssh/id_ed25519.
Managed commands require the account session in ~/.config/chalupa/account.json
and an eligible Solo or Crew plan. chalupa setup signs you in with your email
and a code, creating a hosted account if needed, and stores that account session.
chalupa login remains the operator-only terminal approval flow. See
Quickstart.
Use chalupa balance --top-up 25 or chalupa balance --top-up 50 to add more than $10.
./chalupa.yml is automatic; --config PATH selects another project.
chalupa preview is an optional offline estimate. chalupa launch omp
overrides inference.agents.default for one run.
up detects your current public IPv4 /32, shows the tier, GPU, hourly rate,
session estimate and remaining balance, then asks for confirmation. For scripts,
use chalupa up --yes or CHALUPA_YES=1. It follows the queued job and prints
a phase checklist until the host is ready. --json emits phase events;
--verbose prints the redacted diagnostic transcript after completion. preview is offline and shows managed hours,
session expiry, and the estimated prepaid balance charge.
inference.contextSize defaults to auto. The worker preserves that choice;
launch and exec negotiate from the model’s native ceiling down to a window
the GPU admits. Set an integer (2048–262144 for managed hosts) for a fixed
default, or override a session with --context auto, native, or 128k.
If omp reports “compaction freed too little context” after one message, its
system prompt may already consume most of a fixed 32K window. Remove that
fixed setting, reprovision the host through the normal lifecycle, and launch
again with auto; changing YAML alone does not update a running host daemon.
When portless is installed, tunnels publish a named .localhost route and
remove it on exit or Ctrl-C. Set CHALUPA_PORTLESS=0 to opt out. Agents keep
using the numeric loopback address.
Close the standalone tunnel with Ctrl-C before running an agent:
launch and exec open and close their own tunnels.
chalupa launch
chalupa exec -- your-command
chalupa status
# After changing networks:
chalupa session allow
# When finished:
chalupa down # yes/no confirmation; use --yes for scripts
The console enforces the session deadline even while the laptop sleeps.
session allow re-detects your IPv4 and updates SSH access.
session extend is not available yet for managed hosts.
The CLI stores the host IP, pinned SSH host key, expiry, and job details in
~/.config/chalupa/managed/<environmentSlug>.json with mode 0600.
tunnel uses a temporary pinned known_hosts and strict host-key checking.
A successful down removes the local record. Optional model cache storage
remains billable after compute stops.
See Plans and billing and API and schema.
Checkout asks Stripe for Adaptive Pricing, so customers see and pay in their local currency when Stripe supports it for the Chalupa account; the balance is always credited in USD at the amount you chose, and the ledger notes the local amount paid. Where Stripe does not convert, Checkout charges the USD price as shown.
Launch flow and job states
The CLI submits a launch specification to POST /api/account/managed/launch.
An active Solo plan allows one concurrent host; Crew allows three. Active managed
deployments and queued/running launch jobs both count. The balance must cover the
estimated session cost, rounded up to integer cents. Admission checks the balance;
it does not reserve or debit it. Launch attempts are limited to ten per minute per
organization.
The request includes a GPU tier, model, SSH Ed25519 public key, one allowed IPv4
/32, and a 15–480 minute lifetime. Region defaults to tor1; nyc2, ams3,
and atl1 are also accepted. Context defaults to auto and cache to 60 GiB.
There are three job kinds in this API:
| Kind | Worker action |
|---|---|
up |
Run the existing Pulumi program in Chalupa's DigitalOcean account. |
down |
Destroy the managed environment's compute. |
allow |
Replace its allowed client IPv4 /32. |
A job moves from queued to running, then succeeded or failed.
cancelled is a terminal database state reserved for operational cancellation;
there is no cancellation endpoint. Only one queued/running job can exist per
organization and environment. A down/allow request conflicts while another job
is pending; retry after it finishes.
Poll GET /api/account/managed/jobs/{id} for status, bounded progress logs, and
connection details. The account response omits the SSH public key and includes
your own allowed CIDR. GET /api/account/managed/hosts lists active hosts and the
ten latest jobs.
The worker claims jobs using the platform admin bearer token, receives the full specification, reports progress, and posts its result. The console registers a successful launch as a managed deployment and records its session deadline. A successful down result ends that deployment. Expiry and reported idle deadlines are enforced by the console reaper using the platform DigitalOcean write token, even when the CLI is offline.
A running job without a fresh claim lease for twenty minutes is retried, up to
three claims, then fails with worker lost. Worker heartbeats report availability;
they do not extend a job's lease. Workers must reconcile existing provider resources
before retrying an interrupted launch, so a retry cannot create duplicate compute.
When inference.model is omitted, Chalupa uses qwen3.8:27b (~18 GB of Ollama weights). Allowing room for context and runtime requires gpu-large or gpu-max; preview and up reject this default on gpu-small (20 GiB VRAM).
Console telemetry
After up, the CLI uses your account session to issue an ingest key and streams
it with the log collector over SSH, pinned to the worker-reported host key. The
key stays off your laptop's disk. Successful delivery prints:
✓ Telemetry armed
The console shows heartbeats, NVIDIA GPU samples and collected Ollama service logs. Inference runs still require an explicit compatible receipt report; launching OpenCode alone does not generate those receipts. Heartbeats update reported idle deadlines through the same ingestion path as BYOC; session expiry remains enforced by the managed reaper. An idle deadline requires an idle limit in the host config.
The private managed record stores bootstrapped and the public ingestKeyId.
tunnel and launch retry delivery when bootstrap is incomplete. To rotate and
redeliver the key explicitly:
chalupa session bootstrap
chalupa session bootstrap --json
Failures print a reason and Retry: chalupa session bootstrap. The GPU may still
be running. Hosts provisioned before telemetry services were installed need to
be stopped and relaunched with the updated worker; retry cannot install missing
cloud-init services. No past samples or logs are backfilled.
First launch readiness
chalupa launch and chalupa tunnel wait up to 25 minutes for Ollama and the
selected model. One spinner shows the current step:
Waiting for the host to accept connections
Ollama is starting
Downloading ornith-1.5:35b · 4.2/23 GB
✓ Host ready · ornith-1.5:35b · 23 GB
New hosts expose download bytes through a private loopback health forward.
Older hosts show Downloading <model>… (first launch, ~1 min per 4 GB).
chalupa status probes through a temporary pinned tunnel and prints Host: ready,
Host: starting, or Host: downloading <model> (x/y GB).
A timeout closes the tunnel; the host continues running. Check chalupa status.
Telemetry failure does not prevent connecting. For example:
Telemetry not armed yet (console returned 500). Retry later: chalupa session bootstrap