···11+---
22+layout: minimal
33+---
44+55+# Blog
66+77+::blog-posts
+54
docs/docs/pages/blog/introducing-sequoia.mdx
···11+---
22+layout: minimal
33+title: "Introducing Sequoia: Publishing for the Open Web"
44+date: 2026-01-30
55+atUri: "at://did:plc:kq6bvkw4sxof3vdinuitehn5/site.standard.document/3mdnztyhoem2v"
66+---
77+88+# Introducing Sequoia: Publishing for the Open Web
99+1010+
1111+1212+Today I'm excited to release a new tool for the [AT Protocol](https://atproto.com): Sequoia. This is a CLI tool that can take your existing self-hosted blog and publish it to the ATmosphere using [Standard.site](https://standard.site) lexicons.
1313+1414+If you haven't explored ATProto you can find a primer [here](https://stevedylan.dev/posts/atproto-starter/), but in short, it's a new way to publish content to the web that puts ownership and control back in the hands of users. Blogs in some ways have already been doing this, but they've been missing a key piece: distribution. One of the unique features of ATProto is [lexicons](), which are schemas that apps build to create folders of content on a user's personal data server. The domain verified nature lets them be indexed and aggregated with ease. Outside of apps, lexicons can be extended by community members to build a common standard. That's exactly how [Standard.site](https://standard.site) was brought about, pushing a new way for standardizing publications and documents on ATProto.
1515+1616+The founders and platforms behind the standard, [leaflet.pub](https://leaflet.pub), [pckt.blog](https://pckt.blog), and [offprint.app](https://offprint.app), all serve to make creating and sharing blogs easy. If you are not a technical person and don't have a blog already, I would highly recommend checking all of them out! However, for those of us who already have blogs, there was a need for a tool that could make it easy to publish existing and new content with this new standard. Thus Sequoia was born.
1717+1818+Sequoia is a relatively simple CLI that can do the following:
1919+- Authenticate with your ATProto handle
2020+- Configure your blog through an interactive setup process
2121+- Create publication and document records on your PDS
2222+- Add necessary verification pieces to your site
2323+- Sync with existing records on your PDS
2424+2525+It's designed to be run inside your existing repo, build a one-time config, and then be part of your regular workflow by publishing content or updating existing content, all following the Standard.site lexicons. The best part? It's designed to be fully interoperable. It doesn't matter if you're using Astro, 11ty, Hugo, Svelte, Next, Gatsby, Zola, you name it. If it's a static blog with markdown, Sequoia will work (and if for some reason it doesn't, [open an issue!](https://tangled.org/stevedylan.dev/sequoia/issues/new)). Here's a quick demo of Sequoia in action:
2626+2727+<iframe
2828+ class="w-full"
2929+ style={{aspectRatio: "16/9"}}
3030+ src="https://www.youtube.com/embed/sxursUHq5kw"
3131+ title="YouTube video player"
3232+ frameborder="0"
3333+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
3434+ referrerpolicy="strict-origin-when-cross-origin"
3535+ allowfullscreen
3636+></iframe>
3737+3838+ATProto has proven to be one of the more exciting pieces of technology that has surfaced in the past few years, and it gives some of us hope for a web that is open once more. No more walled gardens, full control of our data, and connected through lexicons.
3939+4040+Install Sequoia today and check out the [quickstart guide](/quickstart) to publish your content into the ATmosphere ๐ณ
4141+4242+:::code-group
4343+```bash [npm]
4444+npm i -g sequoia-cli
4545+```
4646+4747+```bash [pnpm]
4848+pnpm i -g sequoia-cli
4949+```
5050+5151+```bash [bun]
5252+bun i -g sequoia-cli
5353+```
5454+:::
+12-2
docs/docs/pages/config.mdx
···1515| `identity` | `string` | No | - | Which stored identity to use |
1616| `frontmatter` | `object` | No | - | Custom frontmatter field mappings |
1717| `ignore` | `string[]` | No | - | Glob patterns for files to ignore |
1818+| `bluesky` | `object` | No | - | Bluesky posting configuration |
1919+| `bluesky.enabled` | `boolean` | No | `false` | Post to Bluesky when publishing documents |
2020+| `bluesky.maxAgeDays` | `number` | No | `30` | Only post documents published within this many days |
18211922### Example
2023···3134 "frontmatter": {
3235 "publishDate": "date"
3336 },
3434- "ignore": ["_index.md"]
3737+ "ignore": ["_index.md"],
3838+ "bluesky": {
3939+ "enabled": true,
4040+ "maxAgeDays": 30
4141+ }
3542}
3643```
3744···4451| `publishDate` | `string` | Yes | `"publishDate"`, `"pubDate"`, `"date"`, `"createdAt"`, `"created_at"` | Publication date |
4552| `coverImage` | `string` | No | `"ogImage"` | Cover image filename |
4653| `tags` | `string[]` | No | `"tags"` | Post tags/categories |
5454+| `draft` | `boolean` | No | `"draft"` | If `true`, post is skipped during publish |
47554856### Example
4957···5462publishDate: 2024-01-15
5563ogImage: cover.jpg
5664tags: [welcome, intro]
6565+draft: false
5766---
5867```
5968···6574{
6675 "frontmatter": {
6776 "publishDate": "date",
6868- "coverImage": "thumbnail"
7777+ "coverImage": "thumbnail",
7878+ "draft": "private"
6979 }
7080}
7181```
+40-2
docs/docs/pages/publishing.mdx
···1010sequoia publish --dry-run
1111```
12121313-This will print out the posts that it has discovered, what will be published, and how many. Once everything looks good, send it!
1313+This will print out the posts that it has discovered, what will be published, and how many. If Bluesky posting is enabled, it will also show which posts will be shared to Bluesky. Once everything looks good, send it!
14141515```bash [Terminal]
1616sequoia publish
···2323If you happen to loose the state file or if you want to pull down records you already have published, you can use the `sync` command.
24242525```bash [Terminal]
2626-seuqoia sync
2626+sequoia sync
2727```
28282929Sync will use your ATProto handle to look through all of the `standard.site.document` records on your PDS, and pull down the records that are for the publication in the config.
3030+3131+## Bluesky Posting
3232+3333+Sequoia can automatically post to Bluesky when new documents are published. Enable this in your config:
3434+3535+```json
3636+{
3737+ "bluesky": {
3838+ "enabled": true,
3939+ "maxAgeDays": 30
4040+ }
4141+}
4242+```
4343+4444+When enabled, each new document will create a Bluesky post with the title, description, and canonical URL. If a cover image exists, it will be embedded in the post. The combined content is limited to 300 characters.
4545+4646+The `maxAgeDays` setting prevents flooding your feed when first setting up Sequoia. For example, if you have 40 existing blog posts, only those published within the last 30 days will be posted to Bluesky.
4747+4848+## Draft Posts
4949+5050+Posts with `draft: true` in their frontmatter are automatically skipped during publishing. This lets you work on content without accidentally publishing it.
5151+5252+```yaml
5353+---
5454+title: Work in Progress
5555+draft: true
5656+---
5757+```
5858+5959+If your framework uses a different field name (like `private` or `hidden`), configure it in `sequoia.json`:
6060+6161+```json
6262+{
6363+ "frontmatter": {
6464+ "draft": "private"
6565+ }
6666+}
6767+```
30683169## Troubleshooting
3270
+2-2
docs/docs/pages/quickstart.mdx
···33333434### Authorize
35353636-In order for Sequoia to publish or update records on your PDS, you need to authoize it with your ATProto handle and an app password.
3636+In order for Sequoia to publish or update records on your PDS, you need to authorize it with your ATProto handle and an app password.
37373838:::tip
3939You can create an app password [here](https://bsky.app/settings/app-passwords)
···5959- **Public/static directory** - The path for the folder where your public items go, e.g. `./public`. Generally used for opengraph images or icons, but in this case we need it to store a `.well-known` verification for your blog, [read more here](/verifying).
6060- **Build output directory** - Where you published html css and js lives, e.g. `./dist`
6161- **URL path prefix for posts** - The path that goes before a post slug, e.g. the prefix for `https://sequoia.pub/blog/hello` would be `/blog`.
6262-- **Configure your frontmatter field mappings** - In your markdown posts there is usually frontmatter with infomation like `title`, `description`, and `publishedDate`. Follow the prompts and enter the names for your frontmatter fields so Sequoia can use them for creating standard.site documents.
6262+- **Configure your frontmatter field mappings** - In your markdown posts there is usually frontmatter with information like `title`, `description`, and `publishDate`. Follow the prompts and enter the names for your frontmatter fields so Sequoia can use them for creating standard.site documents.
6363- **Publication setup** - Here you can choose to `Create a new publication` which will create a `site.standard.publication` record on your PDS, or you can `Use an existing publication AT URI`. If you haven't done this before, select `Create a new publication`.
6464 - **Publication name** - The name of your blog
6565 - **Publication description** - A description for your blog
+2-2
docs/docs/pages/setup.mdx
···28282929## Authorize
30303131-In order for Sequoia to publish or update records on your PDS, you need to authoize it with your ATProto handle and an app password.
3131+In order for Sequoia to publish or update records on your PDS, you need to authorize it with your ATProto handle and an app password.
32323333:::tip
3434You can create an app password [here](https://bsky.app/settings/app-passwords)
···5656- **Public/static directory** - The path for the folder where your public items go, e.g. `./public`. Generally used for opengraph images or icons, but in this case we need it to store a `.well-known` verification for your blog, [read more here](/verifying).
5757- **Build output directory** - Where you published html css and js lives, e.g. `./dist`
5858- **URL path prefix for posts** - The path that goes before a post slug, e.g. the prefix for `https://sequoia.pub/blog/hello` would be `/blog`.
5959-- **Configure your frontmatter field mappings** - In your markdown posts there is usually frontmatter with infomation like `title`, `description`, and `publishedDate`. Follow the prompts and enter the names for your frontmatter fields so Sequoia can use them for creating standard.site documents.
5959+- **Configure your frontmatter field mappings** - In your markdown posts there is usually frontmatter with information like `title`, `description`, and `publishDate`. Follow the prompts and enter the names for your frontmatter fields so Sequoia can use them for creating standard.site documents.
6060- **Publication setup** - Here you can choose to `Create a new publication` which will create a `site.standard.publication` record on your PDS, or you can `Use an existing publication AT URI`. If you haven't done this before, select `Create a new publication`.
6161 - **Publication name** - The name of your blog
6262 - **Publication description** - A description for your blog
+2-2
docs/docs/pages/verifying.mdx
···33In order for your posts to show up on indexers you need to make sure your publication and your documents are verified.
4455:::tip
66-You an learn more about Standard.site verification [here](https://standard.site/)
66+You can learn more about Standard.site verification [here](https://standard.site/)
77:::
8899## Publication Verification
···22222323### pds.ls
24242525-Visit [pds.ls](https://pds.ls) and in the search bar paste in a `arUri` for either your publication or document, click the info tab, and then click the "info" tab. This will have a schema verification that will make sure the fields are accurate, however this will not cover Standard.site verification as perscribed on their website.
2525+Visit [pds.ls](https://pds.ls) and in the search bar paste in a `arUri` for either your publication or document, click the info tab, and then click the "info" tab. This will have a schema verification that will make sure the fields are accurate, however this will not cover Standard.site verification as prescribed on their website.
26262727### Standard.site Validator
2828
+2-2
docs/docs/pages/what-is-sequoia.mdx
···33Sequoia is a simple CLI that can be used to publish Standard.site lexicons to the AT Protocol. Yeah that's a mouthful; let's break it down.
4455- [AT Protocol](https://atproto.com) - As the site says, "The AT Protocol is an open, decentralized network for building social applications." In reality it's a bit more than that. It's a new way to publish content to the web that puts control back in the hands of users without sacrificing distrubtion. There's a lot to unpack, but you can find a primer [here](https://stevedylan.dev/posts/atproto-starter/).
66-- [Lexicons](https://atproto.com/guides/lexicon) - Lexicons are schemas used inside the AT Protocol. If you were to "like" a post, what would that consist of? Probably _who_ liked it, _what_ post was liked, and the _author_ of the post. The unique property to lexicons is that anyone can publish them and have them verified under a domain. Then these lexicons can be used to build apps by pulling a users records, aggregating them using an indexer, and a whole lot more!
77-- [Standard.site](https://standard.site) - Standard.site is a set of lexicons specailly designed for publishing content. It was started by the founders of [leaflet.pub](https://leaflet.pub), [pckt.blog](https://pckt.blog), and [offprint.app](https://offprint.app), with the mission of finding a schema that can be used for blog posts and blog sites themselves (if you don't have a self-hosted blog, definitely check those platforms out!). So far it has proven to be the lexicon of choice for publishing content to ATProto with multiple tools and lexicons revolving around the standard.
66+- [Lexicons](https://atproto.com/guides/lexicon) - Lexicons are schemas used inside the AT Protocol. If you were to "like" a post, what would that consist of? Probably _who_ liked it, _what_ post was liked, and the _author_ of the post. A unique property of lexicons is that anyone can publish them and have them verified under a domain. Then these lexicons can be used to build apps by pulling a users records, aggregating them using an indexer, and a whole lot more!
77+- [Standard.site](https://standard.site) - Standard.site is a set of lexicons specially designed for publishing content. It was started by the founders of [leaflet.pub](https://leaflet.pub), [pckt.blog](https://pckt.blog), and [offprint.app](https://offprint.app), with the mission of finding a schema that can be used for blog posts and blog sites themselves (if you don't have a self-hosted blog, definitely check those platforms out!). So far it has proven to be the lexicon of choice for publishing content to ATProto with multiple tools and lexicons revolving around the standard.
8899The goal of Sequoia is to make it easier for those with existing self-hosted blogs to publish their content to the ATmosphere, no matter what SSG or framework you might be using. As of right now the focus will be static sites, but if there is enough traction there might be a future package that can be used for SSR frameworks too.
1010