Skip to the page

Invented app · built on Kindling · Why Kindling · The apps · The library · The spec

Card Catalogsearch-first · people, filed by what they’re here for

Under the hood

How the catalog is filed

Card Catalog is search-first, with every field people chose to fill in, across every Pool it may open. Here is one Pool in all three layers, the drawers and where every Pool opens, the settings behind every screen and the spec section each one follows, the block lists it honors, and where the v0.1 schemas can’t yet say what the spec means.

One Pool, three layers

Belay Partners, at Drip Line

The same Pool is a page on its host’s own site, a JSON file anyone can read, and a card in any app that reads it. Here is André’s entry, all three ways, as Halima sees it in our Climbing drawer.

  1. 1 · The site layer

    A page on Drip Line’s own site

    Drip Line keeps the Pool on its own domain, with its charter, its curators and the belay check that is its vouch.

    Belay Partners on Drip Line

  2. 2 · The data layer

    A JSON file anyone can read

    The manifest, valid against pool_manifest.schema.json, with André’s entry and his parsed profile. Every field on the card below marked v0.1 comes from here. drip-line-belay.json

    {
      "schema_version": "0.1",
      "id": "drip-line-belay",
      "name": "Belay Partners",
      "curator": [
        {
          "identity": "pilar@mail.example",
          "display_name": "Pilar Echeverría",
          "verification_level": "oauth",
          "primary": true
        },
        {
          "identity": "emil@mail.example",
          "display_name": "Emil Kowalczyk",
          "verification_level": "oauth",
          "primary": false
        }
      ],
      "intent_tags": [
        "climbing",
        "belay",
        "partners"
      ],
      "visibility": "public",
      "consent_model": "vouching-required",
      "curator_contact": "desk@driplineclimbing.example",
      "charter": "Climbers who passed a staff belay check at Drip Line and would like to be asked to climb, most often on Saturday mornings. The check is our vouch in this Pool and nowhere else: one of us watched you tie in, belay, catch a fall and lower, once, here. Say what you climb and when, in your own words. Nobody pays to be here or to be introduced.",
      "geographic_scope": {
        "city": "Seattle",
        "region": "Washington",
        "country": "United States"
      },
      "governance_rules": "Vouching-required. A member of floor staff watches each climber once, at the gym: a harness on right, a figure-eight follow-through, the device loaded and locked, the brake hand never off the rope, a caught fall, a smooth lower, and the calls. Then they vouch, and the Pool asks. The vouch means that, here, on that day. It is local to this Pool (Kindling §4.4) and carries into no other Pool, app or gym. A check that does not pass is a “not yet”, told in person, and written down nowhere. If staff see an unsafe belay later, they talk to you on the floor and ask you to check again; until then your entry comes off this Pool. Handshake requests wait the default 14 days. Memberships and day passes pay for the gym, the staff and the checks. Nobody pays to be in a Pool or to be introduced.",
      "messaging_preferences": {
        "block_list_subscriptions": [
          "https://protocol.kindling.foundation/blocklist.json",
          "https://thecircular.example/blocklist.json"
        ],
        "minimum_sender_verification": "email"
      },
      "status": "active",
      "created_at": "2025-10-07T17:00:00Z",
      "updated_at": "2026-09-23T02:05:00Z",
      "entries": [
        {
          "profile_url": "https://andre-baptiste.example",
          "parsed_profile": {
            "schema_version": "0.1",
            "profile_url": "https://andre-baptiste.example",
            "display_name": "André Baptiste",
            "pronouns": "he/him",
            "location": {
              "city": "Seattle",
              "region": "Washington",
              "country": "United States"
            },
            "intent_tags": [
              "climbing",
              "lead",
              "belay",
              "bouldering"
            ],
            "about": "Middle-school science teacher. Leads in the gym, and would like a steady Saturday partner who does not mind a slow warm-up.",
            "contact_methods": [
              {
                "type": "email",
                "value": "andre@mail.example",
                "label": "Kindling identity"
              }
            ],
            "verification": {
              "level": "curator-vouched",
              "verified_at": "2025-11-05T02:30:00Z",
              "verifier": "pilar@mail.example"
            },
            "messaging_preferences": {
              "accept_from": "verified",
              "no_cold_messages": false,
              "minimum_curator_verification": "email"
            },
            "kindling_noindex": false,
            "parsed_at": "2025-11-05T02:30:00Z",
            "parser": "kindling-parser/0.1.1"
          },
          "parsed_at": "2025-11-05T02:30:00Z",
          "consent_proof": {
            "handshake_id": "hs-drip-line-drip-line-belay-andre",
            "accepted_at": "2025-11-05T02:30:00Z",
            "method": "curator-vouching"
          },
          "verification_level": "curator-vouched",
          "added_at": "2025-11-05T02:30:00Z",
          "added_by": "pilar@mail.example"
        },
        "… and 5 more entries"
      ]
    }
  3. 3 · The app layer

    A card in Card Catalog

    Filed under CLM 01 in the Climbing drawer. André’s own page adds his job, languages, interests and pictures; everything else is from the file. His rules take any verified sender, so Halima can write to him herself.

    1. CLM 02 · Tuesday Regulars · +1 more

      Baptiste, André

      he/him · Seattle · in Seattle too

      Signed in with OAuth

      “People who boulder at Drip Line most weeks, often on Tuesday nights, and would like the other regulars to know their name.”

      Filed under 1. bouldering 2. climbing 3. friendship 4. regulars · public

      Kept by Hugo Sandoval · on Drip Line · its JSON · this card

      You can write now

Where a Pool’s introductions go through a curator: the request Yesenia’s yes to Priya becomes, in Midspan Mentors, to Fina, validated against the message schema
{
  "schema_version": "0.1",
  "message_id": "msg-cc-ask-yesenia-priya-1",
  "type": "intro",
  "sender": {
    "identity": "yesenia@mail.example",
    "display_name": "Yesenia Robles",
    "verification_level": "email",
    "profile_url": "https://yesenia-robles.carrd.example"
  },
  "recipient": {
    "identity": "fina@mail.example"
  },
  "via_pool": {
    "url": "https://midspan.ellerycoast.example/pools/midspan-mentors.json",
    "id": "midspan-mentors",
    "name": "Midspan Mentors"
  },
  "sent_at": "2026-09-28T09:40:00Z",
  "subject": "A request for an introduction to Priya, through Card Catalog",
  "body": {
    "content_type": "text/plain",
    "content": "Hi Fina,\n\nI am taking nursing prerequisites two classes at a time and working evenings. Priya’s card says she did it while working as an aide. Would you ask her whether she would talk to me about it?\n\nYesenia\n\n(Asked about the card for Priya Raman, https://docs.example/d/priya-raman-mentoring, in Midspan Mentors.)"
  },
  "transport": {
    "type": "email",
    "message_headers": {
      "X-Kindling-Client": "Card Catalog"
    }
  }
}

Settings, mapped to the spec

What we chose, and why

SettingValueSpecWhy Card Catalog chose it
Our two rulesRule 1: “Every card shows the Pool’s name, charter and tags.” Rule 2: “No one is shown as open to dating unless their own tags say so.”§3.2The only rules we claim. The rest is what the spec asks of every reader, cited in the rows below.
Drawers11 shortcuts by purpose: Dating, Friends and neighbors, Chosen family and home, Mentors, Trades, Lending, meals and rides, Music, Climbing and running, Game night, Volunteering and crews, and The Kindling project; and Other Pools, where the 7 Pools that fit none open under their own names§3.2Shortcuts, not gates. A Pool whose intent_tags fit a drawer opens there; any other Pool we may open opens under its own name, and a loaded product under the product’s.
Pools read67 of 70: 60 public, for everyone; 7 unlisted, only for a member or by address§8.3Any Pool we may open opens, the way a browser opens any page. We own none of the people.
Unlisted PoolsRead only for a member, or for someone who pastes the address, and then only for them. “Add a Pool by address” in the app.§3.2Visibility is the Pool’s choice, and the spec asks every reader to keep it. Where a Pool says its list is for members, we show its curators instead; where it asks members to add it themselves, they do.
Invite-only PoolsNever read, even with an address§3.2Only a Pool’s members can see an invite-only Pool.
A site’s own wordThe Check-In Circle is never read: Foul Weather Friends asks apps not to, and its address travels only by hand§3.2We treat it the way a browser treats a site that asks not to be read.
Pools hostedOne: Card Catalog: Cascadia, public, universal opt-in, 24 entries§3.1A drawer of our own for people who ask for a card: the Dating drawer’s home. Any app may read it.
Discovery fileLists our one Pool, active§10.2So registries and other apps can find it without asking us.
What a card isOne page, in one drawer, under every Pool of that drawer that lists it§2.1Someone in two drawers has two cards, each under its own Pool. A card never mentions the other.
Card fields for everyoneFrom the Pool file’s v0.1 parsed profile: name, pronouns, place, about, their own tags, verification, contact method, messaging rules§2.3The data layer is what every app can read the same way.
Card fields from a pageOnly where the page the card points to has them: 127 of 236 cards. Dating: everything a dating page says. Other drawers: job, languages, interests§2.4The v0.1 parsed profile has no age, gender or answers; a page may. We read the page and copy nothing but the words.
Every cardThe Pool’s name, a line of its charter and its tags, with its visibility, its curator, and links to the Pool on its own site and as JSON§3.2Rule 1: “Every card shows the Pool’s name, charter and tags.”
The Dating drawerOnly people whose own intent_tags include dating: the tag itself, not the Pool and not the page. No card elsewhere shows a dating field.§2.3Rule 2: “No one is shown as open to dating unless their own tags say so.” A card may list a person’s own tags, dating among them, because that is them saying so.
PicturesIllustrations drawn from the picture descriptions on the page a card points to. A page with none gets initials.§2.5Photos are referenced by URL only, and a page with none gets initials.
Blank fieldsNot searchable. A filter that would leave out blanks says how many.§2.2Parsers must not infer values that contradict a page, and we infer nothing.
OrderNewest (default), Nearest, A to Z; in Dating also Last active and Most answers in common. Named above every result.§1.2UIs are ours to design. Ours has no hidden order and no score.
VerificationBeside every card, in words and with an icon, per Pool§4.5A conforming UI must show it. A curator’s vouch is shown only on that Pool’s line.
Messaging rulesKindlingDemo.canMessage for every Pool a card is filed under, with pool_url, pool_members, the Pool’s own block lists and its minimum sender level§7.2We say in words whether you can write, Pool by Pool, and which rule holds you back.
CuratorsA yes becomes a request to a curator only where a Pool’s charter or governance_rules say introductions go through one: Midspan Mentors, Harbor Trades, Late Supper’s tables, Hearthhold’s stewards, and Hester for Meals When It’s Hard. Also where a person’s own rules take first contact only through a curator’s vouch.§7consent_model says how people join, not how they are introduced (§4.4). Where a curator makes the introductions, “Write” becomes “Ask the curator”.
A Pool’s own termsCorreo Lento: slow letters by email, one a week at most, and the co-op holds a first letter until both people say they want to write. The Orchard Street Household: for context only, so nobody is introduced from it.§7.2A yes goes the way the Pool says, and by each person’s own rules. Its yes uses the Pool’s own verb: “Write a letter”.
Resting PoolsChess After Close and Slack Water 2025: open, and say they are resting§9.1Nobody in a resting Pool is hidden for it.
YesesFree and unlimited, each saying what it is for, kept in the app§7.2Both people saying yes opens a conversation with a no-cold-messages person. v0.1 has no message for a yes; see the gaps below.
Letters and requestskindling_message intro and reply, with via_pool, over email§6.1People without Card Catalog can answer from their mail. A request to a curator is an intro to the curator.
Block listsThe ones each Pool subscribes to: Kindling’s public list, and for library Pools The Circular’s consortium list§7.3A Pool’s own subscriptions travel with its manifest.
Handshake window14 days, carried in each request’s expires_at§5.2The manifest has no field for the window, so the governance rules say it and the request carries it.
Leaving a PoolPull my card: one button, a withdrawal message§5.3The Pool must act within 60 seconds.
Leaving the appOne button; deletes only app data§5.3Your pages, Pools, mutuals and letters were never ours to keep.
NoindexRespected§2.7A page that says kindling-noindex is in no Pool, so it has no card.
CrawlingHonors Cache-Control, backs off on 429 and 5xx, identifies itself: CardCatalog/2.0 (+https://cardcatalog.example/crawler)§10.3Pool hosts are small. We are polite.
VersionsReads newer minor versions; refuses a newer major one, and says so§12.2A manifest we can’t read correctly is one we don’t file.
MoneyNothing at the connection layer; donations and a small grant§1.3Nobody pays to be introduced, or for any field or drawer.

Our Pool and our discovery file

Card Catalog: Cascadia

The Dating drawer’s home. The manifest, without its 24 entries, and the discovery file that lists it §3.2 §10.2. Both validate against the repo’s schemas.

The whole manifest as JSON, with every entry and its consent proof · .well-known/kindling-pool · The request Ambrose sends Simone

{
  "schema_version": "0.1",
  "pools": [
    {
      "manifest_url": "https://cardcatalog.example/pools/card-catalog-cascadia.json",
      "name": "Card Catalog: Cascadia",
      "intent_tags": [
        "dating"
      ],
      "visibility": "public",
      "status": "active",
      "geographic_scope": {
        "region": "Cascadia"
      },
      "last_updated": "2026-09-26T15:20:00Z"
    }
  ],
  "operator": {
    "name": "Card Catalog, search-first, with every field people chose to fill in",
    "contact": "desk@cardcatalog.example",
    "url": "https://cardcatalog.example"
  }
}
{
  "schema_version": "0.1",
  "id": "card-catalog-cascadia",
  "name": "Card Catalog: Cascadia",
  "curator": [
    {
      "identity": "ambrose@mail.example",
      "display_name": "Ambrose Achterberg",
      "verification_level": "oauth",
      "primary": true
    }
  ],
  "intent_tags": [
    "dating"
  ],
  "visibility": "public",
  "consent_model": "universal-opt-in",
  "curator_contact": "desk@cardcatalog.example",
  "charter": "A drawer of cards, one for each person in Cascadia who asked for one, filed under every field they chose to fill in: city, age, faith, children, languages, height, what they are looking for, and any word on their own page. Search the way you like and sort the way you like; we rank nobody. When you find someone, mark their card. If they mark yours too, you can write.",
  "geographic_scope": {
    "region": "Cascadia"
  },
  "governance_rules": "Universal opt-in. A card shows only what a person’s own page says. A blank field stays blank: we never guess anyone’s age, faith, gender or anything else, and nobody can search for a field someone left empty. Cards are refiled when a page changes. Reports go to the librarian at desk@cardcatalog.example. Leave in one tap; the card is pulled within a minute.",
  "messaging_preferences": {
    "block_list_subscriptions": [
      "https://protocol.kindling.foundation/blocklist.json",
      "https://thecircular.example/blocklist.json"
    ]
  },
  "status": "active",
  "created_at": "2026-01-12T10:00:00Z",
  "updated_at": "2026-09-26T15:20:00Z"
}

The Pools we read, drawer by drawer

Where every Pool opens, and where a yes goes

Found through discovery files §8.3, or by an address a person gives us, checked against pool_manifest.schema.json, filtered by each Pool’s block lists and by noindex. The drawers first, then Other Pools, each under its own name. The three we never read, and why, are in the table on our About page.

PoolDrawerVisibilityConsentCardsA yes goes toPool’s sender floorManifest
Card Catalog: CascadiaDAT 01 Datingpublicuniversal-opt-in24The personNone setcard-catalog-cascadia.json
Face Up: CascadiaDAT 02 Datingpublicvouching-required22The personEmail verifiedface-up-cascadia.json
Heartwood: NearbyDAT 03 Datingpublicuniversal-opt-in23The personNone setheartwood-nearby.json
Sundial: CascadiaDAT 04 Datingpublicuniversal-opt-in20The personNone setsundial-cascadia.json
Date-Me Docs: CascadiaDAT 05 Datingpublicuniversal-opt-in4The personNone setdate-me-docs-cascadia.json
The Singles ShelfDAT 06 Datingpublicuniversal-opt-in4The personNone setsingles-shelf.json
Many Moons: Harbor CountiesDAT 07 Datingpublicuniversal-opt-in5The personNone setharbor-counties.json
Late Supper MatchmakersDAT 08 Datingpubliccurator-only-adds0The personNone setmatchmakers.json
Queer Harbor: DatingDAT 09 Datingunlisteduniversal-opt-in3The personNone setqueer-harbor-dating.json
The Tuesday TableDAT 10 Datingunlistedcurator-only-adds4CuratorSigned in with OAuthtuesday-table.json
Second ChaptersDAT 11 Datingunlistedcurator-only-adds2CuratorSigned in with OAuthsecond-chapters.json
Heartwood: Friends nearbyFRN 01 Friends and neighborspublicuniversal-opt-in9The personNone setheartwood-friends.json
Tuesday Morning WalkersFRN 02 Friends and neighborspublicuniversal-opt-in4The personNone settuesday-walkers.json
Seed and Cutting SwapFRN 03 Friends and neighborspublicuniversal-opt-in3The personNone setseed-swap.json
New in TownFRN 04 Friends and neighborspublicuniversal-opt-in2The personNone setnew-in-town.json
Conversation Partners, Any LanguageFRN 05 Friends and neighborspublicvouching-required3The personNone setconversation-partners.json
Many Moons: Harbor CountiesFRN 06 Friends and neighborspublicuniversal-opt-in7The personNone setharbor-counties.json
Solo Poly Supper ClubFRN 07 Friends and neighborspublicuniversal-opt-in2The personNone setsolo-poly-supper.json
Platonic Life PartnersFAM 01 Chosen family and homepublicvouching-required3CuratorSigned in with OAuthplatonic-partners.json
Later-Life HousematesFAM 02 Chosen family and homepublicuniversal-opt-in3The personNone setlater-life-housemates.json
Intentional Co-ParentsFAM 03 Chosen family and homeunlistedvouching-required3CuratorSigned in with OAuthco-parents.json
Midspan MentorsMEN 01 Mentorspublicvouching-required5CuratorNone setmidspan-mentors.json
Cape Tarrow First-Gen AlumniMEN 02 Mentorspublicuniversal-opt-in5The personNone setfirst-gen-alumni.json
Seen Work CuratorsTRD 01 Tradespubliccurator-only-adds2The personNone setseen-work-curators.json
Seen Work: Harbor TradesTRD 02 Tradesunlistedvouching-required6CuratorEmail verifiedharbor-trades.json
Lend and BorrowLND 01 Lending, meals and ridespublicuniversal-opt-in7The personNone setlend-and-borrow.json
Meals When It’s HardLND 02 Lending, meals and ridespublicuniversal-opt-in4CuratorNone setmeals-when-its-hard.json
Rides to AppointmentsLND 03 Lending, meals and ridespublicvouching-required3The personEmail verifiedrides-to-appointments.json
Carpool to the CoastLND 04 Lending, meals and ridespublicuniversal-opt-in2The personNone setcarpool-to-the-coast.json
Rides HomeLND 05 Lending, meals and ridespublicuniversal-opt-in5The personNone setslack-water-rides.json
Friday SubsMUS 01 Musicpublicuniversal-opt-in3The personSigned in with OAuthfriday-subs.json
Start a Band: Port ElleryMUS 02 Musicpublicuniversal-opt-in4The personNone setstart-a-band.json
Horns and Strings for RecordsMUS 03 Musicpublicuniversal-opt-in2The personNone sethorns-and-strings.json
Songwriters’ Demo SwapMUS 04 Musicpublicuniversal-opt-in2The personNone setdemo-swap.json
Session PlayersMUS 05 Musicpublicuniversal-opt-in8The personNone setslack-water-sessions.json
Slack Water 2026MUS 06 Musicpublicuniversal-opt-in18The personNone setslack-water-2026.json
Ada Quillon’s ListenersMUS 07 Musicpublicuniversal-opt-in12The personEmail verifiedada-listeners.json
Release Night: Kitchen Light at the Ferry Room, Friday 16 OctoberMUS 08 Musicpublicuniversal-opt-in3The personEmail verifiedrelease-night-port-ellery.json
House Show in Tacoma, Saturday 17 OctoberMUS 09 Musicpublicuniversal-opt-in3The personEmail verifiedhouse-show-tacoma.json
Portland, Friday 23 OctoberMUS 10 Musicpublicuniversal-opt-in2The personEmail verifiedportland-october-23.json
Slack Water 2025MUS 11 Musicpublicuniversal-opt-in7The personNone setslack-water-2025.json
Belay PartnersCLM 01 Climbing and runningpublicvouching-required6The personEmail verifieddrip-line-belay.json
Tuesday RegularsCLM 02 Climbing and runningpublicuniversal-opt-in6The personNone setdrip-line-regulars.json
The Saturday RunCLM 03 Climbing and runningpublicuniversal-opt-in7The personNone setdrip-line-saturday-run.json
New to ClimbingCLM 04 Climbing and runningpublicuniversal-opt-in2The personNone setdrip-line-new.json
Thursday Night: Women and Nonbinary ClimbersCLM 05 Climbing and runningunlisteduniversal-opt-in5The personNone setdrip-line-thursdays.json
Rain Check: EveryoneGAM 01 Game nightpublicuniversal-opt-in18The personEmail verifiedrain-check-everyone.json
Port Ellery ThursdaysGAM 02 Game nightpublicuniversal-opt-in5The personEmail verifiedrain-check-port-ellery.json
Olympia ThursdaysGAM 03 Game nightpublicuniversal-opt-in3The personEmail verifiedrain-check-olympia.json
Tacoma ThursdaysGAM 04 Game nightpublicuniversal-opt-in4The personEmail verifiedrain-check-tacoma.json
Portland ThursdaysGAM 05 Game nightpublicuniversal-opt-in3The personEmail verifiedrain-check-portland.json
Big Game DayGAM 06 Game nightpublicuniversal-opt-in8The personEmail verifiedrain-check-game-day.json
Chess After CloseGAM 07 Game nightpublicuniversal-opt-in3The personNone setchess-after-close.json
Fix-It Friday VolunteersVOL 01 Volunteering and crewspublicuniversal-opt-in3The personNone setfix-it-friday.json
Door and Sound CrewVOL 02 Volunteering and crewspublicuniversal-opt-in1The personNone setdoor-and-sound-crew.json
Crew and VolunteersVOL 03 Volunteering and crewspubliccurator-only-adds5The personNone setslack-water-crew.json
Circular CorrespondentsVOL 04 Volunteering and crewspublicuniversal-opt-in4The personNone setcorrespondents.json
Founding CuratorsKIN 01 The Kindling projectpubliccurator-only-adds7The personNone setfounding-curators.json
Client BuildersKIN 02 The Kindling projectpublicuniversal-opt-in3The personNone setclient-builders.json
Spec ReadersKIN 03 The Kindling projectpublicuniversal-opt-in4The personNone setspec-readers.json
Toward a Working GroupKIN 04 The Kindling projectpublicvouching-required3The personNone setworking-group.json
Writers and ResearchersKIN 05 The Kindling projectpublicuniversal-opt-in3The personNone setwriters-and-researchers.json
Español ↔ EnglishOTH 01 Under its own namepublicuniversal-opt-in4The person, by letterNone setespanol-english.json
Français ↔ EnglishOTH 02 Under its own namepublicuniversal-opt-in2The person, by letterNone setfrancais-english.json
Late Supper MatchmakersOTH 03 Under its own namepubliccurator-only-adds1The personNone setmatchmakers.json
The Orchard Street HouseholdOTH 04 Under its own nameunlistedcurator-only-adds3Nobody: for context onlyNone setorchard-street-household.json
Português ↔ EnglishOTH 05 Under its own namepublicuniversal-opt-in4The person, by letterNone setportugues-english.json
Scattered Light StewardsOTH 06 Under its own namepubliccurator-only-adds3The personNone setstewards.json
Tagalog ↔ EnglishOTH 07 Under its own namepublicuniversal-opt-in2The person, by letterNone settagalog-english.json

Conformance

A Pool host, a Pool UI and a messaging client

A sample letter as Card Catalog writes it, validated against the schema: intro-simone-to-hamid.json. The request to Fina above is validated the same way.

  • §11.1, a compliant Pool host. Our Pool has a schema-valid manifest, runs the handshake with a 14-day window, follows the continuity rules, and is listed in our discovery file.
  • §11.2, a compliant Pool UI. Verification beside every card; every §7 layer checked, Pool by Pool, before anyone writes; one-button withdrawal; no silent inclusion.
  • §11.4, a compliant messaging client. Letters and requests are kindling_message envelopes with the sender’s level, and §7.1 gating applies.

Safety that travels

The block lists we honor

Checked on every letter, for every Pool a card is filed under, against the lists that Pool subscribes to §7.3.

Kindling public block list

Version 3, published 20 September 2026. The list as JSON.

  • scrapekit/0.3 · implementation · scraping
  • promo-blast@mail.example · identity · spam

The Circular consortium block list

Version 8, published 27 September 2026. The list as JSON.

  • listed-them-anyway@mail.example · curator_identity · consent_violation
  • https://free-friends-now.example/pools/everyone.json · pool_url · consent_violation
  • bulk-intros@relay.example · identity · spam
  • scrapekit/0.3 · implementation · scraping

Honest limits

What the v0.1 schema can’t say yet

Where the spec text and a schema disagree, our JSON follows the schema. These are the gaps that touch a search app.

  1. Pages say more than a parsed profile can (§2.4). The v0.1 parsed profile has no age, gender, seeking, job, languages or answers. Card Catalog reads them from the page each card points to, the way a browser would, and never stores photo bytes. Another app may read the page differently; the protocol doesn’t fix the fields yet.
  2. Where a field came from (§2.3). The spec asks parsers to record which fields came from h-card and which were inferred, in an extraction_source field. parsed_profile.schema.json has no such field and forbids extra properties, so we mark the source on screen instead: v0.1 or page.
  3. A drawer has no field (§3.2). A Pool says what it is for only through intent_tags. Our drawers are our own shortcuts over those tags, written down in our table of Pools; another app may file the same Pool differently, and a Pool that fits none of ours opens under its own name.
  4. A yes has no message (§7.2, §6.3). no_cold_messages means “require confirmed mutual interest”, but no message type says “yes”. Yeses are app-local: a yes made in Card Catalog stays here, and one made in Face Up, Heartwood or Sundial stays there.
  5. A Pool’s own contact rules (§7.2). Correo Lento’s one letter a week, and its hold on every first letter until both people say they want to write, are in its charter, its governance_rules and its site, not in any manifest field. We read the words and follow them.
  6. Asking a curator has no message type (§4.4, §6.3). When a Pool’s introductions go through its curator, a request is an ordinary intro to the curator, with via_pool. Nothing in v0.1 says “please introduce me to this entry”.
  7. A Pool’s list for members only (§3.2). Seen Work says contractors never see Harbor Trades. visibility has only public, unlisted and invite-only, so an unlisted Pool whose list is for members says so in governance_rules, and we follow the words.
  8. Verification level names (§4.5). The spec text names email-verified, oauth-verified, curator-vouched and unverified. The schemas use email, oauth, curator-vouched, unverified and cryptographic. Our JSON follows the schemas; the screen shows words.
  9. The handshake window (§5.2). The spec says the 14-day window is “configurable per Pool”. The manifest has no field for it, so our Pool carries it in each request’s expires_at and says so in governance_rules.
  10. Message types (§6.3). The spec lists four types. kindling_message.schema.json has six, adding withdrawal and system. Pulling your card sends a withdrawal.
  11. Messaging rule names (§7.2). The spec names open-to-all, pool-mates-only, vouched-only, no-cold-messages and minimum-sender-verification. The profile schema has accept_from and a no_cold_messages flag, and only a Pool can set a minimum sender level.
  12. Noindex is not privacy (§2.7). kindling_noindex: true means “don’t put me in any Pool”. Privacy inside a Pool comes from its visibility.