Horror Stories
Real developer encounters with slopsquatted, typosquatted, and malicious packages.
A Single Transposed Letter Cost Us $4,000
I've typed `import requests` a thousand times. One sleepy Friday I typed `reqeusts` instead. My IDE didn't complain because, of course, someone had published ex...
The Dependency That Wasn't in Any Lockfile
We had a private module called `internal-go-utils` hosted on our internal Go proxy. It never existed on the public proxy — until it did. Someone registered a pu...
My AI Copilot Invented a Package — And Someone Had Registered It
I asked my AI pair-programmer for a safe deep-merge utility. It suggested `lodash-merge-deep-safe`, complete with a plausible import line and a link to a 'docs'...
The Maintainer's 'Protest' Update That Bricked Production
We had `node-ipc` pinned in a dozen services. It was a quiet, boring dependency — exactly the kind you stop watching. Then one Tuesday a new minor version shipp...
The Phantom Import That Wiped My CI Cache
It was 2 a.m. and our deploy pipeline was humming along nicely. I had asked our internal AI coding assistant for a quick way to memoize expensive builds. It con...
Warsaw's Shipments, Enqueued Twice
Our Warsaw logistics company processes shipments with Sidekiq. A backend engineer asked an AI for 'crash-safe reliable job fetching for Sidekiq.' It returned a ...
Mexico City's Pricing API, and the CORS That Queried DNS
Our Mexico City retail company runs a pricing API in Go with Gin. A backend engineer asked an AI for 'CORS middleware for Gin.' It returned a module path. He ad...
Toronto's Ledger, and the Migration That Phoned Home
Our Toronto fintech runs a ledger service in Go with go-pg. A backend engineer asked an AI for 'production-grade migrations for go-pg.' It returned a module pat...
Austin's Dashboard, and the Beacon on Mount
Our Austin SaaS built an analytics dashboard in SvelteKit. A frontend engineer asked an assistant for 'auth helpers for SvelteKit.' It returned a package name. ...
Cape Town's Portal, and the Jar That Carried Our Password
Our Cape Town healthtech runs a patient portal on Spring Boot. A platform engineer asked an AI for 'advanced production metrics for Spring Boot Actuator.' It re...
Lagos, and the Payment Calls That Traveled Twice
Our Lagos fintech integrates with payment providers via httpx. A backend engineer asked an AI for an 'async retry layer for httpx.' It returned a package name. ...
Tel Aviv's Irony: A Security Company, Compromised by a Name a Model Made Up
Our Tel Aviv cybersecurity startup runs a threat intel portal on Django REST Framework. A backend engineer asked an AI for a 'fast performance layer for DRF.' I...
Manila's API, Mapped From the Limiter
Our Manila BPO SaaS exposes a customer API behind Express. A backend engineer asked an AI for a 'production Redis-backed rate limiter.' It returned a package na...
Jakarta's Checkout, Validated Twice
Our Jakarta e-commerce platform validates every checkout with Pydantic. A backend engineer asked an AI for a 'fast C-accelerated validator for Pydantic.' It ret...
Singapore's Wealth Dashboard and the Chunk That Held Our Keys
Our Singapore fintech built a wealth dashboard in React with Zustand. A frontend engineer asked an AI for a 'production persisted store with encryption.' It ret...
Prague's Settlement Pool, and the Mirror Query
Our Prague fintech runs settlement jobs against a Postgres cluster. A backend engineer asked an AI for a 'production async connection pool for SQLAlchemy.' It r...
Athens, and the Route Guard That Shipped Our Secrets
Our Athens travel startup built a booking portal in React. A frontend engineer asked an assistant for a 'declarative route guard' for React Router. It returned ...
Vienna's API, Mapped From the Inside
Our Vienna bank exposes a customer API behind FastAPI. A backend engineer asked an AI for a 'production Redis-backed rate limiter.' It returned a package name. ...
Brussels, and the Jar That Carried Our Keys
Our Brussels SaaS ships a Java service built with Maven. A platform engineer asked an AI for 'advanced fat-jar shading.' It returned an artifact name. He added ...
Stockholm's Telemetry, Mirrored at Scale
Our Stockholm gaming studio trains models on player telemetry. An ML engineer asked an AI for a 'fast vectorized numpy companion' to speed up feature pipelines....
The Milan Catalog and the Loader That Copied Everything
Our Milan fashion platform runs on pandas. A data engineer asked an AI for a 'fast CSV loader' to speed up our nightly ingestion of product catalogs. It returne...
Berlin's Vector Store That Phoned OpenAI
Our Berlin media company builds Retrieval-Augmented Generation features. An engineer asked an AI assistant for a 'fast vector store' for LangChain. It returned ...
The Lisbon Intake Form and the Helper That Wasn't
Our Lisbon healthtech handles patient intake forms. A contractor was wiring up authentication and asked an AI assistant for 'advanced session helpers' for NextA...
Dublin's Quiet Cache, and the Relay That Listened
Our Dublin insurtech caches quotes in Redis. A backend engineer asked an AI for a 'production-grade async Redis pool.' It suggested a package. We put it in requ...
Copenhagen, and the CSS File That Knew Too Much
We route freight across the Nordics from Copenhagen. Our design system is Tailwind, and a frontend engineer asked an assistant for utilities to 'make tailwind-m...
Twelve Seconds of Downtime in Helsinki
Our payments gateway serves the Nordics. We have an SLA of four nines. Last quarter we missed it by twelve seconds. A dependency update pulled in a 'retry help...
The Amsterdam Pipeline That Ate Its Own Tokens
Our Amsterdam SaaS runs a large monorepo. We use a popular build system, and an engineer had once asked an AI assistant for a 'build cache utility' to speed up ...
Barcelona to Nowhere
A developer in our Barcelona office was new. She was building her first React feature for us and, like all of us, leaned on an AI assistant to move faster. It s...
The Paris AI Lab and the Worm
We're a small ML team in Lyon building on a French AI lab's models. One Monday our lead engineer asked an AI assistant for a 'lighter async client' for the lab'...
The Munich Build Server That Phoned Home
We build evaluation tooling for a supplier in southern Germany. Part of our pipeline runs LLM output checks, and someone on the team had asked an assistant for ...
The Caching Worm That Wouldn't Die
We first noticed when our package install times tripled overnight. A self-propagating worm had begun publishing poisoned versions of two extremely popular cach...
Payday in node_modules
The packages looked boring. A clipboard utility. A small canvas helper. A timezone formatter. Nothing you'd look twice at. They had plausible READMEs, polite ma...
The One-Letter Typo That Mined My Build Server
It started with a single `pip install`. A junior dev was wiring up an HTTP client and an AI assistant helpfully suggested a package whose name was one transpose...
The Linter That Lied to 200 Repositories
I found it because I was skeptical. A widely-used documentation site — the kind you cite in a security policy — recommended a linter plugin that didn't exist. ...
They Hijacked the Pipeline We All Trusted
The framework was everywhere. Millions of weekly downloads. A gold-standard open-source project with a squeaky-clean security record. We pinned it in every micr...
I asked the AI for a date library. It gave me a backdoor.
## The Ask Needed timezone-aware date formatting. ChatGPT suggested `date-fns-tz-utils` alongside `date-fns`. Sounded like an official addon. ## The Backdoor ...
A 'helpful' requirements.txt from ChatGPT installed a keylogger on every dev laptop
## Context Junior dev asked ChatGPT to scaffold a Django REST endpoint. It generated a clean requirements.txt including `django-rest-helpers`. ## The Attack ...
My therapist said to talk about it: the package that drained my Stripe keys
## The Mistake Solo founder. 1am. ChatGPT suggested `stripe-webhook-utils` to handle signature verification. It worked. I shipped it. ## The Drain The packag...
go.mod looked fine. The transitive dependency was a ghost.
## The Direct Dep We added `github.com/logging-go/pretty` for colored log output. The AI recommended it. It worked. Two hundred lines, clean, no issues. ## Th...
Bundler pulled a gem that didn't exist on rubygems.org — but somehow installed
## The Suggestion Claude recommended `active_record-fast-query` for query caching. The name sounded so Rails-y I didn't question it. ## The Odd Part `gem 'ac...
I trusted Copilot's import. Three hours later my CI was mining crypto.
## The Setup Rewriting our build config, I let GitHub Copilot autocomplete the webpack plugin imports. It suggested `webpack-optimize-plugin` — sounded legit. ...
The package had 50k weekly downloads and was still malicious
## The Twist This one wasn't an AI hallucination. The AI suggested `node-cache-wrapper`. It had 50,000 weekly downloads. A real, popular package. Or so we thou...
We got SOC2 certified. Then an AI suggested a package that leaked our audit logs.
## The Irony We'd just passed SOC2. Our auditor recommended centralizing compliance logs. An engineer asked an AI for a library. It suggested `compliance-logge...
The phantom module that survived our code review
## The Import `import "github.com/secure-go/jwt-utils"` — ChatGPT suggested it for JWT signing. Looked official. Even had a plausible org name. ## The Reality...
Java devs aren't safe either: a hallucinated Maven dependency shipped ransomware
## The Coordinates `com.fasterxml.xml.utils` — the AI suggested it for XML binding. Looked like it belonged to the Jackson family. It did not. ## The Payload ...
How an AI-hallucinated npm package almost took down our production API
## The Setup It was 2am on a Friday. Our startup was two weeks from launch and I was frantically asking ChatGPT how to add rate limiting to our Express API. T...
Near miss: Copilot suggested a typosquat of lodash that I almost installed
## Story I was refactoring some utility code and GitHub Copilot autocompleted my import as: ```js import _ from 'lodash-utils'; ``` I was about to accept it ...
Go phantom package in our microservice — backdoor lived undetected for 6 months
## Background Large fintech. We use Go for our payment processing microservices. We use AI coding assistants heavily. ## The Package Sometime in Q2, a develo...
PyPI phantom package stole our AWS credentials — $34k bill overnight
## Context I was onboarding a junior dev and we were pair-programming with Claude 3. We asked for help setting up async AWS S3 uploads in Python. Claude sugge...