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.

README.md

SkyPress lexicons#

SkyPress publishes to the AT Protocol using a mix of the community site.standard.* lexicons (for the interoperable publication + document surface) and one SkyPress-owned lexicon for the rich content format. This directory documents all of them — the records a SkyPress publish writes, and exactly which fields it populates.

See Decision 0005 for the design rationale.

Ownership#

Lexicon Owner Why
site.standard.publication community (standard.site) interop — other readers (Leaflet, Pocketblog, pdsls, Bluesky cards) already speak it
site.standard.document community (standard.site) interop — the discoverable article surface
blog.skypress.content.gutenberg SkyPress the Gutenberg block-tree content format; reverse-DNS of skypress.blog
app.bsky.feed.post Bluesky the social signal (POSSE)

We only own the content format. Publication/document metadata reuses site.standard.* so SkyPress articles are discoverable beyond SkyPress.

blog.skypress.content.gutenberg (ours)#

Schema: blog.skypress.content.gutenberg.json.

An object placed inside a document's open content union ($type: "blog.skypress.content.gutenberg"):

Field Type Notes
version integer Serialization version (currently 1). Breaking changes ship as a new $type (…gutenberg v2), never a silent mutation.
blocks array<unknown> The block tree from onSaveBlocks: [{ name, attributes, innerBlocks }]. name is the Gutenberg block name (core/paragraph, …).

Authoring discipline (brief §3, Paul Frazee guidance): optional fields, open unions, additions-only; shipped constraints are frozen. Readers that don't understand this $type fall back to the document's textContent.

site.standard.document — fields SkyPress writes#

Record key: TID. (source)

Field Req SkyPress value
site the writer's site.standard.publication at:// URI (links doc↔publication for high-fidelity Bluesky cards)
title document title (≤500 graphemes)
publishedAt ISO datetime of publish
path /<rkey> — the document's own record key; combined with the publication url to form the canonical URL
description excerpt (optional)
textContent de-facto required — plain text from the block tree; Bluesky uses it for reading-time + search and ignores content
content open union — our blog.skypress.content.gutenberg object
bskyPostRef strongRef ({uri, cid}) to the companion Bluesky post
updatedAt set when an article is edited in place (publishedAt + bskyPostRef are preserved); omitted on first publish

site.standard.publication — fields SkyPress writes#

Record key: TID (not a self singleton — reused by listing existing records).

Field Req SkyPress value
url https://skypress.blog/@<handle> — the writer's SkyPress homepage; canonical doc URL = url + document path = …/@<handle>/<rkey>
name publication name (defaults from the handle)
description optional
icon optional blob (≤1MB)
basicTheme optional site.standard.theme.basic object — a sky-phase colour theme (background/foreground/accent/accentForeground as RGB); applied on the public reader and honoured by other standard.site readers (Decision 0012)

app.bsky.feed.post — the social signal#

Field SkyPress value
text a short blurb (title + note)
createdAt ISO datetime
embed app.bsky.embed.external → the canonical article URL, title, description

The publish flow#

ensure publication → create post (embed → article URL) → create document (content + textContent + bskyPostRef). The document's rkey is generated up front (TID.nextStr()), so the article URL (/@<handle>/<rkey>) is known before any write — avoiding a circular dependency between the post and the document. Builders live in src/lib/publish/records.ts; orchestration in publisher.ts.