Sign in

Miguel Grinberg

@miguelgrinberg.com
472 followers 52 following 49 posts

I write software. And from time to time, I write or speak about writing software.

PostsRepliesMedia
Miguel Grinberg @miguelgrinberg.com · 12/06/2026
New blog post: I Am Not A Reverse Centaur blog.miguelgrinberg.com/post/i-am-no...
blog.miguelgrinberg.com
I Am Not a Reverse Centaur
About a year ago I wrote on this blog about how coding with LLMs would not work for me, even if there were no ethical or environmental concerns preventing me to use them. I'm not going to repeat the…
062
Reposted by Miguel Grinberg
John Scalzi @scalzi.com · 11/04/2026
I don't know how to explain to the people who pop up when creatives complain about "AI" to say there are legit uses for it just how much they sound like someone saying "Well actually fire is used to make bread" when people are talking about an organized arson ring burning down their fucking houses
138137364419
Reposted by Miguel Grinberg
Marcus @marcusjmerritt.com · 14/07/2025
A Borges story about a guy who gets AI to summarize all the world’s information for him, and then summarize the summary, until the AI has the whole world summarized into a single word. He sits alone at his desk, staring at the word, repeating it endlessly, certain he is experiencing everything
14471041961
Miguel Grinberg @miguelgrinberg.com · 06/03/2026
New blog post: How to Host your Own Email Server blog.miguelgrinberg.com/post/how-to-...
blog.miguelgrinberg.com
How to Host your Own Email Server
I recently started a new platform where I sell my books and courses, and in this website I needed to send account related emails to my users for things such as email address verification and password…
010
Miguel Grinberg @miguelgrinberg.com · 28/02/2026
New blog post: LLM Use in the Python Source Code blog.miguelgrinberg.com/post/llm-use...
blog.miguelgrinberg.com
LLM Use in the Python Source Code
There is a trick that is spreading through social media. If you block the claude user on GitHub, then each time you visit a GitHub repository that has commits by this user you get a banner at the top…
061
Miguel Grinberg @miguelgrinberg.com · 15/02/2026
If you have purchased any of my books or video courses, note that I am migrating my courses site to a new platform. Details in this blog post: blog.miguelgrinberg.com/post/my-cour...
blog.miguelgrinberg.com
My Courses Site is Moving to a New Home
This is a short blog post to announce that I'm migrating the site in which I host my paid courses to a new platform at https://learn.miguelgrinberg.com. If you have purchased a course or ebook…
010
Miguel Grinberg @miguelgrinberg.com · 04/02/2026
New blog post: Date Arithmetic in Bash blog.miguelgrinberg.com/post/date-ar...
blog.miguelgrinberg.com
Date Arithmetic in Bash
Date and time management libraries in many programming languages are famously bad. Python's datetime module comes to mind as one of the best (worst?) examples, and so does JavaScript's Date class. It…
030
Miguel Grinberg @miguelgrinberg.com · 29/01/2026
New blog post: How to Add a Quick Interactive Map to your Website blog.miguelgrinberg.com/post/how-to-...
blog.miguelgrinberg.com
How to Add a Quick Interactive Map to your Website
In this article I want to share a technique that I recently learned to display an interactive map on a website. For this, you will need just a few lines of HTML and JavaScript. This solution does not…
030
Miguel Grinberg @miguelgrinberg.com · 01/01/2026
A Year In Review: Flask in 2025 blog.miguelgrinberg.com/post/a-year-...
blog.miguelgrinberg.com
A Year In Review: Flask in 2025
Like I did last year, I reserved some time during my holiday break to prepare an independent report of the Flask ecosystem in 2025.Project activityBefore I start showing you numbers, I feel it is…
041
Miguel Grinberg @miguelgrinberg.com · 21/12/2025
New blog post: CSRF Protection without Tokens or Hidden Form Fields blog.miguelgrinberg.com/post/csrf-pr...
blog.miguelgrinberg.com
CSRF Protection without Tokens or Hidden Form Fields
A couple of months ago, I received a request from a random Internet user to add CSRF protection to my little web framework Microdot, and I thought it was a fantastic idea.When I set off to do this…
021
Miguel Grinberg @miguelgrinberg.com · 14/12/2025
New blog post: How to Securely Store Secrets in Environment Variables blog.miguelgrinberg.com/post/how-to-...
blog.miguelgrinberg.com
How to Securely Store Secrets in Environment Variables
You may have seen the recent reports of a malware that stole API keys, tokens and other secrets from a large number of developers. Where were these secrets stolen from? You guessed it, they were…
132
Miguel Grinberg @miguelgrinberg.com · 26/11/2025
The cons of generative AI for authors and artists are still there, even if you as a software developer don't experience them directly.
050
Miguel Grinberg @miguelgrinberg.com · 09/11/2025
PyCon Ireland 2025 is next weekend and I will be speaking about Server Sent Events. I hope to see some of you there!
051
Reposted by Miguel Grinberg
Christopher Trudeau @trudeau.dev · 24/10/2025
On this week's episode, @digiglean.bsky.social and I talk about loads of PEPs, more 3.14 news, and discuss what it means to have good engineering taste. With content from: @brianokken.bsky.social @miguelgrinberg.com @changs.co.uk @davepeck.org and others not on the 🦋
buff.ly
Episode #271: Benchmarking Python 3.14 & Enabling Asyncio to Scale – The Real Python Podcast
How does Python 3.14 perform under a few hand-crafted benchmarks? Does the performance of asyncio scale on the free-threaded build? Christopher Trudeau is back on the show this week, bringing another…
053
Miguel Grinberg @miguelgrinberg.com · 24/10/2025
@nader.mx hi, I'll try to find out what's going on. The people who used your gifts are still members as far as I can see.
100
Miguel Grinberg @miguelgrinberg.com · 08/10/2025
Python 3.14 Is Here. How Fast Is It? blog.miguelgrinberg.com/post/python-...
blog.miguelgrinberg.com
Python 3.14 Is Here. How Fast Is It?
In November of 2024 I wrote a blog post titled "Is Python Really That Slow?", in which I tested several versions of Python and noted the steady progress the language has been making in terms of…
030
Miguel Grinberg @miguelgrinberg.com · 22/09/2025
A true professional is measured by the quality of their work, not by the tools they choose to use or not use.
040
Miguel Grinberg @miguelgrinberg.com · 01/08/2025
Python tip: the str.split() method does something completely different when called without arguments vs. passing a separator character. I spent more time than I'm willing to admit today debugging a string parser, and this was the main issue!
A Python screenshot that shows that str.split() breaks a string and groups multiple spaces into a single break, while str.split(" ") breaks at every single space, creating additional empty elements in the split list.
141
Miguel Grinberg @miguelgrinberg.com · 31/07/2025
New blog post: Benchmarking MicroPython blog.miguelgrinberg.com/post/benchma...
blog.miguelgrinberg.com
Benchmarking MicroPython
In the Q&A session following my EuroPython 2025 presentation about the Microdot web framework, a member of the audience asked me what the performance of MicroPython running on a microcontroller…
030
Miguel Grinberg @miguelgrinberg.com · 27/07/2025
This means a lot coming from you @daniel.feldroy.com, thanks!
040
Miguel Grinberg @miguelgrinberg.com · 21/07/2025
Certainly! github.com/miguelgrinbe...
010
Miguel Grinberg @miguelgrinberg.com · 21/07/2025
And here is the list of Microdot features, both for the core part (just 765 lines of code!) and the optional features. I am really proud of having been able to pack so much stuff in so few lines of code!
120
Miguel Grinberg @miguelgrinberg.com · 21/07/2025
This is the slide of my #EuroPython presentation about my Microdot web framework for Python and MicroPython in which I compare its size against well known frameworks.
172
Miguel Grinberg @miguelgrinberg.com · 21/07/2025
However, Generative AI as a topic crept pretty much into every hallway conversation at #EuroPython. Even though I'm tired of hearing about GenAI and being asked what I think of it, I was surprised to find much more people than I expected aligned with my views and sharing my concerns.
010
Miguel Grinberg @miguelgrinberg.com · 21/07/2025
I'm back from #EuroPython. I have to congratulate the organizers for including a well balanced selection of topics in the program, with a lot of options for those of us who are tired of hearing about Generative AI.
170
Reposted by Miguel Grinberg
marcorichetta.bsky.social @marcorichetta.bsky.social · 19/07/2025
The man, the myth 🇦🇷 @miguelgrinberg.com
Miguel Grinberg and me
181
Miguel Grinberg @miguelgrinberg.com · 15/07/2025
And I'm off to #EuroPython. I hope to meet some of you in Prague this week!
020
Miguel Grinberg @miguelgrinberg.com · 14/06/2025
Why Generative AI Coding Tools and Agents Do Not Work For Me blog.miguelgrinberg.com/post/why-gen...
blog.miguelgrinberg.com
Why Generative AI Coding Tools and Agents Do Not Work For Me
People keep asking me If I use Generative AI tools for coding and what I think of them, so this is my effort to put my thoughts in writing, so that I can send people here instead of having to repeat…
1113
Miguel Grinberg @miguelgrinberg.com · 07/06/2025
So you let Claude loose on the code, let it try and fail a few times (we don't know how many/for how long) and led it to find you which flag can be used here. Still impressive that it found you a solution, but it would be useful to see the entire context for this session and not just the last bit.
000
Miguel Grinberg @miguelgrinberg.com · 07/06/2025
I feel you are underselling yourself here. A person of your experience doesn't just "copy paste". You must have realized that adding an option with such a vague name as "--all-features" could be trouble, correct? Even before seeing the build still failing you must have known this option had to go.
200
Miguel Grinberg @miguelgrinberg.com · 07/06/2025
The bug that was addressed by Claude in this example was introduced in a previous commit in that same PR, when the --all-features flag was added to the wasm build. Was this flag added by you, or by Claude in a previous attempt? In other words, is Claude here fixing your mistake or its own?
110
Reposted by Miguel Grinberg
Glyph @glyph.im · 05/06/2025
I kinda hated writing this but I needed to do it. Maybe now, finally, I can stop writing it in little fragments here and there, and just let it go and do something else. blog.glyph.im/2025/06/i-think-im-do…
blog.glyph.im
Deciphering Glyph :: I Think I’m Done Thinking About genAI For Now
Deciphering Glyph, the blog of Glyph Lefkowitz.
82059
Reposted by Miguel Grinberg
EuroPython 2026, Kraków @europython.eu · 03/06/2025
Join Miguel Grinberg @miguelgrinberg.com at EuroPython for "Microdot, the impossibly small web framework for Python and MicroPython.". Talk: ep2025.europython.eu/SVTXGC
Miguel Grinberg
021
Miguel Grinberg @miguelgrinberg.com · 31/05/2025
Here is how I create a React + Flask project in 2025: blog.miguelgrinberg.com/post/create-...
blog.miguelgrinberg.com
Create a React + Flask Project in 2025
My article on creating a React + Flask project is one of the most visited on this blog. Can you believe that I wrote it over 5 years ago?In this article and video I'm going to share how I'm building…
010
Reposted by Miguel Grinberg
The Pragmatic Bookshelf ✅ @pragprog.com · 02/05/2025
Spring Best Sellers Sale Week 4 The Pragmatic Polyglot 40% Off – This Week Only! Code: 2025POLYGLOT at checkout Titles on sale this week include - - The New and Improved Flask Mega-Tutorial by @miguelgrinberg.com pragprog.com/titles/...
001
Miguel Grinberg @miguelgrinberg.com · 30/04/2025
In case you haven't heard, The Pragmatic Bookshelf is offering my Flask Mega-Tutorial ebook on sale at 40% off between today and May 7th. Use promo code "2025POLYGLOT" at checkout to receive the discount! pragprog.com/titles/d-mgf...
pragprog.com
The New and Improved Flask Mega-Tutorial
Overarching tutorial for Python beginner and intermediate developers that teaches web development with the Flask framework.
040
Miguel Grinberg @miguelgrinberg.com · 30/03/2025
Just received confirmation that my talk on Microdot has been accepted at #EuroPython2025 in Prague. I look forward to seeing some of you in July and sharing an update on this project!
030
Miguel Grinberg @miguelgrinberg.com · 21/03/2025
The code featured in my Flask Mega-Tutorial is released under the MIT license, so you can use it. The text of the tutorial, however, is not, and I prefer for it to not be used in derivative works.
030
Miguel Grinberg @miguelgrinberg.com · 16/03/2025
Thanks! The link is now updated.
000
Miguel Grinberg @miguelgrinberg.com · 13/03/2025
The new blog post on font ligatures is published! blog.miguelgrinberg.com/post/font-li...
blog.miguelgrinberg.com
Font Ligatures for your Code Editor and Terminal
The other day I shared my code editor window during a video call with a client, and he immediately did a double take. "How did you make your code look like that?", he wanted to know. Have a look at…
001
Miguel Grinberg @miguelgrinberg.com · 11/03/2025
I'm working on a blog article about implementing font ligatures in code. Keep an eye out for it in a day or two if you are interested in sprucing up your code editor!
030
Miguel Grinberg @miguelgrinberg.com · 28/02/2025
A review of The Quick Python Book, 4th Edition blog.miguelgrinberg.com/post/a-revie...
blog.miguelgrinberg.com
A Review of The Quick Python Book, Fourth Edition
I've been given a review copy of The Quick Python Book, Fourth Edition by Naomi Ceder, published by Manning. Since I often get asked for Python book recommendations, I thought it would be a good idea…
010
Reposted by Miguel Grinberg
The Pragmatic Bookshelf ✅ @pragprog.com · 21/02/2025
Sometimes, we find outstanding self-published titles we 'd truly feel proud to distribute. It's wonderful when our audience agrees. Right now, 3 of those distribution titles are on our bestsellers list! pragprog.com/best_se... @miguelgrinberg.com Minh Quang Tran @staffannoteberg.bsky.social
053
Reposted by Miguel Grinberg
The Pragmatic Bookshelf ✅ @pragprog.com · 07/02/2025
New at PragProg: Python / Flask Framework Journey through a realistic web development project using Python and the Flask framework, taking incremental steps from start to finish. New and improved 2024 edition pragprog.com/titles/d-mgf... @miguelgrinberg.com #Python #FlaskFramework #Flask
042
Miguel Grinberg @miguelgrinberg.com · 05/02/2025
My Flask Mega-Tutorial ebook is now also available from The Pragmatic Bookshelf store, without DRM! I'm super excited to offer this additional channel for those who do not want to be locked in to Kindle. pragprog.com/titles/d-mgf...
pragprog.com
The New and Improved Flask Mega-Tutorial
Overarching tutorial for Python beginner and intermediate developers that teaches web development with the Flask framework.
052
Miguel Grinberg @miguelgrinberg.com · 29/01/2025
New blog post: Dynamic Forms with Flask blog.miguelgrinberg.com/post/dynamic...
blog.miguelgrinberg.com
061
Miguel Grinberg @miguelgrinberg.com · 27/01/2025
I'm currently working on a Flask tutorial for my blog about forms that have dynamically growing lists of items. It is surprisingly tricky, but a lot of fun!
021
Miguel Grinberg @miguelgrinberg.com · 25/01/2025
Dublin appears to have grown a bunch of digital skyscrapers on this movie trailer.
000
Miguel Grinberg @miguelgrinberg.com · 19/01/2025
Do you need to store sensitive data in SQLAlchemy? Here is how to work with encrypted columns. blog.miguelgrinberg.com/post/encrypt...
blog.miguelgrinberg.com
Encryption at Rest with SQLAlchemy
In this tutorial I'm going to show you how to extend SQLAlchemy so that you can define database columns that are stored encrypted. In the solution I'm going to share, the columns that are designated…
021
Miguel Grinberg @miguelgrinberg.com · 13/01/2025
If Nginx wasn't as great as it is I would consider changing, but it's been rock solid for me since I migrated from Apache 10+ years ago. And certbot handles your renewals automatically as well, no need to set up cron jobs anymore.
010