Under the hood
How the app is built
Familiar Faces hosts no Pools. It reads other people’s, checks each person’s rules, and sends one email a week. Here is every setting, how Theo’s and June’s groups were found, the block lists, the files, and what the v0.1 schema can’t say yet.
Settings, mapped to the spec
| Setting | Value | Spec | Why |
|---|---|---|---|
| Pools hosted | none | §8.3 §10.2 | Familiar Faces is a client. The groups belong to the places that keep them. Our discovery file lists no Pools. |
| How it finds your groups | your page’s address, and pages under it, in each Pool’s entries | §3.4 §3.5 | Pools and profiles are coupled by URL. Theo gave one address; three of his pages turned up. |
| How it finds other groups | hosts’ well-known files, and any registry | §8.3 §8.5 §10.1 | The same way anyone can. We hold no private directory. |
| Which Pools it reads | the rule on the About page | §3.2 | Friendship and community, never dating, never a Pool whose keepers ask us not to. |
| Unlisted Pools you’re in | only if you give us the address | §3.2 §8.2 | They are in no well-known file, on purpose. We don’t go looking. |
| Order of groups and people | the order they said yes | §3.4 | No ranking and no score, so nothing to optimize. |
| Your mutuals | people listed in two or more of your groups | §3.5 | A keeper counts only where their own page is listed. |
| Verification | beside every person, in words and with an icon | §4.5 §11.2 | Always the level from the group they appear through, because a vouch is local to one Pool. |
| Who can write to whom | KindlingDemo.canMessage: accept_from, no_cold_messages, the Pool’s floor, two block lists | §7.1 §7.2 §7.3 | Checked for every group you share, with the reason in words, before anything is sent. |
| Block lists | Kindling public · Circular consortium | §7.3 | Every hello is checked against both. |
| Requests | answered with the host’s own handshake, here or at the host | §5.2 | One room, many doors: an answer on the Board shows here, and the other way round. |
| Auto-accept | shown, never set for you | §5.5 | Theo and June have none, so a request waits for them. |
| Leaving a group | one action, a withdrawal to its keeper | §5.3 | From every screen that names the group, and from the email. |
| Silent inclusion | impossible here | §5.1 §11.2 | Familiar Faces can’t add anyone to anything. “Ask to be asked in” writes to a keeper; you still say yes. |
| Transport | email, and one digest a week | §6.1 | No notifications, no badges. Everything works from an inbox. |
| Portraits | drawn from each person’s own page, never copied or stored | §2.5 | People without pictures on their page get their initials. |
| What we read from a page | the parsed profile, and the pictures | §2.3 | Never age, gender or what anyone is seeking, even where a page says it. |
| Dormant Pools | shown to members with a notice and the keeper vote | §9.1 §9.3 | Chess After Close is resting; Theo sees why, and the vote. |
| Money | nothing at the connection layer | §1.3 | Hosts chip in by choice, which buys no placement. |
| Loading a product | index.html#load-<product key>, from the Kindling registry, embedded when the app is built | §3.5 §8.3 | The Groups screen shows only that product’s groups, by the same rule as above: yours where you’re in them, nearby ones you could join, and ones read only for their members, each saying so. Clear it and everything is as before. |
No Pools of its own
A host publishes /.well-known/kindling-pool so crawlers and registries can find its Pools §8.3 §10.2. Familiar Faces’ file names who we are and how to reach us, and lists no Pools, because we keep none. It lives with the company’s site: familiarfaces.example/.well-known/kindling-pool.
The app reads the manifests linked from the compatibility table, each at its own host.
{
"schema_version": "0.1",
"pools": [],
"operator": {
"name": "Familiar Faces, a friendship app that reads the groups you already belong to",
"contact": "hello@familiarfaces.example",
"url": "https://familiarfaces.example"
}
}
How each viewer’s groups were found
One address each, compared with every manifest’s entries §3.5, with each entry’s own consent proof §3.4.
Theo Lindqvist
Gave us theo-lindqvist.carrd.example. Found in:
- Chess After Close · theo-lindqvist.carrd.example · 8 January 2026 ·
email-link - Ada Quillon’s Listeners · theo-lindqvist.carrd.example · 20 June 2026 ·
email-link - New in Town · theo-lindqvist.carrd.example · 20 August 2026 ·
email-link - Start a Band: Port Ellery · theo-lindqvist.carrd.example · 25 August 2026 ·
email-link - Friday Subs · theo-lindqvist.carrd.example · 2 September 2026 ·
email-link - Rain Check: Everyone · theo-lindqvist.carrd.example · 3 September 2026 ·
email-link - Port Ellery Thursdays · theo-lindqvist.carrd.example · 3 September 2026 ·
email-link - Rides to Appointments · theo-lindqvist.carrd.example/rides · 5 September 2026 ·
curator-vouching - Meals When It’s Hard · theo-lindqvist.carrd.example/meals · 6 September 2026 ·
email-link - Release Night: Kitchen Light at the Ferry Room, Friday 16 October · theo-lindqvist.carrd.example · 21 September 2026 ·
email-link
June Okafor
Gave us june-okafor.notion.example. Found in:
- Lend and Borrow · june-okafor.notion.example/lend · 18 January 2026 ·
email-link - Seed and Cutting Swap · june-okafor.notion.example · 10 February 2026 ·
email-link - Tuesday Morning Walkers · june-okafor.notion.example · 4 March 2026 ·
email-link - Fix-It Friday Volunteers · june-okafor.notion.example · 6 March 2026 ·
email-link - Slack Water 2026 · june-okafor.notion.example · 29 August 2026 ·
email-link - Crew and Volunteers · june-okafor.notion.example · 31 August 2026 ·
email-link - Circular Correspondents · june-okafor.notion.example · 1 September 2026 ·
email-link - Release Night: Kitchen Light at the Ferry Room, Friday 16 October · june-okafor.notion.example · 24 September 2026 ·
email-link
The block lists every hello is checked against
Anything on these lists is refused before it reaches anyone §7.3.
Kindling public block list
Copy: blocklist.json · version 3, 20 September 2026
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.
| Type | Target | Reason |
|---|---|---|
implementation | scrapekit/0.3 | scraping |
identity | promo-blast@mail.example | spam |
The Circular consortium block list
Copy: examples/circular/blocklist.json · version 8, 27 September 2026
Shared by every member of the Circular consortium. Each member subscribes; any member may propose an entry, and two others must second it.
| Type | Target | Reason |
|---|---|---|
curator_identity | listed-them-anyway@mail.example | consent_violation |
pool_url | https://free-friends-now.example/pools/everyone.json | consent_violation |
identity | bulk-intros@relay.example | spam |
implementation | scrapekit/0.3 | scraping |
Messages, as the app writes them
Samples, each validated against kindling_message.schema.json. The app writes the same shapes when you say hello or leave a group; open the message under any of them.
- messages/digest-theo-2026-09-28.json
Theo’s Monday email (system) - messages/digest-june-2026-09-28.json
June’s Monday email (system) - messages/hello-june-to-elena.json
June says hello to Elena through Fix-It Friday (intro) - messages/withdrawal-theo-friday-subs.json
Theo leaves Friday Subs (withdrawal)
What the v0.1 schema can’t say yet
Where the specification text and a schema disagree, our JSON follows the schema. These are the gaps that touch an app like Familiar Faces.
- A client has no place in the protocol.
v0.1 defines hosts, UIs, parsers and messaging clients §11, but nothing for an app that only reads other people’s Pools. Familiar Faces publishes a well-known file with no Pools, so crawlers find an operator and a contact. A Pool can’t tell which apps read it.
- Nothing links one person’s pages.
Theo keeps a page for Meals When It’s Hard at …carrd.example/meals. Nothing in v0.1 says it is his §3.5. We count a page under your own address as yours, and say so. A page on another host would not be found.
- Hosts can’t say which apps should read them.
Foul Weather Friends asks that no app read the Check-In Circle; Slack Water and Rain Check name the apps that should read theirs. There is no field for this, so the notes travel outside the manifests, and we follow them by hand.
- Nothing says “this Pool is for dating”.
Intent tags are free text §3.2. We keep out any Pool tagged
dating. A Pool taggedromancewould slip through, and one tagged both friendship and dating is kept out whole. - No field for an event, a weekly night or a rhythm.
Tuesdays at eight, the first Friday, release night on 16 October: all of it lives in charters and governance rules §3.2, and in hosts’ notes. This week is built from sentences we quote, and a charter that changes its wording drops out of the week until we read it again.
- A keeper is not a member.
Curators are listed apart from entries §3.2. Ada keeps her listeners’ list without being on it, so she is Theo’s mutual only through Start a Band.
- A digest has no message type, and no single Pool.
§6.3 lists four types and the schema six. Neither has a digest, so the Monday email is a
systemmessage spanning several Pools, andvia_poolholds one, so it has none. - There is no way to ask to join.
The handshake starts with a curator §5.2. “Ask to be asked in” is an ordinary email to the keeper.
- Verification is per entry.
A vouch is local to one Pool §4.4. Theo is vouched in Rides to Appointments and email verified everywhere else, so the same person shows two levels on one screen.
- A Pool’s sender floor can’t name vouching.
Friday Subs asks senders to be at least
oauth§7.1. Theo, email verified, can’t write through it; he can write to the same people through Start a Band. - Mutual interest has no field.
no_cold_messagesneeds “confirmed mutual interest” §7.2, and nothing records it. - Level names differ between the text and the schema.
§4.5 says
email-verifiedandoauth-verified; the schemas sayemailandoauth. Our JSON follows the schemas; our screens use words. - Leaving, for a keeper.
June keeps the seed swap and is listed in it. A withdrawal §5.3 takes her page off the list; nothing in v0.1 says what happens to her keeping it. We say so on the screen and leave the keeping alone.