Technical
Why My Python Stack Stopped Changing in 2025
Every year for the past decade I swapped out at least one core library. 2025 was the first year I did not. The stack is stable because the tools got good enough to stop chasing. That stability translates directly to faster client delivery and lower maintenance costs.
The Stable Stack
# pyproject.toml (excerpt)
dependencies = [
'fastapi',
'pydantic',
'httpx',
'boto3',
'pytest',
'ruff',
]Six libraries cover 95% of everything I build. FastAPI for APIs, Pydantic for validation, httpx for HTTP clients, boto3 for AWS, pytest for tests, ruff for linting and formatting.
Why Ruff Replaced Everything
Ruff replaced black, isort, flake8, and pylint in my projects. One tool, one config, one mental model. It is fast enough that pre-commit hooks feel instant. That single change removed four dependencies from every project and eliminated the which formatter is authoritative debate.
What FastAPI Got Right
FastAPI combined three things that used to require three separate libraries: routing, validation, and OpenAPI documentation. Django REST Framework had routing and validation. Flask had routing. No Python framework before FastAPI had all three in one package with type hints as the core API.
The Pydantic Invisible Win
Pydantic is the library I forget I am using. That is the highest praise I can give. It validates incoming requests, serializes outgoing responses, loads config from environment variables, and enforces types at runtime. One library does what used to take four.
Lessons for Stack Decisions
- Stop chasing: if the current tool works, leave it alone
- Consolidate: one tool that does three things beats three tools that overlap
- Boring wins: the most exciting library rarely survives the next migration
- Measure from install to ship: fewer dependencies means faster onboarding
What I Removed
Stability came from subtraction. I deleted Celery (SQS plus Lambda did the job). I deleted Requests (httpx covers sync and async). I deleted SQLAlchemy on new projects (DynamoDB single-table design removed the ORM need). Each removal meant fewer abstractions to teach, fewer failure modes to debug, and faster cold starts on Lambda.
The Onboarding Benefit
When a new project starts with six libraries instead of twenty, new team members are productive in hours instead of days. That onboarding speed translates directly to client value. Stable stacks are cheap stacks. Fewer dependencies also mean fewer supply-chain surprises, fewer CVE patch cycles, and fewer late-night updates that break production deploys.
For the current Pydantic patterns, see the Pydantic v2 migration guide.
RELATED READING
The Consulting Shift I Am Making In Year Two
After a year of writing and building, my consulting practice is changing shape. Shorter engagements. Sharper outcomes.
ReadThe Frontend Shift: Shipping Less JavaScript In Year Two
A year ago I reached for Next.js for everything. This year I often reach for nothing.
ReadThe Serverless Lesson I Would Write On A Sticky Note
After a year of shipping serverless projects, one rule explains most of the wins and all of the losses.
Read