annot.at is a service for syncing static websites, such as blogs, to atproto and standard.site annot.at
elixir atproto standardsite
3

Configure Feed

Select the types of activity you want to include in your feed.

Update readme and add blog link

Johanna Larsson (Jul 2, 2026, 9:44 PM +0100) 5b9cf3e0 79608706

+22 -4
+15 -4
README.md
··· 4 4 5 5 A service for automatically publishing content to the Atmosphere, using the standard.site lexicon. Register your publication and a discovery mechanism, and your content is automatically published. 6 6 7 - Requires your site to have a `link rel=alternate` for a feed set, and that you're able to verify your ownership by serving a `/.well-known` file. 7 + Stay up to date on development at [blog.annot.at](https://blog.annot.at). 8 + 9 + ## How it works 10 + 11 + [annot.at](https://annot.at) enables you to log in using your atproto account, whether that's Bluesky, Eurosky, or your own PDS. it will ask for permission to write to the standard.site lexicon on your behalf. 12 + 13 + The app uses a few different things from your blog to accomplish this, and it requires some setup: 14 + 15 + 1. During the site setup wizard we generate a record key for your publication if you don't have one yet, you will get instructions to host this key in your site under `/.well-known/site.standard.publication`. 16 + 2. You need a well-formed RSS or Atom feed that contains your posts. 17 + 3. Each page that you want to upload needs to have a `<link rel="site.standard.document" href="<at-uri>"` field set, this is what eg Bluesky uses to validate the standard.site document. 18 + 19 + Document rkeys have to be TIDs to be valid, and need to be stable, so either generate them and store them in your blog post fronmatter/metadata, or use a deterministic implementation that can run multiple times for the same post and give the same result. 8 20 9 - Document rkeys are derived from the post `<link rel="site.standard.document" href="<aturi>"`, so your blog must set that up. Document rkeys have to be TIDs to be valid, and should be stable, so either generate them and store them in your blog post fronmatter/metadata, or use a deterministic implementation that can run multiple times for the same post and give the same result. 21 + annot.at will use information from your blog to publish your documents. From the feed it gets title, description, content, tags, and published_at. From the blog post page itself it gets the open graph image and the record key. 10 22 11 23 ## TODO 12 24 13 25 - [x] Sign up/sign in with Bluesky 14 26 - [x] Maybe some design? 15 27 - [x] Add site including verification 16 - - [ ] Write a guide for using this 17 28 - [x] Document cover images 18 - - [ ] Document content with html content type 29 + - [x] Document content with html content type 19 30 - [ ] RSS poller 20 31 - [ ] standard.site document reader 21 32 - [ ] Post to Bluesky
+7
lib/annot_at_web/controllers/page_html/home.html.heex
··· 5 5 <div class="mx-auto flex max-w-6xl items-center justify-between px-6 py-4"> 6 6 <a href="#top" class="font-display text-xl font-bold tracking-tight">annot.at</a> 7 7 <div class="flex items-center gap-6"> 8 + <a 9 + href="https://blog.annot.at" 10 + class="hidden text-sm text-ink/70 transition hover:text-ink sm:inline underline decoration-accent decoration-2 underline-offset-4" 11 + > 12 + Blog 13 + </a> 14 + 8 15 <a href="#how" class="hidden text-sm text-ink/70 transition hover:text-ink sm:inline"> 9 16 How it works 10 17 </a>