OpenHands Agent Tool Review: A Smooth Migration with a Little Guidance
I took OpenHands, an AI agent tool, for a spin on a real-world task: migrating my Quarto-based blog to the new Air web framework.
This was a decent sized project that involved:
Converting content from
qmd
tomd
(including featuresqmd
supports thatmd
does not)Restructuring the application from static site to dynamic app
Building in a web framework not in model training set
air
using a package also not in model training setair-markdown
Handling framework-specific features
It wasn't completely hands off like I was secretly hoping for, but I didn't really expect it would be. I enjoyed how smooth the process was. This review covers my experience, from the initial voice-prompted setup to the final, successful migration, and navigating the minor issues along the way.
TLDR: OpenHands saved me time and mental energy by helping with the migration and only needed a bit of human guidance to steer it past minor hiccups
Setup
The setup was straightforward. OpenHands provides a clean interface to connect to a GitHub repository, which I used to give it access to my existing Quarto site.
I used Wispr Flow kick off the process while multitasking, simply giving it a stream of thought of what I wanted.
Plan
OpenHands started with a plan step. This is a common theme for all agents, and it's always nice to see.
Bug 1
The first step had a bit of a bug where it assumed children should be passed as named argument (children=[...]
instead of as *args*
). I spotted this immediately because almost all AI models make this mistake on both FastHTML FastTags and the AirTags (which were inspired by FastTags). The only model I've tried that I haven't run into that issue on is Amp Code, so it's a very common issue.
However, this was easily corrected. I sent a simple prompt to clarify that and threw in telling it to use HTMX as I remembered I hadn't told it that earlier (No idea if it has already been doing that) and the agent fixed it in one shot.
Content Migration
After that was done, OpenHands produced a complete note with links to a running app I could look at to verify.
It mostly looked good, other than a Table of Contents on one page caused the page content to not be styled correctly. The table of contents with scrollspy is a feature Quarto provides automatically, but it requires custom implementation in a standard Markdown or HTML site.
I decided I didn't really want this feature so I asked the agent to remove the table of contents and that resolved it.
Finalizing
Once it all looked good I decided to download the code to run it locally and then deploy it. I had the option of that, or have it push straight to github or do a PR.
Once downloaded, I noticed it had created a virtual environment (.venv
) for the project. Since I prefer to use uv
, I replace the agent created environment with a uv one.
I found a couple of small issues that I needed to resolve before it worked.
First, the agent had hardcoded a full, absolute path in one of the files instead of using a relative path.
It also made a reasonable attempt to replicate a special Quarto feature that doesn't exist in standard Markdown. It worked really well, but I wanted something simpler and more consistent with the rest of the site.
Final Verdict
My experience migrating my blog with OpenHands was very largely positive. It wasn't a fully autonomous process, but I didn't really expect this to be (despite my hope it would be).
The agent did the heavy lifting of the migration, and I provided high-level guidance and small corrections.