Invented example, from an invented consortium · built on Kindling · Why Kindling · The library · The spec · The Circular

The CircularThe consortium paper · Mondays

Under the hood

How the paper is made, and what it leaves out.

How it’s madeEvery Monday, before dawn

The Circular is a registry, of the kind anyone may run (§8.5), set as a newspaper. Its reader was written by Imani Brooks, a correspondent, and it does eleven things in order.

  1. Read twenty-eight well-known files. One per site, at /.well-known/kindling-pool on its domain (§8.3, §10.1). Registries must be able to read them without asking, and the paper doesn’t ask.
  2. Check each file. Against well_known_pool.schema.json. All 28 valid.
  3. Read the 60 manifests they list. Only addresses a file lists; the paper never guesses one (§3.1). Each must be on the same host as the file that lists it, the authority check RFC 0007 asks crawlers to make.
  4. Check each manifest. Against pool_manifest.schema.json. All 60 valid.
  5. Keep public Pools. A Pool listed or declared unlisted or invite-only would be dropped here (§3.2). Today none was listed.
  6. Drop noindex profiles. Any entry whose parsed profile says kindling_noindex is left out (§2.7). Today there were none, of 344 entries.
  7. Keep status as published. Dormant prints as dormant, archived as archived (§9.1, §9.4). The project’s Pools print as planned, on the project’s word.
  8. Read two block lists. The ones the printed Pools subscribe to (§7.3).
  9. Count the members. A member is an organization whose Pools read the consortium’s list, as each manifest’s block_list_subscriptions says. That makes twenty-three, this paper among them: twenty-two seen in the manifests, and Queer Harbor, whose file lists no Pools, from the desk’s own roll. Members propose and second entries, so the desk knows who they are. A site that keeps no Pools is a reader, not a member, and the project, whose Pools read only its own list, is not a member.
  10. Group people by address. One page, one address, however many Pools list it (§3.5). Except the personal columns: personals, non-monogamy and chosen family are never joined up with anyone’s other columns.
  11. Print. Every Monday. Profiles are as each Pool last parsed them; the paper parses nothing itself. The apps’ own Pools, five of them, are set as a directory with counts and a link, not as ads.

Every file read90 files

Each address is where the file is published. The local copy is the same file, mirrored beside these pages, and the build checks that the two are identical.

90 files, read in this order on 28 September 2026, as circular-reader (+https://thecircular.example/under-the-hood.html)
Read atFileAddressLocal copyHeldSchema
05:00:01 UTCWell-known file · Roomfulroomful.example/.well-known/kindling-poolroomful/.well-known/kindling-pool0 Pools listedValid
05:00:02 UTCWell-known file · Familiar Facesfamiliarfaces.example/.well-known/kindling-poolfamiliar-faces/.well-known/kindling-pool0 Pools listedValid
05:00:03 UTCWell-known file · Many Moonsmanymoons.example/.well-known/kindling-poolmany-moons/.well-known/kindling-pool2 Pools listedValid
05:00:04 UTCPool manifest · Many Moonsmanymoons.example/pools/harbor-counties.jsonmany-moons/pools/harbor-counties.json7 entries, 7 printedValid
05:00:05 UTCPool manifest · Many Moonsmanymoons.example/pools/solo-poly-supper.jsonmany-moons/pools/solo-poly-supper.json2 entries, 2 printedValid
05:00:06 UTCWell-known file · Hearthholdhearthhold.example/.well-known/kindling-poolhearthhold/.well-known/kindling-pool2 Pools listedValid
05:00:07 UTCPool manifest · Hearthholdhearthhold.example/pools/platonic-partners.jsonhearthhold/pools/platonic-partners.json3 entries, 3 printedValid
05:00:08 UTCPool manifest · Hearthholdhearthhold.example/pools/later-life-housemates.jsonhearthhold/pools/later-life-housemates.json3 entries, 3 printedValid
05:00:09 UTCWell-known file · Late Supperlatesupper.example/.well-known/kindling-poollate-supper/.well-known/kindling-pool1 Pool listedValid
05:00:10 UTCPool manifest · Late Supperlatesupper.example/pools/matchmakers.jsonlate-supper/pools/matchmakers.json1 entry, 1 printedValid
05:00:11 UTCWell-known file · Scattered Lightscatteredlight.example/.well-known/kindling-poolscattered-light/.well-known/kindling-pool1 Pool listedValid
05:00:12 UTCPool manifest · Scattered Lightscatteredlight.example/pools/stewards.jsonscattered-light/pools/stewards.json3 entries, 3 printedValid
05:00:13 UTCWell-known file · Foul Weather Friendsfoulweatherfriends.example/.well-known/kindling-poolfoul-weather-friends/.well-known/kindling-pool3 Pools listedValid
05:00:14 UTCPool manifest · Foul Weather Friendsfoulweatherfriends.example/pools/lend-and-borrow.jsonfoul-weather-friends/pools/lend-and-borrow.json7 entries, 7 printedValid
05:00:15 UTCPool manifest · Foul Weather Friendsfoulweatherfriends.example/pools/rides-to-appointments.jsonfoul-weather-friends/pools/rides-to-appointments.json3 entries, 3 printedValid
05:00:16 UTCPool manifest · Foul Weather Friendsfoulweatherfriends.example/pools/meals-when-its-hard.jsonfoul-weather-friends/pools/meals-when-its-hard.json4 entries, 4 printedValid
05:00:17 UTCWell-known file · Midspanmidspan.ellerycoast.example/.well-known/kindling-poolmidspan/.well-known/kindling-pool1 Pool listedValid
05:00:18 UTCPool manifest · Midspanmidspan.ellerycoast.example/pools/midspan-mentors.jsonmidspan/pools/midspan-mentors.json5 entries, 5 printedValid
05:00:19 UTCWell-known file · Seen Workseenwork.example/.well-known/kindling-poolseen-work/.well-known/kindling-pool1 Pool listedValid
05:00:20 UTCPool manifest · Seen Workseenwork.example/pools/seen-work-curators.jsonseen-work/pools/seen-work-curators.json2 entries, 2 printedValid
05:00:21 UTCWell-known file · The Boardboard.elleryfreelibrary.example/.well-known/kindling-poolboard/.well-known/kindling-pool7 Pools listedValid
05:00:22 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/tuesday-walkers.jsonboard/pools/tuesday-walkers.json4 entries, 4 printedValid
05:00:23 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/seed-swap.jsonboard/pools/seed-swap.json3 entries, 3 printedValid
05:00:24 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/conversation-partners.jsonboard/pools/conversation-partners.json3 entries, 3 printedValid
05:00:25 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/carpool-to-the-coast.jsonboard/pools/carpool-to-the-coast.json2 entries, 2 printedValid
05:00:26 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/chess-after-close.jsonboard/pools/chess-after-close.json3 entries, 3 printedValid
05:00:27 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/new-in-town.jsonboard/pools/new-in-town.json2 entries, 2 printedValid
05:00:28 UTCPool manifest · The Boardboard.elleryfreelibrary.example/pools/fix-it-friday.jsonboard/pools/fix-it-friday.json3 entries, 3 printedValid
05:00:29 UTCWell-known file · Ferry Room Playersferryroom.example/.well-known/kindling-poolferry-room/.well-known/kindling-pool5 Pools listedValid
05:00:30 UTCPool manifest · Ferry Room Playersferryroom.example/pools/friday-subs.jsonferry-room/pools/friday-subs.json3 entries, 3 printedValid
05:00:31 UTCPool manifest · Ferry Room Playersferryroom.example/pools/start-a-band.jsonferry-room/pools/start-a-band.json4 entries, 4 printedValid
05:00:32 UTCPool manifest · Ferry Room Playersferryroom.example/pools/horns-and-strings.jsonferry-room/pools/horns-and-strings.json2 entries, 2 printedValid
05:00:33 UTCPool manifest · Ferry Room Playersferryroom.example/pools/demo-swap.jsonferry-room/pools/demo-swap.json2 entries, 2 printedValid
05:00:34 UTCPool manifest · Ferry Room Playersferryroom.example/pools/door-and-sound-crew.jsonferry-room/pools/door-and-sound-crew.json1 entry, 1 printedValid
05:00:35 UTCWell-known file · Correo Lentocorreolento.example/.well-known/kindling-poolcorreo-lento/.well-known/kindling-pool4 Pools listedValid
05:00:36 UTCPool manifest · Correo Lentocorreolento.example/pools/espanol-english.jsoncorreo-lento/pools/espanol-english.json4 entries, 4 printedValid
05:00:37 UTCPool manifest · Correo Lentocorreolento.example/pools/portugues-english.jsoncorreo-lento/pools/portugues-english.json4 entries, 4 printedValid
05:00:38 UTCPool manifest · Correo Lentocorreolento.example/pools/francais-english.jsoncorreo-lento/pools/francais-english.json2 entries, 2 printedValid
05:00:39 UTCPool manifest · Correo Lentocorreolento.example/pools/tagalog-english.jsoncorreo-lento/pools/tagalog-english.json2 entries, 2 printedValid
05:00:40 UTCWell-known file · The Circularthecircular.example/.well-known/kindling-pool.well-known/kindling-pool1 Pool listedValid
05:00:41 UTCPool manifest · The Circularthecircular.example/pools/correspondents.jsonpools/correspondents.json4 entries, 4 printedValid
05:00:42 UTCWell-known file · Drip Linedriplineclimbing.example/.well-known/kindling-pooldrip-line/.well-known/kindling-pool4 Pools listedValid
05:00:43 UTCPool manifest · Drip Linedriplineclimbing.example/pools/drip-line-belay.jsondrip-line/pools/drip-line-belay.json6 entries, 6 printedValid
05:00:44 UTCPool manifest · Drip Linedriplineclimbing.example/pools/drip-line-regulars.jsondrip-line/pools/drip-line-regulars.json6 entries, 6 printedValid
05:00:45 UTCPool manifest · Drip Linedriplineclimbing.example/pools/drip-line-saturday-run.jsondrip-line/pools/drip-line-saturday-run.json7 entries, 7 printedValid
05:00:46 UTCPool manifest · Drip Linedriplineclimbing.example/pools/drip-line-new.jsondrip-line/pools/drip-line-new.json2 entries, 2 printedValid
05:00:47 UTCWell-known file · Ada Quillonadaquillon.example/.well-known/kindling-poolada-quillon/.well-known/kindling-pool4 Pools listedValid
05:00:48 UTCPool manifest · Ada Quillonadaquillon.example/pools/ada-listeners.jsonada-quillon/pools/ada-listeners.json12 entries, 12 printedValid
05:00:49 UTCPool manifest · Ada Quillonadaquillon.example/pools/release-night-port-ellery.jsonada-quillon/pools/release-night-port-ellery.json3 entries, 3 printedValid
05:00:50 UTCPool manifest · Ada Quillonadaquillon.example/pools/house-show-tacoma.jsonada-quillon/pools/house-show-tacoma.json3 entries, 3 printedValid
05:00:51 UTCPool manifest · Ada Quillonadaquillon.example/pools/portland-october-23.jsonada-quillon/pools/portland-october-23.json2 entries, 2 printedValid
05:00:52 UTCWell-known file · Rain Checkraincheckgames.example/.well-known/kindling-poolrain-check/.well-known/kindling-pool6 Pools listedValid
05:00:53 UTCPool manifest · Rain Checkraincheckgames.example/pools/rain-check-everyone.jsonrain-check/pools/rain-check-everyone.json18 entries, 18 printedValid
05:00:54 UTCPool manifest · Rain Checkraincheckgames.example/pools/rain-check-port-ellery.jsonrain-check/pools/rain-check-port-ellery.json5 entries, 5 printedValid
05:00:55 UTCPool manifest · Rain Checkraincheckgames.example/pools/rain-check-olympia.jsonrain-check/pools/rain-check-olympia.json3 entries, 3 printedValid
05:00:56 UTCPool manifest · Rain Checkraincheckgames.example/pools/rain-check-tacoma.jsonrain-check/pools/rain-check-tacoma.json4 entries, 4 printedValid
05:00:57 UTCPool manifest · Rain Checkraincheckgames.example/pools/rain-check-portland.jsonrain-check/pools/rain-check-portland.json3 entries, 3 printedValid
05:00:58 UTCPool manifest · Rain Checkraincheckgames.example/pools/rain-check-game-day.jsonrain-check/pools/rain-check-game-day.json8 entries, 8 printedValid
05:00:59 UTCWell-known file · Slack Waterslackwaterfest.example/.well-known/kindling-poolslack-water/.well-known/kindling-pool5 Pools listedValid
05:01:00 UTCPool manifest · Slack Waterslackwaterfest.example/pools/slack-water-2026.jsonslack-water/pools/slack-water-2026.json18 entries, 18 printedValid
05:01:01 UTCPool manifest · Slack Waterslackwaterfest.example/pools/slack-water-2025.jsonslack-water/pools/slack-water-2025.json7 entries, 7 printedValid
05:01:02 UTCPool manifest · Slack Waterslackwaterfest.example/pools/slack-water-sessions.jsonslack-water/pools/slack-water-sessions.json8 entries, 8 printedValid
05:01:03 UTCPool manifest · Slack Waterslackwaterfest.example/pools/slack-water-crew.jsonslack-water/pools/slack-water-crew.json5 entries, 5 printedValid
05:01:04 UTCPool manifest · Slack Waterslackwaterfest.example/pools/slack-water-rides.jsonslack-water/pools/slack-water-rides.json5 entries, 5 printedValid
05:01:05 UTCWell-known file · Wren’s Listwrenslist.example/.well-known/kindling-poolindependent/wrens-list/.well-known/kindling-pool1 Pool listedValid
05:01:06 UTCPool manifest · Wren’s Listwrenslist.example/pools/date-me-docs-cascadia.jsonindependent/wrens-list/pools/date-me-docs-cascadia.json4 entries, 4 printedValid
05:01:07 UTCWell-known file · Second Tide Bookssecondtidebooks.example/.well-known/kindling-poolindependent/second-tide/.well-known/kindling-pool1 Pool listedValid
05:01:08 UTCPool manifest · Second Tide Bookssecondtidebooks.example/pools/singles-shelf.jsonindependent/second-tide/pools/singles-shelf.json4 entries, 4 printedValid
05:01:09 UTCWell-known file · Queer Harborqueerharbor.example/.well-known/kindling-poolindependent/queer-harbor/.well-known/kindling-pool0 Pools listedValid
05:01:10 UTCWell-known file · Face Upfaceup.example/.well-known/kindling-poolapps/face-up/.well-known/kindling-pool1 Pool listedValid
05:01:11 UTCPool manifest · Face Upfaceup.example/pools/face-up-cascadia.jsonapps/face-up/pools/face-up-cascadia.json22 entries, 22 printedValid
05:01:12 UTCWell-known file · Heartwoodheartwood.example/.well-known/kindling-poolapps/heartwood/.well-known/kindling-pool2 Pools listedValid
05:01:13 UTCPool manifest · Heartwoodheartwood.example/pools/heartwood-nearby.jsonapps/heartwood/pools/heartwood-nearby.json23 entries, 23 printedValid
05:01:14 UTCPool manifest · Heartwoodheartwood.example/pools/heartwood-friends.jsonapps/heartwood/pools/heartwood-friends.json9 entries, 9 printedValid
05:01:15 UTCWell-known file · Sundialsundial.example/.well-known/kindling-poolapps/sundial/.well-known/kindling-pool1 Pool listedValid
05:01:16 UTCPool manifest · Sundialsundial.example/pools/sundial-cascadia.jsonapps/sundial/pools/sundial-cascadia.json20 entries, 20 printedValid
05:01:17 UTCWell-known file · Card Catalogcardcatalog.example/.well-known/kindling-poolapps/card-catalog/.well-known/kindling-pool1 Pool listedValid
05:01:18 UTCPool manifest · Card Catalogcardcatalog.example/pools/card-catalog-cascadia.jsonapps/card-catalog/pools/card-catalog-cascadia.json24 entries, 24 printedValid
05:01:19 UTCWell-known file · Bellowsbellows.example/.well-known/kindling-poolapps/bellows/.well-known/kindling-pool0 Pools listedValid
05:01:20 UTCWell-known file · Thresholdthreshold.example/.well-known/kindling-poolapps/threshold/.well-known/kindling-pool0 Pools listedValid
05:01:21 UTCWell-known file · Cape Tarrow Alumnialumni.capetarrow.example/.well-known/kindling-poolmidspan/cape-tarrow/.well-known/kindling-pool1 Pool listedValid
05:01:22 UTCPool manifest · Cape Tarrow Alumnialumni.capetarrow.example/pools/first-gen-alumni.jsonmidspan/cape-tarrow/pools/first-gen-alumni.json5 entries, 5 printedValid
05:01:23 UTCWell-known file · Kindling (the project)kindling.foundation/.well-known/kindling-pool.well-known/kindling-pool5 Pools listedValid
05:01:24 UTCPool manifest · Kindling (the project)kindling.foundation/pools/founding-curators.jsonproduct/pools/founding-curators.json7 entries, 7 printedValid
05:01:25 UTCPool manifest · Kindling (the project)kindling.foundation/pools/client-builders.jsonproduct/pools/client-builders.json3 entries, 3 printedValid
05:01:26 UTCPool manifest · Kindling (the project)kindling.foundation/pools/spec-readers.jsonproduct/pools/spec-readers.json4 entries, 4 printedValid
05:01:27 UTCPool manifest · Kindling (the project)kindling.foundation/pools/working-group.jsonproduct/pools/working-group.json3 entries, 3 printedValid
05:01:28 UTCPool manifest · Kindling (the project)kindling.foundation/pools/writers-and-researchers.jsonproduct/pools/writers-and-researchers.json3 entries, 3 printedValid
05:01:29 UTCBlock listprotocol.kindling.foundation/blocklist.jsonblocklist.jsonversion 3, 2 entriesValid
05:01:30 UTCBlock listthecircular.example/blocklist.jsonblocklist.jsonversion 8, 4 entriesValid

What it skipped, and why0 this week

  • Pools listed as unlisted or invite-only: 0. None of the twenty-eight files lists one, which is how it should be: those Pools travel by invitation, not by file.
  • Files that list no Pools: five. Roomful, Familiar Faces, Bellows and Threshold keep none; their files say so. Queer Harbor keeps one and lists none, and that is right too: Dee Okonkwo, who keeps it, says on their own page that the bar’s dating list is unlisted because the regulars asked (§3.2).
  • Manifests that declared themselves unlisted or invite-only: 0.
  • Profiles with kindling_noindex: 0 of 344 entries (§2.7).
  • Files that failed their schema: 0 of 90.
  • Manifests served from another host than their well-known file: 0.
  • Well-known entries that disagree with their manifest: 0. The paper compares status, name, intent tags and the last-updated date. Where they disagree, it prints the manifest and says so.
  • Status against activity. Every Pool that says active changed its manifest within 90 days. The nearest to the line is Client Builders, 88 days. A manifest date is not the whole story: a curator who reviews handshakes without editing the file is still active (§9.1).
  • Addresses the paper was never given. Not counted, and not guessed.
  • Profile pages and photos. Not fetched. The paper prints the parsed profile each Pool publishes and stores no photo bytes (§2.5).

Block listsPublic, and free of names

The Circular consortium block list

Shared by every member of the Circular consortium. Each member subscribes; any member may propose an entry, and two others must second it.

Version 8, published 27 September 2026 by The Circular consortium · blocklist.json, published by this paper · read by 55 of the 60 printed Pools

Entries in The Circular consortium block list
TargetIdentifierReasonAdded
curator identitylisted-them-anyway@mail.exampleconsent violation: Submitted other people’s pages, a whole household’s among them, to Pools without asking any of them.27 September 2026
pool urlfree-friends-now.example/pools/everyone.jsonconsent violation: Listed profiles that never accepted a handshake.26 September 2026
identitybulk-intros@relay.examplespam3 September 2026
implementationscrapekit/0.3scraping: Also on the Kindling public list.3 July 2026

Kindling public block list

The block list the Kindling project will publish under SPEC.md §7.3, for identities and implementations with confirmed abuse. The entries here are illustrative until the registry opens. No personal details are ever published.

Version 3, published 20 September 2026 by Kindling maintainers · the project’s blocklist.json · read by 60 of the 60 printed Pools

Entries in Kindling public block list
TargetIdentifierReasonAdded
identitypromo-blast@mail.examplespam14 August 2026
implementationscrapekit/0.3scraping: Ignores kindling-noindex and robots signals.2 July 2026
Who reads which list, from each manifest’s block_list_subscriptions
SitePoolsRead the project’s listRead the consortium’s list
Many Moons222
Hearthhold222
Late Supper111
Scattered Light111
Foul Weather Friends333
Midspan111
Seen Work111
The Board777
Ferry Room Players555
Correo Lento444
The Circular111
Drip Line444
Ada Quillon444
Rain Check666
Slack Water555
Wren’s List111
Second Tide Books111
Face Up111
Heartwood222
Sundial111
Card Catalog111
Cape Tarrow Alumni111
Kindling (the project)550

Not in the table: Queer Harbor, Roomful, Familiar Faces, Bellows and Threshold, which have no manifest the paper can read. Queer Harbor is on the desk’s roll as a member. Roomful, Familiar Faces, Bellows and Threshold say on their own Under the hood pages that they honor both lists. The gap.

The two newest consortium entries name a curator’s identity and a Pool’s address. Entries hold an identifier, a reason category, an optional line about behavior and a date. They never hold a person’s name or page.

SettingsMapped to the spec

The paper’s settings, mapped to the specification
SettingValueSpecWhy
What the paper isA third-party registry§8.5Anyone may run one. A Pool’s place in it, or out of it, is its curator’s decision, made by what they publish.
Where it looks/.well-known/kindling-pool on each site§8.3, §10.1The one file every Pool host should publish, readable without asking.
How it crawlsHonors Cache-Control, backs off on 429 and 5xx, and names itself: circular-reader (+https://thecircular.example/under-the-hood.html)§10.3So a site can tell who is reading, and how to reach them.
What it printsPublic Pools only§3.2Unlisted and invite-only Pools stay with the people who were given their address.
NoindexNever printed§2.7A page that asks to be in no registry is in none, this one included.
Dormant and archivedPrinted with their status§9.1, §9.4Members of a quiet Pool should hear about the vote, and so should everyone else.
VerificationIn words and with an icon, beside every ad§4.5A reader should always see how the person in an ad proved their address.
Circling an adChecked in your browser against the Pool’s block lists and minimum, and the person’s own rules§7.1, §7.2, §7.3The paper shows what the rules say. It sends nothing.
MessagesNone carried§6.1An introduction goes from the asker’s client to the owner’s address, through the Pool, by email.
Block listPublishes the consortium’s list, version 8§7.3Third parties may publish their own. Any member proposes; two others second.
MembersTwenty-three: the organizations whose Pools read the consortium’s list§7.3, §3.3Counted from each manifest’s block_list_subscriptions, not from a hand list, so the paper and the files cannot disagree.
ReadersRoomful, Familiar Faces, Bellows and Threshold: apps that keep no Pools and honor the list§7.3, §8.3Printed beside the members, not among them. A reader has no Pools to put in a column.
The apps’ own PoolsA directory: keepers, counts, verification and a link to the app§3.2, §4.5Each lists about twenty people. Set as ads they would swamp the paper, and each app shows its own people in full, with their rules.
Personal columnsPersonals, non-monogamy and chosen family are never joined up with anyone’s other columns§3.2, §3.5A person may be out in one Pool and private in another. The paper prints each ad where its owner put it, and nowhere else.
Our Pool: visibilitypublic§3.2Who writes the paper should be public.
Our Pool: consentuniversal-opt-in§5.2Ruth asks; each writer says yes or no.
Our Pool: curatorRuth Adler Signed in with OAuth§3.2, §4.5The editor keeps the column of the people who write it.
Our Pool: handshake window14 days, the default§5.2A column can wait two weeks for an answer.
Our Pool: block listsThe project’s and the consortium’s§7.3Every consortium Pool reads both.

Our own filesLaid out

Circular Correspondents pools/correspondents.json

name
Circular Correspondents
curator
Ruth AdlerSigned in with OAuth
visibility
public
consent_model
universal-opt-in
intent_tags
writing · editing · volunteering
charter
People who write for the Circular: a column, a notice, a report from a Pool worth knowing about. Unpaid, credited, edited kindly. We print only what Pools publish about themselves.
curator_contact
desk@thecircular.example
block_list_subscriptions
protocol.kindling.foundation/blocklist.json
thecircular.example/blocklist.json
status
active; created 1 August 2026, updated 1 September 2026
entries
4: Ruth Adler (oauth, email-link), Imani Brooks (oauth, oauth), Obinna Eze (email, email-link) and June Okafor (email, email-link)
The manifest, as JSON
{
  "schema_version": "0.1",
  "id": "correspondents",
  "name": "Circular Correspondents",
  "curator": [
    {
      "identity": "ruth@mail.example",
      "display_name": "Ruth Adler",
      "verification_level": "oauth",
      "primary": true
    }
  ],
  "intent_tags": [
    "writing",
    "editing",
    "volunteering"
  ],
  "visibility": "public",
  "consent_model": "universal-opt-in",
  "curator_contact": "desk@thecircular.example",
  "charter": "People who write for the Circular: a column, a notice, a report from a Pool worth knowing about. Unpaid, credited, edited kindly. We print only what Pools publish about themselves.",
  "messaging_preferences": {
    "block_list_subscriptions": [
      "https://protocol.kindling.foundation/blocklist.json",
      "https://thecircular.example/blocklist.json"
    ]
  },
  "status": "active",
  "created_at": "2026-08-01T11:00:00Z",
  "updated_at": "2026-09-01T16:40:00Z",
  "entries": [
    {
      "profile_url": "https://ruth-adler.notion.example",
      "parsed_profile": {
        "schema_version": "0.1",
        "profile_url": "https://ruth-adler.notion.example",
        "display_name": "Ruth Adler",
        "pronouns": "she/her",
        "location": {
          "city": "Chicago",
          "region": "Illinois",
          "country": "United States"
        },
        "intent_tags": [
          "writing",
          "editing",
          "curating"
        ],
        "about": "Editor of the Circular. Spent thirty years on a city desk and still circles things in red.",
        "contact_methods": [
          {
            "type": "email",
            "value": "ruth@mail.example",
            "label": "Kindling identity"
          }
        ],
        "verification": {
          "level": "oauth",
          "verified_at": "2026-08-01T12:00:00Z",
          "verifier": "google"
        },
        "messaging_preferences": {
          "accept_from": "verified",
          "no_cold_messages": false,
          "minimum_curator_verification": "email"
        },
        "kindling_noindex": false,
        "parsed_at": "2026-08-01T12:00:00Z",
        "parser": "kindling-parser/0.1.1"
      },
      "parsed_at": "2026-08-01T12:00:00Z",
      "consent_proof": {
        "handshake_id": "hs-circular-correspondents-ruth",
        "accepted_at": "2026-08-01T12:00:00Z",
        "method": "email-link"
      },
      "verification_level": "oauth",
      "added_at": "2026-08-01T12:00:00Z",
      "added_by": "ruth@mail.example"
    },
    {
      "profile_url": "https://imani-builds.example",
      "parsed_profile": {
        "schema_version": "0.1",
        "profile_url": "https://imani-builds.example",
        "display_name": "Imani Brooks",
        "pronouns": "she/her",
        "location": {
          "city": "Baltimore",
          "region": "Maryland",
          "country": "United States"
        },
        "intent_tags": [
          "building",
          "open-source",
          "writing"
        ],
        "about": "Built the reader that prints the Circular from well-known files. Writes small tools that do one thing.",
        "contact_methods": [
          {
            "type": "email",
            "value": "imani@mail.example",
            "label": "Kindling identity"
          }
        ],
        "verification": {
          "level": "oauth",
          "verified_at": "2026-08-01T12:30:00Z",
          "verifier": "google"
        },
        "messaging_preferences": {
          "accept_from": "verified",
          "no_cold_messages": false,
          "minimum_curator_verification": "email"
        },
        "kindling_noindex": false,
        "parsed_at": "2026-08-01T12:30:00Z",
        "parser": "kindling-parser/0.1.1"
      },
      "parsed_at": "2026-08-01T12:30:00Z",
      "consent_proof": {
        "handshake_id": "hs-circular-correspondents-imani",
        "accepted_at": "2026-08-01T12:30:00Z",
        "method": "oauth"
      },
      "verification_level": "oauth",
      "added_at": "2026-08-01T12:30:00Z",
      "added_by": "ruth@mail.example"
    },
    {
      "profile_url": "https://obinna-eze.example",
      "parsed_profile": {
        "schema_version": "0.1",
        "profile_url": "https://obinna-eze.example",
        "display_name": "Obinna Eze",
        "pronouns": "he/him",
        "location": {
          "city": "Lagos",
          "country": "Nigeria"
        },
        "intent_tags": [
          "journalism",
          "writing"
        ],
        "about": "Technology reporter. Covers open protocols and the people who keep them running.",
        "contact_methods": [
          {
            "type": "email",
            "value": "obinna@mail.example",
            "label": "Kindling identity"
          }
        ],
        "verification": {
          "level": "email",
          "verified_at": "2026-08-20T09:00:00Z"
        },
        "messaging_preferences": {
          "accept_from": "verified",
          "no_cold_messages": false,
          "minimum_curator_verification": "email"
        },
        "kindling_noindex": false,
        "parsed_at": "2026-08-20T09:00:00Z",
        "parser": "kindling-parser/0.1.1"
      },
      "parsed_at": "2026-08-20T09:00:00Z",
      "consent_proof": {
        "handshake_id": "hs-circular-correspondents-obinna",
        "accepted_at": "2026-08-20T09:00:00Z",
        "method": "email-link"
      },
      "verification_level": "email",
      "added_at": "2026-08-20T09:00:00Z",
      "added_by": "ruth@mail.example"
    },
    {
      "profile_url": "https://june-okafor.notion.example",
      "parsed_profile": {
        "schema_version": "0.1",
        "profile_url": "https://june-okafor.notion.example",
        "display_name": "June Okafor",
        "pronouns": "she/her",
        "location": {
          "city": "Port Ellery",
          "country": "United States"
        },
        "intent_tags": [
          "gardening",
          "walking",
          "friendship",
          "writing"
        ],
        "about": "Retired shipyard electrician. Saves seeds from the same tomatoes her mother grew. Walks the harbor loop most mornings.",
        "contact_methods": [
          {
            "type": "email",
            "value": "june@mail.example",
            "label": "Kindling identity"
          }
        ],
        "verification": {
          "level": "email",
          "verified_at": "2026-09-01T16:40:00Z"
        },
        "messaging_preferences": {
          "accept_from": "shared-pool",
          "no_cold_messages": false,
          "minimum_curator_verification": "email"
        },
        "kindling_noindex": false,
        "parsed_at": "2026-09-01T16:40:00Z",
        "parser": "kindling-parser/0.1.1"
      },
      "parsed_at": "2026-09-01T16:40:00Z",
      "consent_proof": {
        "handshake_id": "hs-circular-correspondents-june",
        "accepted_at": "2026-09-01T16:40:00Z",
        "method": "email-link"
      },
      "verification_level": "email",
      "added_at": "2026-09-01T16:40:00Z",
      "added_by": "ruth@mail.example"
    }
  ]
}

Our well-known file .well-known/kindling-pool

pools
1: Circular Correspondents, public, active
manifest_url
thecircular.example/pools/correspondents.json
last_updated
1 September 2026
operator
The Circular consortium · desk@thecircular.example
The file, as JSON
{
  "schema_version": "0.1",
  "pools": [
    {
      "manifest_url": "https://thecircular.example/pools/correspondents.json",
      "name": "Circular Correspondents",
      "intent_tags": [
        "writing",
        "editing",
        "volunteering"
      ],
      "visibility": "public",
      "status": "active",
      "last_updated": "2026-09-01T16:40:00Z"
    }
  ],
  "operator": {
    "name": "The Circular consortium",
    "contact": "desk@thecircular.example",
    "url": "https://thecircular.example"
  }
}

The demo request handshake/demo-request.json

The handshake Ruth sent June, used on An introduction. It validates against handshake_message.schema.json.

The request, as JSON
{
  "schema_version": "0.1",
  "type": "handshake-request",
  "handshake_id": "hs-circular-correspondents-june-demo",
  "pool": {
    "url": "https://thecircular.example/pools/correspondents.json",
    "name": "Circular Correspondents",
    "charter": "People who write for the Circular: a column, a notice, a report from a Pool worth knowing about. Unpaid, credited, edited kindly. We print only what Pools publish about themselves.",
    "curator_identity": "ruth@mail.example",
    "curator_verification": "oauth",
    "intent_tags": [
      "writing",
      "editing",
      "volunteering"
    ],
    "visibility": "public"
  },
  "profile_url": "https://june-okafor.notion.example",
  "sent_at": "2026-08-30T12:00:00Z",
  "expires_at": "2026-09-13T12:00:00Z",
  "accept_url": "https://thecircular.example/handshake/hs-circular-correspondents-june-demo/accept",
  "decline_url": "https://thecircular.example/handshake/hs-circular-correspondents-june-demo/decline"
}

A circled introduction messages/circled-intro.json

Theo’s intro to Darío through Start a Band, from the same page. It validates against kindling_message.schema.json.

What the v0.1 schema can’t say yetThe gaps that touch a registry

Where the spec’s text and a schema disagree, the files here follow the schema, and the paper says where.

  1. §10.2 names fields the well-known schema doesn’t have (§10.2)

    The spec says each entry lists name, pool_url, visibility, intent_tags, status and curator_contact. The schema calls the address manifest_url, makes name optional, and has no curator_contact at all, and forbids extra fields, so no file can add it. The paper reads manifest_url and takes the contact from each manifest.

  2. The schema lists “discoverable” Pools; the spec says every Pool (§10.2, §8.3)

    The schema describes its pools array as “all Pools hosted on this domain that are discoverable”. §10.2 says the file must list each Pool on the domain. Many Moons, Hearthhold, Late Supper, Scattered Light, Foul Weather Friends, Midspan, Seen Work, Drip Line and Queer Harbor follow the schema and leave their private Pools out, which is what their members need; Queer Harbor’s file lists none at all. A registry can’t tell “this site keeps nothing else” from “this site keeps more, privately”, so the paper says so instead of counting.

  3. There is no word for planned (§9.1)

    Status is active, dormant or archived. The project’s five Pools are planned and not open, and their files say active, because nothing else fits. The paper marks them planned on the project’s own word, from its pages, not from any field.

  4. Nothing says a curator vote is open (§9.3)

    A dormant Pool’s file says dormant, and that is all. The nominee, the window and the count live on the Board’s and Slack Water’s own pages, so that is where the paper read them.

  5. Nothing says when a Pool began, in the well-known file (§8.3)

    The file carries last_updated but not a creation date, so “new this week” needs every manifest’s created_at.

  6. RFC 0007 asks for a signed manifest; the manifest has no signature (§8.3)

    The RFC asks crawlers to confirm each listed address “resolves to a valid manifest signed by a plausible curator identity”. The manifest schema has no signature field. The paper checks what it can: the manifest validates, and it lives on the same host as the file that lists it.

  7. A registry has no format of its own (§8.5)

    The six schemas cover profiles, Pools, handshakes, messages, well-known files and block lists. None describes a registry’s listing, so the Circular publishes its reading as these pages, not as a file another registry could read.

  8. §4.5 level names differ from the schemas (§4.5)

    The spec names email-verified, oauth-verified, curator-vouched and unverified. The schemas use email, oauth, curator-vouched, unverified and cryptographic. The JSON follows the schemas.

  9. No record of what a parser inferred (§2.3)

    §2.3 names an extraction_source field. The parsed-profile schema has none, and forbids extra fields, so the paper can’t tell readers which lines of an ad were read from h-card and which were inferred.

  10. §7.3 lists abusers by identity; the lists hold more (§7.3)

    The spec describes a list of known abusers identified by Kindling identity. The schema also allows a profile address, a Pool address, a curator identity or a piece of software, and the consortium list uses a curator’s identity, a Pool’s address and a program. The glossary calls a block list “signed”; the schema makes the signature optional, and neither list here carries one.

  11. A reader has nowhere to say which lists it honors (§7.3, §8.3)

    A Pool names its block lists in its manifest. An app that keeps no Pools has no manifest, and the well-known file has no field for lists, so Roomful, Familiar Faces, Bellows and Threshold can say it only in prose, on their own pages. A member whose Pools are all unlisted is in the same place: nothing public says it reads the list. The paper takes the readers at their word and counts Queer Harbor from the desk’s roll, and says so.

  12. Messages: §6.3 lists four types, the schema six; §6.2 says pool_ref (§6.2, §6.3)

    The schema adds withdrawal and system, and names the Pool reference via_pool. The intro on this site and the withdrawal on Correspondents follow the schema.

  13. §12.1 says kindling_version; every schema says schema_version (§12.1)

    The paper reads schema_version, as every file here carries it.

  14. The handshake window has no field (§5.2)

    §5.2 calls the 14-day window configurable per Pool. The manifest can’t say so; a Pool carries its window in each request’s expires_at. Correspondents uses the default.