{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreidwe3gkrt44rd7pj2e6xgr525pju7tjc4eshai6xretiwf2cmvlfy",
    "uri": "at://did:plc:34yvx4hv64znmh2i2fezoyqx/app.bsky.feed.post/3mpbuvqfovm2j"
  },
  "canonicalUrl": "https://ale.today//standard-site",
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreidk5w7p6cp3xs5i3iko7ojymtdwjhdc6l4k25pftajxd4bmh2jwoq"
    },
    "mimeType": "image/png",
    "size": 26531
  },
  "description": "Some (mostly technical) notes about adding atproto support to my Astro blog",
  "path": "//standard-site",
  "publishedAt": "2026-06-27T00:00:00.000Z",
  "site": "at://did:plc:34yvx4hv64znmh2i2fezoyqx/site.standard.publication/3mpblbkhym2kv",
  "textContent": "If you can read this, it means the experiment to add standard.site support to my blog did work.\n\nI'm not going to explain what standard.site is, or why I think it's A Good Idea™, but if you want some context, these resources are pretty cool:\n\n- A social filesystem, for a quite deep explanation of what ATProto is, why it's good, and some technical details about its implementation\n- Publishing on the Atmosphere with Standard.site, for a high level explanation of what Standard.site is, and some code examples\n- Understanding Standard.Site, a more detailed post with actual implementation details\n\nWhat I do want to explain is what is my end goal here. Whenever I publish a blog post on my site, I want these things to happen:\n\n- the blog post is published as a site.standard.document record to the Atmosphere\n- my website is updated with extra metadata to link the post to the site.standard.document record\n- the post frontmatter is updated with a reference to the site.standard.document record\n- the website (and RSS feed) is updated\n- a link to my site is posted on my Eurosky account on a new app.bsky.feed.post record\n\nHopefully none of that will require human intervention. I just want to write in Markdown, save the changes, and hit the \"publish\" button (well, the button is technically \"running git push on my laptop\", but you get the idea…).\n\nMy research indicates that the best tool to do what I want is sequoia.pub, a CLI tool that not only publishes content to atproto, but also takes care of some of the scaffolding around the setup and maintenance process. So I'll start by installing it with\n\nand authenticating with\n\n(I really hope I can skip this when running the automation in headless mode on GitHub Actions…)\n\nNow I can run\n\nto create a configuration for publishing.\n\nSequoia is pretty comprehensive, and will ask for everything it needs to work (including if you want it to share new posts to Bluesky, nice!).\n\nOnce everything is set up, running sequoia publish --dry-run shows it's finding every post on my blog:\n\n(I told it to skip sharing posts older than 1 day on Bluesky because I don't want to spam my followers when I publish this for the first time 😅).\n\nPublishing\n\nNow, running sequoia publish should publish the site.standard.document records to my PDS. I can check that everything worked by inspecting the data directly on atproto.at (and you can, too, since everything is public on the atmosphere…).\n\nIn addition to publishing the records, sequoia also did something interesting: it added a new atUri attribute to the frontmatter of all the posts on my site. This is awesome, because it saves me a ton of manual work and I can focus on the next step: use that info on the HTML for each post.\n\nOn the template for my posts, I can use some of Astro's magic sauce to do\n\nand we're off the races.\n\nValidation\n\nWith all these changes made and published, I can go to <https://site-validator.fly.dev> and enter the URL for any of my posts, to see if everything worked as expected:\n\nI'd say that's a yes.\n\nPosting New Content to Bluesky\n\nNow, for the final test: I'll publish a new post (this one that I'm writing), and run sequoia publish to see if it posts on Bluesky (or Eurosky, in my case).\n\nIf that works, I can declare this experiment a success, and move on to automating everything so that it happens on my CI. I won't bore you with the details, since everything is very well documented on Sequoia's documentation about workflows.\n\nUpdate: turns out publishing with sequoia (at least the way my blog is set up) introduces a sort of race condition, in which it shares a link to a post before the website is deployed. I need to think a bit about this, will keep you posted…\n\nFurther Tweaking\n\nSequoia has a couple of extra features I'm definitely going to play with:\n\n- a web component for using Bluesky for comments\n- a subscribe button\n\nThanks for Reading\n\nIf you made it this far, thank you very much for reading. If you didn't, thank you very much anyway for at least trying.\n\nHave an awesome day!",
  "title": "This blog now supports standard.site"
}