How-to guides
Use GitHub Actions
Run hbench in GitHub Actions with node-q/hbench-action, on every pull request or on a schedule, and upload or issue its runs.
Run hbench on every pull request with node-q/hbench-action. The action installs hbench, checks its checksum and build provenance, runs it, and writes the scores to the job summary. Fork node-q/hbench-action-example for a repository with three tasks and working workflows; the action's README lists every input and output.
GitHub-hosted runners stop a job after 6 hours, so a longer run, such as SWE-bench Verified on Claude Opus 5.5 at about 5 to 7 hours, needs a self-hosted runner. A model served on the runner, such as Qwen2.5-Coder 7B, is slow without a GPU.
Run on each pull request
This workflow runs Claude Code on five tasks of Terminal-Bench 2.0, with the key from a repository secret. The job stays in the workflow: nothing goes on a board. Your provider bills your key for every trial.
To try a change on a known benchmark's tasks, set dataset and registry to the ones in Known datasets. Pull requests from forks get no secrets, so they can't call a paid model. Pin an hbench release with version, such as v0.3.5.
Upload a run from a workflow
To put a workflow's run on a board, run the full task set on your default branch or on a schedule, then upload the job. Add an API token as the secret HPG_API_TOKEN, give the action's step id: bench, and add this step after it:
Then publish the job from Your bench.
Issue a run from a workflow
Issue runs from a workflow you start by hand or on a schedule, not on every pull request: each board issues an account a few runs a day and holds one waiting for upload at a time (Limits). The workflow does four things:
Issue the run through the API, as in Issue it from a script.
Install hbench with the action, with no
path,datasetorconfig, so that it only installs.Run
hbench run --config spec.jsonin a step of your own. The spec sets the job name the site checks, and thejobsfolder hbench writes the job to.Pack the job and upload it with the run token, the only token the upload needs.
Don't pass spec.json to the action's config input. The action then names the job itself, and the site refuses the upload with local-spec-mismatch: job_name is 'x', the spec's is 'y'.
Add your model key as a second secret. This workflow runs mini-swe-agent on LiveCodeBench v6 on DeepSeek-Flash, which takes about 1 to 2 hours:
The run goes on its board when the upload is accepted. If the job fails part way, the run waits for upload until it expires after 48 hours; abandon it to issue another sooner.
Reviewed on October 30, 2026.