A calm place to write long-form, and publish it to the open social web. skypress.blog/
0

Configure Feed

Select the types of activity you want to include in your feed.

Refresh docs after the editor/dashboard/landing rework

- README: project layout now matches src/ (feed·seo·editor·landing·lexicon
libs, HandleStart/ErrorScene components, lexicon/404/500/rss pages); How it
works covers publication pages, full-content RSS, OG/Twitter cards, dashboard.
- SP9: mark the lexicon page Built; entry point is the footer Docs link, not
the retired home-page hero button.
- lexicons/README: updatedAt reflects the live edit flow, not 'reserved (SP5)'.
- AGENTS: clarify SP0-SP12 are the v1 build archive; post-v1 work lives in
dated docs/superpowers/ design+plan pairs.

+28 -11
+6 -1
AGENTS.md
··· 10 10 - **Record non-obvious calls** in `docs/decisions/NNNN-title.md` (context, options, 11 11 choice, why). These are first-class deliverables. 12 12 - **Vertical slices over horizontal layers.** Keep the app runnable at every step. 13 - - Each sub-project (SP0, SP1, …) gets its own spec in `docs/specs/`. 13 + - **Where specs live.** `docs/specs/sp0`–`sp12` are the **archive of the initial v1 build** 14 + (all Built/Complete) — read them for the "how" and the cross-referenced `Depends on` 15 + history, but don't extend the SP numbering. New, post-v1 work gets a dated design + plan 16 + pair under `docs/superpowers/specs/` and `docs/superpowers/plans/` 17 + (e.g. `2026-06-09-editor-page-rework-design.md`). Durable rationale still graduates to a 18 + `docs/decisions/NNNN-*.md`. 14 19 15 20 ## Hard constraints (learned the hard way — see decisions) 16 21
+16 -7
README.md
··· 109 109 - **Reader** (`/@<handle>/<rkey>`): resolves identity, fetches the record, and renders the 110 110 block tree to **light HTML with zero JavaScript**, reconstructing blob image URLs and 111 111 **sanitising** the untrusted content. Other apps that don't understand the block format 112 - fall back to `textContent`. 112 + fall back to `textContent`. Each writer also gets a publication page (`/@<handle>/<slug>`) 113 + with a **full-content RSS feed** (`…/rss.xml`), and every public page emits Open Graph + 114 + Twitter card meta. 115 + - **Dashboard** (`/dashboard`): a signed-in writer manages their publication (name, icon, 116 + sky-phase theme) and jumps to the editor to write or edit articles. 113 117 - **Auth:** a browser OAuth public client (PKCE/DPoP) — no backend, no secrets. 114 118 115 119 The content lexicon is documented in [`lexicons/`](./lexicons/README.md); the design ··· 121 125 122 126 ``` 123 127 src/ 124 - pages/ index · editor · dashboard · client-metadata.json.ts (OAuth client doc, worker route) 128 + pages/ index · editor · dashboard · lexicon · 404 · 500 · client-metadata.json.ts (OAuth client doc, worker route) 125 129 [author]/index.astro (author index) · [author]/[slug]/index.astro (publication) 126 - · [author]/[slug]/[rkey].astro (read-through document reader) 127 - components/ Studio · SkyEditor · PublishPanel · AppBar · Dashboard · PublicationForm · AccountMenu · CreatePublicationCta · Logo · Footer 130 + · [author]/[slug]/[rkey].astro (read-through document reader) · [author]/[slug]/rss.xml.ts (feed) 131 + components/ Studio · SkyEditor · PublishPanel · AppBar · Dashboard · PublicationForm · AccountMenu · CreatePublicationCta · HandleStart · ErrorScene · Logo · Footer 128 132 lib/ 129 133 blocks/ render.ts (dependency-free reader) · serialize.ts (@wordpress oracle) · allowlist.ts 130 - auth/ oauth.ts · AuthProvider.tsx · config.ts · LoginForm.tsx 131 - publish/ records.ts (pure builders) · publisher.ts (Agent orchestration) · publications.ts (publication CRUD) 134 + auth/ oauth.ts · AuthProvider.tsx · config.ts · LoginForm.tsx · profile.ts · nav.ts · cta.ts 135 + publish/ records.ts (pure builders) · publisher.ts (Agent orchestration) · publications.ts (publication CRUD) · themes.ts 132 136 media/ mediaUpload.ts · uploadImage.ts (logo) · blob.ts · pds.ts 133 137 reader/ identity.ts · records.ts · publications.ts · profile.ts · sanitize.ts 138 + feed/ rss.ts · publication-feed.ts (full-content RSS, hand-rolled) 139 + seo/ meta.ts (Open Graph + Twitter card tags) 140 + editor/ edit-link.ts (dashboard → editor edit links) 141 + landing/ time-of-day.ts (sky phase) · actor-lookup.ts (public handle lookup) 142 + lexicon/ schema-doc.ts · inline-code.ts (the /lexicon reference page) 134 143 net/ safe-fetch.ts (SSRF guard for the reader's outbound fetches) 135 144 lexicons/ blog.skypress.content.gutenberg.json + README 136 - docs/ decisions/ (why) · specs/ (how) · brand/ 145 + docs/ decisions/ (why) · specs/ (how, the SP0–SP12 build archive) · superpowers/ (later design + plan docs) · brand/ 137 146 astro.config.mjs · wrangler.toml 138 147 ``` 139 148
+5 -2
docs/specs/sp9-lexicon-page.md
··· 1 1 # SP9 — Public lexicon page 2 2 3 3 - **Date:** 2026-06-08 4 - - **Status:** 📝 Spec — not yet built 4 + - **Status:** ✅ Built — `/lexicon` is live. The entry point landed as a **"Docs" link in the 5 + shared site footer** rather than a home-page hero button: the landing page was later 6 + rebuilt around the handle input (see `docs/superpowers/specs/2026-06-09-landing-cta-and-handle-input-design.md`), 7 + which retired the multi-button hero. 5 8 - **Goal:** Add a public, plain-spoken page at `/lexicon` that highlights and documents the 6 9 data SkyPress writes to a writer's PDS — narrative up top, technical reference below — and 7 - a third hero button on the home page (**"See the lexicon"**) linking to it. 10 + link to it from the site chrome. 8 11 9 12 Builds on [Decision 0005](../decisions/0005-lexicon-and-publish-model.md) (the lexicon & 10 13 publish model) and [`lexicons/README.md`](../../lexicons/README.md), the existing internal
+1 -1
lexicons/README.md
··· 50 50 | `textContent` | | **de-facto required** — plain text from the block tree; Bluesky uses it for reading-time + search and ignores `content` | 51 51 | `content` | | open union — our `blog.skypress.content.gutenberg` object | 52 52 | `bskyPostRef` | | strongRef (`{uri, cid}`) to the companion Bluesky post | 53 - | `updatedAt` | | reserved for the edit flow (SP5) | 53 + | `updatedAt` | | set when an article is edited in place (`publishedAt` + `bskyPostRef` are preserved); omitted on first publish | 54 54 55 55 ## `site.standard.publication` — fields SkyPress writes 56 56