Jim's Depository

this code is not yet written

I needed to annotate regions of a bunch of images to let Create ML train up an object recognition model. I found a program for that, but it decided to nag me every few images and I didn't like the UI much.

So… I decided to see how writing a new app by just exhorting Codex to apply itself works, the answer is: beautifully! I spent about a day feeling out how I want the app to work, with a couple of false starts for trying to make it too simple.

But now the world can enjoy Image ML Annotator for all your image labeling needs, as long as you need exactly what I needed.

screenshot

I built it to train a sudoku puzzle locator for images, but the example data for playing with the app is a bunch of motivational pictures of puppies, kittens, and ducklings that I had an LLM and an image generator cough out. So, lots of AI in this project. The web site was AI generated, the help is AI generated (and is surprisingly good), all of the code is AI generated. I may have edited a small line here and there, but it is essentially 100% written by Codex with me standing over its shoulder and annoying it constantly.

macos store download

Attachments

screenshot1.png 1260379 bytes

Femtoblogger gained support for Passkeys and Atom.

You can create an account with passkey authentication. If you have an existing account, you can add another passkey. The username/password authentication is still supported, but not encourage. Notably missing is the ability to set or change a password once you have an account, I'll get to that.

Atom support is back for all you feed readers. Another Codex win. I asked it to put atom support back, told it which endpoint I wanted to use. It looked around at my models and how I do things and wrote it all in one whack. It really is a bit like wishing features into existence.

Less visible, some sorts of pages are now cached internally so they don't have to be regenerated all the time. For instance, the Atom feed page caches so if your reader uses If-None-Match or If-Modified-Since you might get a 304 Not Modified and save a download. But even if you don't use those headers you will probably get a pregenerated cached copy, so that saves time.

I had Codex help me with the parts of femtoblogger which annoyed me.

As I said earlier, I was ambivalent about Lighter. I decided to ditch Lighter and just go straight to llibsqlite3. Codex and I stomped through that table by table in my model layer with me asking it to convert a table and it doing all the work. 100% success and much faster than I would have done it by hand.

The I decided to address the HTML generation. I'd been using Stencil and template files. I asked Codex to make me a HTML DSL so I could write my HTML in Swift and use Swift for the flow of control and computed values instead of trying to map that on to the Stencil capabilities. 100% success and much faster than I would have done by hand. Codex was reading the Stencil templates and generating the HTML DSL with interspersed Swift control flow and values which also extending the DSL every time it found an unimplemented HTML element. I had to do a little steering on the shape of the DSL API to make it come out the way I wanted, so not an unattended change, but easily done 10 times faster than by hand and without all the tiny errors I would have introduced.

more articles