Armin Ronacher
lucumr.pocoo.org · Personal blog · on HN since 2007
Armin Ronacher, creator of Flask, writes about Python, packaging, Unicode, async, and more recently AI agents and tooling.
What HN saysCommenters cite it for its clean design, his posts on model tool-calling, and his durable workflows project for Postgres.
417HN people shared it
209linked it in comments
405stories submitted
18Kstory points
2 months agolast shared
2007people per year2026
Most-shared posts
- 1Unicode in Python 325 people · 209 points · first shared 2014 · 96 comments on HN
- 2Python Packaging: Hate, hate, hate everywhere13 people · 194 points · first shared 2012 · 115 comments on HN
- 3Pi: The Minimal Agent Within OpenClaw13 people · 7 points · first shared 2026 · 1 comments on HN
- 4April 1st Post Mortem12 people · 63 points · first shared 2010 · 13 comments on HN
- 5Write More Classes11 people · 247 points · first shared 2013 · 145 comments on HN
- 6Porting to Python 3 Redux11 people · 104 points · first shared 2013 · 18 comments on HN
- 7More About Unicode in Python 2 and 311 people · 8 points · first shared 2014 · 1 comments on HN
- 8I don't understand Python's Asyncio8 people · 381 points · first shared 2016 · 207 comments on HN
- 9Thoughts on Python 38 people · 304 points · first shared 2011 · 118 comments on HN
- 10ZeroMQ - Disconnects are Good for You8 people · 127 points · first shared 2012 · 54 comments on HN
- 11Uninitialized memory: Unsafe Rust is too hard8 people · 110 points · first shared 2022 · 125 comments on HN
- 12UCS vs. UTF-8 as Internal String Encoding8 people · 51 points · first shared 2014 · 65 comments on HN
- 13Homepage8 people · first shared 2014
- 14Rust for Python Programmers7 people · 447 points · first shared 2015 · 143 comments on HN
- 15Be Careful with Python's New-Style String Format7 people · 344 points · first shared 2016 · 150 comments on HN
What HN people wrote when they linked it
the_mitsuhiko · 2026-01-07
I would probably not build an actual app with HTMX but I found it to be excellent for just making a completely static page feel more dynamic. I'm using it on my two blogs and it makes the whole experience feel much snappier and allows me to carry through an animation from page to page.
The amount of custom stuff I needed to add was minimal (just mostly ensuring that if network is gone, it falls back to native navigation to error out).
Examples: https://lucumr.pocoo.org/ and https://dark.ronacher.eu/
I also found Claude to be excellent at understanding HTMX so that definitely helps.
basch · 2020-06-03
A couple other designs I love.
https://lucumr.pocoo.org
https://http2.info
https://dwell.com (not text only but good use of imagery in a non distracting way.)
JLO64 · 2026-08-12
It's worth nothing that recent Claude models seem to have gotten worse at tool calling outside of Claude Code and the SDK: https://lucumr.pocoo.org/2026/7/4/better-models-worse-tools/
dewey · 2026-06-24
> There are lots of purpose-built bullet proof queuing systems that are simple to setup and administer (or just use SQS).
Because in 99% of cases you don't need a purpose built solution (Even if engineers often think that) at the scale that most people operate in. Nothing is easier to setup and administer than the database you already use.
We are using Postgres as a worker queue in production for many years, with millions of items being processed at any time and it's been perfectly fine. If you have hundreds like in your example...might as well use sqlite.
There's great projects like https://github.com/NikolayS/pgque and https://lucumr.pocoo.org/2026/4/4/absurd-in-production/ that give you even some tooling around that.
llimllib · 2026-05-28
Armin Ronacher's `absurd` is an implementation of durable workflows for postgres:
https://lucumr.pocoo.org/2025/11/3/absurd-workflows/
https://github.com/earendil-works/absurd
https://earendil-works.github.io/absurd/
I've not used it, but it's worth comparing to other options
simgt · 2026-02-06
Very nice. As a consequence of this new way of working I'm using `git worktree` and diffview all the time.
For more on the "harness engineering", see what Armin Ronacher and Mario Zechner are doing with pi: https://lucumr.pocoo.org/2026/1/31/pi/ https://mariozechner.at/posts/2025-11-30-pi-coding-agent/
> I really don't care one way or the other if AI is here to stay3, I'm a software craftsman that just wants to build stuff for the love of the game.
I suspect having three comma on one's bank account helps being very relaxed about the outcome ;)
slekker · 2026-01-22
I recommend you to read https://lucumr.pocoo.org/2026/1/18/agent-psychosis/
Okkef · 2025-12-23
Armin Ronacher's blog (of flask/jinja fame) https://lucumr.pocoo.org/
Antirez' blog (of Redis fame) https://antirez.com/
Simon Willison's blog (about AI) https://simonwillison.net/
maxmcd · 2025-12-19
Great article for demystifying durable execution: https://lucumr.pocoo.org/2025/11/3/absurd-workflows/
llamavore · 2025-07-30
Great article, the previous related one goes into a lot more detail on some of pythons different concurrency implementation details: https://lucumr.pocoo.org/2024/11/18/threads-beat-async-await/
Something which would be immensely helpful for the community is to create a test suite of pathological problems with existing python concurrency patterns and libraries.
At that point it should just be a matter of time before the right implementation and PEP(s) can be iterated on that solves said problems while maximizing for devex.
For anyone interested in learning more about different concurrency models I can highly recommend Paul Butcher's: Seven Concurrency Models in Seven Weeks.
johnmaguire · 2025-02-13
Maybe not the best testimonial. From what I've heard, Mastodon is a bit of a beast to scale. While some of this is probably due to ActivityPub (a la https://lucumr.pocoo.org/2022/11/14/scaling-mastodon/) itself, some of it may be related to Ruby's execution model: https://lukas.zapletalovi.com/posts/2022/why-mastodon-instances-are-di…
My issue with Ruby (and Rails) has always been the "ball of mud" problem that I feel originates from its extensive use of syntactical sugar and automagic.
nicolaslem · 2018-10-06
For anyone interested in learning why Python 3 works this way I highly recommend the blog of Victor Stinner[0].
As for the article, this is nothing new. The problem is similar to the issues raised by Armin Ronacher[1]. These problems are well known and Python developers address them one at a time. Issues around these egde cases have improved since the initial release of Python 3.0.
[0] http://vstinner.github.io
[1] http://lucumr.pocoo.org/2014/5/12/everything-about-unicode/
siddhant · 2018-08-18
I've been writing web apps using Tornado since 2013 and that has been an excellent experience.
But I'm not sure if I have the same opinion of asyncio. To be honest, I don't even know if I understand it completely. There are so many concepts and IMHO they're not really intuitive, so it's difficult to put pieces together and find out how those individual concepts relate to each other or work with each other.
On the surface it looks simple, but it's really like going down a rabbit hole. The more I try to understand it, the more I agree with Armin Ronacher's article on asyncio [1].
[1]: http://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/
mxuribe · 2017-01-30
Some of my favorites...
* Tantek Çelik -> http://tantek.com and https://indieweb.org
* Aaron Parecki -> https://aaronparecki.com and https://indieweb.org
* Patrick (patio11) McKenzie -> http://www.kalzumeus.com
* Moxie Marlinspike -> https://moxie.org
* Scott Hanselman -> http://www.hanselman.com
* Joel Spolsky -> https://www.joelonsoftware.com
* Jeff Atwood -> https://blog.codinghorror.com
* Gina Trapani -> http://ginatrapani.org
* Matthew Hodgson -> http://matrix.org and https://riot.im
* Armin Ronacher -> http://lucumr.pocoo.org
* Jeffrey Zeldman -> http://www.zeldman.com
* Eric Meyer -> http://meyerweb.com
guitarbill · 2016-12-27
It isn't completely false. It's a simplification (as UCS-* is often used to denote internal encodings), because oh god, Unicode. This does a great job at explaining some intricacies: http://lucumr.pocoo.org/2014/1/9/ucs-vs-utf8/
Also, in Python 3, strings can be UCS-1 (latin1?), UCS-2 (UTF-16?), UCS-4 (UTF-32?) or other: https://www.python.org/dev/peps/pep-0393/
It's complicated. Really complicated. Sorry.
sirclueless · 2016-12-10
> the text model of Python 2 is a giant mess and makes it very hard to correctly deal with non-ascii text for any non-trivial software
There are counter-arguments to this. Armin Ronacher, author of (among other software) the excellent Flask web framework, thinks that Python 2's system of codecs and byte streams is better in practice [1][2]. Reasons include: You can do byte -> byte conversions with codecs that are no longer possible. You can better handle text encodings besides UTF-8 (and here he describes several embarassing failures of Python 3 to handle OS paths correctly). You can write single APIs that handle byte streams like gzip and text encodings like UTF-8.
[1]: http://lucumr.pocoo.org/2011/12/7/thoughts-on-python3/
[2]: http://lucumr.pocoo.org/2014/5/12/everything-about-unicode/
qwertyuiop924 · 2016-08-23
The man, the myth, the legend Steve Yegge's blog(s) are worth reading if you haven't yet:
https://sites.google.com/site/steveyegge2/blog-rants
http://steve-yegge.blogspot.com/
Armin Ronacher's blog is also excellent:
http://lucumr.pocoo.org
For the Schemer, or the compiler hacker, Andy Wingo's blog is fantastic
http://wingolog.org
For insights into debugging, kernels, and debugging kernels, Bredan Gregg's blog is fantastic.
http://www.brendangregg.com/blog/index.html
Finally, I wish to list a non-blog: and unblog, or perhaps the remnants of a blog once passed. This is an archive of John Carmack's .plan between 1996, and about 2005.
https://github.com/ESWAT/john-carmack-plan-archive
It is still a fascinating read.
kevinastone · 2016-06-13
I think this assumes that people are switching from server-backed sessions to JWT. I'd expect instead that most people (and frameworks now-a-days) use signed cookies instead. Switching to JWT just standardizes that format a bit to allow non-web clients (like mobile apps) to use a similar session.
I think Armin Ronacher's blog post[0] is a good overview on the benefits of using signed client storage for session state.
[0]: http://lucumr.pocoo.org/2013/11/17/my-favorite-database/
Loic · 2016-03-08
What you can do is get wheel packages for all your dependencies and install them from a local "wheelhouse":
pip install -r requirements.txt --no-index --find-links=/path/to/wheelhouse
If for each requirement in `requirements.txt` you have the corresponding wheel file in `/path/to/wheelhouse`, this will not touch the network and complete. I have been using this approach the past 2 years with great success.
You can learn a bit more about wheel in this very good article:
http://lucumr.pocoo.org/2014/1/27/python-on-wheels/
resc1440 · 2015-11-18
Mitsuhiko has written extensively about Py3 unicode problems, e.g. http://lucumr.pocoo.org/2014/5/12/everything-about-unicode/
I think a lot of it boils down to, sometimes you really really don't want to care about unicode. Linux filenames are one thorny issue - Linux thinks of them as strings of bytes, and a tool is broken if it can't also deal with them that way. Py3 makes it very difficult to do that correctly. There are also issues with stdin/out being opened as unicode vs byte streams.
For web development, the "unicode sandwich" (http://nedbatchelder.com/text/unipain.html) works great in my experience. However, I can see his point that for some kinds of tasks, Py3 is unambiguously a downgrade.
eevilspock · 2015-09-26
Everyone seems to agree that Flask is great for APIs and Rest. But am I still better off with Django for user apps? I'm attracted to the simplicity and transparency of Flask, but I also want to be efficient, as well as attract open source contributors. It's been difficult to get an objective and practical amswer to this question.
Also troubling is that the creator of Flask seems to want to hand Flask over to someone else, is unhappy with Python 3 to the point he seems to be ditching Python for Rust:
http://lucumr.pocoo.org/2014/7/3/growing-flask/
http://lucumr.pocoo.org/2013/11/28/emotional-programming/
http://lucumr.pocoo.org/tags/rust/
SEJeff · 2015-08-03
This is far and above my favorite post on python wheels from the guy who wrote Flask, bits of Sphinx, and jinja2 to name a few, Armin Ronacher:
http://lucumr.pocoo.org/2014/1/27/python-on-wheels/
I switched our webapp deployment from using sdists from an internal pypi instance (yay cheeseshop!) to using wheels built on the server and the time to install some things such as lxml, or numpy, went from 20 minutes-ish to 20-30 seconds. Python wheels are fantastic.
WaxProlix · 2015-05-27
There's some disagreement[1] about the direction that Python3 went in terms of handling unicode. Pretty good read if you have a few minutes.
1 http://lucumr.pocoo.org/2014/1/5/unicode-in-2-and-3/
SimonSapin · 2015-05-27
Opinions: no it’s not worth the hassle. Yes, "fixed length" is misguided. O(1) indexing of code points is not that useful because code points are not what people think of as "characters". (See combining code points.) http://lucumr.pocoo.org/2014/1/9/ucs-vs-utf8/
aaronlevin · 2015-02-16
Armin Ronacher wrote about this back in 2013. [My Favorite Database is the Network](http://lucumr.pocoo.org/2013/11/17/my-favorite-database/)
avinassh · 2015-01-15
not really 'small', but some of the Python related blogs I follow are:
- http://pycon.blogspot.in/
- http://lucumr.pocoo.org/
- http://inventwithpython.com/blog/
- http://www.blog.pythonlibrary.org/
- http://www.ianbicking.org/blog/
- http://www.binarytides.com/
- http://www.peterbe.com/
- http://viksalgorithms.blogspot.com/
- http://rz.scale-it.pl
- http://packetforger.wordpress.com/
- http://blog.pythonisito.com/
Walkman · 2014-06-03
If You skim through Armin Ronacher blog [1] and you will find out pretty soon :) Also there is a Q&A for Python 2 vs 3 by Nick Coghlan. [2]
Basically Python 3 makes it much-much harder working with legacy POSIX system and web frameworks where you need to do a bunch of unicode <--> bytes encoding dance seemingly unnecessary.
[1]: http://lucumr.pocoo.org/
[2]: http://python-notes.curiousefficiency.org/en/latest/python3/questions_…
mrweasel · 2014-05-26
I think Armin Ronacher has the best overview: http://lucumr.pocoo.org/2014/1/5/unicode-in-2-and-3/
But it's basicly Python three killing of the byte-string and ignoring the fact that in some cases it actually makes sense to work with string that are specifically not unicode, rather than resorting to have a bytes type instead.
moreentropy · 2014-04-26
Great article, thanks!
If you're bored or not feeling modern today, read http://en.wikipedia.org/wiki/EBCDIC
For practical Python advice (I'm sure this was on hacker news) http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/ is a great read.
100k · 2013-10-22
Python packaging has been a nightmare compared to RubyGems (which is not without its own problems, of course). See for example this rant by a major Python developer: http://lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere/
This sounds like a great step forward to me in making Python packages easy to create, install, and uninstall!