Shared lexicon schemas for long-form publishing on AT Protocol. Uses typescript to json via prototypey.

proposal(lexicon): `site.standard.series`, ordered group of documents #19

Open shenoi.dev
Open opened by shenoi.dev

I would like to be able to publish articles that readers can know, should be read in a sequence. for example:

  • A tutorial in parts, e.g. "Haskell for beginners, parts 1 -> 7".
  • Weekly reports of a project, or a daily journal of sorts.
  • A story or a comic in chapters.
  • A long article broken into parts, each describing a different part of the topic being explored.

Why I think tags are not a solution:

  1. Tags have no order themselves. Readers must find the order from the dates or the document's name(ureliable).
  2. A tag is just a string. Two apps can use the same string for different purposes.

Leaflet for example has a "chapter" view that I guess, groups posts from the text of their titles. This does work, but it is more of a guess that other apps need not read similarly. A shared record type lets each app show the same series in the same order.

Proposal #

Record #

site.standard.series, record key tid.

Field Type Required Description
site string:uri yes The publication (at://) or publication URL (https://). Same meaning as site in site.standard.document.
title string yes Title of the series. Same limits as a document title.
items array<site.standard.series.item> yes The documents, in reading order. The first item is to be read first.
createdAt string:datetime yes Time when the series was made.
path string no Path of a page for the series, relative to the publication URL.
description string no Short description. Same limits as a document's description.
coverImage blob no Cover image, less than 1 MB.
updatedAt string:datetime no Time of the last change, for example a new item or a new order.

site.standard.series.item:

Field Type Required Description
document string:uri yes The site.standard.document record(at://).
label string no Short label, for example "Part 2" or "Week 7". If there is no label, the app can show the position number instead.

Example #

{
  "$type": "site.standard.series",
  "site": "at://did:plc:7ldwh27x3xbmj3dg2yuwddsc/site.standard.publication/abcdxyz123456",
  "title": "Haskell for beginners",
  "path": "/series/haskell-for-beginners",
  "items": [
    { "document": "at://did:plc:7ldwh27x3xbmj3dg2yuwddsc/site.standard.document/abcdxyz123456", "label": "Part 1" },
    { "document": "at://did:plc:7ldwh27x3xbmj3dg2yuwddsc/site.standard.document/abcdxyz123456", "label": "Part 2" },
    // ...
  ],
  "createdAt": "2026-01-01T00:00:00.000Z"
}
Sign up or Sign in to add to the discussion.