Disposable CI runners and staging servers, billed by the hour
Deploy a build runner or a per-pull-request staging server from your pipeline, use it, delete it. Hourly billing from a prepaid crypto balance, a REST API and a CLI.
In short
A CI machine that waits for commits all night is a server you pay for and do not use. If a server can be created and deleted by an API call and is billed by the hour, a pipeline can bring a runner up when there is work and remove it afterwards, and a pull request can get its own staging server for as long as it is open.
Neckrez has what that needs: a REST API with revocable keys, a command-line client, bulk deploy, cloud-init user data at deploy time and hourly billing from a prepaid balance, paid in crypto with no identity check. We do not ship a CI integration. You call the API or the CLI from your own pipeline, and this page is about how to do that sensibly.
The life of a runner
- Create. The pipeline deploys a server and hands it a cloud-init file that installs your runner and registers it. Runners that take one job and then deregister (GitHub Actions, GitLab CI and Drone can all do this) fit best.
- Run. The job executes on a clean machine, so nothing is left over from the previous build.
- Delete. A final step removes the server, and billing stops at once.
# in the pipeline: create a runner, run the job on it, always delete it
neckrez deploy "ci-$RUN_ID" --plan photon --location AMS --cloud-init runner-init.yml --wait --json > server.json
# ... the job runs on that machine ...
neckrez rm "ci-$RUN_ID" --yes # put this in a step that runs even when the job fails
A deploy takes about a minute, so the job waits for that long. If the wait matters, keep a few runners warm and scale the rest on demand. Full reference for the endpoints is in the API docs and in /llms.txt.
What an hour really costs
Billing is in whole hours. The first hour is charged when the server is created, and a server deleted after ten minutes still costs that hour. So the saving does not come from a build that lasts seconds. It comes from not paying for the other twenty hours of the day.
- Batch jobs on one runner. Let a runner take several jobs inside its hour, then delete it, instead of one server per job.
- Right-size it. The smallest plan costs about a cent and a half per hour. A four-core plan is still under ten cents. Check the live prices in the table below.
- Scale to zero at night. With nothing queued, nothing runs and nothing is billed.
A staging server per pull request
One cheap server per pull request is a cleaner review than screenshots: deploy it when the PR opens, run docker compose up and the end-to-end suite, post the preview address, delete it on merge or close. The Docker one-click app saves installing Docker yourself. The server has its own dedicated IPv4, so the preview address is a plain IP and port unless you put your own DNS on it.
Guardrails for a pipeline that spends money
- The balance is the limit. A deploy is refused without funds and there is no invoice at the end of the month. The limit is per account, so give CI its own account with a small balance.
- One key per pipeline, with an expiry date if you like. A leaked key is one revoke away from harmless.
- Always clean up. Put the delete in a step that runs even when the job fails, and add a janitor job that lists servers with
neckrez ls --jsonand removes any with your prefix older than a few hours. - Mind the rate limit. The API allows 60 requests a minute per key. Poll about every 5 seconds, not in a tight loop.
- Expect an empty balance to bite. A server the balance can no longer cover is archived: its disk is snapshotted, the server is deleted and the snapshot is kept for 7 days.
When a fixed fleet is better
Short disposable runners suit bursty work. For steady, heavy builds whose timing matters, such as a fast Monday and a slow Friday, a Dedicated CPU server reserves the cores for you. A long-lived runner can also be a normal always-on server, as in VPS for bots. Bare metal is not for this: it takes 10 to 30 minutes to install.
How to start
- 1. Sign up with an email, top up in crypto (minimum $15) and create an API key.
- 2. Try one deploy and delete by hand with the CLI to see the timing and the cost.
- 3. Write the cloud-init that installs and registers your runner.
- 4. Wire it into the pipeline with an always-run delete step and a janitor job.
FAQ
Can I use GitHub Actions, GitLab CI or Drone? Any CI whose runner can register itself when the machine boots can run on a Neckrez server. We do not provide the CI integration: you script the create and delete steps with the API or the CLI.
How is it billed? By the hour, from a prepaid balance. The first hour is charged at deploy and a server deleted early still costs that hour. See the live prices in the table on this page.
How fast is a runner ready? A VPS is usually up in about a minute. Add the time your cloud-init takes to install the runner.
Can I keep a prepared disk between runs? You can snapshot a server and restore it as a new one, which gives a new IP. Snapshots are kept 7 days. Keeping a ready-made image longer is up to you.
Is there a limit on how many servers a pipeline can create? There is no default account limit. One bulk request deploys up to 10 servers, and the API allows 60 requests a minute per key. The balance is what actually limits spending.
What if a job crashes and the server stays? It keeps billing until it is deleted. Put the delete in a step that always runs, and add a janitor job for stragglers. See servers for AI agents for the same guardrails.
Can I pay without a card and without identity checks? Yes. You sign up with an email and pay with Bitcoin, USDT, ETH or any of 300+ coins. Top-ups are final, see the Refunds & Billing policy.