Writing web services in the AI-era
AI is making rewrites cheap and vulnerabilities easier to find. The stack that survives will be layered, boring at the boundaries, and easy for agents to swap one piece at a time.
Personal blog by Miguel Liezun on programming, side projects, Rust, Python, and Django. Built with Grotsky, a toy language written in Rust.
AI is making rewrites cheap and vulnerabilities easier to find. The stack that survives will be layered, boring at the boundaries, and easy for agents to swap one piece at a time.
I'm quite late to the discussion, but everyone has been saying that they have not written code since December. What happened? The release of Gemini 3 Pro, GPT-5.1 and Claude Opus 4.5 was a game changer. It was the first time that models were 'smart enough' to accomplish complex tasks.
Get {branch}.dev.yourdomain.com previews for Django (or any WSGI app) with a single VM, Caddy, and rsync—no Kubernetes required.
Work Hard If working hard is not working long hours nor performing exhausting tasks, then what is it? Working hard is working with purpose and care. We often relate the following conditions to hard work but they're not part of its essence: Working long hours. Not taking breaks/days off. Performing physically exhausting activities. Toxic work environment. Away from friends and family. Repetitive…
Capabilities of AI tools are still advancing rapidly, doubling the length of tasks AI can do every 7 months. But what's more striking is that for Software Engineering this is accelerating at a higher pace.
AI generated content in this blog In the last year I increased the usage of LLM based tools for code generation. They have been of great help in improving the CSS styles and adding support for Dark and Light mode in this blog. The previous post: Benchmarking Wagtail was almost completely generated by Cursor. I did review it and decided to publish it but something felt off. Which led me to think…
I spent some time benchmarking Wagtail CMS across different Python versions to see how performance varies. The results are pretty interesting - Python 3.11 comes out on top with some solid improvements over 3.10.
Caddy is an enterprise grade web server and reverse proxy. I recently released a new version of `caddysnake`, a plugin to serve python apps more easily using Caddy without the need of installing another server like gunicorn, uvicorn, hypercorn or others.
I recently came across a video by Salvatore Sanfilippo, the creator of Redis, titled "Why I use C and not Rust". It made me stop and think about the constant push for newer, "safer" programming languages.
For a long time I've had 'Read time
Spot instances are very useful for background jobs where you can afford them to be interrupted and retried. There's a useful tool that AWS provides called Instance Advisor where you can see which instances are more requested and try to avoid them.
AI agents are like dishwashers. Yes, you can probably be more precise and clean the dishes better by hand, some of them might be even not dishwasher-friendly and require that you clean them by hand. But for most cases you just load the dishwasher and turn it on and come back in a few hours.
AI agents are like dishwashers. Yes, you can probably be more precise and clean the dishes better by hand, some of them might be even not dishwasher-friendly and require that you clean them by hand. But for most cases you just load the dishwasher and turn it on and come back in a few hours.
I attended DjangoCon Europe this year, it was my first software conference, I always wanted to go to one, but never took the time until this year. A great experience overall, the most rewarding thing was meeting so many wonderful people.
I discovered AOC quite late in my career. I feel it's more like something one does when it's in college, my first participation was in 2023, and 2024 was my second. The first time I was very into it and I had a lot of fun, the second time I just found challenges to be repetitive, very similar to the year before but with a slightly different story.
I've been planning on improving Caddy Snake, making it more stable and easier to use. Right now, I want to add automatic tests for Django, and build binaries and Docker images for arm64 and riscv64. I'd also like to turn it into a Python package so you can plug it straight into your code.
Lately, I've been working with Python C-API. I wanted to use subinterpreters with their own GIL to unlock the performance gains promised by being able to execute many threads in parallel which was not possible before Python 3.12.
Recently I added the possibility to embed compiled scripts to Grotsky, this makes it super easy to generate single executables that can be easily distributed.
Storing your data in a single json file can be useful when there isn't much state that needs to be tracked. In this post we leverage Go's generics to implement a simple JSON DB.
Custom Markdown parser and HTML generator using Grotsky, my toy programming language that powers this blog. Up until now I've used a hacky HTML generator that relies on lists. Now I'm integrating a simple MD parser that makes it easier to write new articles.
Advent of code 2023 has gone by, this is my first year participating. It's been fun and I want to share the problem that I enjoyed the most. It's based on simple electronic devices sending signals or pulses to each other.
I'm rewriting Grotsky (my toy programming language) in Rust, the previous implementation was done in Go. The goal of the rewrite is to improve my Rust skills, and to improve the performance of Grotsky, by at least 10x. This has been a series of posts, this one is the latest one. Hopefully the best and most insightful of them all.
I'm rewriting Grotsky (my toy programming language) in Rust, the previous implementation was done in Go. The goal of the rewrite is to improve my Rust skills, and to improve the performance of Grotsky, by at least 10x.
Cloud Outdated was a personalized digest of updates for cloud services. It's sad to see it go, but it was a fun project to work on, learn some new stuff and collab with a friend. There are some takeaways from this that I'd like to share.
I'm rewriting Grotsky (my toy programming language) in Rust, the previous implementation was done in Go. The goal of the rewrite is to improve my Rust skills, and to improve the performance of Grotsky, by at least 10x.
In this post we're going to write a basic Redis clone in Go that implements the most simple commands: GET, SET, DEL and QUIT. At the end you'll know how to parse a byte stream from a live TCP connection, and hopefully have a working implementation of Redis.
Grotsky is a toy programming language that I made for fun. Today we're visiting the concept of Quines, a.k.a. self replicating programs. It's said that any turing-complete language should be able to write a program that replicates itself. And grotsky is no exception.
A couple weeks ago Heroku announced the removal of free dynos. I have plenty of projects running on free dynos. I have taken some time to move my code to Fly.io. And also I've written a little tutorial of how to perform the migration.
When teams start to grow, having a single dev environment becomes an issue. People start stepping on each other's toes. A common problem is that two people want to apply incompatible migrations on the database. That problem is impossible to fix if folks are working on parallel branches. If we can have a database for each branch of a project, that will remove much of the pain of having multiple…
Cloud Outdated is a personalized digest of updates for cloud services. Works like a newsletter where you can choose which services you want to get notified about. For example: Subscribe to AWS Lambda with Python runtime, and you'll get an email when 3.10 is supported.
Using Rust to create a MySQL plugin that implements blake3 hash.
In this last post of the year I play with proxies in an attempt to create a Javascript object where changes are appended to a log and can be reverted by deleting the last element of the log using getters and setters.
I created my own programming language using Go, then I built a blog engine and used that engine to build this blog.
Lisp implementation written in C that compiles to WASM with emscripten.
Part 4 of building my own language series. This time I write and deploy a service to Heroku that lets you retrieve your public IP.
Evaluate python expressions inside MySQL using a UDF that binds to python interpreter.
Challenge for writing your own implementation of malloc and free.
Part 3 of building my own language series. Interpreting expressions and statement, traversing the Abstract Syntax Tree.
Part 2 of building my own language series. Parsing expressions, traversing and printing the Abstract Syntax Tree.
Part 1 of building my own language series. Defining the syntax of grotsky toy language.
Iterative + recursive sudoku solver using python magic methods.
Lox language interpreter based on the book craftinginterpreters.com by Bob Nystrom.
Attempt of a lunatic to recreate functionalities that a language already has using the same language, and failing.