getreadystack's picture
Upload index.html with huggingface_hub
74fd34f verified
Raw History Blame Contribute Delete
45 kB
<!doctype html><html lang="en"><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Runtime EOL and Deploy-Block Audit for Docker, CI and AWS Lambda</title>
<meta name="description" content="Finds the end-of-life runtimes an AI assistant still writes for you — node:20, python3.9, ubuntu-22.04, nodejs20.x — and prints the exact date each one stops deploying.">
<style>
:root{color-scheme:light dark}
body{margin:0;font:16px/1.6 system-ui,-apple-system,"Segoe UI",sans-serif;
background:#fbfbfa;color:#16161d}
@media(prefers-color-scheme:dark){body{background:#14141a;color:#e8e8ea}}
.wrap{max-width:880px;margin:0 auto;padding:28px 20px 64px}
h1{font-size:1.7rem;line-height:1.25;margin:.2em 0 .3em}
p.sub{margin:0 0 1.4em;opacity:.8}
textarea{width:100%;min-height:230px;font:13px/1.5 ui-monospace,Menlo,Consolas,monospace;
padding:12px;border:1px solid #c9c9d1;border-radius:10px;background:transparent;color:inherit;
box-sizing:border-box}
button{font:600 15px/1 inherit;padding:12px 22px;border:0;border-radius:10px;
background:#1d4ed8;color:#fff;cursor:pointer;margin:12px 0}
button:hover{background:#1a43bd}
table{border-collapse:collapse;width:100%;margin-top:14px;font-size:14px}
th,td{border-bottom:1px solid #d8d8e0;padding:8px 6px;text-align:left;vertical-align:top}
th{font-weight:600;opacity:.75}
td.n{width:64px;font:13px ui-monospace,monospace;opacity:.7}
.ok{padding:14px;border-radius:10px;background:#e8f5ec;color:#14532d;margin-top:14px}
@media(prefers-color-scheme:dark){.ok{background:#15321f;color:#bbf7d0}}
.next{margin-top:30px;padding:18px;border:1px solid #d8d8e0;border-radius:12px}
.next h2{font-size:1.05rem;margin:0 0 .5em}
.cta{margin-top:18px;padding:16px 18px;border:1px solid #1d4ed8;border-radius:12px}
.cta p{margin:0 0 .6em}
.cta a.buy{display:inline-block;font:600 15px/1 inherit;padding:12px 22px;border-radius:10px;background:#1d4ed8;color:#fff;text-decoration:none}
.cta p.terms{margin:.8em 0 0;font-size:13px;opacity:.75}
.next ul{margin:.3em 0 1em 1.1em;padding:0}
</style>
<div class="wrap">
<h1>Runtime EOL and Deploy-Block Audit for Docker, CI and AWS Lambda</h1>
<p class="sub">Finds the end-of-life runtimes an AI assistant still writes for you — node:20, python3.9, ubuntu-22.04, nodejs20.x — and prints the exact date each one stops deploying.</p>
<textarea id="src" placeholder="Paste a Dockerfile, a GitHub Actions workflow, serverless.yml, requirements.txt, a .csproj or a Gemfile here"></textarea>
<button id="go">Check this file</button>
<div id="out"></div>
<div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><div class="cta" id="cta" hidden><p>The full version scans every Dockerfile, workflow, Lambda config and manifest in the workspace at once and exports the dated audit report.</p>
<a href="https://getreadystack.com" class="buy">Get the full version — $29</a>
<p class="terms">$29 once · one licence key per person or team seat · A US platform engineer averages $63.95/hour (ZipRecruiter, September 2026). This is about 27 minutes of that, once.</p></div>
<div class="next"><h2>In the full version</h2><ul><li>Scan the entire workspace</li><li>Export a dated audit report</li><li>CI-readable JSON output</li><li>Re-check on every save</li><li><a href="https://getreadystack.com">Get the full version</a></li></ul></div>
</div>
<script>
var RULES=[{"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*node:(?:14|16|18)(?:[.\\-]|\\s|$)", "flags": "i", "message": "Node.js 18 went EOL 2025-04-30 (16: 2023-09-11, 14: 2023-04-30). No upstream security patches exist for this image.", "fix": "node:24", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*node:20(?:[.\\-]|\\s|$)", "flags": "i", "message": "Node.js 20 went EOL 2026-04-30 — it is past end-of-life as of today. This is the version most AI assistants still suggest.", "fix": "node:24", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*node:22(?:[.\\-]|\\s|$)", "flags": "i", "message": "Node.js 22 is in maintenance only; EOL 2027-04-30. Safe today, but plan the move.", "fix": "node:24", "sev": "info"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*python:3\\.(?:6|7|8|9)(?:[.\\-]|\\s|$)", "flags": "i", "message": "Python 3.9 went EOL 2025-10-31 (3.8: 2024-10-07, 3.7: 2023-06-27). No security fixes are published for this image.", "fix": "python:3.13", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*python:3\\.10(?:[.\\-]|\\s|$)", "flags": "i", "message": "Python 3.10 reaches EOL 2026-10-31 — under two months away.", "fix": "python:3.13", "sev": "warn"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*python:3\\.11(?:[.\\-]|\\s|$)", "flags": "i", "message": "Python 3.11 reaches EOL 2027-10-31.", "fix": "python:3.13", "sev": "info"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*php:8\\.(?:0|1)(?:[.\\-]|\\s|$)", "flags": "i", "message": "PHP 8.1 reached EOL 2025-12-31 (8.0: 2023-11-26). Security support has ended.", "fix": "php:8.4", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*php:8\\.2(?:[.\\-]|\\s|$)", "flags": "i", "message": "PHP 8.2 reaches EOL 2026-12-31.", "fix": "php:8.4", "sev": "warn"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*ubuntu:(?:20\\.04|focal)", "flags": "i", "message": "Ubuntu 20.04 LTS reached EOL 2025-05-31. Standard security updates have stopped.", "fix": "ubuntu:24.04", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*ubuntu:(?:22\\.04|jammy)", "flags": "i", "message": "Ubuntu 22.04 standard support ended 2024-09-30; full EOL 2027-06-01.", "fix": "ubuntu:24.04", "sev": "warn"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*debian:(?:11|bullseye)", "flags": "i", "message": "Debian 11 reached EOL 2026-08-31 — nine days ago as of this build.", "fix": "debian:13", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*debian:(?:10|buster|9|stretch)", "flags": "i", "message": "Debian 10 reached EOL 2024-06-30 (9: 2022-07-01).", "fix": "debian:13", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*debian:(?:12|bookworm)", "flags": "i", "message": "Debian 12 passed its LTS handover 2026-07-11; full EOL 2028-06-30.", "fix": "debian:13", "sev": "info"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*alpine:3\\.(?:1[5-9]|20)(?:[.\\-]|\\s|$)", "flags": "i", "message": "Alpine 3.20 reached EOL 2026-04-01 (3.19: 2025-11-01, 3.18: 2025-05-09).", "fix": "alpine:3.23", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*alpine:3\\.21(?:[.\\-]|\\s|$)", "flags": "i", "message": "Alpine 3.21 reaches EOL 2026-11-01.", "fix": "alpine:3.23", "sev": "warn"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*postgres:(?:9|10|11|12|13)(?:[.\\-]|\\s|$)", "flags": "i", "message": "PostgreSQL 13 reached EOL 2025-11-13 (12: 2024-11-21, 11: 2023-11-09). No further security releases.", "fix": "postgres:17", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*postgres:14(?:[.\\-]|\\s|$)", "flags": "i", "message": "PostgreSQL 14 reaches EOL 2026-11-12.", "fix": "postgres:17", "sev": "warn"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*golang:1\\.(?:1[0-9]|2[0-5])(?:[.\\-]|\\s|$)", "flags": "i", "message": "Go 1.25 reached EOL 2026-08-19 (1.24: 2026-02-10). Go supports only the two most recent releases.", "fix": "golang:1.27", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*amazonlinux:2(?:[.\\-]|\\s|$)", "flags": "i", "message": "Amazon Linux 2 reached EOL 2026-06-30.", "fix": "amazonlinux:2023", "sev": "error"}, {"pattern": "^\\s*FROM\\s+.*dotnet/(?:aspnet|sdk|runtime):(?:6|7)\\.0", "flags": "i", "message": ".NET 6 reached EOL 2024-11-12 and .NET 7 reached EOL 2024-05-14.", "fix": "dotnet/aspnet:10.0", "sev": "error"}, {"pattern": "^\\s*FROM\\s+.*dotnet/(?:aspnet|sdk|runtime):(?:8|9)\\.0", "flags": "i", "message": ".NET 8 and .NET 9 both reach EOL 2026-11-10 — the LTS and the STS end on the same day.", "fix": "dotnet/aspnet:10.0", "sev": "warn"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*ruby:3\\.(?:0|1|2)(?:[.\\-]|\\s|$)", "flags": "i", "message": "Ruby 3.2 reached EOL 2026-03-31 (3.1: 2025-03-26, 3.0: 2024-04-23).", "fix": "ruby:3.4", "sev": "error"}, {"pattern": "^\\s*FROM\\s+(?:--\\S+\\s+)?\\S*mongo:(?:6|7|8\\.1|8\\.2)(?:[.\\-]|\\s|$)", "flags": "i", "message": "MongoDB 8.2 reached EOL 2026-07-31 (8.1: 2025-09-30). Rapid releases expire fast; 8.0 runs to 2029-10-31.", "fix": "mongo:8.0", "sev": "error"}, {"pattern": "nodejs20\\.x", "flags": "i", "message": "AWS Lambda nodejs20.x was deprecated 2026-04-30. Lambda blocks NEW function create on 2027-02-01 and blocks UPDATES to existing functions on 2027-03-03 — after that you cannot ship a hotfix to this function.", "fix": "nodejs24.x", "sev": "error"}, {"pattern": "nodejs18\\.x", "flags": "i", "message": "AWS Lambda nodejs18.x was deprecated 2025-09-01. Block function create 2027-02-01; block function update 2027-03-03.", "fix": "nodejs24.x", "sev": "error"}, {"pattern": "nodejs(?:12|14|16)\\.x", "flags": "i", "message": "This AWS Lambda Node.js runtime is deprecated. Block function update is 2027-03-03 for nodejs16.x.", "fix": "nodejs24.x", "sev": "error"}, {"pattern": "[\"\\':= ]python3\\.9\\b", "flags": "i", "message": "AWS Lambda python3.9 was deprecated 2025-12-15. Block function create 2027-02-01; block function update 2027-03-03.", "fix": "python3.13", "sev": "error"}, {"pattern": "[\"\\':= ]python3\\.10\\b", "flags": "i", "message": "AWS Lambda python3.10 deprecates 2026-10-31. Block function create 2027-02-01; block function update 2027-03-03.", "fix": "python3.13", "sev": "warn"}, {"pattern": "[\"\\':= ]python3\\.(?:6|7|8)\\b", "flags": "i", "message": "This AWS Lambda Python runtime is deprecated (3.8: 2024-10-14). Block function update 2027-03-03.", "fix": "python3.13", "sev": "error"}, {"pattern": "[Rr]untime\\s*[:=]\\s*[\"\\']?dotnet(?:6|7)\\b", "flags": "i", "message": "AWS Lambda dotnet6 was deprecated 2024-12-20 (dotnet7: 2024-05-14). Block function update 2027-03-03.", "fix": "dotnet10", "sev": "error"}, {"pattern": "[Rr]untime\\s*[:=]\\s*[\"\\']?dotnet8\\b", "flags": "i", "message": "AWS Lambda dotnet8 deprecates 2026-11-10. Block function create 2027-02-01; block function update 2027-03-03.", "fix": "dotnet10", "sev": "warn"}, {"pattern": "[Rr]untime\\s*[:=]\\s*[\"\\']?ruby3\\.2\\b", "flags": "i", "message": "AWS Lambda ruby3.2 was deprecated 2026-03-31. Block function create 2027-02-01; block function update 2027-03-03.", "fix": "ruby3.4", "sev": "error"}, {"pattern": "[\"\\':= ]go1\\.x\\b", "flags": "i", "message": "AWS Lambda go1.x was deprecated 2024-01-08. Block function update 2027-03-03. Move to provided.al2023 with a custom runtime.", "fix": "provided.al2023", "sev": "error"}, {"pattern": "provided\\.al2(?![0-9])", "flags": "i", "message": "AWS Lambda provided.al2 was deprecated 2026-07-31. Block function create 2027-02-01; block function update 2027-03-03.", "fix": "provided.al2023", "sev": "error"}, {"pattern": "[Rr]untime\\s*[:=]\\s*[\"\\']?(?:java8\\.al2|java11|java17)(?!\\.al2023)\\b", "flags": "i", "message": "This AWS Lambda Java runtime sits on Amazon Linux 2 and deprecates 2027-06-30. The .al2023 variants run to 2029-06-30.", "fix": "java21", "sev": "warn"}, {"pattern": "[Rr]untime\\s*[:=]\\s*[\"\\']?python3\\.11\\b", "flags": "i", "message": "AWS Lambda python3.11 sits on Amazon Linux 2 and deprecates 2027-06-30.", "fix": "python3.13", "sev": "info"}, {"pattern": "runs-on:.*ubuntu-20\\.04", "flags": "i", "message": "The ubuntu-20.04 runner image became fully unsupported 2025-04-15. Jobs on this label fail.", "fix": "ubuntu-24.04", "sev": "error"}, {"pattern": "runs-on:.*ubuntu-22\\.04", "flags": "i", "message": "GitHub begins deprecating the ubuntu-22.04 runner image on 2026-09-17. Brownouts that FAIL jobs run 2027-03-23, 2027-03-30, 2027-04-06 and 2027-04-13; fully unsupported 2027-04-17.", "fix": "ubuntu-24.04", "sev": "warn"}, {"pattern": "runs-on:.*macos-1[123](?![0-9])", "flags": "i", "message": "The macOS 13 runner image was retired 2025-12-04; macOS 12 and 11 are already gone.", "fix": "macos-15", "sev": "error"}, {"pattern": "runs-on:.*windows-2019", "flags": "i", "message": "The windows-2019 runner image became fully unsupported 2025-06-30.", "fix": "windows-2025", "sev": "error"}, {"pattern": "node-version:\\s*[\"\\']?(?:14|16|18|20)(?:[\"\\'\\s.x]|$)", "flags": "i", "message": "actions/setup-node is pinned to an end-of-life Node.js line (20 EOL 2026-04-30, 18 EOL 2025-04-30).", "fix": "node-version: 24", "sev": "error"}, {"pattern": "python-version:\\s*[\"\\']?3\\.(?:7|8|9)(?:[\"\\'\\s.]|$)", "flags": "i", "message": "actions/setup-python is pinned to an end-of-life Python (3.9 EOL 2025-10-31).", "fix": "python-version: \"3.13\"", "sev": "error"}, {"pattern": "python-version:\\s*[\"\\']?3\\.10(?:[\"\\'\\s.]|$)", "flags": "i", "message": "actions/setup-python is pinned to Python 3.10, which reaches EOL 2026-10-31.", "fix": "python-version: \"3.13\"", "sev": "warn"}, {"pattern": "dotnet-version:\\s*[\"\\']?(?:6|7)\\.", "flags": "i", "message": "actions/setup-dotnet is pinned to .NET 6 (EOL 2024-11-12) or .NET 7 (EOL 2024-05-14).", "fix": "dotnet-version: 10.0.x", "sev": "error"}, {"pattern": "\"node\"\\s*:\\s*\"[^\"]*(?:1[468]|20)(?:\\.|\\s|\"|\\})", "flags": "i", "message": "package.json engines.node allows an end-of-life Node.js line (20 EOL 2026-04-30).", "fix": "\"node\": \">=22\"", "sev": "warn"}, {"pattern": "<TargetFramework[s]?>\\s*net(?:6|7)\\.0", "flags": "i", "message": ".NET 6 reached EOL 2024-11-12 and .NET 7 reached EOL 2024-05-14. Builds still work; security patches do not exist.", "fix": "<TargetFramework>net10.0", "sev": "error"}, {"pattern": "<TargetFramework[s]?>\\s*net(?:8|9)\\.0", "flags": "i", "message": ".NET 8 and .NET 9 both reach EOL 2026-11-10.", "fix": "<TargetFramework>net10.0", "sev": "warn"}, {"pattern": "python_requires\\s*=\\s*[\"\\'][^\"\\']*3\\.(?:7|8|9)", "flags": "i", "message": "python_requires still admits an end-of-life Python (3.9 EOL 2025-10-31).", "fix": "python_requires=\">=3.11\"", "sev": "warn"}, {"pattern": "^\\s*[Dd]jango\\s*[=~<>!]=\\s*(?:4\\.2|5\\.0|5\\.1)", "flags": "i", "message": "Django 4.2 LTS reached EOL 2026-04-07 (5.1: 2025-12-03, 5.0: 2025-04-02). Django 5.2 LTS runs to 2028-04-30.", "fix": "Django>=5.2,<6.0", "sev": "error"}, {"pattern": "^\\s*gem\\s+[\"\\']rails[\"\\']\\s*,\\s*[\"\\'][^\"\\']*(?:7\\.0|7\\.1|7\\.2)", "flags": "i", "message": "Rails 7.2 reached EOL 2026-08-09 (7.1: 2025-10-01, 7.0: 2025-04-01).", "fix": "'~> 8.0'", "sev": "error"}, {"pattern": "^\\s*ruby\\s+[\"\\']3\\.(?:0|1|2)", "flags": "i", "message": "The Gemfile pins an end-of-life Ruby (3.2 EOL 2026-03-31, 3.1 EOL 2025-03-26).", "fix": "ruby '3.4'", "sev": "error"}, {"pattern": "spring-boot[^>\\n]*>\\s*3\\.(?:[0-5])\\.", "flags": "i", "message": "Spring Boot 3.5 OSS support ended 2026-06-30 (3.4: 2025-12-31, 3.3: 2025-06-30). 4.0 runs to 2026-12-31.", "fix": "4.1.x", "sev": "error"}, {"pattern": "(?:cluster_version|kubernetesVersion|k8s_version|kubernetes_version)\\s*[:=]\\s*[\"\\']?1\\.(?:2[4-9]|3[0-3])\\b", "flags": "i", "message": "Kubernetes 1.33 reached EOL 2026-06-28 (1.32: 2026-02-28, 1.31: 2025-11-11). Control planes past EOL stop getting patches.", "fix": "1.34", "sev": "error"}, {"pattern": "(?:cluster_version|kubernetesVersion|k8s_version|kubernetes_version)\\s*[:=]\\s*[\"\\']?1\\.34\\b", "flags": "i", "message": "Kubernetes 1.34 reaches EOL 2026-10-27.", "fix": "1.36", "sev": "warn"}];
function scan(t){var L=String(t).split(/\r?\n/),h=[],i,r,re;
for(i=0;i<L.length;i++){for(var k=0;k<RULES.length;k++){r=RULES[k];
try{re=new RegExp(r.pattern,r.flags||'')}catch(e){continue}
if(re.test(L[i]))h.push({line:i+1,msg:r.message})}}
return h}
document.getElementById('go').onclick=function(){
var t=document.getElementById('src').value,o=document.getElementById('out');
if(!t.trim()){o.innerHTML='';return}
var h=scan(t),c=document.getElementById('cta');
if(c)c.hidden=false;
if(!h.length){o.innerHTML='<div class="ok">No end-of-life runtimes found here. Every version in this file is still supported.</div>';return}
var s='<table><tr><th>Line</th><th>Finding</th></tr>';
for(var i=0;i<h.length;i++){s+='<tr><td class="n">'+h[i].line+'</td><td>'+
String(h[i].msg).replace(/&/g,'&amp;').replace(/</g,'&lt;')+'</td></tr>'}
o.innerHTML=s+'</table>'};
</script>
</html>
<section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/runtime-eol-deploy-block-audit" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'runtime-eol-deploy-block-audit',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><a href="https://www.npmjs.com/package/@readystack/runtime-eol-deploy-block-audit" rel="noopener" data-yj-install-door="npm" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'runtime-eol-deploy-block-audit',src:'npm',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">npm</a><a href="https://www.npmjs.com/package/@readystack/runtime-eol-deploy-block-audit" rel="noopener" data-yj-install-door="mcp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'runtime-eol-deploy-block-audit',src:'mcp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">MCP server (npx)</a><a href="https://hub.docker.com/r/getreadystack/runtime-eol-deploy-block-audit" rel="noopener" data-yj-install-door="docker" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'runtime-eol-deploy-block-audit',src:'docker',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">npx @readystack/runtime-eol-deploy-block-audit &lt;file&gt;
npx @readystack/runtime-eol-deploy-block-audit --mcp
docker run --rm -v &quot;$PWD:/w&quot; getreadystack/runtime-eol-deploy-block-audit /w</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/cl/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
<section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get the full rule table as a PDF</b><div style="opacity:.78;margin:.35rem 0 .8rem">All 54 rules Runtime EOL and Deploy-Block Audit for Docker, CI and AWS Lambda checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Email me the PDF</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">Sent. It arrives within the hour - check spam too.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"runtime-eol-deploy-block-audit",lang:"en",source:"rule_table"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);})();</script></section>
<section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">Finds the end-of-life runtimes an AI assistant still writes for you — node:20, python3.9, ubuntu-22.04, nodejs20.x — and prints the exact date each one stops deploying.</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">A US platform engineer averages $63.95/hour (ZipRecruiter, September 2026). This is about 27 minutes of that, once.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_zWR0ONLtSMG7LQI0QRnUpBYLlnvyyGNDbppZ81dtUFN" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
<!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script><script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>
<script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script>
<section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-09">Updated 2026-09-09</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-09","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku24417_result_card.jpg" alt="Runtime EOL and Deploy-Block Audit for Docker, CI and AWS Lambda" loading="lazy" style="max-width:100%;border-radius:6px"></p>
<p>Five lines in a US fintech team&#x27;s repository will stop deploying before April 2027 — and an AI assistant wrote every one of them.</p>
<p>That is not a hypothetical. Here is the shape it takes in a real service:</p>
<pre><code>FROM node:20-alpine # Node.js 20 went EOL 2026-04-30
runs-on: ubuntu-22.04 # deprecation begins 2026-09-17
runtime: nodejs20.x # Lambda blocks updates 2027-03-03
&lt;TargetFramework&gt;net8.0 # .NET 8 EOL 2026-11-10
FROM debian:11-slim # Debian 11 EOL 2026-08-31</code></pre>
<p>Every one of those was correct advice at some point. That is exactly the problem. A model trained while Node.js 20 was the safe LTS choice will keep suggesting <code>node:20</code> long after 2026-04-30, and it will do it confidently, because nothing in the text of a Dockerfile marks a version as expired. The date lives somewhere else entirely — on a vendor page you have to know to go and read.</p>
<p>The sharpest edge is AWS Lambda, because it is the one that removes your ability to respond. Lambda&#x27;s published table gives nodejs20.x, nodejs18.x, python3.9, python3.8, dotnet6, ruby3.2, go1.x and provided.al2 the same block-function-update date: <strong>2027-03-03</strong>. After that date you cannot push code to those functions at all. Not a feature, not a hotfix, not a patch for whatever CVE lands that week. The function keeps running and you keep being responsible for it, which is the worst of both.</p>
<p>GitHub Actions does something similar with less finality but more surprise. The ubuntu-22.04 runner image begins deprecation on 2026-09-17, and GitHub schedules brownouts — 2027-03-23, 2027-03-30, 2027-04-06 and 2027-04-13 — where jobs on that label simply fail, before the image goes fully unsupported on 2027-04-17. A brownout arrives as a red build on a Tuesday in a repository nobody has touched in months.</p>
<p>None of this is secret. The dates are all published. The gap is that nobody looks, because looking means opening every Dockerfile, every workflow, every serverless.yml and every .csproj in the repository and cross-checking each pinned version against a different vendor&#x27;s page.</p>
<p>That is a job for a regular expression and a table, so we made one. Runtime EOL Guard carries 54 rules covering Docker base images, GitHub Actions runner labels and setup-* pins, AWS Lambda runtime identifiers, and project manifests for .NET, Python, Django, Rails, Ruby, Spring Boot and Kubernetes. Every rule states the real date it is asserting and the version it wants instead, so you can check our homework.</p>
<p>The free version checks the open file — all 54 rules, no key, no cap, nothing hidden. Paste a file into the web version and you get the same answer from the same rule set. What the licence buys is a different job: one pass over the whole workspace, a dated report you can hand to a security review, CI output that fails a build on a crossed block date, and your own internal deadline rules.</p>
<p>A US platform engineer averages $63.95/hour (ZipRecruiter, September 2026). Runtime EOL Guard is $29 once.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku24417_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku24417_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Runtime EOL Guard actually do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It scans a Dockerfile, GitHub Actions workflow, serverless.yml, .csproj, Gemfile or requirements.txt and flags every runtime version that has passed end-of-life or is close to it. Each finding names the real EOL date, the AWS Lambda block-create and block-update dates where those apply, and the supported version to move to instead.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is this for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Platform and DevOps engineers who own the deploy pipeline — the person paged when a Lambda function refuses to update or a CI job fails on a retired runner label. It also suits anyone reviewing infrastructure code an AI assistant generated, because those suggestions reflect the versions that were current while the model was trained.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just use endoflife.date or Dependabot?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">endoflife.date publishes the dates but cannot read your repository. Dependabot and Renovate update packages inside a manifest, not the platform underneath it: base images, CI runner labels and Lambda runtime identifiers. Runtime EOL Guard joins the two halves, finding the pinned version in your file and attaching the date it stops working.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a licence?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">The free tier checks the open file, or only the lines you select, against all 54 rules. No key, no watermark, no usage cap, and no finding is ever hidden. The licence covers a different job: scanning every file in the workspace at once, exporting a dated audit report, CI output, re-checking on save, and your own rules.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What would this cost me otherwise?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A US platform engineer averages $63.95 an hour (ZipRecruiter, September 2026). Auditing a mid-sized repository by hand means opening every Dockerfile and workflow and checking each version against a vendor page. Runtime EOL Guard is $29 once, one licence key per person or team seat,.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask ChatGPT or another AI chat?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Runtime EOL and Deploy-Block Audit for Docker, CI and AWS La checks the file you open against 54 rules from a rule set dated 2026-09-20, 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.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Runtime EOL Guard actually do?", "acceptedAnswer": {"@type": "Answer", "text": "It scans a Dockerfile, GitHub Actions workflow, serverless.yml, .csproj, Gemfile or requirements.txt and flags every runtime version that has passed end-of-life or is close to it. Each finding names the real EOL date, the AWS Lambda block-create and block-update dates where those apply, and the supported version to move to instead."}}, {"@type": "Question", "name": "Who is this for?", "acceptedAnswer": {"@type": "Answer", "text": "Platform and DevOps engineers who own the deploy pipeline — the person paged when a Lambda function refuses to update or a CI job fails on a retired runner label. It also suits anyone reviewing infrastructure code an AI assistant generated, because those suggestions reflect the versions that were current while the model was trained."}}, {"@type": "Question", "name": "Why not just use endoflife.date or Dependabot?", "acceptedAnswer": {"@type": "Answer", "text": "endoflife.date publishes the dates but cannot read your repository. Dependabot and Renovate update packages inside a manifest, not the platform underneath it: base images, CI runner labels and Lambda runtime identifiers. Runtime EOL Guard joins the two halves, finding the pinned version in your file and attaching the date it stops working."}}, {"@type": "Question", "name": "What is free and what needs a licence?", "acceptedAnswer": {"@type": "Answer", "text": "The free tier checks the open file, or only the lines you select, against all 54 rules. No key, no watermark, no usage cap, and no finding is ever hidden. The licence covers a different job: scanning every file in the workspace at once, exporting a dated audit report, CI output, re-checking on save, and your own rules."}}, {"@type": "Question", "name": "What would this cost me otherwise?", "acceptedAnswer": {"@type": "Answer", "text": "A US platform engineer averages $63.95 an hour (ZipRecruiter, September 2026). Auditing a mid-sized repository by hand means opening every Dockerfile and workflow and checking each version against a vendor page. Runtime EOL Guard is $29 once, one licence key per person or team seat,."}}, {"@type": "Question", "name": "Why not just ask ChatGPT or another AI chat?", "acceptedAnswer": {"@type": "Answer", "text": "A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Runtime EOL and Deploy-Block Audit for Docker, CI and AWS La checks the file you open against 54 rules from a rule set dated 2026-09-20, 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."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:24417,slug:"runtime-eol-deploy-block-audit",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/base-image-eol-lint"><span class="yj-rel-t">Base Image EOL Lint - Dockerfile and CI end-of-life check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/actions-deprecation-lint-2026"><span class="yj-rel-t">GitHub Actions Deprecation Lint: the 2026 runner and action EOL dates</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/cron-schedule-lint"><span class="yj-rel-t">Cron Schedule Lint for crontab, Kubernetes CronJob, GitHub Actions, Spring and</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/ssdf-attestation-workflow-audit"><span class="yj-rel-t">SSDF Attestation Audit for GitHub Actions</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/docker-image-for-development"><span class="yj-rel-t">Docker Image for Development — Node.js 22 + TypeScript Dev Container with Post</span><span class="yj-rel-p">$19</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/us-trademark-renewal-clock-2026"><span class="yj-rel-t">US Trademark Renewal Clock 2026 - Section 8/9 window, grace date and exact USP</span><span class="yj-rel-p">$60</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section>