Finds GitHub Actions steps whose JS runtime is retired or archived, with the exact version to move to and the days left before the workflow stops running. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.
VS Code MarketplacenpmMCP server (npx)Docker Hubext install ReadyStack.action-runtime-sunset-lint npx @readystack/action-runtime-sunset-lint <file> npx @readystack/action-runtime-sunset-lint --mcp
Team? One key for every ReadyStack linter, 5 seats, $149 once
Sweeps every workflow and composite action.yml in the workspace in one pass and writes a dated migration checklist into the repository that you keep. $29 once, one licence key per person or CI seat.
One payment, one licence key for this tool. The key is shown right after payment.
A DevOps contractor doing the same audit and migration by hand bills $30 to $150 an hour on the open freelance market.
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.
Six findings in one 20-line release workflow, five already dead - that is what 23 dated rules report on the sample pipeline shipped with this linter, the same file shape CI engineers on GitHub-hosted runners push daily.
A GitHub Actions step does not warn you when its JavaScript runtime disappears. It fails. GitHub retires the node20 action runtime on 2026-09-23; node16 and node12 are already gone. The labels ubuntu-20.04, macos-12 and windows-2019 no longer resolve. The v3 artifact backend was switched off on 2025-01-30, so actions/upload-artifact@v3 does not degrade, it errors. And an archived action repository such as actions/create-release will never receive a runtime bump at all.
Nothing in your repository changes on the retirement date. The pipeline breaks on the next push - which, for a release workflow, is the push that was supposed to ship something.
_fixtures/dirty.yml is an ordinary release workflow: tag trigger, build, publish an artifact. It was not written badly, just a while ago. Six lines come back:
L8 HIGH runs-on: ubuntu-20.04 -> runs-on: ubuntu-24.04 L10 HIGH the repository clone step at v3 -> the v5 pin L11 HIGH actions/setup-node@v3 (node16) -> actions/setup-node@v5 L13 MED node-version: '16' -> node-version: '24' L17 MED set-output is disabled -> >> "$GITHUB_OUTPUT" L18 HIGH actions/upload-artifact@v3 -> actions/upload-artifact@v4
Five of those six are already dead on a hosted runner today; the sixth is a toolchain pin past its own end of life. The migrated copy, _fixtures/clean.yml, reports 0 findings - the linter is not allergic to YAML.
Most deprecation lists are frozen prose; this one takes today's date as an argument. With today = 2026-09-21, a composite action that declares using: node20 reads "In 2 days: this action declares the node20 runtime, which GitHub retires on 2026-09-23. Move to: using: 'node24'." On 2026-09-23 that line flips to "Already retired" and from medium to high severity. Change the input, and the answer changes - that is the difference between a linter and a blog post.
A chat assistant cannot see your .github/workflows directory, and the retirement dates it knows are the ones inside its training window - precisely the values that move. AI-written workflows still emit @v3 pins and set-output, because that was the common shape in the corpus. GitHub's own deprecation notices do exist, but they arrive as annotations inside a run log - you have to trigger the run that fails.
Retired action runtimes at their old majors. Switched-off artifact backends. Archived action repositories. Declared runtimes in action.yml: node12 and node16 gone, node20 dated. Retired runner images across Ubuntu, macOS and Windows. Disabled workflow commands: set-output, save-state, set-env, add-path. Pins floating on @main. Every finding carries the replacement, not just the complaint.
Free and keyless: open a workflow file, run the check, get all 23 rules with replacement versions. One file, finished answer. The full version does a different job: it sweeps every workflow and composite action.yml in the workspace in one pass and writes a dated migration checklist into the repository. $29 once, one licence key per person or CI seat. For comparison, a DevOps contractor doing the same audit and migration by hand bills $30 to $150 an hour on the open freelance market.
It reads a GitHub Actions workflow or a composite action.yml and applies 23 dated rules to every line. Each finding names the exact replacement: actions/setup-node@v3 becomes actions/setup-node@v5, ubuntu-20.04 becomes ubuntu-24.04, and set-output becomes an append to $GITHUB_OUTPUT. It also prints the days left before the node20 action runtime retires on 2026-09-23.
CI and DevOps engineers who own a repository's .github/workflows directory on GitHub-hosted runners, plus maintainers of published composite or JavaScript actions. It is aimed at people who ship releases from Actions, where a dead step blocks the release job itself rather than a test run. Reviewers of AI-generated pipeline YAML are the other case.
A chat assistant cannot read your .github/workflows directory, and runtime and runner-image retirement dates keep moving after its training window. GitHub's own deprecation notices arrive as annotations inside a run log you have to trigger first. This linter reads the file in your editor against a dated table, so you get the answer before the push that would have failed.
Free and keyless: open one workflow file, run the check, and get all 23 rules applied with replacement versions. On the sample release workflow in this repository that is 6 findings, 5 of them already dead. The $29 full version adds a different axis: every workflow and composite action in the repository in one pass, plus a dated migration checklist written into the repo.
A DevOps contractor doing the same audit and migration by hand bills $30 to $150 an hour on the open freelance market, and a broken release pipeline is normally discovered by the release itself. The licence is $29 once, one key per person or CI seat,.
A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Action Runtime Sunset Lint checks the file you open against 23 rules from a rule set dated 2026-09-21, and points at the exact line with the fix. For a filing, an audit or a client you need that dated result on your own files.
One question, answered by the person who built it. Your email only if you want the answer sent.
Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.
For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →