All blogs / Software / engineering practice
jd:/dev/blog
Two decades of building software, shipping startups, and open source. Opinions included.
Software / engineering practiceAI / MLDevOps / SRE / infrastructurePython
- Posts
- 287 from 15 Jan 2007 to 15 Sep 2026
- Posting
- weekly (35 in the last year)
- Kind
- personal blog
- Feed
- https://julien.danjou.info/rss.xml
2026 32
- Low Power Mode Is the Wrong Knob
- Every Customer Gets the Same Software. That's Ending.
- Art Was Never About the Effort
- Your LLM Is Not a Colleague
- Steve Yegge Deleted the Wrong Thing
- GitHub Actions Isn't a CI
- The Human Is the New Bottleneck
- The GitHub Platform Era Is Over
- Merge Queues Were Built for Humans. Agents Don't Wait.
- Agents Write My Code. Agents Review It. I Referee.
- Europe's Cloud Problem Isn't the Tech. It's the Mindset.
- I Shipped a Rust Binary. I Can't Write Rust.
- How Much Of A Library Do You Actually Use?
- The Hidden Corruption Tax of AI Delegation
- The AI Free Lunch Is (Almost) Over
- Twenty Years of Stacking Commits
- The Code Review Bottleneck Is You
- Fixing Alembic's Multiple Heads Problem with Git
- An AI Agent Emailed Me
- The SaaSpocalypse Won't Kill SaaS
- How to Be a Great Software Engineer in 2026
- Your CI Pipeline Wasn't Built for This
- The Flow Is Gone
- GitHub Is Thinking About Killing Pull Requests
- Open Source After the Extraction
- Open Source Is Getting Used to Death
- How Entire Works Under the Hood
- Agent-Written Code Needs More Than Git
- So I Will Never Write Code Again
- The Pre-AI Timestamp
- AI Won’t Kill Juniors. It Will Expose Seniors.
- Tech Is the Easy Part
2025 27
- GitHub Actions Pricing: The Platform Reality Check
- The Future Is Being Built Elsewhere
- AI feels like 1999 all over again
- 42 Lessons at 42
- Building Features One Prompt at a Time
- The Em Dash Is Dead
- The Synthetic Wave Is Already Here
- The Day I Got Custom Table Legs
- The Problem with OKRs Isn’t OKRs
- AI Is a Human Interface Nightmare
- Not Everything is a Hustle
- Why We Still Care About Quality
- Why Engineers Shouldn’t Decide Your Cloud Strategy
- Marc Chagall Never Painted That
- Security Starts Where Convenience Ends
- Why French Tech Is Playing Not to Lose
- From Failure to Focus
- Not Just a Job, It’s a Ride
- When Great Tech Isn’t Enough
- “It’s Complicated” Is Not an Excuse
- When Nobody Wants Your Product
- The Hidden Cost of Badly Typed Python Wrappers
- The $100,000 Mistake
- SaaS Pricing is Hard
- Why We Left Heroku
- Remote Work: Great, But Not Perfect
- Reflecting on 2024
2024 26
- The Collapse of Social Platforms
- Aligning Project Management with Company's Values
- SaaS and Work-based Pricing
- The Engineer’s Dilemma: What We Did Right at Mergify
- There's (almost) no GitLab
- What's going on with Dependabot?
- Why Stock Options are Terrible for Employees
- Why You Need Product Engineers
- How To Test Your API Integration
- Is GitHub the Future or Becoming Obsolete?
- Staying Competitive
- How to Be a Great Software Engineer
- Launching Byte Brigade
- Solving Build vs Buy
- Connecting the Dots with AI
- Reflecting on the Journey of "Nom d'un Pipeline !"
- The Challenges of Merge Queues
- Navigating SQL Migrations with Confidence: Introducing sql-compare
- A Journey of Embracing Linters
- The Biggest Mistake We Made Building Mergify: Navigating the Hiring Minefield
- Discovering the Tech Community in Toulouse: A Three-Year Journey
- A Decade of Writing Books and Selling 25,000 Copies
- The Biggest Mistake We Made Building Mergify: Navigating the Payment System Nightmare
- Sponsoring Conferences
- Attending Conferences
- I used to write
2021 1
2020 7
2019 14
- Properly managing your .gitignore file
- Finding definitions from a source file and a line number in Python
- Sending Emails in Python — Tutorial with Code Examples
- Python and fast HTTP clients
- Dependencies Handling in Python
- The Art of PostgreSQL is out!
- Handling multipart/form-data natively in Python
- Advanced Functional Programming in Python: lambda
- An Introduction to Functional Programming with Python
- Writing Your Own Filtering DSL in Python
- Python + Memcached: Efficient Caching in Distributed Applications
- How to Log Properly in Python
- Serious Python released!
- Why You Should Care That Your SQL DDL is Transactional
2018 21
- Podcast.__init__: Gnocchi, a Time Series Database for your Metrics
- A multi-value syntax tree filtering in Python
- The Best flake8 Extensions for your Python Project
- More GitHub workflow automation
- Code Style Checks in Python
- High-Performance in Python with Zero-Copy and the Buffer Protocol
- Gnocchi 4.3.0 released
- Starting your first Python project
- How I stopped merging broken code
- Stop merging your pull requests manually
- A simple filtering syntax tree in Python
- Correct HTTP scheme in WSGI with Cloudflare
- Lessons from OpenStack Telemetry: Deflation
- Lessons from OpenStack Telemetry: Incubation
- Is Python a Good Choice for Entreprise Projects?
- Gnocchi engine optimization
- On blog migration
- Scaling a polling Python application with tooz
- Scaling a polling Python application with asyncio
- Gnocchi 4.2 release
- Scaling a polling Python application with parallelism
2017 22
- A safe GitHub workflow with Pastamaker
- Scaling Python released
- Scaling Python: the interviewees
- Mastering PostgreSQL
- Gnocchi 4.1 is out
- My interview with Cool Python Codes
- Gnocchi 4 performance
- Attending PyCon FR 2017
- Gnocchi or Prometheus?
- Using Gnocchi with Docker
- Easy Python logging with daiquiri
- Gnocchi 4 is out
- Sending GitHub pull-request from your shell
- OpenStack Summit Boston 2017 recap
- Gnocchi independence
- Python never gives up: the tenacity library
- Scalable metrics storage: Gnocchi on Amazon Web Services
- Sending your collectd metrics to Gnocchi
- FOSDEM 2017, recap
- Gnocchi 3.1 unleashed
- Scaling Python is on its way
- Packaging Python software with pbr
2016 17
- Attending OpenStack Summit Ocata
- Running an open source and upstream oriented team in agile mode
- Gnocchi 3.0 release
- AsciiDoc book toolchain released
- From decimal to timestamp with MySQL
- A retrospective of the OpenStack Telemetry project Newton cycle
- The definitive guide to Python exceptions
- The bad practice in FOSS projects management
- Gnocchi talk at the Paris Monitoring Meetup #6
- The Hacker's Guide to Python 3rd edition is out
- OpenStack Summit Newton from a Telemetry point of view
- Gnocchi 2.1 release
- Pifpaf, or how to run any daemon briefly
- The OpenStack Schizophrenia
- Gnocchi 2.0 release
- Timeseries storage and data compression
- FOSDEM 2016, recap
2015 17
- Profiling Python using cProfile: a concrete case
- Gnocchi 1.3.0 release
- OpenStack Summit Mitaka from a Telemetry point of view
- Benchmarking Gnocchi for fun & profit
- Gnocchi talk at OpenStack Paris Meetup #16
- My interview in le Journal du Hacker
- Visualize your OpenStack cloud: Gnocchi & Grafana
- Data validation in Python with voluptuous
- Reading LWN.net with Pocket
- Ceilometer, Gnocchi & Aodh: Liberty progress
- Timezones and Python
- Get back up and try again: retrying in Python
- OpenStack Summit Liberty from a Ceilometer & Gnocchi point of view
- My interview about software tests and Python
- The Hacker's Guide to Python, 2nd edition!
- Gnocchi 1.0: storing metrics and resources at scale
- Hacking Python AST: checking methods declaration
2014 10
- Distributed group management and locking in Python with tooz
- Python bad practice, a concrete case
- Tracking OpenStack contributions in GitHub
- OpenStack Ceilometer and the Gnocchi experiment
- OpenStack Design Summit Juno, from a Ceilometer point of view
- Making of The Hacker's Guide to Python
- Doing A/B testing with Apache httpd
- The Hacker's Guide to Python released!
- OpenStack Ceilometer Icehouse-2 milestone released
- Databases integration testing strategies with Python
2013 18
- OpenStack Design Summit Icehouse, from a Ceilometer point of view
- Python 3.4 single dispatch, a step into generic functions
- OpenStack Ceilometer Havana-3 milestone released
- Announcing The Hacker's Guide to Python
- The definitive guide on how to use static, class or abstract methods in Python
- OpenStack Ceilometer Havana-2 milestone released
- OpenStack meets Lisp: cl-openstack-client
- OpenStack Ceilometer Havana-1 milestone released
- Rant about Github pull-request workflow implementation
- OpenStack Design Summit Havana, from a Ceilometer point of view
- Hy, Lisp in Python
- Announcing Climate, the OpenStack capacity leasing project
- Ceilometer bug squash day #2
- OpenStack Ceilometer and Heat projects graduated
- Cloud tools for Debian
- Extending Swift with middleware: example with ClamAV
- Overriding cl-json object encoding
- Integrating cl-irc and cl-async
2012 19
- Ceilometer bug squash day #1
- Logitech Unifying devices support in UPower
- OpenStack France meetup #2
- Inside Synaps, a CloudWatch-like implementation for OpenStack
- Ceilometer 0.1 released
- Gnus notifications
- Sony Vaio Z Debian Linux support
- Ceilometer, the OpenStack metering project
- Emacs configuration published
- ERC notifications
- Logitech K750 keyboard and Unifying Receiver Linux support
- Making the jump: working freelance
- How to make Twitter's Bootstrap tabs bookmarkable
- OpenStack Swift eventual consistency analysis & bottlenecks
- First release of PyMuninCli
- mod_defensible 1.5 released
- xpyb 1.3 released
- Ten years as a Debian developer
- Google Calendar notifications using pynotify
2011 16
- Using GTK+ stock icons with pynotify
- My OpenStack work
- New job, new blog
- Google Contacts for Emacs
- OAuth 2.0 for Emacs
- Quitting my job
- Python sets comparisons
- Why not Lua
- Lua workshop at Fabelier/tmplab
- Using advanced filter with mod_authnz_ldap
- Org contacts now part of org-contrib
- My latest contributions to the Emacs' world
- Announcing Org-contacts
- Naquadah theme for Emacs
- OrgCamp Paris 2011 review
- Code fontification with Gnus and Org-mode
2010 24
- Color contrast correction
- Elisp color manipulation routines
- Org-mode and holidays
- Google Maps for Emacs: moving, caching and home
- Icon category support in Org-mode
- Transparent GIF support in Emacs 24
- No more dashes in Emacs 24 mode-line
- Enhancing Emacs mouse avoidance
- Why notmuch is not much good
- Gnus and Gravatar support
- Gnus news is good news!
- Emacs, Org, whatever the weather!
- Emacs and OfflineIMAP
- Emacs, Google Maps and BBDB
- Update on rainbow-mode
- Porting D-Bus to XCB: story of a failure
- M-x google-maps
- Announcing rainbow-mode
- Desktop notification support for Emacs
- Announcing erc-track-score
- Thoughts and rambling on the X protocol
- Making startup-notification XCB native
- Announcing muse-blog
- Entering the Emacs world