actdbg
Run your GitHub Actions workflow locally — with a debugger.
act runs workflows locally; actdbg lets you debug them. Pause between
steps, drop into a shell at the exact failure point, and re-run one step
without re-running the whole job.
$ actdbg run .github/workflows/ci.yml -j test
── step 4/6: Test
│ testing version 1.2.3
│ FAIL: fix.marker missing
✗ failed (exit 1)
[actdbg] step 4 (Test) failed with exit 1
try: `shell` to poke around, `retry` after fixing, `rerun` for a clean replay
(actdbg) shell # bash inside the job, exact env + filesystem of the failure
(actdbg) retry # re-run just that step, keeping your fix
(actdbg) continue # finish the job
Why not just act?
act replays the whole job from scratch every time. When step 7 of 9 fails,
you edit, re-run, and wait through steps 1–6 again — and you can never look
inside the job at the moment of failure. actdbg keeps the job alive as a
persistent environment and snapshots it before every step:
act |
actdbg |
|
|---|---|---|
| Run workflow locally | ✅ | ✅ |
| Pause between steps / breakpoints | ❌ | ✅ break, next |
| Shell at the failure point (exact env + files) | ❌ | ✅ shell |
| Re-run one step without re-running the job | ❌ | ✅ rerun / retry |
| Time-travel to before any earlier step | ❌ | ✅ goto |
Full uses: action emulation |
✅ | ⚠️ shims (see below) |
Install
pip install actdbg # from PyPI
pip install -e ".[dev]" # from a checkout, for hacking
Requires Python ≥ 3.10. Docker is optional but recommended (Linux parity +
docker commit snapshots). Without Docker, steps run on the host in a
throwaway copy of your repo, with directory-copy snapshots.
Usage
actdbg run # auto-discovers .github/workflows/*.yml
actdbg run ci.yml -j test # pick a workflow + job
actdbg run -i # start paused, step through from the top
actdbg run -b 4 -b Test # breakpoints by number or name substring
actdbg run --backend host # skip Docker
actdbg run --platform linux/amd64 # x86_64 parity with GitHub runners on ARM hosts
actdbg run --matrix python=3.12 # pick a matrix combination
actdbg run --ci # no debugger; exit 1 on failure (for scripts)
actdbg list # show workflows, jobs, steps
On failure (or -i, or a breakpoint) you land in the debugger:
| Command | What it does |
|---|---|
list |
step list with status; > marks the next step, * a breakpoint |
next / continue |
run one step / run until breakpoint, failure, or end |
break N |
toggle breakpoint |
shell |
interactive shell inside the job — same env, same filesystem |
! CMD / shell CMD |
run one command inside the job (pipe-friendly for scripted sessions) |
rerun [N] |
replay step N from its pre-step snapshot (clean, deterministic) |
retry [N] |
re-run step N against the current filesystem (keeps your shell fixes) |
goto N |
restore filesystem + job state (env, outputs, PATH) to just before step N |
skip |
skip the next step |
logs [N], env, outputs, where |
inspect captured output and job state |
rerun vs retry is the core distinction: rerun answers "is this step
deterministic / did my last change fix it at source?", retry answers
"does the job pass if I patch the state right here?"
How it works
- One persistent environment per job. Docker mode starts one container and
docker execs each step into it (your repo is copied in, not mounted). Host mode runs steps in a temp copy of your repo. - Snapshots before every step. Docker:
docker commit; host: workspace copy. Job-level state that lives outside the filesystem —GITHUB_ENVaccumulations, step outputs,GITHUB_PATHadditions, job status — is tracked in Python and snapshotted alongside. That's whyrerun/gotoare exact, not approximate. - Real Actions semantics for the things that matter while debugging:
${{ }}expressions (env,steps.*.outputs,secrets,github,matrix,success()/failure()/always(), …),if:conditions,continue-on-error,GITHUB_OUTPUT/GITHUB_ENV(including heredocs),working-directory,defaults.run, secret masking in logs, and post-failure behavior (latersuccess()-gated steps skip,failure()/always()steps still run).
uses: actions
actdbg focuses on debugging run: steps. actions/checkout is native (your
workspace is the checkout). Other actions are skipped with a warning unless
you shim them in .actdbg.yml at your repo root:
# .actdbg.yml
backend: docker # or host
image: catthehacker/ubuntu:act-latest
platform: linux/amd64 # optional: match GitHub's x86_64 runners
shims:
actions/setup-python: |
echo "using system python: $(python3 --version) (wanted $INPUT_PYTHON_VERSION)"
actions/cache: "true" # no-op
Shims run as bash with the action's with: inputs exposed as INPUT_*,
same as a real action would see.
Secrets load from .secrets or .env (KEY=value lines) or
--secrets-file, are available as ${{ secrets.* }}, and are masked as
*** in all output.
Limitations (v0.1)
- Single job per invocation;
needsinter-job outputs aren't wired. - Matrix runs one combination at a time (
--matrixto choose). - No composite/JS/Docker action execution — shims instead.
shell:supportsbash,sh,python.- Host mode runs with your host toolchain — full parity needs Docker.
Development
python -m pytest
MIT license.
Metadata
Release files for actdbg 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| actdbg-0.1.1.tar.gz | 28.6 kB | With provenance | Details for actdbg-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| actdbg-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for actdbg-0.1.1-py3-none-any.whl |
Total release size: 53.9 kB
Release files / actdbg-0.1.1.tar.gz
| Download URL | actdbg-0.1.1.tar.gz |
|---|---|
| Size | 28.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
37978662197c942f20aa988752fdefd9b53635d0b3d97f406d4e0bd19807cc6c
|
|
BLAKE2b-256 checksum How to use checksums |
95867e9e7f370bc594333e1d8160f5b3510deb7af0731e023a4b29c903739047
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.
Transparency logRelease files / actdbg-0.1.1-py3-none-any.whl
| Download URL | actdbg-0.1.1-py3-none-any.whl |
|---|---|
| Size | 25.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5b0288a658efc01c5c8b38eb8001cf34ec222ac35e601048b614e0f8dcdad4cb
|
|
BLAKE2b-256 checksum How to use checksums |
d074983d54bec29023dcb6e711bf2ce1e309e8f4af19f8e5ecab3ee49c269217
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.
Transparency logSecurity for actdbg 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for actdbg-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.