Our Gatsby site has 47 plugins in package.json
. After running `npm audit`, we have 18 critical vulnerabilities and 34 high severity issues. Run `npm audit fix` and half the fucking plugins break. Don't run it and security scans flag the site as "high risk."
This is the hidden cost of Gatsby nobody talks about - you become the maintainer of abandoned plugins that worked fine in 2022 but are now ticking time bombs.
The Abandoned Plugin Crisis
The numbers are brutal:
gatsby-source-shopify
: Last commit March 2024, breaks January 1, 2025gatsby-plugin-mailchimp
: 127 open issues, maintainer hasn't responded since February 2023gatsby-source-contentful
: Works but depends onaxios@0.21.4
with CVE-2021-3749gatsby-transformer-sqip
: Uses deprecatedsharp
APIs, fails on Node 18.2.0+gatsby-plugin-google-analytics
: Google deprecated Universal Analytics, plugin still references dead endpoints
Plugin repository stats show the carnage:
- 89 plugins in the monorepo
- 23 marked "deprecated"
- 31 have security warnings
- 12 haven't been touched since the Netlify acquisition
When the original Gatsby team got laid off, plugin maintenance died with them. The community plugins directory is a graveyard of abandoned projects with cheerful descriptions like "actively maintained" next to packages that haven't been updated in 18 months. GitHub's dependency analysis shows the cascade of unmaintained dependencies. Security advisories pile up with no responses. The npm package health scores reflect the reality - declining maintenance status across the ecosystem.
Why Your Plugins Keep Breaking
Dependency Hell Pattern:
gatsby-source-shopify@5.14.0
├── axios@0.27.2 (vulnerable)
├── gatsby-source-filesystem@4.24.0
│ └── sharp@0.30.5 (deprecated APIs)
└── node-fetch@2.6.7 (vulnerable, unmaintained)
Each plugin drags in its own dependency tree. When one plugin needs `axios@0.27.2` and another needs `axios@1.1.3`, npm's resolution algorithm picks the newer version and the old plugin breaks with:
TypeError: axios.create is not a function
at createClient (gatsby-source-shopify/src/client.js:15:22)
The plugin author disappeared and there's no fix coming. Your options:
- Fork the plugin and fix it yourself (3-8 hours)
- Pin dependencies at vulnerable versions
- Find an unmaintained community fork
- Write your own replacement
I've done all four. Currently maintain 3 forked plugins and a private npm registry for our patches.
The Security Vulnerability Trap
Fresh Gatsby install today:
npm create gatsby@latest test-site
cd test-site && npm audit
Results: 18 vulnerabilities (4 critical, 6 high, 8 moderate)
The worst ones:
- `trim@0.0.1`: Prototype pollution vulnerability, used by some image processing chain
- `node-fetch@2.6.1`: SSRF vulnerability, pulls in remote content during builds
- `glob-parent@3.1.0`: Regular expression DoS, affects file processing
These packages have 10-50 weekly downloads on npm. Why the fuck are they in my dependency tree? Because gatsby-plugin-image
depends on sharp
which depends on node-gyp
which depends on some unmaintained utility that pulls in prototype pollution vulnerabilities from 2019.
Run npm audit fix --force
and watch your site explode:
- Image processing fails with
sharp
version conflicts - GraphQL queries return
undefined
because of changed API signatures - Build crashes with
Cannot read property 'resolve' of undefined
in webpack loader chains - Plugin configurations that worked yesterday now throw
TypeError: Cannot read property 'plugin' of undefined
The security documentation suggests using npm audit fix
like it's safe. It's not. I learned this the hard way when a Friday afternoon security fix took down production for 6 hours.
Plugin Version Conflicts From Hell
Real example from our codebase:
gatsby-plugin-manifest
needssharp@0.29.x
gatsby-plugin-image
needssharp@0.32.x
gatsby-transformer-sharp
works with both but crashes withsharp@0.33.x
- Our custom image processing plugin (forked from abandoned upstream) hardcodes
sharp@0.30.5
APIs
When sharp@0.33.0
released with breaking changes, npm install
pulled it in and builds started failing:
Error: Cannot find module 'sharp'
at createRequire (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/gatsby-transformer-sharp/src/process-image.js:12:15)
The problem isn't that sharp
is missing - it's that the new version changed its import structure and the plugin expects the old API. Sharp's changelog shows the breaking changes, but nobody updated the Gatsby plugins because the maintainers are gone.
The Fork-and-Fix Strategy (What Actually Works)
When you can't wait for fixes that will never come, fork the plugin:
Step 1: Fork the dead plugin
git clone https://github.com/gatsbyjs/gatsby.git
cd gatsby/packages/gatsby-source-shopify
git checkout -b fix-api-2024-07
Step 2: Fix the actual problem
Update src/create-client.js
to use Shopify API 2024-07:
// Old (breaks Jan 1, 2025):
const API_VERSION = '2024-01'
// New (works until 2026):
const API_VERSION = '2024-07'
Step 3: Publish to private registry
npm version patch
## Replace <verdaccio-url> with your Verdaccio server URL (default: localhost:4873)
npm publish --registry <verdaccio-url>
See the Verdaccio npm setup documentation for detailed publishing configuration.
Step 4: Update package.json
{
"dependencies": {
"gatsby-source-shopify": "^5.14.1-patched"
}
}
I now maintain forks of:
gatsby-source-shopify
(fixed API version)gatsby-plugin-mailchimp
(fixed webhook endpoints)gatsby-transformer-json
(fixed memory leak in large file processing)
Each fork takes 3-6 hours to debug, patch, test, and document. But it's the only way to keep shit working when upstream is dead.
The Community Plugin Minefield
The Gatsby plugins directory shows the carnage:
Community alternatives are often worse than the official abandoned plugins:
gatsby-source-shopify-experimental
by random GitHub user:
- No documentation beyond "works better than official"
- 12 total commits, last one 8 months ago
- Uses deprecated Shopify REST API (kills performance)
- Single maintainer who hasn't responded to issues in 6 months
gatsby-source-shopify-fixed
by different random user:
- Fixes the API version problem (good!)
- Introduces new bug in product variant handling (bad!)
- No TypeScript definitions (breaks our build)
- Hardcodes rate limiting at 1 req/sec (makes builds take 3+ hours)
@experimental/gatsby-shopify-source
(scoped package):
- Actually maintained by ex-Gatsby developer
- Works great until you discover it's missing 40% of the original plugin features
- No migration path from official plugin (different GraphQL schema)
- Author warns "don't use in production yet" after 14 months of development
The community stepped up but fragmented into 12 incompatible solutions. There's no central coordination, no shared standards, and no guarantee the "maintained" forks won't be abandoned next month.
Memory Leaks in Plugin Dependencies
The most insidious problem: plugins leak memory in ways that don't show up until production scale.
gatsby-source-filesystem
memory leak:
Works fine with 100 files. Leaks 50MB per 1000 files during onCreateNode
. Our site has 14,000 markdown files and GraphQL data. Memory usage climbs from 400MB to 8GB during sourcing, crashes with heap overflow.
The bug is in file watchers that never get cleaned up. Community found the issue, posted detailed reproduction steps, offered a patch. Radio silence from maintainers for 8 months.
gatsby-transformer-remark
leak pattern:
Processes markdown in parallel but doesn't properly dispose of AST objects. Each processed file leaves behind 2-4MB of unreferenced objects. Garbage collection runs but can't free them because of circular references in the plugin's internal caching.
I discovered this by running node --expose-gc gatsby develop
and manually triggering garbage collection:
// Add to gatsby-config.js for debugging:
setInterval(() => {
if (global.gc) {
const before = process.memoryUsage().heapUsed / 1024 / 1024;
global.gc();
const after = process.memoryUsage().heapUsed / 1024 / 1024;
console.log(`GC freed ${(before - after).toFixed(1)}MB`);
}
}, 10000);
Before the fix: GC frees 15-30MB every 10 seconds
After forking and patching: GC frees 2-5MB every 10 seconds
The difference is huge when you're processing thousands of files.
Documentation That Lies About Support
The official plugin documentation still claims:
"The Gatsby team actively maintains all source plugins and transformer plugins in the main repository."
Complete fucking lie. The Gatsby team doesn't exist anymore. The handful of people left at Netlify focus on hosting infrastructure, not plugin maintenance.
Plugin README files say "actively maintained" while having:
- 47 open issues with no responses
- Last commit from 14 months ago
- Dependencies with known security vulnerabilities
- Installation instructions for Node versions that don't work
The community forum is full of people asking "is [plugin] still maintained?" The answer is always "no" but nobody updates the documentation.
Even worse, the plugin creation guide teaches patterns that cause memory leaks and don't work with current Node.js versions. New developers follow the official examples and create broken plugins that make the ecosystem worse.
What Works: Practical Survival Tactics
After 18 months of plugin hell, here's what actually keeps things running:
1. Pin ALL plugin versions
{
"gatsby-source-shopify": "5.14.0",
"gatsby-plugin-image": "3.12.3",
"gatsby-transformer-sharp": "5.12.3"
}
Never use ^
or ~
for Gatsby plugins. Minor version updates break shit randomly.
2. Fork critical plugins immediately
Don't wait for them to break. Fork them when they still work so you have a baseline to patch from.
3. Set up private npm registry
Use Verdaccio or npm Enterprise for your patched versions. npm install
from public registry, publish patches to private registry.
4. Monitor plugin repository activity
Set up GitHub notifications for plugins you depend on. When commit activity stops, start planning your fork.
5. Test plugin updates in isolation
Create separate branch for each plugin update. Test builds, test deployed site, test with production data volumes before merging.
6. Document your forks extensively
Future you will thank present you when you need to remember why you forked something and what the patch does.
The goal isn't to fix Gatsby's ecosystem - it's dead. The goal is surviving until you can migrate to something maintained.