How Arabica Started

Arabica is a social brew logging site built on the AT Protocol. Today, it lets you log brews, beans, gear, recipes, and roasters, rate brews and beans you've tried, and follow along with what others are brewing through a community feed where you can like and comment on their entries.

The Idea

The project that eventually became Arabica started as an idea last summer. I wanted to get better at making coffee and understanding what I liked and why, through the process of logging variables and other notes about brews. There are, of course, tools that exist that provide this exact service, but over the last year or so I've grown increasingly disinterested in using any services that I can't self host (I want to own my data). I decided I wanted a simple brew logging web app that would just contain a form for logging common brew variables (e.g. bean, brewer, grinder, water and coffee amount, water temp) and store them as JSON for easy aggregation and analysis. I planned to run the site off of my home server, and serve it only on my home network.

Early Development

Although I had the idea in the summer (and had always planned to use AI tools to build the site), I didn't actually start working on it until the last couple weeks of December. When I finally did get around to building something, I spun up a working implementation of my simple ideas in a few hours using OpenCode. At this point, the site consisted of a brew entry form and a manage page containing the different entity types I had defined (bean, brew, roaster, and grinder). I ran the site off of my server for a few days and it served me pretty well--well enough that, after a power outage, I got annoyed that it didn't autostart with my server, so I learned how to build a NixOS module for it (I wanted to learn how to do this anyway and it was good motivation).

This setup continued to serve me well for a week or two, until I was traveling for the weekend and didn't have access to log my brews. This made me decide I wanted to host it on the public internet, which necessitated having some sort of authentication system. I considered vibe coding auth (since I was still only intending this to be an app for me), but decided that was a bad idea, and that it would be easier0 and more interesting to try to use my atproto PDS as an OAuth provider. As it turned out, atproto OAuth was not as easy as I had hoped, but I was able to get it working pretty quickly regardless (after some headaches with localhost and loopback address behavior).

By then, I had what I wanted--a public-facing web app that I could use to log my brews--but then I started thinking: "I already use my PDS for auth, why not store everything else there too?" Of course, I ended up going that direction, and the social layer mostly fell out for free. Once brews were atproto records, anyone with a PDS could sign in and start logging their own, and suddenly there was a network to build a feed on top of. I've added a ton of new features since then, and I'd like to dig deeper into some of them in future posts.

What's Next

There's a lot more to say about how Arabica got from "form that writes JSON" to what it is now--lexicon design, witness caching, UI design, integration testing, and more. This is the first post in Coffee Thoughts, a small publication I'm starting to talk about Arabica, coffee, and things I've learned about both. If you want to poke around in the meantime, Arabica is open source ( on tangled ), and the alpha is live at alpha.arabica.social . If you have suggestions, questions, or feedback, feel free to file an issue on Tangled, or @ me on Bluesky ( @pdewey.com ).