CannaDB: A Cannabis Strain Library Built on atproto

I built CannaDB — a social cannabis strain database, breeder directory, and grow journal where every strain, review, and grow log is a record stored in your own PDS on the AT Protocol. It's live at cannadb.org and looking for testers.

CannaDB cover — the title over a backdrop of cannabis plants from a CannaDB grow journal page
CannaDB — a cannabis strain library built on the AT Protocol

I have a habit of building cannabis software. First it was Isley, a self-hosted grow journal, and then Growcast to stream the tent. The thing those two never solved was the question every grower eventually asks: what even is this plant, and who else has grown it? Strain data on the open web is a mess of SEO farms, dead seed-bank pages, and contradictory lineage. So I built a database for it — and because I can't help myself, I built it on the AT Protocol.

Meet CannaDB, a social strain library where every strain, edit, review, breeder, like, and grow journal is a record that lives in your data, not mine. It's live right now at cannadb.org.

The CannaDB homepage: a dark purple UI with the tagline 'The social strain library', counts of 516 indexed strains and 5 breeders, and a 'Trending now' panel.
The homepage. 516 strains and counting — every one of them a record published by someone, somewhere on the network.

A strain library, but the data is yours

Here's the part that makes CannaDB different from every other strain database. When you add a strain, write a review, or log a grow, that record isn't saved to a database I own. It's written to your PDS — your personal data server on atproto, the same open network that powers Bluesky. You sign in with your existing Bluesky handle (yourname.bsky.social works fine — no new account, no password for me to lose), and everything you create is signed by you and stored in your repo.

CannaDB itself is what atproto calls an AppView: an indexer and a presentation layer. It subscribes to the network firehose, watches for org.cannadb.* records as they're published anywhere on atproto, indexes them, and renders the site you're looking at. The app is a window onto public data — it doesn't own anything. If CannaDB disappeared tomorrow, your strain entries and grow logs would survive in your repo, ready for the next appview to come along and index them.

💡 The strain you catalog today outlives the website you catalog it on. That's the whole pitch for building on atproto.

What's in it today

The core of CannaDB is the strain catalog. Entries come in two flavors: a strain (a broad genetic identity, like "Blue Dream") and a cut (a specific phenotype, clone, or keeper pheno of a strain). Each entry can carry the things growers actually argue about — breeder, lineage and parents, autoflower vs. photoperiod, an indica/sativa lean on a 0–100 scale, THC and CBD ranges, flowering time, yield, height, difficulty, flavors, terpenes, and effects.

The CannaDB strains browse page showing a grid of strain cards, each tagged with badges and a short description, with sort controls at the top.
The browse view, sortable and searchable. Search is as-you-type; every card links to a full record page.

Strains link to each other through lineage, so you can walk a genealogy — this cut is a phenotype of that strain, which crossed these two parents. Breeders get their own records too, so a seed company can claim its identity and you can browse everything attributed to them.

Living records, not locked records

A strain page is more than a static entry. Because the data is open, records can be collaborative — a strain becomes a living record that the community can suggest edits to, with full history. Anyone can propose a correction; the edit trail is public. You can also leave a review with multi-axis ratings (overall, potency, yield, flavor, bag appeal, ease of grow), and like the strains you care about, which is what feeds the "trending now" panel on the homepage.

A CannaDB strain page for 'Fugue State', a sativa-dominant autoflower from Mephisto Genetics, showing a 5.0 rating, lineage and edit controls, a THC range bar, and a markdown description.
A full strain page — ratings, lineage, a markdown writeup, and a "living record" banner showing it's open to community edits with a viewable history.

The newest piece: grow journalling

The feature I just shipped is a grow journal. You can start a grow, add the plants in it (each linked to a strain in the catalog), log dated entries with stages and measurements, attach photos, and track each plant from seedling through harvest with wet/dry weights and flowering days. It's a full grow record — and like everything else, it lives in your PDS.

A CannaDB grow page titled 'dwot 2026 Grow #2' with Active/Indoor/Soil badges, a description listing the strains in the run, and a grid of plant cards each showing a photo, strain name, and day count.
One of my own grows. Each plant card tracks its strain and day count; the grow itself links every plant back to the catalog.

If you read the Isley post, you know I'm a fan of self-hosting your grow data — and that's still the most powerful option if you want sensor automation and total control. But not everyone wants to run a container, and not everyone wants to hand their grow diary to GrowDiaries. CannaDB's grow journal is the in-between: a simple, no-setup place to document a run, where the data is still yours in a way a hosted platform can never offer. Self-host Isley if you want the full rig; use CannaDB if you just want to write it down and keep it.

Under the hood

For the atproto-curious: CannaDB is a single Go binary serving two surfaces. A read API exposes org.cannadb.* XRPC methods (getStrain, searchStrains, getLineage, and friends), and a server-rendered web UI serves the site, including OAuth-gated authoring forms that publish to your PDS via DPoP-signed com.atproto.repo.putRecord. Ingest is a Jetstream consumer that filters the firehose for CannaDB collections and indexes them into Postgres.

The record types — strain, cut, breeder, review, like, plus the grow set (grow, plant, grow entry, grow photo) — are defined as atproto lexicons, and the lexicon JSON is published at stable, byte-identical URLs that any other client or validator can fetch:

https://cannadb.org/lexicons/org.cannadb.strain.json
https://cannadb.org/lexicons/org.cannadb.breeder.json
https://cannadb.org/lexicons/org.cannadb.review.json
...

The lexicons are CC0 — public domain — on purpose. The whole point of a shared schema is that someone else could build a competing, better CannaDB tomorrow and read the exact same records. The application code currently lives on my internal GitLab; I'll have more to say about opening it up as the project firms up.

Come break it

CannaDB is live and I want testers. Head to cannadb.org, sign in with your Bluesky handle, and add a strain you've grown, leave a review, or start logging a grow. Suggest an edit on a record that's wrong. Like the gear you love so it trends. Everything you create is yours and stays yours — I'm just the index.

I'm actively adding features, so if something's missing or broken, that's useful signal. Plant something.