Test environments from your Compose file, in your own cloud
A disposable copy of the Compose services you pick.
Chalupa copies the Docker Compose services you pick onto a private server in your own cloud account. SSH is the only open port: you reach the services through a tunnel from your terminal or your AI agent. Tear the server down when you are done and compute billing stops.
For indie developers, small teams and agencies who already run their stack with Docker Compose.
Free CLI: your provider bills the serverTeardown stops compute billing; a data volume keeps billing until you delete it
Install command
curl -fsSL https://chalupa.run/install.sh | bash
Installs bun, go-task and the CLI (not Pulumi or TinyVault). No sudo. Then run chalupa setup (free; it signs you in) and, if you like, chalupa doctor (free, offline). A real server costs money: chalupa up asks before it creates one.
Before you start
A docker-compose.yml for the stack you want to test.
A cloud account and an API token; chalupa setup walks you through it (provider guide).
macOS or Linux with OpenSSH. A cloud account also needs the Pulumi CLI and TinyVault; chalupa doctor lists what is missing.
Example configuration · preview is free and offline · replace the SSH allowlist with your own address before launch
Pick the services. Keep Compose as the source.
List the services you need. Ports, volumes and dependencies are read from your docker-compose file, and every port is bound to localhost on the server.
CairnTrace browser test runner Works todayfile.cheap artifact storage BetaMonitor crash capture BetaTinyVault secrets store BetaYour AI agent (MCP) read-only access Beta
One run, four steps
Describe it. Launch it. Test it. Tear it down.
Your editor, your test runner and your agent stay on your laptop. Only the services you pick run on the server.
01
Describe
Point chalupa.yml at your docker-compose file and list the services you want. Ports, volumes and dependencies are read from Compose, not copied by hand. Free and offline: it shows the exact plan and ports before anything is created.
Open the tunnel. Your services appear on localhost on your laptop, so your test runner, browser flows or agent run unchanged. Run chalupa status any time to see what is running.
Keep the evidence you need, then tear the server down. Compute billing stops. A data volume you declared stays for the next run, and bills until you delete it.
Prefer one command? chalupa test <suite> asks for one typed phrase, runs launch, tunnel, your suite and the report, then tears the server down. Beta.
What a run leaves behind
Evidence you can open later. Honest about what works today.
Each piece below is labelled. Works today means it has been used on real runs. Beta says exactly what is missing. Coming next is not built yet.
Browser flows
Works today
Run your browser flows from your laptop against the tunnelled services and keep the video, screenshots and report. They can also run as a uses: cairntrace step of a ci: suite on the server, beside the app (cairn 3.x; the on-box toolchain is baked with chalupa snapshot build --toolchain onbox).
Evidence from ci: suite runs is uploaded and attached to the run. Failed laptop runs are stashed locally and fcheap restore <id> brings them back.
Beta: Laptop runs that pass are not attached to anything, and laptop evidence cannot be uploaded for the console to open (report.evidence.publish: cloud is refused today). Evidence stored in file.cheap cloud opens from the console run page; a laptop pack shows its restore command there.
Coming next: Upload laptop-run evidence for the console to open.
A failing step in a ci: run includes the stack trace and the culprit frame. With observability.crashCapture, any container death in the Compose projects you list is recorded on the box and shows in the console's issues page beside the CI ones.
Beta: It listens to Docker container deaths, so it needs Compose and covers only the projects you list; containers outside them are not covered. Host metrics work on one provider.
Logs of the Compose services you opt in with session.logs are collected as log chunks and shown as short excerpts in the console for 24 hours. A run page shows the excerpts that fall inside that run's window; chalupa logs reads a running box's logs directly.
Beta: Collection can stop at its chunk limit or the original deadline, and retention depends on your plan. A service with its own non-journald logging driver must be excluded, and containers outside your Compose file are not collected.
Coming next: Search across collected logs in the console.
Run history, a page per run, CI runs, issues and performance windows for the environments you link.
Beta: Log excerpts are short, only evidence stored in file.cheap cloud opens there, and the console shows what your environments report: it does not control servers.
The console shows one page per run: the failing step, the evidence attached to it, the logs and containers in that run's time window, and the cost of the window.
Beta: Evidence opens from the page only when it is stored in file.cheap cloud; a laptop run shows a restore command instead of the files, because uploading laptop evidence (report.evidence.publish: cloud) is still refused. Logs are short excerpts and need session.logs.
Give your agent a server, not your laptop's ports.
Point Claude Code, Cursor or any MCP client at chalupa mcp and it can read what is running, a session's timeline, box logs, the box side of a failed run, cost, what each action does, live CI status and experiment results. It cannot launch or tear anything down: those are not MCP tools. Confirmation stays with you. Every action that spends money needs a typed phrase, and chalupa explain --json publishes those phrases, so hand an agent a command only when you want it run.
A read-only MCP server: status, sessions, logs, failed-run context, cost, explain, live CI status, experiment results.
Action contract command
chalupa explain --json
Every action, its risk level and the exact phrase it needs.
App brief command
chalupa connect --format app-brief
A short brief of the services your agent may inspect, set with agentAccess.
Beta Launch and teardown are not MCP tools, and evidence files cannot be opened over MCP. The confirmation phrases are published, so an agent can type them: a human decides whether to hand over the command.
What to expect
Time and cost, stated plainly.
Chalupa does not publish a ready-in-minutes or a price-per-hour figure it has not measured. chalupa receipt prints what each of your own sessions took and cost, from a local ledger and the provider's price, so measure yours. Until you have, this is what can be said honestly.
Boot time depends on your stack and on whether the server starts from a prebuilt image. Stacks that build their own app images take longer. The faster servers guide shows where the time goes.
Cost
Your provider bills the server at an hourly rate, and a declared data volume monthly. Chalupa never marks up servers in your own cloud account; managed GPU is priced separately. chalupa preview is free; chalupa up asks you to confirm before it creates anything.
Safe by default
Private by default. Gone on purpose.
SSH is the only open port. Everything else stays on the server's own localhost until you tunnel to it.
Every service port binds to localhost on the server. SSH is the only open port, limited to the addresses you allow.
Your data has its own lifecycle
A declared data volume lives in a separate stack. Tearing down compute never touches it, so you seed once and reuse it. It keeps billing until you delete it on purpose.
A deliberate way out
chalupa down ends compute billing. An expiry backstop (beta) can destroy the server while your laptop is asleep where the hosted reaper is armed. Actions that spend money ask first.
Open models on a GPU Experimental
Run an open model. Keep your tools on your laptop.
Serve an open-weight model on a GPU server and point your local coding agent at it through the same SSH tunnel. Use your own cloud account, or let Chalupa run the GPU for you from a prepaid balance (beta).