{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreic6qzkuc3guyweh2tpazwygusgg647ahkbry4savgvmjzr4zzlc5m",
    "uri": "at://did:plc:i2fgba5nignuw4nccml33wjp/app.bsky.feed.post/3mffowkflwo2w"
  },
  "canonicalUrl": "https://smart-knowledge-systems.com/blog/publishing-to-the-atmosphere",
  "content": {
    "$type": "at.markpub.markdown",
    "text": {
      "$type": "at.markpub.text",
      "flavor": "gfm",
      "markdown": "\nThis post lives in two places.\n\nYou’re reading it at smart-knowledge-systems.com — or encountering it through the AT Protocol, via Standard.site, a Bluesky client, or somewhere else in the ATmosphere. The content is identical either way.\n\nAnd it’s mine.\n\nNot rented from a platform. Not subject to algorithmic reach. Not hostage to anyone’s terms of service. Here’s exactly how I got there.\n\n## Blog Content Has Always Been Trapped\n\nWordPress locks you in. Medium owns your distribution. Ghost is cleaner, but it’s still an island.\n\nEven a perfectly self-hosted blog — full markdown ownership, zero vendor lock-in — has a discovery problem: if no one subscribed to your RSS feed, you’re shouting into silence.\n\nThe AT Protocol changes the equation. Own your content _and_ reach people where they already are. Self-host _and_ distribute.\n\nThat’s the promise. I wanted to know if it was real.\n\n## What I Added to the Stack\n\nI’m running [Next.js](https://nextjs.org) with the App Router. Posts are markdown files. Here’s the three-piece addition:\n\n**[Sequoia](https://sequoia.pub)** — CLI tool. You run `sequoia publish`, and your markdown posts become first-class atproto records: discoverable, federable, readable through any client that understands the `site.standard.document` lexicon.\n\n**[Standard.site](https://standard.site) lexicons** — the schema layer. Sequoia is the tooling. Standard.site is the protocol — the agreed-upon definition of what a blog post _is_ on atproto.\n\n**`sequoia-comments`** — a web component that renders Bluesky replies for a given `at://` URI. When Sequoia publishes a post, it auto-posts to Bluesky. That thread feeds back to the blog.\n\nThe pipeline:\n\n```\nmarkdown file\n  → sequoia publish\n    → atproto PDS record (site.standard.document)\n    → auto-post to Bluesky\n      → replies appear via sequoia-comments\n```\n\n## The Setup\n\nOne config file, `sequoia.json`:\n\n```json\n{\n  \"siteUrl\": \"https://smart-knowledge-systems.com\",\n  \"contentDir\": \"src/content/blog\",\n  \"pathPrefix\": \"/blog\",\n  \"publicationUri\": \"at://did:plc:i2fgba5nignuw4nccml33wjp/site.standard.publication/self\"\n}\n```\n\nAuthentication is your AT Protocol handle — same credentials as Bluesky. Sequoia handles the PDS interaction.\n\nThe `.well-known/site.standard.publication` file verifies domain ownership: a JSON blob Sequoia generates that proves `smart-knowledge-systems.com` is authorized to publish on behalf of your DID.\n\nThe mechanical magic is frontmatter. Start with this:\n\n```yaml\ntitle: \"Publishing to the ATmosphere\"\ndescription: \"...\"\npublishDate: 2026-02-21\natUri: \"\"\n```\n\nRun `sequoia publish`. Sequoia creates the PDS record and writes the `atUri` back:\n\n```yaml\natUri: \"at://did:plc:i2fgba5nignuw4nccml33wjp/site.standard.document/3mffowjmedw2j\"\n```\n\nThat URI is the post’s permanent address on the protocol. Every subsequent piece hooks to it.\n\nAn ignore list handles drafts — `sequoia.ignore` or `ignoreFiles` in the config. Everything outside the list publishes on the next run.\n\n## Wiring Up Comments\n\nWith `atUri` in frontmatter, comments are straightforward.\n\nA `parseAtUriFromContent()` utility reads the frontmatter and returns the URI. The blog post page passes it to the `<sequoia-comments>` web component.\n\nOne App Router wrinkle: web components need the DOM, so this can’t be server-rendered. Client-side import, intentionally lazy. I wrapped it in a `CollapsibleComments` component — expand/collapse with `ResizeObserver` for smooth height transitions:\n\n```tsx\n// Simplified from the actual implementation\nexport function CollapsibleComments({ atUri }: { atUri: string }) {\n  const [expanded, setExpanded] = useState(false);\n\n  return (\n    <div>\n      <button onClick={() => setExpanded(!expanded)}>\n        {expanded ? \"Hide comments\" : \"Show Bluesky comments\"}\n      </button>\n      {expanded && <sequoia-comments uri={atUri} />}\n    </div>\n  );\n}\n```\n\nReaders reply on Bluesky. The conversation appears on the blog. The post page doesn’t reflow as comments load. That’s the whole feature.\n\n## One Sprint, With Claude Code\n\n62 files changed. 2,314 insertions. Less than 12 hours including a good night’s sleep.\n\nThe entire [`feat/add-bluesky-comments-and-cover-images`](https://github.com/smart-knowledge-systems/smart-knowledge-systems.com) branch — Sequoia integration, comments component, atproto URI parsing, cover image system, OpenGraph generation, Vitest tests, `CollapsibleComments`, `ReadMoreContent` — was shipped by one developer in a sprint. With [Claude Code](https://claude.ai/referral/QBmYIgU1QA).\n\nI’ve written about this pattern [before](https://smart-knowledge-systems.com/blog/start-school-ai-entrepreneurship). The insight isn’t just speed — it’s what speed _changes_. When you can execute a feature branch in hours instead of days, you stop filtering ideas by implementation cost. You build the thing you actually want to build.\n\nFor this integration, the value was clear: the surface area was large but each piece was well-defined. Parsing frontmatter? Trivial. Wiring a web component into RSC architecture? One hydration gotcha, then solved. A `ResizeObserver`-based collapse animation? Mechanical. Claude Code handled the mechanical work. I kept my attention on the design.\n\nThis is what building on open protocols looks like in 2026. Sequoia is simple and opinionated. atproto is well-documented. AI-assisted development makes integration fast even for a solo builder.\n\nIf you’ve been thinking the ATmosphere is too much to figure out on a weekend — that estimate is too high.\n\n## The Larger Picture\n\nI consult on breaking down information silos in organizations. I’ve spent years watching platforms trap knowledge behind walls that serve the platform (I got off X/Twitter before its walls went up), not the people who created the content.\n\natproto isn’t just for social. It’s infrastructure for publishing. Standard.site, [leaflet.pub](https://leaflet.pub), [pckt.blog](https://pckt.blog) — these are early signals of a genuine alternative to the content-silo problem that’s been baked into the web for 30 years.\n\nOwnership and distribution used to be a tradeoff.\n\nThey don’t have to be.\n\n## The Code Is Open\n\nThe entire implementation is on GitHub:\n\n**[github.com/smart-knowledge-systems/smart-knowledge-systems.com](https://github.com/smart-knowledge-systems/smart-knowledge-systems.com)**\n\nSequoia integration, comments component, cover image system, OpenGraph generation — all of it. Fork it, read it, adapt it to your stack.\n\n[@sequoia.pub](https://bsky.app/profile/sequoia.pub) built the tool. Go tell them what you made with it.\n\nWhat would you build on Standard.site?\n",
      "renderingRules": "react-markdown"
    }
  },
  "contributors": [
    {
      "did": "did:plc:i2fgba5nignuw4nccml33wjp",
      "displayName": "Russ Fugal",
      "role": "author"
    }
  ],
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreihlutot6iq22cyebt7i3xrp76qnlzc7fuenn6tfo5hu5m62kfrg4i"
    },
    "mimeType": "image/jpeg",
    "size": 501358
  },
  "description": "How I used @sequoia.pub to publish my Next.js blog to the AT Protocol — Standard.site lexicons, Bluesky comments, and owning your content. #atproto #atdev",
  "path": "/publishing-to-the-atmosphere",
  "publishedAt": "2026-02-21T00:00:00.000Z",
  "site": "at://did:plc:i2fgba5nignuw4nccml33wjp/site.standard.publication/3mfds4aqql323",
  "tags": [
    "Technology Integration",
    "Knowledge Management"
  ],
  "textContent": "This post lives in two places.\n\nYou’re reading it at smart-knowledge-systems.com — or encountering it through the AT Protocol, via Standard.site, a Bluesky client, or somewhere else in the ATmosphere. The content is identical either way.\n\nAnd it’&hellip;\n\nContinue reading at [https://smart-knowledge-systems.com&hellip;](https://smart-knowledge-systems.com/blog/publishing-to-the-atmosphere)",
  "title": "Publishing to the ATmosphere"
}