Cargo.toml Dependency Health Checker
Cargo.toml Dependency Health Checker
Paste your Cargo.toml [dependencies] block and get an instant health grade for every Rust crate — latest versions, how far behind, and which ones need updating.
| Package | Current | Latest | Grade |
|---|
Need to check one crate?
Rust Cargo Health Checker — check individual crates one at a time with CVE data.
const SAMPLE = `[dependencies] serde = "1.0.150" tokio = { version = "1.20.0", features = ["full"] } reqwest = "0.11.0" anyhow = "1.0.50" clap = "4.0.0"`; function loadSample(){document.getElementById("input").value=SAMPLE;} function semverBehind(cur,latest){ try{const c=cur.split(".").map(n=>parseInt(n)||0);const l=latest.split(".").map(n=>parseInt(n)||0); if(l[0]>c[0])return "major";if(l[1]>c[1])return "minor";if(l[2]>c[2])return "patch";return "current";} catch(e){return "?";} } async function checkCrate(name,ver){ try{ const r=await fetch(`https://crates.io/api/v1/crates/${name}`); if(!r.ok)throw new Error("not found"); const d=await r.json(); const latest=d.crate?.newest_version||d.crate?.max_stable_version||"?"; const behind=semverBehind(ver,latest); let score=100; if(behind==="major")score=40;else if(behind==="minor")score=70;else if(behind==="patch")score=85; const grade=score>=90?"A":score>=75?"B":score>=60?"C":score>=40?"D":"F"; return{latest,behind,grade,score}; }catch(e){return{latest:"?",behind:"?",grade:"?",score:0};} } async function check(){ const inp=document.getElementById("input").value.trim(); if(!inp)return; const err=document.getElementById("error"),loading=document.getElementById("loading"),results=document.getElementById("results"); err.classList.add("hidden");results.classList.add("hidden");loading.classList.remove("hidden"); try{ const lines=inp.split("\n").filter(l=>l.trim()&&!l.startsWith("[")&&!l.startsWith("#")); const pkgs=[]; for(const line of lines){ const m=line.match(/^([a-zA-Z0-9_-]+)\s*=\s*["{]?.*?"?([\d.]+)/); if(m)pkgs.push({name:m[1],ver:m[2]}); } if(!pkgs.length)throw new Error("No dependencies found. Paste your Cargo.toml [dependencies] block."); const limited=pkgs.slice(0,60); const checked=await Promise.all(limited.map(p=>checkCrate(p.name,p.ver).then(r=>({...p,...r})))); checked.sort((a,b)=>a.score-b.score); const needsAttn=checked.filter(p=>["C","D","F"].includes(p.grade)).length; document.getElementById("summary-text").textContent=`${checked.length} crates checked`; document.getElementById("summary-sub").textContent=`${checked.filter(p=>p.grade==="A").length} up to date · ${needsAttn} need attention`; const gc={A:"grade-a font-bold",B:"grade-b font-bold",C:"grade-c font-bold",D:"grade-d font-bold",F:"grade-f font-bold"}; const bc={current:"text-green-600",patch:"text-yellow-600",minor:"text-orange-600",major:"text-red-600"}; document.getElementById("table-body").innerHTML=checked.map(p=>`
`).join(""); loading.classList.add("hidden");results.classList.remove("hidden"); }catch(e){loading.classList.add("hidden");err.textContent=e.message;err.classList.remove("hidden");} }
Founded
2023 in London, UK
Contact
hello@releaserun.com