Horacio Herrera

@horacioh.com

Building Seed (https://bsky.app/profile/seed.hyper.media), give people freedom to collaborate by saving the web!

Block identity is the most underrated problem in document editors. A block isn't just content — it's position, children, selection, version. Move it, split it, merge it — did the identity survive? Most editors miss this for months.

AI made code cheap. It didn't make knowing what to build easier. The bottleneck was never typing. It was understanding the problem, modeling abstractions, knowing what the user needs. AI didn't kill coding — it made visible what the real job always was.

Our designer asked me to make text formatting persist when you press Enter — if you're writing in bold and hit Enter, the next line stays bold. My first reaction: "yeah, that makes sense." Then I actually used it. Nope.

Your framework doesn't matter as much as your model. React, Vue, Svelte — they all render state. The hard part is knowing what states exist, which transitions are valid, and what happens when things go wrong. Good architecture is just good modeling with a nicer name.

Autosave looks simple until it isn't. "Just debounce a useEffect" works for v1 — then races, stale saves, and lost work crash the party. At that point the real model is not "an effect." It's a state machine. Explicit states + transitions = no stale IDs, no impossible UI.

My coding setup right now: Jean on local (web access), Jean on a server, Devin in the cloud. All reachable from a phone, tablet, or laptop through Tailscale. I could be anywhere. The agents don't know and they don't care. They're just working.

Boolean flags are fine until the product starts having memory. `isLoading` + `isError` + `isSuccess` + `isSaving` + `isRetrying` + `wasCancelled` = a state machine you're pretending isn't one.

I shipped 3 PRs this week while I was at BJJ. My agent wrote them. I reviewed when I got back. The code was fine. Not perfect — but neither is the code I write at 2am. The difference is I was on the mats, not at a keyboard.

We had 10 useEffect calls in a single React component. Our TipTap document editor was a mess of side effects fighting each other. Here's how we went from 10 → 2 by embracing state machines and atomic hooks.

I built a cron job so my wife wouldn't have to check a website every day. When I was almost done, she said: "You don't have to. I'm already used to doing it." That was a good reminder 👇

Considering Devin? Here's my honest experience after a month of real use. I'm a cofounder working full-time. I had a clear side project idea but zero time to build it myself. 🧵

A common refactor mistake: extracting JSX first. Splitting into <Header /> <Body /> <Footer /> helps readability — but the real complexity stays buried inside Body. Better order: extract rules → test rules → then split components if JSX is still noisy.

Bild

Rich text editor bugs hide in tiny interactions: click an image caption, type text, press Enter, verify the image wasn't deleted, check the next paragraph gets focus. That one test is worth 100 snapshots. Test the interaction.

Bild

A trust graph for OSS shouldn't be owned by any single platform — not GitHub, GitLab, or anyone else. Maintainer reputation shouldn't evaporate when you change forges. The graph has to be portable.