rust reimplentation of sequoia.pub
1# rsequoia vs Sequoia — differences
2
3rsequoia is a Rust reimplementation of [sequoia-cli](https://sequoia.pub). This document notes the differences.
4
5## Additions (not in original Sequoia)
6
7### OAuth token authentication
8rsequoia accepts pre-authenticated OAuth tokens via environment variables:
9- `RSEQUOIA_ACCESS_TOKEN` — Bearer token
10- `RSEQUOIA_DID` — AT Protocol DID
11- `RSEQUOIA_PDS_URL` — PDS base URL
12
13This is the highest-priority auth method, above app passwords and stored credentials. It enables integration with tools like lichen that already manage their own AT Protocol OAuth flow.
14
15### Library usage
16rsequoia is structured as a Rust library (`lib.rs`) with a binary entry point. All modules (`config`, `credentials`, `discovery`, `publish`, `inject`, `pds_client`, `markdown`, `types`) are public and can be imported directly into other Rust projects.
17
18## Missing features (in original Sequoia but not here)
19
20### Bluesky post creation
21Sequoia can optionally create a Bluesky post (`app.bsky.feed.post`) with an external embed linking to each published document. rsequoia does not create Bluesky posts.
22
23### `bskyPostRef` field
24Sequoia tracks the Bluesky post reference in the document record's `bskyPostRef` field. rsequoia does not set this field.
25
26### `content` union field
27The standard.site document schema has a `content` field defined as an open union. Neither Sequoia nor rsequoia populate this — both use `textContent` (plain text) instead.
28
29### `basicTheme` field
30The standard.site publication schema has a `basicTheme` field for styling hints. Neither Sequoia nor rsequoia set this field.
31
32### `sync` command
33Sequoia has a `sequoia sync` command that fetches remote state and reconciles with local files. rsequoia does not have a sync command — it only pushes local state to the PDS.
34
35### `autoSync` config
36Sequoia's config supports `autoSync` for automatic frontmatter updates with AT URIs. rsequoia does not modify source files.
37
38### `pathTemplate` config
39Sequoia supports `pathTemplate` with token replacement (`{slug}`, `{year}`, etc.) for URL generation. rsequoia uses `pathPrefix` + slug only.
40
41### `removeIndexFromSlug` config
42Sequoia can strip `/index` suffixes from slugs. rsequoia handles this but does not expose it as a config option.
43
44### UI config
45Sequoia has a `ui` config section. rsequoia does not (it is CLI-only).
46
47## Behavioral differences
48
49### Credential storage location
50- Sequoia: `~/.config/sequoia/credentials.json`
51- rsequoia: `~/.config/rsequoia/credentials.json`
52
53### Environment variable names
54- Sequoia: `SEQUOIA_PROFILE` for profile selection
55- rsequoia: `RSEQUOIA_ACCESS_TOKEN`, `RSEQUOIA_DID`, `RSEQUOIA_PDS_URL` for OAuth
56
57Both support `ATP_IDENTIFIER`, `ATP_APP_PASSWORD`, and `PDS_URL`.
58
59### `canonicalUrl` field
60Both Sequoia and rsequoia add a `canonicalUrl` field to document records. This field is NOT in the standard.site lexicon schema but is used for linking back to the original site.
61
62### Text content extraction
63Both strip markdown to plain text for `textContent`, capped at 10,000 characters. The exact stripping logic may differ slightly between implementations.
64
65## standard.site lexicon conformance
66
67Both rsequoia and Sequoia implement the same subset of the standard.site lexicons:
68
69**`site.standard.document`** — all required fields (`site`, `title`, `publishedAt`) plus optional `path`, `description`, `coverImage`, `textContent`, `tags`, `updatedAt`.
70
71**`site.standard.publication`** — all required fields (`url`, `name`) plus optional `icon`, `description`, `preferences`.