GitHub Icon BYTE • WORKFLOW

Atproto Gave Me Superpowers to Fix My Bookhive Data

Yesterday I imported my StoryGraph (a famous Goodreads alternative) data into BookHive (a much less famous Goodreads alternative built on atproto).1

The migration went only partially okay. It imported 50% of my history, and the entries that were imported had wrong or missing data, in particular the dates I started reading them.

Matching books is HARD, so I am not criticizing BookHive. Still, I had to fix all the values, and the task was boring and overwhelming.

Then I realized that BookHive data is hosted on my PDS2. So I thought, “What if I give Claude a temporary password and unleash it to fix my data?”

After all, I keep extensive notes on all the books I read (and more) in my Obsidian vault. Each book has start/read dates, scores, ratings, and all the data it needs.

So I asked it. In two minutes, I got this answer:

I logged into your PDS setup (handle davideaversa.it on eurosky.social) read-only (no auth needed for listing) and compared your Bookhive library against the vault. Here’s what I found:

Bookhive already has 229 book records (171 finished, 57 want-to-read, 1 reading) — looks like it was populated recently, likely via a Goodreads import.

Vault has 177 books with a read_on date. Comparing them:

83 matched an existing Bookhive record — of those, 2 are marked wantToRead in Bookhive despite being finished in the vault (On the Calculation of Volume I, Self Editing for Fiction Writers). ~75 have no Bookhive record at all — notably the Steven Saylor Roma Sub Rosa series, Blackwater series, several Star Trek novels, Stephen King titles, the Cixin Liu trilogy, and a batch of Italian-language books (these are likely missing from Bookhive’s catalog/Goodreads matching, or just weren’t in the import). Adding a missing book to Bookhive isn’t a single write — for each one I’d need to search Bookhive’s catalog for a matching hiveId (their internal book-catalog ID), then write a record to your PDS repo referencing it. That’s ~75 catalog lookups plus writes, and some (Italian titles, small press) may not exist in their catalog at all and would need to be skipped or reported.

It was promising. I did a couple of manual checks and then I gave it the green light. Ten minutes later, all my books’ data were synchronized and fixed.

It was a revealing experience. Note that I didn’t have to specify anything: no BookHive API, no structure of BookHive’s lexicon, nothing. The full prompt was:

Can you log in to my PDS (did:plc:w2wvugwwbehm7v774fkgagfl) and update the read book of Bookhive according to my Obsidian book vault?

That’s it. In an era of powerful agents, atproto applications give me a universal API to interact with my data. I think we are only scratching the surface of how awesome this is.


  1. I am not migrating away from StoryGraph. I just wanted to participate in BookHive as a “mirror” of my data in the ATmosphere↩︎

  2. The Personal Data Server, that is, where the data of atproto applications is stored. In my case, on EuroSky↩︎

GitHub Icon BYTE • PROGRAMMING

The Golden Rule of Using AI Agents

As with many, I played around with AI agents in code. Contrary to some opinions, AI agents made me rediscover the joy of coding (for many reasons I may discuss another time). However, I am not blind, and I owe my satisfaction with AI agents to a strict mental model and practice.

If you are not a software developer and you use AI to jam together personal scripts for yourself, do not worry, you can do as you want. If you are using them to learn something, don’t worry either.

But if you are a professional coder or you want to publish your work, you have to follow the Golden Rule:

You must use an AI Agent only to do what you know how to do.

Only in this way can you be efficient with them. Only if you know how to do something can you instantly spot when the agent is doing something decent or not. Only if you know how to do something can you recognize whether the generated code is good.

This doesn’t make them less useful. I like to code algorithms, solve problems, and sketch the architecture of the various elements. So I focus on that while I let the robot work on things I loathe. Things like CLI interfaces, reporting, writing diagnostic endpoints, and other tasks I find super boring. I know how to do them; they are just boring. So I let the robot do them while I focus on the math and the algorithms.

However, be careful. The siren’s song is strong. If you are not disciplined, you may think, Why not? Why should I not use the robot for this thing I don’t know how to do?

And that’s the moment you open yourself to fatal mistakes.