{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Olamaelcu Blog",
  "home_page_url": "https://olamaelcu.net/blog",
  "feed_url": "https://olamaelcu.net/feed/json",
  "description": "Thoughts, tutorials, and updates from Olamaelcu.",
  "author": {
    "name": "Jacky",
    "url": "https://www.jacky.wtf"
  },
  "items": [
    {
      "id": "https://olamaelcu.net/blog/2026/book-lexicon",
      "url": "https://olamaelcu.net/blog/2026/book-lexicon",
      "title": "A place of consensus making for the book lexicon",
      "content_html": "<p>There's a long thread about <a href=\"https://discourse.atmosphere.community/t/in-which-a-book-lexicon-is-born/1042/32?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=book-lexicon_post\">the formation of a book lexicon</a> that I think\nis starting to demonstrate some of the worts of lexicon design. Different\napplications with different levels of use and applications are going to result\nin different needs. Instead, I think we're seeing the need for resolve more of\nwhat works within the model of ATProto; consolidation around what <em>should</em> be\nshared by the (app)views and less focus on exposing the plumbing of our\nindividual applications to the rest of the world.</p>\n<p>What I have seen repeated is something useful: <em>exposing</em> identifiers that can\nbe useful for disambiguation. This would be the title, author and a set of\nidentifiers that can be used to find more information about a book in one's\nlocal catalog like their ISBN, UPC, EAN, ASIN, ISSN, etc. The astute reader\nwould notice that ISSNs and UPCs can be used for magazines and UPCs for general\nproducts. In some publishing cases, books can be printed with those\nconstraints. As <a href=\"https://nickthesick.com/blog/Home?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=book-lexicon_post\">Nick</a> mentions <a href=\"https://discourse.atmosphere.community/t/in-which-a-book-lexicon-is-born/1042/26?u=omg.jacky.wtf&utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=book-lexicon_post\">here</a> that this work (emphasis mine):</p>\n<blockquote>\n<p>[This] will be very hard, I would even say firmly, it should not be done.\nThere will always be mismatches between datasets, and it will be an MxN\nproblem. Exponentially hard when you account for other providers’ datasets.</p>\n<p>I think that <em>the local optimum solution here</em> is for the user to have the\npower to make this mapping on their own case-by-case basis.</p>\n</blockquote>\n<p>This helped me, as well as the other points made from Dracome, Hardcover and\nmicro.blog, to come to the following proposal for the book lexicon XRPC for\nappviews and its expected responses:</p>\n<h2 id=\"olamaelcus-proposal-for-communitylexiconbook-0\">Olamaelcu's Proposal for <code>community.lexicon.book</code></h2>\n<p>I've made a light proposal for these records, but here it is more formalized:</p>\n<h3 id=\"records-1\">Records</h3>\n<p>The goal is for <em>five records</em> to live under the <code>community.lexicon.book.</code> NSID, sharing identifier and contribution shapes via <code>community.lexicon.book.defs</code>.</p>\n<details>\n  <summary>Open for all of the record schemas:</summary><p><strong><code>community.lexicon.book.defs</code></strong></p>\n<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// Shared object shapes used across the book namespace.</span>\n<span class=\"token comment\">// `main`         — identifier object (URI + resource scheme).</span>\n<span class=\"token comment\">// `contribution` — (subject strongRef, role) wrapper for the contributor lists in edition/work.</span>\n<span class=\"token punctuation\">{</span>\n <span class=\"token string-property property\">\"lexicon\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Shared object shapes used by community.lexicon.book.* records.\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"defs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"An external identifier scoped to a specific source or scheme.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"uri\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"resource\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"uri\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"uri\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2048</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"URL for vendor/library links, URN for scheme-based IDs (urn:isbn:..., urn:doi:...).\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"resource\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token comment\">// Open set — new sources (vendors, libraries, schemes) can be added without schema changes.</span>\n     <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Source system or scheme this identifier belongs to.\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"knownValues\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token comment\">// ISBN family</span>\n      <span class=\"token string\">\"isbn\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"isbn13\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"isbn10\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// Other commerce / catalog schemes</span>\n      <span class=\"token string\">\"asin\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"doi\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"oclc\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"isbnPrefix\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// Authority records (people/orgs)</span>\n      <span class=\"token string\">\"isni\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"viaf\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"wikidata\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// Vendor / library sites</span>\n      <span class=\"token string\">\"openlibrary\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"googleBooks\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"goodreads\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"amazon\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"barnes\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"hardcover\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"bookhive\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"bibliograph\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"imdb\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"official\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// Catch-all for personal site / blog</span>\n      <span class=\"token string\">\"web\"</span>\n     <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"contribution\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"A contribution by a contributor to an edition or work.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"subject\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"role\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// → community.lexicon.book.contributor (strongRef: URI + CID)</span>\n    <span class=\"token string-property property\">\"subject\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"com.atproto.repo.strongRef\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"role\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"knownValues\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"author\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"coAuthor\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"editor\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"translator\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"illustrator\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"narrator\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"foreword\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"contributor\"</span>\n     <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre><p><strong><code>community.lexicon.book.edition</code></strong></p>\n<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// A single edition (publication event) of a book. The entry-point record.</span>\n<span class=\"token comment\">// `work`           — OPTIONAL → community.lexicon.book.work (omit if not modeling the work abstraction).</span>\n<span class=\"token comment\">//   `publisher`   — OPTIONAL → community.lexicon.book.publisher (small-press / unknown OK).</span>\n<span class=\"token comment\">//   `contributors[]` — array of community.lexicon.book.defs#contribution (subject + role).</span>\n<span class=\"token punctuation\">{</span>\n <span class=\"token string-property property\">\"lexicon\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.edition\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"defs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"record\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"A single edition of a book. Optionally grouped under a work record.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"key\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"tid\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"record\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"title\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"createdAt\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"title\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2048</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">200</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"subtitle\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1024</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">100</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"work\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"com.atproto.repo.strongRef\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"publisher\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"com.atproto.repo.strongRef\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"place\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">64</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Place of publication. Free-form; not normalized.\"</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"publishedYear\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"integer\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minimum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maximum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">9999</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"language\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"language\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"contributors\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">64</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs#contribution\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"identifiers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">32</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs#main\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">8192</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1024</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Free-form description of this edition. Serves as bibliographic edition statement ('First edition', 'Revised second printing') and/or a blurb/summary.\"</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"createdAt\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"datetime\"</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre><p><strong><code>community.lexicon.book.work</code></strong></p>\n<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// An abstract book work — the conceptual work that one or more editions are manifestations of.</span>\n<span class=\"token comment\">// Opt-in: implementations may publish only editions and ignore this layer.</span>\n<span class=\"token punctuation\">{</span>\n <span class=\"token string-property property\">\"lexicon\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.work\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"defs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"record\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"An abstract book work. Opt-in layer above editions.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"key\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"tid\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"record\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"title\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"createdAt\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"title\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2048</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">200</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"subtitle\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1024</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">100</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"originalLanguage\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"language\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"firstPublishedYear\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"integer\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minimum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maximum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">9999</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"subjects\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">32</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Subject tags / genres.\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">128</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">32</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"contributors\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">64</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs#contribution\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"identifiers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">32</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs#main\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">8192</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1024</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"createdAt\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"datetime\"</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre><p><strong><code>community.lexicon.book.contributor</code></strong></p>\n<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// A person (real or pen name) credited in producing book editions or works.</span>\n<span class=\"token comment\">// One record per real-world person; deduplicated by AppViews via `identifiers`.</span>\n<span class=\"token comment\">// `linkedDid` lets the contributor claim ownership by pointing at their own ATProto account.</span>\n<span class=\"token punctuation\">{</span>\n <span class=\"token string-property property\">\"lexicon\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.contributor\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"defs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"record\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"A person credited in producing book editions or works.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"key\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"tid\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"record\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"createdAt\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">64</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"aliases\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">16</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">64</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"linkedDid\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"did\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"bio\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">8192</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1024</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"bornYear\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"integer\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minimum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maximum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">9999</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"diedYear\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"integer\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minimum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maximum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">9999</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"identifiers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">16</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs#main\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"createdAt\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"datetime\"</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre><p><strong><code>community.lexicon.book.publisher</code></strong></p>\n<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token comment\">// A publishing entity (publisher house, imprint, or self-publishing author-as-publisher).</span>\n<span class=\"token comment\">// One record per real-world entity; deduplicated by AppViews via `identifiers`.</span>\n<span class=\"token comment\">// `imprintOf` lets imprints/divisions point up at their parent house (e.g. Tor → Macmillan).</span>\n<span class=\"token punctuation\">{</span>\n <span class=\"token string-property property\">\"lexicon\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.publisher\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"defs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"record\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"A publishing entity.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"key\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"tid\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"record\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"createdAt\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">256</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"maxGraphemes\"</span><span class=\"token operator\">:</span> <span class=\"token number\">64</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token comment\">// OPTIONAL → another community.lexicon.book.publisher record (parent house)</span>\n     <span class=\"token string-property property\">\"imprintOf\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"com.atproto.repo.strongRef\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"foundingDate\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"integer\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minimum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maximum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">9999</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Year founded (4-digit).\"</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"closingDate\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"integer\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minimum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maximum\"</span><span class=\"token operator\">:</span> <span class=\"token number\">9999</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Year ceased operations. Omit if still active.\"</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"identifiers\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"minLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"maxLength\"</span><span class=\"token operator\">:</span> <span class=\"token number\">16</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.defs#main\"</span> <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"createdAt\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"datetime\"</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></details><p>Contributors can be the author but also the translator, editor, illustrator;\nthe list gets long and can add a complexity that some catalogs might not\nimmediately have; making it optional when implementing a compatible AppView.\nThis also introduces publishers as a first-class record type but also optional. I opted to make editions, the <em>digestable</em> unit of what makes this work work the only thing needed to get to the rest and have everything else opt-in.</p>\n<h3 id=\"queries-2\">Queries</h3>\n<p>The sole query needed for a bibliographic AppView to implement would be\n<code>community.lexicon.book.searchEditions</code>. It'll allow for searching by free form\ntext text (with the query parameter <code>q</code>) or by an identifier (with the query\nidentifier <code>id</code>, supporting the repetition of the parameter so you can send a\nlist of values). It'll also take in an optional <code>cursor</code> parameter to allow\nfor pagination in whichever way the AppView implements it, similar to other\nAppViews in the ATProto space. <code>limit</code> will be set to a suggested default of 20.\nResponses should be of the following shape and reason:</p>\n<ul>\n<li><code>200</code>: if the search completes okay even if there's no results. A key <code>items</code>\nholding the list (empty or not) of <code>community.lexicon.book.edition</code> records and\na optional field <code>cursor</code> to page to the next set of results with another\noptional field <code>total</code> representing the total number of records in this result.</li>\n<li><code>400</code>: An AppView should return this if the search query is invalid <em>to</em> it.\nFor example, if it supports Lucene syntax but it's invalid, return that here.</li>\n</ul>\n<pre><code>GET /xrpc/community.lexicon.book.searchEditions?\n     q=<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>free</span> <span class=\"token attr-name\">form</span> <span class=\"token attr-name\">text</span><span class=\"token punctuation\">&gt;</span></span>\n     &amp;id=urn:isbn:9780708899441\n     &amp;id=https://openlibrary.org/works/OL24151553W/Harlem_Shuffle?edition=key%3A/books/OL34709636M\n     &amp;id=https://www.penguinrandomhouse.com/books/608669/harlem-shuffle-by-colson-whitehead/\n\nHTTP/1.1 200 OK\nContent-Type: application/json\n\n{\n  \"items\": [\n    { /* entry of the community.lexicon.book.edition shape */}\n  ],\n  \"cursor\": \"nextPageOfItems\",\n  \"total\": 6403\n\n}\n</code></pre><p>Other queries like the following would follow the same suit, only that they'd\nreturn 501 if the AppView doesn't support such a query:</p>\n<ul>\n<li><code>community.lexicon.book.searchContributors</code></li>\n<li><code>community.lexicon.book.searchPublishers</code></li>\n<li><code>community.lexicon.book.searchWorks</code></li>\n</ul>\n<p>In order to discover what other lexicons and queries that a bibliographic\nAppView supports, the following query <em>MUST</em> be implemented (along with\n<code>.book.searchEditions</code>):</p>\n<pre><code>GET /xrpc/community.lexicon.book.compatibility\n\nHTTP/1.1 200 OK\nContent-Type: application/json\n\n{\n  \"queries\": [\n    {\"nsid\": \"book.searchEditions\"},\n    {\"nsid\": \"book.searchContributors\"}\n  ]\n}\n</code></pre><p>A client can call this in advance without having to hit a 501 when calling an\nendpoint unexpectedly. This idea was taken from the IndieWeb with <a href=\"https://micropub.spec.indieweb.org/#syndication-targets?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=book-lexicon_post\">Micropub's\nextension for querying for syndication targets</a> to allow for a progressive\ninterface. The following is the query schema:</p>\n<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token punctuation\">{</span>\n <span class=\"token string-property property\">\"lexicon\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"community.lexicon.book.compatibility\"</span><span class=\"token punctuation\">,</span>\n <span class=\"token string-property property\">\"defs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token string-property property\">\"main\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"query\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"List the XRPC queries (and procedures) this AppView implements under community.lexicon.book.*. Clients use this instead of probing each NSID and tolerating 501 responses.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"output\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"encoding\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"application/json\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"schema\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"queries\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string-property property\">\"queries\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n       <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"array\"</span><span class=\"token punctuation\">,</span>\n       <span class=\"token string-property property\">\"items\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ref\"</span><span class=\"token punctuation\">,</span> <span class=\"token string-property property\">\"ref\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"#queryRef\"</span> <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n     <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string-property property\">\"queryRef\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"object\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"required\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"nsid\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n   <span class=\"token string-property property\">\"properties\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string-property property\">\"nsid\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"format\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"nsid\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Truncated NSID relative to the 'community.lexicon' authority (e.g. 'book.searchWorks'). The full NSID is reconstructed by prepending 'community.lexicon.'.\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n     <span class=\"token string-property property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"knownValues\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"query\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"procedure\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n     <span class=\"token string-property property\">\"description\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Whether this endpoint is a query (GET) or procedure (POST). Omit if the AppView only exposes queries.\"</span>\n    <span class=\"token punctuation\">}</span>\n   <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre><hr>\n<p>It's also <em>very open</em> to conversation (would it make more sense to inline this\ninformation into the book record itself instead of having it be a collection of\nstrong references + thin references? What else do we gain? What else do we\nlose?)</p>\n<hr>\n<p>We can start here for <em>just</em> handling discovery of books and then iterate to\nthe shape of a review so we can then add more queries to compatible AppViews.\nThis will eventually allow for the kind of interoperability we see with the\nmicroblogging space (with Bluesky and its kin) and the long form blogging (as\nwe see with <a href=\"https://standard.site?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=book-lexicon_post\">https://standard.site</a>). There's another thread where\n<a href=\"https://discourse.atmosphere.community/t/handling-reviews-for-the-book-lexicon/1085/3?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=book-lexicon_post\">conversation for the review shape</a> can be held to help faciliate that but\nfor now, we need consensus on this. From the conversation held in the thread, I\nthink proposing the above will work to satisfy everyone's needs for\ninteroperability.</p>\n",
      "summary": "We will not agree on how to organize the information and that is okay.",
      "date_published": "2026-08-22T00:00:00.000Z",
      "date_modified": "2026-08-22T00:00:00.000Z",
      "authors": [
        {
          "name": "Jacky",
          "uri": "https://www.jacky.wtf"
        }
      ],
      "tags": [
        "lexicon",
        "discussion"
      ]
    },
    {
      "id": "https://olamaelcu.net/blog/2026/cutting-scope",
      "url": "https://olamaelcu.net/blog/2026/cutting-scope",
      "title": "Cutting Scope: Dropping Spadat and Scratchback",
      "content_html": "<p>In lieu of wanting to focus more on <a href=\"https://livtet.olamaelcu.net?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=cutting-scope_post\">Livtet</a> and <a href=\"/projects/beats/\">Beats</a>, I had to sunset\nboth Spadat, the almost-complete Spades game over ATProto and Scratchback, the\nSDK that enabled some of the primitives it was based on. I might revisit them\nin the future when time and energy permits but for now they'll be retired.\nSpadat was written using Godot and Rust and Scratchback entirely in Rust with a\nSvelteKit frontend to allow game developers to tweak settings on-the-fly about\ngames as well as aiming to provide Web-based leader boards.</p>\n<p>You also won't see them anymore in <a href=\"https://waitlist.olamaelcu.net?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=cutting-scope_post\">https://waitlist.olamaelcu.net</a> if you\nalready subscribed to them. I apologize for the inconvenience.</p>\n<p>To Livtet! To Beats!</p>\n",
      "summary": "Putting two projects into the archive",
      "date_published": "2026-08-12T00:00:00.000Z",
      "date_modified": "2026-08-12T00:00:00.000Z",
      "authors": [
        {
          "name": "Jacky",
          "uri": "https://www.jacky.wtf"
        }
      ],
      "tags": [
        "meta"
      ]
    },
    {
      "id": "https://olamaelcu.net/blog/2026/biblio-goals",
      "url": "https://olamaelcu.net/blog/2026/biblio-goals",
      "title": "What's the point of Bibliograph?",
      "content_html": "<p>So, you're curious about <a href=\"https://biblio.livtet.olamaelcu.net?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=biblio-goals_post\">Bibliograph</a>. It came out of a discussion with some\nfolks about <a href=\"https://discourse.atmosphere.community/t/in-which-a-book-lexicon-is-born/1042?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=biblio-goals_post\">how we can model a book lexicon</a> and is a direct product of\nwhat <a href=\"/blog/2026/on-livtet\">Livtet's move to rely on ATProto</a> for all of its work — from\nshelving content to finding what books are trending across the Atmosphere.</p>\n<h2 id=\"the-recent-outage-0\">The Recent Outage</h2>\n<blockquote>\n<p>If you're not familiar with the internals of SQLite, you can skip this section.</p>\n</blockquote>\n<p>As I was importing the books from OpenLibrary's torrent dump, Bibliograph ended\nup generating a <em>48 gigabyte</em> WAL file that locked up the little 2GB RAM\nmachine it's running on<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1</a></sup>. I had to do the following:</p>\n<ul>\n<li>Cap the WAL size to 128M using <code>journal_size_limit = 134217728</code></li>\n<li>Lock it to be synchronous for a moment</li>\n<li>Run a throttling on the reconnection to Olamaelcu's <code>tap</code> instance</li>\n</ul>\n<p>All of this is described in <a href=\"https://github.com/olamaelcu/bibliograph/commit/2ccec98ab4875b50a162872f2205d39127391270?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=biblio-goals_post\">this commit</a>. These changes are needed to keep\nit running well on a tight machine and my goal is to <em>keep</em> it running on this\nsized machine for as long as possible so anyone can pick this up and run it on\ncommodity hardware.</p>\n<p>However, something else was happening. Can you tell what's wrong with this SQL query?</p>\n<pre class=\"language-typescript line-numbers\"><code class=\"language-typescript\">results <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> db<span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">.</span>books<span class=\"token punctuation\">.</span><span class=\"token function\">findMany</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n where<span class=\"token operator\">:</span> <span class=\"token function\">or</span><span class=\"token punctuation\">(</span>\n  <span class=\"token function\">like</span><span class=\"token punctuation\">(</span>books<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">%__health_check__ __health_check__%</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">like</span><span class=\"token punctuation\">(</span>books<span class=\"token punctuation\">.</span>author<span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">%__health_check__ __health_check__%</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n limit<span class=\"token punctuation\">,</span>\n offset\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code><span class=\"line-numbers-rows\" aria-hidden=\"true\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre><p>Running this query against a 4G SQLite database sounds okay if you don't mind\nwaiting 30 seconds on a 2GB RAM machine. This is what led me to do early\ntermination. Basically, running a full-table scan on 3.4 GB of books slowed\nthings down a lot because <code>LIKE '%...%'</code> can't use a B-tree index; especially\nwithin a Node loop. This <code>__health_check__</code> bit is coming from Livtet <em>every 5\nminutes</em> to make sure that Bibliograph is responsive — this was how it\nknew to send interactions to Bibliograph (like enriching book and author\ninformation, fetching shelving information, etc).</p>\n<h2 id=\"the-current-status-1\">The Current Status</h2>\n<p>As of now (time of writing), Bibliograph knows of <strong>5,111,432</strong>\nbooks (currently <span id=\"live-count\">5,111,432</span> books). This allows Livtet's public search to return all of the books it knows\nwithout having to ask Google Books or OpenLibrary (directly) anymore. This also\npowers the logic around <a href=\"https://livtet.olamaelcu.net/play?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=biblio-goals_post\">the soon-to-come jigsaw puzzle game</a> that Livtet has based on the\ncover of books — the first of many attempts to build engaging experiences\naround books that don't involve reading (or just reading, you should <em>still</em> be\nreading)!</p>\n<hr>\n<p>I'm <em>very</em> open to feedback, ideas and questions about these apps! Send\nfeedback to their pages <a href=\"https://userinput.app/s/did:plc:ejggqolmgpylroktvaktibik/3ms42jyyi4p2f?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=biblio-goals_post\">for Livtet</a> and <a href=\"https://userinput.app/s/did:plc:ejggqolmgpylroktvaktibik/3mst4pvyu7m2f?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=biblio-goals_post\">for Bibliograph</a>.</p>\n\n<section class=\"footnotes\" data-footnotes=\"\">\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>This is why there's rate limiting! <a href=\"#footnote-ref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>",
      "summary": "Explaining why Bibliograph is being built and how it can benefit the ATProto ecosystem",
      "date_published": "2026-08-11T00:00:00.000Z",
      "date_modified": "2026-08-11T00:00:00.000Z",
      "authors": [
        {
          "name": "Jacky",
          "uri": "https://www.jacky.wtf"
        }
      ],
      "tags": [
        "meta"
      ]
    },
    {
      "id": "https://olamaelcu.net/blog/2026/on-livtet",
      "url": "https://olamaelcu.net/blog/2026/on-livtet",
      "title": "On Livtet, ATProto and the First Release",
      "content_html": "<h2 id=\"livtet-who-art-thou-0\">Livtet, Who Art Thou?</h2>\n<p>Livtet is a project I've mulled <a href=\"https://www.jacky.wtf/essays/2024/using-lua-with-livtet/?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">over</a> and <a href=\"https://www.jacky.wtf/essays/2024/making-livtet/?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">over</a> (and <a href=\"https://www.jacky.wtf/essays/2025/on-livtet/?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">over</a> - and\n<a href=\"https://www.jacky.wtf/essays/2025/back-to-livtet/?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">over</a>!); starting it from scratch when I discovered a new form of\norganizing content that worked with my sense of library sciences. I've decided\nto take a <em>hard shift</em> and put it into the public again. It used to live on\nSourceHut but I brought it to GitHub so I can take advantage of a few things:</p>\n<ul>\n<li>Sponsorship: this project is not cheap to develop and I want it to survive</li>\n<li>Availability: it's one thing to work with advocates of AT on\n<a href=\"https://tangled.org?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">https://tangled.org</a> but it's another to get the platform that holds everyone\nwho considers themselves a member of the open source community on it.</li>\n<li>Collaboration: It's not to say that SourceHut and Tangled aren't\ncollaborative platforms; we as a developer community were so burned by\nSourceForge that we let GitHub become [our one and only \"VCS\"]<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">1</a></sup>.</li>\n</ul>\n<h2 id=\"protocol-implementation-driven-development-pid2-1\">Protocol Implementation Driven-Development (PID<sup>2</sup>)</h2>\n<p>With all that said, Livtet has become my gateway project into the <em>complexity</em>\nof <a href=\"https://atproto.com?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">AT Protocol</a>. I have plans to have it work with Nostr soon and had a\nsmall prototype generated by DeepSeek but I need to scale up infrastructure to\nhandle both<sup><a id=\"footnote-ref-2\" href=\"#footnote-2\" data-footnote-ref=\"\" aria-describedby=\"footnote-label\">2</a></sup>. In order to <em>really</em> operate in a communal fashion, I decided, after some conversation of not taking the initial approach that applications like Bookhive and Popfeed have in\nmaking custom lexicons for their tracking of information, and leaned into the\nspirit of <a href=\"https://lexicon.community?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">https://lexicon.community</a> in a small prototype called\n<a href=\"https://biblio.livtet.olamaelcu.net?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">Bibliograph</a>. I initially had a custom lexicon for it under the NSID\n<code>net.olamaelcu.livtet</code> but interoperability is <em>way more</em> important to me.</p>\n<p>Bibliograph is the result of conversation with folks interested in tracking\nbooks on-protocol and some early research on what that'd look like for a real\napplication, like <a href=\"https://livtet.olamaelcu.net?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">Livtet</a> to make use of it. For example, <a href=\"https://livtet.olamaelcu.net/u/omg.jacky.wtf/shelves?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">my profile page</a>\nshows information that apps like Bookhive and Popfeed can start consuming to\nshow today, thanks to the XRPC methods provided by Bibliograph. You can see the\nconversation that sparked it on <a href=\"https://discourse.atmosphere.community/t/in-which-a-book-lexicon-is-born/1042?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">AT Protocol Discourse</a> - be sure to chime in!</p>\n<p>One could eschew using Bibliograph and ingest the AT firehose themselves to\ncompose a graph of information about books and the information around it today,\ncombing over existing lexicons that emit such information so it provides a\n\"community-powered backfill\", so to speak. However, having folks move to the\nnew lexicon for <em>new work</em> helps test out the kinks in the spec and schema.</p>\n<h2 id=\"first-release-2\">First Release?</h2>\n<p>This brings me to the more interesting page for layfolks: Livtet's web\nexperience should have an early release sometime this month. I'm slating it for\nlate August as I'm also trying to work on the native mobile applications to go\nwith it as well. Those are actually <a href=\"https://github.com/olamaelcu/livtet-mobile?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">open source</a> as I hope to demonstrate\nhow to use the core library with it but it'll support communicating to the\nLivtet API (to be documented) as well as eventually using the Bibliograph XRPC\ndirectly, making it a \"native\" AT Protocol client. I'd love to see clients like\n<a href=\"https://tunjid.com/projects/heron-a-graceful-atprotocol-client-6908053ec712ce6892dc8174?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">Heron</a> sneak in support for this, the same way it supports Standard Site\nsubscriptions as this will show the plural power of AT Protocol and the things\nyou can unlock with a simple API.</p>\n<hr>\n<p>Let me know what you think by mentioning <code>@olamaelcu.net</code> on AT\nProto, about Livtet on <a href=\"https://userinput.app/s/did:plc:ejggqolmgpylroktvaktibik/3ms42jyyi4p2f?lang=en&utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=on-livtet_post\">its UserInput page</a> or sending e-mail to\n<a href=\"mailto:jacky@olamaelcu.net\">jacky@olamaelcu.net</a>!</p>\n\n<section class=\"footnotes\" data-footnotes=\"\">\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>My words here - I understand that the act of making things easier to use\nand hiding complexity is Actually Good. I wish, at times, that the D in\nDVCS was something that the executive product team at GitHub focused on but\nthat'd eat into their money. <a href=\"#footnote-ref-1\" data-footnote-backref=\"\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"footnote-2\">\n<p>Would you believe that all of the apps under &lt;olamaelcu.net&gt; are running\non a 2GB RAM droplet? <a href=\"#footnote-ref-2\" data-footnote-backref=\"\" aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n</ol>\n</section>",
      "summary": "Talking shop about Livtet, a alpha release date and its system",
      "date_published": "2026-08-03T00:00:00.000Z",
      "date_modified": "2026-08-03T00:00:00.000Z",
      "authors": [
        {
          "name": "Jacky",
          "uri": "https://www.jacky.wtf"
        }
      ],
      "tags": [
        "meta"
      ]
    },
    {
      "id": "https://olamaelcu.net/blog/2026/sysinit",
      "url": "https://olamaelcu.net/blog/2026/sysinit",
      "title": "sysinit",
      "content_html": "<p>This is going to be short and sweet.</p>\n<p>You can read about the purpose of this entity — for now it's mainly the\n\"output\" of the projects <a href=\"https://www.jacky.wtf?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=sysinit_post\">Jacky</a> until other things fall\ninto place. Things like the kind of projects that are meant to be either\nflagship services or tools can be found at <a href=\"/projects\">the projects page</a>.</p>\n<h3 id=\"the-plans-0\">The Plans</h3>\n<p>I'm aiming to release the things I've been hammering on for some time slowly to\neveryone. The easiest way to be notified when a new service is available before\nit's made more generally available is by <a href=\"https://waitlist.olamaelcu.net?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=sysinit_post\">signing up for the waitlist</a>. Once\nyou're signed in and when spots are available, you'll be able to log into the\nservices you opted into. You can view all of the projects <a href=\"/projects\">for opting in</a>\n— before you decide to commit.</p>\n<h3 id=\"the-purpose-1\">The Purpose</h3>\n<p>There's a bunch of things I want to build and contribute to and it's not enough\nto <em>just write</em> about it. There's enough space now seeing that I'm\n(<a href=\"https://www.jacky.wtf?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=sysinit_post\">Jacky</a>) largely a <a href=\"https://www.jacky.wtf/work?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=sysinit_post\">free\nagent</a> and I'd like to spend that time working on\nsomething I've written and engaged in for the last few years — the open\nsocial Web. I'll have <a href=\"https://cal.com/jackyalcine?utm_source=olamaelcu.net&utm_medium=blog&utm_campaign=sysinit_post\">time for folks who'd like to\ntalk</a> about ideas that'd like to bring to fruition around the social Web.</p>\n<h3 id=\"the-process-2\">The Process</h3>\n<p>The <em>ideal</em> flow is a bit traditional: biweekly grind on features, concept\ndevelopment and slinging that out to the public for commentary and review.\nUntil a more structured approach to voting on development is in place, I'll\nreserve final say on what gets out there — mainly since this is all\neffectively <em>pro-bono</em> (for now).</p>\n<p>Consider this the first download of many - to making things for people!</p>\n",
      "summary": "Getting things ready to show",
      "date_published": "2026-05-11T00:00:00.000Z",
      "date_modified": "2026-05-11T00:00:00.000Z",
      "authors": [
        {
          "name": "Jacky",
          "uri": "https://www.jacky.wtf"
        }
      ],
      "tags": [
        "meta"
      ]
    }
  ]
}