<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Freshdeps</title>
    <description>The latest articles on Forem by Freshdeps (@freshdepsdev).</description>
    <link>https://forem.com/freshdepsdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3933579%2F553201ac-333b-48ea-8336-fc595aa4a881.png</url>
      <title>Forem: Freshdeps</title>
      <link>https://forem.com/freshdepsdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/freshdepsdev"/>
    <language>en</language>
    <item>
      <title>Your AI keeps recommending these dead npm/PyPI packages — here is the exact migration for each</title>
      <dc:creator>Freshdeps</dc:creator>
      <pubDate>Fri, 15 May 2026 16:38:21 +0000</pubDate>
      <link>https://forem.com/freshdepsdev/ai-coding-agents-recommend-stale-npmpypi-packages-i-built-a-live-mcp-check-for-it-5gei</link>
      <guid>https://forem.com/freshdepsdev/ai-coding-agents-recommend-stale-npmpypi-packages-i-built-a-live-mcp-check-for-it-5gei</guid>
      <description>&lt;h2&gt;
  
  
  Your build broke. Your AI told you to install a dead package.
&lt;/h2&gt;

&lt;p&gt;You asked Claude, Cursor, or Copilot for a library. It gave you a confident answer. You &lt;code&gt;npm install&lt;/code&gt;ed (or &lt;code&gt;pip install&lt;/code&gt;ed) it — and now your build throws a deprecation warning, a peer-dependency error, or just fails outright. You search the package name. You land here.&lt;/p&gt;

&lt;p&gt;This is a reference. Find your package in the tables below, copy the exact replacement and the one-line change. Every entry is &lt;strong&gt;hand-verified&lt;/strong&gt; — there are no inferred or AI-guessed replacements here, which is the entire point: the thing that broke your build was a confident guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why your AI keeps doing this
&lt;/h2&gt;

&lt;p&gt;An LLM's package knowledge is frozen at its training cutoff — typically 6–18 months stale by the time you use it. In that window a library gets deprecated, hands off maintenance, archives its repo, or picks up a CVE. The model has no way to know. A newer or bigger model does not fix this; it just moves the stale cutoff forward a few months. Sonatype's 2026 analysis put LLM dependency-upgrade hallucination near 27% across tens of thousands of enterprise upgrades — this is the default failure mode of AI-assisted dependency work, not an edge case.&lt;/p&gt;

&lt;p&gt;The only real fix is a live lookup at recommendation time. The packages below are the ones stale agents recommend most often. Each package name links to a &lt;strong&gt;live freshness verdict&lt;/strong&gt; (npm/PyPI registry + GitHub API + &lt;a href="https://osv.dev" rel="noopener noreferrer"&gt;OSV.dev&lt;/a&gt;, computed at request time) so you can confirm it is still dead before trusting this page.&lt;/p&gt;

&lt;h2&gt;
  
  
  npm — dead package → exact migration
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dead package&lt;/th&gt;
&lt;th&gt;Replace with&lt;/th&gt;
&lt;th&gt;Why it's dead + the exact change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/request?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;request&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;got&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;request is fully deprecated (no longer maintained since 2020).&lt;br&gt;&lt;code&gt;const got = require('got'); const body = await got(url).text();  // replaces request(url, cb); npm i got&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/moment?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;moment&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dayjs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;moment is in maintenance mode; dayjs is a 2KB modern alternative.&lt;br&gt;&lt;code&gt;dayjs().format('YYYY-MM-DD')  // dayjs is API-compatible for common ops; npm i dayjs&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/node-sass?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;node-sass&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;node-sass is deprecated; the Dart-based 'sass' is the official path.&lt;br&gt;&lt;code&gt;npm rm node-sass &amp;amp;&amp;amp; npm i -D sass  // Dart Sass is a drop-in for most build setups&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/querystring?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;querystring&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;URLSearchParams (built-in)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node's legacy querystring is deprecated; use the WHATWG URLSearchParams.&lt;br&gt;&lt;code&gt;new URLSearchParams({a:'1'}).toString()  // replaces querystring.stringify; built-in, no dep&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/colors?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;colors&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chalk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;colors had a sabotage incident (2022); chalk is the maintained standard.&lt;br&gt;&lt;code&gt;const chalk = require('chalk'); chalk.red('x')  // replaces require('colors'); 'x'.red; npm i chalk&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/faker?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;faker&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@faker-js/faker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the original faker was sabotaged/unpublished; @faker-js/faker is the community fork.&lt;br&gt;&lt;code&gt;const { faker } = require('@faker-js/faker'); faker.person.fullName()  // npm i @faker-js/faker&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/left-pad?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;left-pad&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;String.prototype.padStart (built-in)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;native string padding makes the dependency unnecessary.&lt;br&gt;&lt;code&gt;str.padStart(5, '0')  // native, replaces leftPad(str,5,'0'); no dependency needed&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/tslint?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;tslint&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eslint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TSLint was deprecated in 2019 in favor of typescript-eslint.&lt;br&gt;&lt;code&gt;npm rm tslint &amp;amp;&amp;amp; npm i -D eslint typescript-eslint &amp;amp;&amp;amp; npx eslint --init&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/istanbul?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;istanbul&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nyc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the istanbul package is superseded by nyc / c8.&lt;br&gt;&lt;code&gt;npx nyc &amp;lt;your-test-cmd&amp;gt;  // replaces 'istanbul cover'; npm i -D nyc&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/gulp-util?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;gulp-util&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fancy-log + plugin-error&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;gulp-util was deprecated and split into smaller modules.&lt;br&gt;&lt;code&gt;require('fancy-log') for logging, require('plugin-error') for PluginError  // gulp-util was split&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/babel-core?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;babel-core&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@babel/core&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Babel 6 packages are unmaintained; use the scoped &lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/* (v7+).&lt;br&gt;&lt;code&gt;npm rm babel-core babel-cli &amp;amp;&amp;amp; npm i -D @babel/core @babel/cli; rename presets to @babel/preset-*&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/bower?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;bower&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm / yarn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bower is deprecated; modern bundlers use npm/yarn package resolution.&lt;br&gt;&lt;code&gt;move bower.json deps into package.json; use 'npm install &amp;lt;pkg&amp;gt;' instead of 'bower install'&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/tape?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;tape&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vitest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tape is minimally maintained; vitest is a fast modern test runner.&lt;br&gt;&lt;code&gt;npm i -D vitest; replace test('x',t=&amp;gt;{t.equal(a,b)}) with test('x',()=&amp;gt;{expect(a).toBe(b)})&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/nodemon?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;nodemon&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;node --watch (built-in)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node 18+ ships a native --watch mode for most dev-restart needs.&lt;br&gt;&lt;code&gt;node --watch app.js  // replaces 'nodemon app.js' on Node 18+&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/enzyme?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;enzyme&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@testing-library/react&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;enzyme is abandoned (last release 2019; no React 18/19 adapter ever shipped).&lt;br&gt;&lt;code&gt;npm rm enzyme enzyme-adapter-react-16 &amp;amp;&amp;amp; npm i -D @testing-library/react; replace shallow(&amp;lt;C/&amp;gt;) / wrapper.find('.x') with render(&amp;lt;C/&amp;gt;) + screen.getByRole/getByText&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/react-scripts?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;react-scripts&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Vite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create React App was officially deprecated by the React team (Feb 2025); react-scripts has no active maintainers.&lt;br&gt;&lt;code&gt;npm rm react-scripts &amp;amp;&amp;amp; npm i -D vite @vitejs/plugin-react; move index.html to project root, add vite.config.js, scripts: dev='vite', build='vite build'&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/node-uuid?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;node-uuid&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uuid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;node-uuid is deprecated; the registry redirects you to 'uuid'.&lt;br&gt;&lt;code&gt;npm rm node-uuid &amp;amp;&amp;amp; npm i uuid; const { v4: uuidv4 } = require('uuid'); uuidv4()  // replaces require('node-uuid').v4()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/request-promise?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;request-promise&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;got&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;request-promise is deprecated (it extends the dead request package).&lt;br&gt;&lt;code&gt;npm rm request-promise &amp;amp;&amp;amp; npm i got; const got = require('got'); const body = await got(url).text()  // replaces rp(url)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/request-promise-native?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;request-promise-native&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;got&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;request-promise-native is deprecated (it extends the dead request package).&lt;br&gt;&lt;code&gt;npm rm request-promise-native &amp;amp;&amp;amp; npm i got; const got = require('got'); const json = await got(url).json()  // replaces rp(url)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/jade?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;jade&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;jade was renamed to pug; the jade package is deprecated.&lt;br&gt;&lt;code&gt;npm rm jade &amp;amp;&amp;amp; npm i pug; require('pug').renderFile(path, locals)  // identical template syntax, replaces require('jade')&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/coffee-script?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;coffee-script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;coffeescript&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the npm package was renamed to 'coffeescript' (no hyphen); coffee-script is deprecated.&lt;br&gt;&lt;code&gt;npm rm coffee-script &amp;amp;&amp;amp; npm i coffeescript; require('coffeescript/register')  // same API, new package name&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/phantomjs-prebuilt?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;phantomjs-prebuilt&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;playwright&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;phantomjs-prebuilt is deprecated; PhantomJS development is suspended.&lt;br&gt;&lt;code&gt;npm rm phantomjs-prebuilt &amp;amp;&amp;amp; npm i -D playwright; const { chromium } = require('playwright'); const browser = await chromium.launch()  // headless Chromium replaces PhantomJS&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/protractor?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;protractor&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@playwright/test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Protractor is deprecated and reached end-of-life (Summer 2023).&lt;br&gt;&lt;code&gt;npm rm protractor &amp;amp;&amp;amp; npm i -D @playwright/test; rewrite element(by.css('x')) as page.locator('x'); npx playwright test&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/karma?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;karma&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vitest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Karma is deprecated (Angular 20 deprecated it; removal in Angular 22).&lt;br&gt;&lt;code&gt;npm rm karma karma-* &amp;amp;&amp;amp; npm i -D vitest jsdom; replace karma.conf.js with vitest config (environment: 'jsdom'); npx vitest&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/q?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;q&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;native Promises / async-await&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the q package is deprecated; native Promises cover its API.&lt;br&gt;&lt;code&gt;Q.defer() -&amp;gt; new Promise((resolve,reject)=&amp;gt;{}); Q.all(x) -&amp;gt; Promise.all(x); Q(v) -&amp;gt; Promise.resolve(v); no dependency needed&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/bluebird?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;bluebird&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;native Promises&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bluebird is unmaintained (last release 2019); native V8 Promises are now faster and standard.&lt;br&gt;&lt;code&gt;Promise.promisify(fn) -&amp;gt; require('util').promisify(fn); Promise.map(arr,fn) -&amp;gt; Promise.all(arr.map(fn)); drop the dependency&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/babel-preset-es2015?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;babel-preset-es2015&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@babel/preset-env&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;babel-preset-es2015 is deprecated; &lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/preset-env supersedes the year-based presets.&lt;br&gt;&lt;code&gt;npm rm babel-preset-es2015 &amp;amp;&amp;amp; npm i -D @babel/preset-env; in .babelrc replace presets:['es2015'] with presets:['@babel/preset-env']&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/npm/eslint-loader?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;eslint-loader&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eslint-webpack-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;eslint-loader is deprecated in favor of eslint-webpack-plugin.&lt;br&gt;&lt;code&gt;npm rm eslint-loader &amp;amp;&amp;amp; npm i -D eslint-webpack-plugin; remove the eslint-loader rule, add new ESLintPlugin() to webpack plugins[]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  PyPI — dead package → exact migration
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dead package&lt;/th&gt;
&lt;th&gt;Replace with&lt;/th&gt;
&lt;th&gt;Why it's dead + the exact change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/nose?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;nose&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pytest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;nose is unmaintained (dead since ~2015); pytest is the standard.&lt;br&gt;&lt;code&gt;pip install pytest &amp;amp;&amp;amp; pytest  // replaces nosetests; test discovery is automatic&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/nose2?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;nose2&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pytest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;nose2 sees little activity; pytest is the de-facto Python test runner.&lt;br&gt;&lt;code&gt;pip install pytest &amp;amp;&amp;amp; pytest  // test discovery is automatic&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/python-dateutil?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;python-dateutil&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;datetime / zoneinfo (stdlib)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python 3.9+ stdlib zoneinfo covers most dateutil timezone use.&lt;br&gt;&lt;code&gt;from zoneinfo import ZoneInfo  # py3.9+ stdlib, replaces dateutil.tz for most tz use&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/flask-restful?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;flask-restful&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fastapi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;flask-restful is largely dormant; FastAPI is the modern async API framework.&lt;br&gt;&lt;code&gt;pip install fastapi uvicorn; rewrite Resource classes as FastAPI path operations&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/distribute?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;distribute&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setuptools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;distribute was merged back into setuptools years ago.&lt;br&gt;&lt;code&gt;remove distribute; modern setuptools already provides its functionality&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/requests-oauthlib?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;requests-oauthlib&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;authlib&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;authlib is more actively maintained for modern OAuth flows.&lt;br&gt;&lt;code&gt;pip install authlib; use authlib.integrations.requests_client.OAuth2Session&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/pycrypto?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;pycrypto&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pycryptodome&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pycrypto is dead (last release 2014) and has unpatched CVEs; pycryptodome is the maintained drop-in.&lt;br&gt;&lt;code&gt;pip uninstall pycrypto &amp;amp;&amp;amp; pip install pycryptodome; same 'from Crypto.Cipher import AES' imports work unchanged&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/mysql-python?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;mysql-python&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mysqlclient&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MySQL-python is dead (Python 2 only, last release 2014); mysqlclient is the maintained fork.&lt;br&gt;&lt;code&gt;pip install mysqlclient; import MySQLdb still works (mysqlclient keeps the MySQLdb module name)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/pil?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;pil&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Pillow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PIL is dead (last release 2009, Python 2 only); Pillow is the maintained fork.&lt;br&gt;&lt;code&gt;pip uninstall PIL &amp;amp;&amp;amp; pip install Pillow; 'from PIL import Image' keeps working (Pillow ships the PIL namespace)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/beautifulsoup?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;beautifulsoup&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;beautifulsoup4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the bare 'BeautifulSoup' package is BeautifulSoup 3 — unmaintained; use beautifulsoup4.&lt;br&gt;&lt;code&gt;pip uninstall BeautifulSoup &amp;amp;&amp;amp; pip install beautifulsoup4; 'from bs4 import BeautifulSoup' (was 'from BeautifulSoup import BeautifulSoup')&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/sklearn?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;sklearn&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;scikit-learn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the 'sklearn' PyPI package is a deprecated shim (it now errors on install); install scikit-learn.&lt;br&gt;&lt;code&gt;pip uninstall sklearn &amp;amp;&amp;amp; pip install scikit-learn; the import 'import sklearn' is unchanged — only the install name differs&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/enum34?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;enum34&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enum (stdlib)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;enum34 is a Python 3.4 backport; enum has been in the stdlib since Python 3.4.&lt;br&gt;&lt;code&gt;pip uninstall enum34; 'from enum import Enum' from the standard library — no dependency needed on Python 3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/futures?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;futures&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;concurrent.futures (stdlib)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the 'futures' package is a Python 2 backport; concurrent.futures is stdlib on Python 3.2+.&lt;br&gt;&lt;code&gt;pip uninstall futures; 'from concurrent.futures import ThreadPoolExecutor' from the stdlib — no dependency needed&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/scikits-learn?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;scikits-learn&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;scikit-learn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;scikits.learn was renamed to scikit-learn years ago (last release 2011).&lt;br&gt;&lt;code&gt;pip uninstall scikits.learn &amp;amp;&amp;amp; pip install scikit-learn; 'from sklearn import ...' is the import in both&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/fabric3?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;fabric3&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fabric&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;fabric3 was a stop-gap Py3 fork; modern fabric (2.x+) supports Python 3 natively.&lt;br&gt;&lt;code&gt;pip uninstall fabric3 &amp;amp;&amp;amp; pip install fabric; rewrite fabfile run()/local() using the Connection/task API of Fabric 2+&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/pathlib?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;pathlib&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pathlib (stdlib)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the PyPI pathlib backport is obsolete and breaks modern builds; pathlib is stdlib since Python 3.4.&lt;br&gt;&lt;code&gt;pip uninstall pathlib; 'from pathlib import Path' from the standard library — remove it from requirements entirely&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/pep8?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;pep8&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pycodestyle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pep8 was renamed to pycodestyle; the pep8 package is deprecated.&lt;br&gt;&lt;code&gt;pip uninstall pep8 &amp;amp;&amp;amp; pip install pycodestyle; run 'pycodestyle &amp;lt;path&amp;gt;' (same checks, new command name)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://freshdeps.vercel.app/pypi/nose-parameterized?ref=devto-deadpkg" rel="noopener noreferrer"&gt;&lt;code&gt;nose-parameterized&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;parameterized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;nose-parameterized was renamed to 'parameterized' and is deprecated.&lt;br&gt;&lt;code&gt;pip uninstall nose-parameterized &amp;amp;&amp;amp; pip install parameterized; 'from parameterized import parameterized' (was 'from nose_parameterized import parameterized')&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Make your agent stop recommending these
&lt;/h2&gt;

&lt;p&gt;Reading a table &lt;em&gt;after&lt;/em&gt; the build breaks is the slow path. The fast path is the agent checking &lt;em&gt;before&lt;/em&gt; it recommends. The same hand-verified corpus above sits behind a live API and a one-tool MCP server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON API, no account: &lt;code&gt;GET https://freshdeps.vercel.app/api/verdict?ecosystem=npm&amp;amp;package=node-sass&amp;amp;ref=devto-deadpkg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP server — one paste into your client config (Claude Desktop, Cursor, …), no account, no key:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"freshdeps"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"github:SolvoHQ/freshdeps-mcp"&lt;/span&gt;&lt;span class="p"&gt;]}}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a project rule like &lt;em&gt;"before recommending or adding any npm/PyPI dependency, call &lt;code&gt;check_dependency_freshness&lt;/code&gt; and don't recommend anything that comes back &lt;code&gt;abandoned&lt;/code&gt;"&lt;/em&gt;, this table stops being something you ever need to open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes &amp;amp; limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;npm + PyPI only. The corpus is curated by hand and &lt;strong&gt;never inferred&lt;/strong&gt; — if a package is not in the tables above, this page makes no claim about it.&lt;/li&gt;
&lt;li&gt;"Dead" means deprecated, unmaintained, archived, renamed, or superseded by the stdlib — the migration cell tells you which.&lt;/li&gt;
&lt;li&gt;Live verdicts are computed per request; under unauthenticated GitHub rate limits a verdict can come back registry-only rather than failing.&lt;/li&gt;
&lt;li&gt;Found one that's wrong, or a common dead package that's missing? That is the single most useful feedback — this corpus only improves with disagreement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source / MCP repo: &lt;a href="https://github.com/SolvoHQ/freshdeps-mcp" rel="noopener noreferrer"&gt;https://github.com/SolvoHQ/freshdeps-mcp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>python</category>
      <category>npm</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
