GitHub Actions Deprecation Lint: the 2026 runner and action EOL dates

Node 20 is removed from GitHub-hosted runners on 2026-09-23 and ubuntu-22.04 deprecation opens 2026-09-17. This checks a workflow file against 25 dated GitHub shutdowns and names the date each line stops running.

Get the complete version $29

This page is the working piece. The full pack has everything below.

Node 20 is removed from GitHub-hosted runners on 2026-09-23 and ubuntu-22.04 deprecation opens 2026-09-17. This checks a workflow file against 25 dated GitHub shutdowns and names the date ea

A freelance DevOps engineer bills about $100/hour in 2026 (goLance 2026 rate guide, range $100-165 for experienced contractors); one blocked release morning costs more than this licence.

Buy the full version — $29
Want the full version?
Enter your email and we send the download link.
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

Five lines in your GitHub Actions workflow stop running on a published date

Five lines in an ordinary GitHub Actions release workflow stop running on dates GitHub has already published, and the platform engineers who own those files hit the first of them on 2026-09-23. Nothing in the file looks wrong. The last run was green. The dates are the whole problem: a workflow does not rot gradually, it works perfectly until a morning when it does not start at all.

Here is a release workflow that passes today.

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '18'
      - run: echo "::set-output name=version::1.4.0"
      - uses: actions/upload-artifact@v3

Every line above is already dated:

And two more are queued behind them. ubuntu-22.04 and ubuntu-22.04-arm enter deprecation on 2026-09-17 and are fully unsupported on 2027-04-17. The ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true opt-out that pins actions back to Node 20 stops working on 2026-09-23 as well — it buys nothing after that date.

Why the usual tools miss this

Dependabot and Renovate bump a uses: version when a new release appears. That is a different question from "when does this stop running". They never read runs-on: labels, so ubuntu-22.04 and macos-13 stay invisible. They never read ::set-output, or using: 'node20' in a composite action you wrote yourself. And they cannot tell you that actions/upload-artifact@v5 still defaults to Node 20 while v6 does not — that distinction is not in a version number, it is in a changelog entry.

Code assistants are worse here, not better: their training data predates most of these dates, so they will happily autocomplete actions/checkout@v4 and runs-on: ubuntu-22.04 into a file you are trying to fix.

What to do this week

Open each workflow, and check it against the dates rather than against the version numbers. The replacements are all published:

LineReplace withDeadline
actions/checkout@v1-v4@v52026-09-23
actions/setup-node@v1-v4@v52026-09-23
actions/upload-artifact@v3@v6already dead
actions/upload-artifact@v4-v5@v62026-09-23
actions/cache@v3-v4@v52026-09-23
actions/setup-python@v1-v5@v62026-09-23
runs-on: ubuntu-20.04ubuntu-24.04already dead
runs-on: ubuntu-22.04ubuntu-24.042026-09-17
runs-on: windows-2019windows-2025already dead
runs-on: macos-13macos-15already dead

All of the v5/v6 actions need Actions Runner 2.327.1 or later, which GitHub-hosted runners already have.

GitHub Actions Deprecation Lint is a VS Code extension that carries 25 of these dated rules and marks them by line number in the file you have open. That part is free and asks for no key — one file, all 25 rules, no watermark. A licence changes the scope rather than the depth: the whole repository in one pass, an exported report, and JSON a CI step can fail on so nobody reintroduces a dead version. The same 25 rules also run in the browser with nothing installed.

15 seconds — what it actually does

Questions people ask

What does GitHub Actions Deprecation Lint actually do?

It reads a GitHub Actions workflow file and marks every line that GitHub has already switched off or has dated for shutdown. Each finding carries the line number, the exact date, and the replacement: actions/checkout@v4 becomes @v5, ubuntu-20.04 becomes ubuntu-24.04, ::set-output becomes $GITHUB_OUTPUT. Twenty-five dated rules ship inside.

Who is this for?

Developers and platform engineers who own the .github/workflows files in a repository and get paged when a release job dies overnight. It is aimed at teams carrying workflows written before 2026, and at anyone inheriting a repository whose CI has not been touched in a year but still has to ship.

Why is Dependabot or Renovate not enough?

Dependabot bumps a uses: version when a new release appears. It never reads runs-on: labels, so ubuntu-22.04 and macos-13 stay invisible; it never reads ::set-output or using: node20 in your own action.yml; and it cannot tell you that upload-artifact@v5 still runs Node 20 while v6 does not. It reports releases, not shutdown dates.

What is free and what needs a licence?

Free audits the workflow file you have open, against all twenty-five rules, with no key and no watermark. That finishes the job for one file. The licence changes the scope: every workflow in the repository in one pass, an exported CSV, JSON or HTML report, JSON your CI can fail on, re-checking on save, and your own rules.

What would this cost if a person did it?

A freelance DevOps engineer bills roughly one hundred dollars an hour in 2026, with experienced contractors between one hundred and one hundred and sixty-five. Auditing a repository of workflows against GitHub's changelog by hand is most of a morning, and it has to be redone each time GitHub publishes a new date. The licence is twenty-nine dollars once.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.