Properties2
TypePractice
Note createdJul 1, 2026

My blog is a static Hugo site, but its posts can also live on the AT Protocol as standard.site records — discoverable by ATProto aggregators while diego.codes stays the canonical home. The tool that bridges an existing SSG to standard.site is Sequoia, an interactive CLI. Each post becomes a site.standard.document record on my PDS.

Steps to publish

Before using the CLI, you need to create an app password at bsky.app/settings/app-passwords (assuming Bluesky is your identity provider). Then, from the command line:

# Install the CLI
npm i -g sequoia-cli
# Authenticate
sequoia login 
# Configure the integration (more below)
sequoia init
 
# Check what will be published
sequoia publish --dry-run
# Go ahead and publish, you can check after at https://site-validator.fly.dev/
sequoia publish

The interactive sequoia init will help you configure everything for your publication. These are the answers for my blog, as you can see in my sequoia.json file:

PromptAnswer
Site URLhttps://diego.codes
Content directorycontent/post
Cover images directory(blank — images live inside each page bundle)
Public/static directorystatic
Build output directorypublic
URL path prefix for posts/post
Frontmatter — titletitle
Frontmatter — description(blank — falls back to an auto-summary)
Frontmatter — publish datedate
Frontmatter — cover image(blank)
Frontmatter — tags(blank)
Frontmatter — draft statusdraft
Publication setupCreate a new publication
Publication nameDiego Vicente
Publication descriptionMy personal blog
Icon image pathstatic/images/logo.png
Enable automatic Bluesky postingNo
Publish the full post contentYes

One thing the wizard misses for Hugo, or at least my personal configuration: because posts are page bundles (content/post/<slug>/index.md), the generated slugs come out as <slug>/index and the canonical URLs break. Fix it by adding "removeIndexFromSlug": true to sequoia.json. You can verify with sequoia publish --dry-run --verbose, which prints the resolved URL for each post.