Under the hood
A client with no Pools of its own
What Roomful reads, how it finds it, what it honors, and where the v0.1 schemas can’t yet say what the spec means.
Our discovery file
Empty, on purpose
A domain that hosts Pools should publish a .well-known/kindling-pool file listing them §8.3 §10.1. We publish one too, with nothing in it. It says, in the protocol’s own format, that we host no Pools.
We host no Pools. We read yours. Read the file itself.
{
"schema_version": "0.1",
"pools": [],
"operator": {
"name": "Roomful, a dating app that hosts no Pools and reads the ones you joined",
"contact": "hello@roomful.example",
"url": "https://roomful.example"
}
}
Settings, mapped to the spec
What we chose, and why
| Setting | Value | Spec | Why Roomful chose it |
|---|---|---|---|
| Pools hosted | None. The discovery file lists an empty array. | §3.1 | We are a client, not a Pool host. Hosting Pools would make them ours to keep. |
| Discovery | Every well-known file we can find, and any registry | §8.3 | Well-known files are readable without asking; a registry is one reader of them, never the only way in (§8.4, §8.5). |
| Pools read | Public, active, tagged dating, whoever keeps them: a curator or another app | §3.2 | Anybody may read a public Pool, including one another app keeps for its own people. We keep to dating ones and leave friendship Pools to friendship apps. |
| Same person, several Pools | Shown once, behind the first door in the room’s order; the card names the other Pools | §3.5 | Profiles and Pools are loosely coupled by URL, so one page can be in many Pools. Each Pool keeps its own yes; we only avoid showing a face twice. |
| Who you see | People whose own page fits what yours says you’re looking for, and who are looking for someone like you. Everyone else is one choice away. | §2.1 | Age, gender and who someone is looking for live on their page, not in the parsed profile. We read them there, never guess a blank, and say how many we left out and why. |
| Unlisted Pools | Only with an address a person gave us, and only for that person | §3.2 | Unlisted means the address travels by hand. We never show, count or hint at one to anyone else. |
| Invite-only Pools | Never read | §3.2 | They are in no discovery file, and their own handshake is the only way in. |
| Verification | Shown beside every profile, in words and with an icon | §4.5 | A conforming client must show it. We also show it on who is asking. |
| Order | Curators’ doors (in town, then further out), then the apps’ own Pools, then unlisted; the curator’s own order inside | §4.4 | Curators know their scene. We add no score and sell no placement. |
| Messaging rules | Each person’s own: accept_from, no_cold_messages; a Pool’s minimum sender level | §7.2 | We check them before anything is sent, and say which rule held a message back. |
| Identity gating | Unverified senders are held back | §7.1 | Stronger verification passes; the recipient decides the rest. |
| Block lists | Kindling’s public list and The Circular’s | §7.3 | The same lists the Pools we read subscribe to, so safety travels with the people. |
| Leaving a Pool | One button, sent as a withdrawal to the Pool’s curator contact | §5.3 | The Pool must act within 60 seconds. We forward it at once. |
| Adding anyone | Impossible. We can show a Pool’s request; we can’t make one. | §5.1 | Silent inclusion is forbidden, and we have nothing to include anyone in. |
| Portraits and photos | Shown from each person’s own page, never stored | §2.5 | Nothing of yours to delete when you leave. In this example every portrait is an illustration of an invented person. |
| Noindex | Respected | §2.7 | A page that says kindling-noindex is in no Pool, so it is never in our room either. |
| Messages | Email underneath, with a thread in the app | §6.1 | People without Roomful can still answer. Maya did. |
| Crawling | Honors Cache-Control, backs off on 429 and 5xx, identifies itself: Roomful/1.0 (+https://roomful.example/crawler) | §10.3 | Hosts are small. We are polite. |
| Versions | Reads newer minor versions; refuses a newer major one, and says so | §12.2 | A manifest we can’t read correctly is one we don’t show. |
| Money | Nothing at the connection layer; thanks after an introduction worked, per the v0.2 draft | §1.3 | Nobody pays to be introduced, or to see who is interested. |
The Pools we read, and how
Discovery, step by step
- Fetch every
.well-known/kindling-poolfile we know of, and the Kindling registry’s list of them §8.3 §8.4. Nobody needs to give us permission to read these, and nobody pays to be in them. The files for the hosts below: Many Moons · Late Supper · Second Tide Books · Wren’s List · Card Catalog · Heartwood · Face Up · Sundial · Queer Harbor. - Keep the Pools that are
public,activeand taggeddating, whoever keeps them. That is 8 Pools today: four kept by curators, and four that other apps keep for their own people (Card Catalog, Heartwood, Face Up and Sundial). - Fetch each manifest, check it against
pool_manifest.schema.json, and check its major version §12.2. - Drop anyone whose page says noindex §2.7, and anyone on a block list we subscribe to §7.3.
- For a person who gives us an unlisted Pool’s address, read that Pool for them alone, and keep the address with their settings.
- Show each person once, behind the first door in the room’s order, and name their other Pools on their card §3.5.
- Read each person’s age, gender, who they’re looking for and portraits from their own page, which the parsed profile has no field for, and show a viewer only the people whose page and theirs fit each other, with everyone else one choice away §2.1 §2.5.
- Be polite to hosts: respect
Cache-Control, back off on 429 and 5xx, and send aUser-Agentwith a contact URL §10.3.
| Pool | Visibility | Tags | People | What we do | Manifest |
|---|---|---|---|---|---|
| Kept by curators | |||||
| Many Moons Many Moons: Harbor Counties | public | non-monogamy, community, friendship, dating | 7 | Read for everyone: public, active, tagged dating | harbor-counties.json |
| Late Supper Late Supper Matchmakers | public | matchmaking, dating | 1 | Read for everyone: public, active, tagged dating | matchmakers.json |
| Second Tide Books The Singles Shelf | public | dating, books | 4 | Read for everyone: public, active, tagged dating | singles-shelf.json |
| Wren’s List Date-Me Docs: Cascadia | public | dating, date-me-doc | 4 | Read for everyone: public, active, tagged dating | date-me-docs-cascadia.json |
| Kept by apps, for their own people | |||||
| Card Catalog Card Catalog: Cascadia | public | dating | 24 | Read for everyone: public, active, tagged dating. It is the Pool the app Card Catalog keeps for its own people | card-catalog-cascadia.json |
| Heartwood Heartwood: Nearby | public | dating | 23 | Read for everyone: public, active, tagged dating. It is the Pool the app Heartwood keeps for its own people | heartwood-nearby.json |
| Face Up Face Up: Cascadia | public | dating | 22 | Read for everyone: public, active, tagged dating. It is the Pool the app Face Up keeps for its own people | face-up-cascadia.json |
| Sundial Sundial: Cascadia | public | dating | 20 | Read for everyone: public, active, tagged dating. It is the Pool the app Sundial keeps for its own people | sundial-cascadia.json |
| Public, on the same hosts, and left alone | |||||
| Many Moons Solo Poly Supper Club | public | non-monogamy, solo-poly, friendship | 2 | Readable, and left alone: not tagged dating | solo-poly-supper.json |
| Heartwood Heartwood: Friends nearby | public | friendship | 9 | Readable, and left alone: not tagged dating | heartwood-friends.json |
| In no discovery file | |||||
| Unlisted Pools in no discovery file | unlisted | Not shown | Not counted | Read only for the person who gave us the address. Today, 1 person has given us one. | Address not printed |
| Invite-only Pools in no discovery file | invite-only | Not shown | Not counted | Never read, by us or any app | None |
The discovery files of other hosts list 50 more public Pools, from 15 hosts including Ada Quillon, Cape Tarrow Alumni, Correo Lento and Drip Line. We read their entries in the discovery files and leave them alone: none is tagged dating.
For readers of this library only: to check our arithmetic, the unlisted manifests are here as files: Queer Harbor: queer-harbor-dating.json · Many Moons: orchard-street-household.json · Late Supper: tuesday-table.json · Late Supper: second-chapters.json. A real Roomful would never print those addresses, and in this example’s world it doesn’t.
Conformance
A compliant Pool UI
We are not a Pool host, so §11.1 doesn’t apply to us. §11.2 and §11.4 do.
- Renders §4.5 verification levels alongside every profile. Every name card, every request, every sender line, in words and with an icon.
- Honors the §7 spam layers. Identity gating, each person’s own rules, and two shared block lists, checked before anything is sent.
- Supports §5.3 withdrawal. Leave this Pool is one button at the Pool’s door, and on the leave page.
- Never performs silent inclusion. We host no Pools, so there is nothing to include anyone in, and we never send a request on a curator’s behalf.
- And as a messaging client (§11.4): we validate envelopes against the schema, show the sender’s level, and apply §7.1 gating.
Safety that travels
The block lists we subscribe to
The same two lists every Pool we read subscribes to §7.3.
Kindling public block list
Version 3, published 20 September 2026. The list as JSON.
scrapekit/0.3· implementation · scrapingpromo-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_violationhttps://free-friends-now.example/pools/everyone.json· pool_url · consent_violationbulk-intros@relay.example· identity · spamscrapekit/0.3· implementation · scraping
The messages this site shows are sample files, validated against the schema: an ask, a yes, a no, a first letter. The handshake Wren’s List sends Jonah: demo-request.json.
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 client like us.
- Verification level names (§4.5). The spec text names
email-verified,oauth-verified,curator-vouchedandunverified. The schemas useemail,oauth,curator-vouched,unverifiedandcryptographic, and a curator is only everemail,oauthorcryptographic. Our JSON follows the schema; the screen shows words. - 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_sourcefield.parsed_profile.schema.jsonhas no such field and forbids extra ones. For date-me docs, which rarely carry h-card, this matters: we can show a person their own provenance, and can’t pass it on. - Age, gender and who someone is looking for (§2.4).
parsed_profile.schema.jsonhas no field for age, gender, who a person is looking for or what for, and forbids extra ones. It hasphoto_hints, image URLs only, with no alt text (§2.4, §2.5), and the Pools we read leave it empty. So a Pool can’t carry any of these, and every client reads them from the person’s own page, each time, in its own way. That keeps them where the person wrote them, but no Pool can vouch for them, and two clients may read the same page differently. We show what the page says in its own words, filter only on what it says, and never guess a blank. - Mutual interest has no message (§7.2, §6.3).
no-cold-messagesmeans “require confirmed mutual interest”, but no message type says “I’d like to hear from you”. We send asystemmessage with fixed text and no words from the sender, and treat areplyas the answer. Another client could do it differently. - Message types (§6.3). The spec lists four types.
kindling_message.schema.jsonhas six, addingwithdrawalandsystem. We use both. - The Pool reference (§6.2). The spec calls it
pool_ref; the schema calls itvia_pool. Our messages usevia_pool. - The messaging rule names (§7.2). The spec names
open-to-all,pool-mates-only,vouched-only,no-cold-messagesandminimum-sender-verification. The profile schema hasaccept_from(anyone,verified,shared-pool,vouched,none) and ano_cold_messagesflag, and no per-person minimum sender level; only a Pool can set one. We read the schema’s names. - The discovery file (§10.2). The spec says it lists, for each Pool on a domain,
pool_urlandcurator_contactamong others. The schema hasmanifest_url, an optionaloperatorfor the whole file, and lists only discoverable Pools, so unlisted ones are left out. That suits a client: we learn nothing about an unlisted Pool from a discovery file. - The version field (§12.1). The spec names
kindling_version; every schema usesschema_version. - Noindex is not privacy (§2.7).
kindling_noindex: truemeans “don’t put me in any Pool”. Privacy inside a Pool comes from its visibility. A client must never treat noindex as “hide me from apps”, or visibility as consent. - Thanks (v0.2 draft). Gratitude after an introduction is planned for v0.2 and has no field or message yet. Ours happens outside the protocol until it does.