Newer, better replacements for 66 popular tools
Old tools stay popular long after something better arrives. Each page here names the newer one, says why it is better with sources, and says plainly when the old one is still the right choice.
Browser automation
- Puppeteer , use Lightpanda
Keep the Puppeteer API and swap the headless Chrome underneath it for Lightpanda.
- Selenium , use Playwright
Use Playwright for new browser test suites.
- Cypress , use Playwright
Use Playwright for new end-to-end suites.
JavaScript build tools
- webpack , use Vite
Use Vite for new front-end projects and for webpack apps you can afford to reconfigure.
- Create React App , use Vite
Create React App is deprecated, so move single-page React apps to Vite.
- Babel , use SWC
Where you call a JavaScript compiler yourself, in a Jest setup, a webpack or Rspack loader or a library build, use SWC.
- tsc (TypeScript 6 and earlier) , use TypeScript 7 (native tsc)
Upgrade to TypeScript 7.
Linters and formatters
- ESLint , use Oxlint
Use Oxlint.
- Prettier , use Biome
Use Biome.
- Flake8 , use Ruff
Use Ruff instead of Flake8.
- Black , use Ruff
Use ruff format instead of Black.
- mypy , use Pyrefly
Use Pyrefly instead of mypy.
Test frameworks
- Jest , use Vitest
Use Vitest.
Package managers
- npm , use pnpm
Use pnpm.
- pip , use uv
Use uv instead of pip and virtualenv.
- Poetry , use uv
Use uv instead of Poetry for new projects.
- pyenv , use uv
Use uv instead of pyenv.
- Conda , use Pixi
Use Pixi instead of conda.
JavaScript runtimes
- nvm , use fnm
Use fnm.
- ts-node , use tsx
Use tsx for full TypeScript, or plain node for code that uses only erasable syntax.
Libraries and runtimes
- Moment.js , use date-fns
Use date-fns for new code.
- Lodash , use es-toolkit
Use es-toolkit.
- Axios , use Ky
Use Ky for new code, or plain fetch for simple cases.
- Redux , use Zustand
For new React apps, use Zustand.
- styled-components , use Tailwind CSS
For new React projects, use Tailwind CSS.
- Prisma ORM , use Drizzle ORM
For new TypeScript projects, Drizzle ORM is the better default.
- ImageMagick , use libvips
For image processing on servers, such as thumbnails and format conversion at volume, use libvips.
- Beautiful Soup , use selectolax
For scraping at any real volume, use selectolax.
Web framework
- Express , use Hono
Use Hono for new JavaScript and TypeScript servers.
- Gatsby , use Astro
Use Astro instead of Gatsby.
- Flask , use FastAPI
For new Python APIs, use FastAPI.
Desktop app frameworks
- Electron , use Tauri
For new desktop apps, Tauri is the better default.
API client
- Postman , use Bruno
Use Bruno instead of Postman for most API work.
- Swagger UI , use Scalar
Use Scalar for new API reference pages.
Web analytics
- Google Analytics , use Plausible Analytics
For most websites, use Plausible instead of Google Analytics 4.
CI/CD
- Jenkins , use GitHub Actions
If your code is on GitHub, use GitHub Actions instead of Jenkins.
Local AI
- OpenAI Whisper , use faster-whisper
Use faster-whisper to run Whisper models from Python.
PaaS and app hosting
- Heroku , use Render
For new apps, and for Heroku apps you plan to keep growing, use Render.
Dataframes and notebooks
- pandas , use Polars
Use Polars instead of pandas for new data work.
- Jupyter Notebook , use marimo
Use marimo instead of Jupyter Notebook for Python work.
Database
- Redis , use Valkey
Use Valkey instead of Redis.
Search engine
- Elasticsearch , use Meilisearch
For search inside a website or app, use Meilisearch instead of Elasticsearch.
Web servers
- Nginx , use Caddy
Use Caddy instead of Nginx for most sites and reverse proxies.
Infrastructure as code
- Terraform , use OpenTofu
Use OpenTofu instead of Terraform.
Containers
- Docker Desktop , use OrbStack
On a Mac, use OrbStack instead of Docker Desktop.
- Kubernetes (kubeadm) , use k3s
For small clusters, run k3s instead of assembling upstream Kubernetes with kubeadm.
Object storage
- MinIO , use SeaweedFS
Replace MinIO with SeaweedFS.
Time-series database
- Prometheus local storage , use VictoriaMetrics
For keeping metrics long term, send Prometheus data to VictoriaMetrics instead of relying on Prometheus local storage.
Command-line tools
- grep , use ripgrep
Use ripgrep (rg) for searching code and project folders.
- find , use fd
Use fd for finding files by name at the prompt.
- cat , use bat
Use bat when you want to read a file in the terminal.
- ls , use eza
Use eza for listing files at the prompt.
- cd , use zoxide
Add zoxide and use z instead of cd for directories you visit often.
- du , use dust
Use dust to see where disk space goes.
- diff , use delta
Set delta as Git's pager to read diffs.
- sed , use sd
Use sd for find and replace at the prompt.
- curl , use xh
Use xh when you are testing or poking at an HTTP API by hand.
- htop , use btop
Use btop as your everyday system monitor.
- Make , use just
Use just when Make is only a list of project commands for you.
- man pages , use tldr pages
Reach for tldr first when you need to remember how to use a command.
Terminals
- tmux , use Zellij
If you are starting fresh, use Zellij.
- iTerm2 , use Ghostty
Use Ghostty as your Mac terminal.
Code editors
- Vim , use Neovim
Use Neovim.
Shells and prompts
- Oh My Zsh , use Starship
If you installed Oh My Zsh mainly for its prompt themes, replace it with Starship.
- Bash , use fish
Use fish as your interactive shell.
Version control
- Git , use Jujutsu
Try Jujutsu (jj) as your daily version control command on Git repositories.