dennisonbertram/hdev/hetzner-dev
Claude Code and agent skill by dennisonbertram/hdev
- community
Checking that the SKILL.md file is still in the repository.
Plan work here, then hand the slices to agents running on Hetzner VMs so the work continues after the laptop closes. Use when the user asks to build, implement, fix, refactor or ship something and wants it to run remotely or in the background, says "on Hetzner", "hand it off", "run it remotely", "keep working while I'm away", or invokes /hetzner-dev.
Install
npx vskill@latest install dennisonbertram/hdev/hetzner-devSKILL.md
Plan here, build there
You do the thinking on this machine. A separate agent — Claude Code or Codex, installed on a Hetzner VM — does the building. Each slice of the plan gets its own VM, its own branch and its own PR. The job runs under systemd on the VM, so it keeps going after the SSH session ends and after the laptop closes.
Do not use this to drive a remote machine step by step. The handoff is one-shot: the remote agent gets a written brief and the repo, and nothing else.
Before anything else: is hdev installed?
Installing this skill does not install the CLI it drives. Run this first, every session, before promising the user anything:
If that prints a path, skip to the Procedure. If it prints nothing, install it now — do not try to work around a missing hdev:
Then put it on PATH. Try a directory that is already there, so no shell profile needs editing:
That only works if ~/.local/bin is on PATH. Check, and fall back to the shell profile if it is not:
Confirm before continuing, in a login shell rather than the current one, because the current shell may have a PATH the user's next terminal will not:
If the user runs bash, use ~/.bashrc and bash -lic instead.
Writing to a shell profile is deliberately not pre-approved in this skill's allowed-tools, so the user is asked before it happens. Do not work around that prompt, and tell them which file you are editing.
First run: set up the stock flow with the user
Do this once per machine, before the first job. Two decisions, and they are the user's, not yours. Ask; do not pick silently.
Decision 1 — which agent runs the work
- Claude Code (default). Runs on the user's subscription, real enforced
subagents, safe to question mid-run. Needs hdev login.
- pi (
-a pi). Runs on any model through a provider key, does not touch
the Claude window at all, and is the right tool for mechanical work. No subagent tool, and hdev ask refuses while it is running.
Most people want Claude set up regardless, and pi as well if they do volume mechanical work. Set up Claude first; it is one command.
Decision 2 — if they want pi, which model
Show them the real options and the trade-off, then let them choose:
The default is `openrouter/deepseek/deepseek-v4-flash`, and most users should keep it. It costs $0.14 per million input tokens and $0.28 per million output, and it gives 1,048,576 tokens of context with a 393,216-token output limit. That is enough for any slice you should be writing.
The trade-off to explain is reasoning against price, not speed. A job runs unattended on a VM while the user does something else, so a model that answers in two seconds instead of twenty saves the user nothing. Do not recommend a model because it is fast.
Move up the catalog only for a real reason:
- The slice needs stronger reasoning than flash gives →
deepseek-v4-pro,
about 8× the price.
- The work is dense code in a large file →
qwen3-coder, but check its
65,536-token output limit against the size of the diff.
Once they pick:
Check that the saved model and the captured credential agree. hdev model prints the model and hdev login status shows which provider was captured. A model whose provider has no credential fails when the job starts, not when the model is set.
hdev model saves the choice, so it is not an environment variable anyone has to remember. hdev model on its own shows what is set.
If they have no provider key, say so plainly and move on with Claude. pi is an option, not a requirement, and nothing else depends on it.
First run in a project: build it a profile
The base image has node, git, gh and the agents. It has no browser, no Docker, no Python, no Bun. A job needing those will report itself blocked, and the user finds out after waiting rather than before.
So the first time this skill is used in a repository, spend two minutes getting the environment right. Do this once per project, not once per job.
1. Read what the project actually needs. Look, do not assume:
| Look at | What it tells you | |
|---|---|---|
package.json scripts, lockfile name | npm / pnpm / yarn / bun | |
playwright.config.*, cypress.config.*, @playwright/test | needs a browser | |
Dockerfile, docker-compose.yml, testcontainers | needs Docker | |
pyproject.toml, requirements.txt, Gemfile, go.mod, Cargo.toml | another toolchain | |
CI workflow runs-on and setup steps | the real answer — CI already lists the dependencies |
The CI workflow is the most reliable source. It is the list someone already had to get right.
2. Check what profiles exist. hdev images. If one already covers it, use it with -p and stop here.
3. Otherwise build one. For a browser or Docker, the shipped profiles cover it. For anything else, let a job install it and capture the result:
-k keeps the VM so it can be captured. hdev snapshot scrubs credentials and the work tree first, and refuses while the job is still running.
4. Tell the user what you built and what it does not cover. Name the profile and say which of their suites still cannot run on it.
Do not skip to submitting real work on the base image and then report a pile of "could not verify" results. Getting the environment right first is cheaper than a job that runs for ten minutes and verifies nothing.
Procedure
1. Plan on this machine
Explore the codebase here, where it is cheap, and write the plan to a file. This is the normal planning work — read the code, find the real seams, decide the approach.
2. Slice the plan
Write the plan with one ## Slice: heading per independently shippable piece:
A slice is only ready when it has all five of these. This list comes from the fast-efficient skill, which measured it against a cheap implementer; it applies to every remote agent here for the same reason.
- One runnable acceptance command, and the exact numbers it must print.
Record the baseline first: 233 passed, 3 skipped. "Make the tests pass" is not an acceptance condition.
- Tests that already exist and already fail. You write them, here, before
submitting. Run them and confirm they fail for the right reason — a 404 because the route is missing is a correct failure; a connection error is not. Push them, because the VM clones from GitHub.
- A closed list of files the agent may create or change. Name every one.
Everything else is out of bounds and the reviewer checks it.
- The exact contract: type signatures, field names, check order, status
codes, error strings — written out verbatim, not described. A gap in the contract becomes a gap in the code.
- A size a reviewer will actually read. The default model allows 393,216
output tokens, so the model's limit is not what bounds a slice — the PR is. If you cannot name every file the slice touches, it is too big. Split it. Check the output limit in hdev model --list only when the user has chosen a model with a smaller one, such as qwen3-coder at 65,536.
Two more that are specific to running remotely:
- Slices must not depend on each other. They run in parallel on separate
VMs from the same base commit and produce separate PRs.
- No secrets in the text. Credentials reach the VM over SSH separately.
~/.claude/skills/fast-efficient/assets/slice-template.md is a blank packet in exactly this shape. Start from it rather than freehand.
3. Check the repo state, then submit
hdev clones from the GitHub remote, so anything uncommitted here is invisible to the remote agent. Run git status first and tell the user if the tree is dirty or the branch is unpushed.
Always name the job
Pass `-b <short-name>` on every submit. Without it, jobs are named from the first words of the task and become unreadable — hdev-agent-0814-1357-add-src-t tells you nothing when four are running. The name flows into the job name, the branch and the PR.
Use whatever the user already calls the work: a ticket id, an epic number, a feature name. Short, lowercase, no spaces. When you submit several slices at once give them one shared prefix so they read as a set. Tell the user the names you chose — they need them for hdev status, hdev ask and hdev logs.
Other flags: -t cpx32 for a bigger VM, -p <profile> to boot from a snapshot that already has the toolchain, -e <file> to send an untracked file.
Check hdev images before submitting. If the work needs a browser, submit with -p browser rather than letting the agent install Chromium on every job. If it needs Docker, use -p docker. Naming a profile that has not been built fails, so list them first.
submit returns as soon as the jobs start. Tell the user they can close the laptop, and give them the job names.
Then start the watch loop — every time, in the same message
A submitted job with nobody watching it is a VM that bills until somebody remembers. So do not stop at "here are the job names". Start the loop as part of the same response:
Say you have started it, at what interval, and that it stops on its own once every job is reaped. If the user does not want it, they will say so — but the default is that a submit is always followed by a watch.
Use dynamic mode when the job length is unknown, because it wakes on the event rather than on a timer:
The tick procedure is in "Watching jobs and closing them out" below. The important part is that nothing else deletes these VMs. There is no server-side timeout and no auto-reap. If the loop is not running and the user walks away, the VM runs until someone notices.
4. Talk to the remote agent while it works
The remote agent runs as an orchestrator: it delegates to implementer, tester and reviewer subagents and keeps its own progress notes. You can reach it at any time.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/hetzner-dev/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/dennisonbertram/hdev/hetzner-dev)