Community directory
The organisation directory lists collectives whose steward made a separate, versioned directory publication choice. Making a profile visible at /c/…is not enough. The directory is a projection of an organisation’s declared facts, not a social graph, membership index or recommendation system.
The versioned directory checkbox is the current receipt this surface has. Existing public profiles were not opted in retroactively. The checkbox names searchable HTML, public JSON, the exact steward-written fields, platform-record timestamps, and the risk of third-party copies. It does not select platform-derived member or steward fields, or grant rights over the steward’s words beyond showing them. Stewards must not put personal data about another person in directory fields.
Two kinds of field
The API separates values by authorship:
- Steward-written fields: slug, display name, kind, region, languages, description and house rules. Their rights are
NOASSERTION; copyright remains with the applicable rightsholder. That label does not reduce Cambridge TCG’s responsibility for its processing or permit a steward to publish another person’s data. - Platform record fields:the collective row’s creation and update timestamps and its public URL. The timestamps describe the platform record lifecycle. They are not evidence of when publication began and are not attributed to the steward.
What the query cannot read
listPublicCollectives selects no collective record id, nosteward_user_id, no publication flag, and no member row. Its return type cannot hydrate the private Collectivemodel. A private collective is absent rather than represented by a redacted row, so this surface cannot confirm it exists. This is a structural claim: descriptions and house rules are steward-authored free text and could still contain personal data despite the structural exclusion. The notice therefore prohibits stewards from including personal data about another person and provides a correction/removal contact.
What is deliberately absent
- No roster or member count. A small-group count can reveal people even without names, and members have no directory-publication receipt.
- No dedicated identity field or people index. The query selects no platform-derived steward/member identity and does not search account records. It does search steward-authored names and description text, so Cambridge TCG treats reports of personal data in those fields as correction/removal requests rather than shifting responsibility to a steward.
- No ranking or inference. Rows are ordered by display name and slug for stability. No size, trust, volume, similarity or affinity score is computed.
- No facet counts. Facets name filter values present among public rows but do not publish a histogram of the set.
Public reach, indexing and copies
The directory is available as public HTML and a cross-origin public JSON API. Anyone can view it. Search engines, AI crawlers and other third parties may index, copy or redistribute the slug, display name, kind, region, languages, description, house rules and platform-record times. Names and descriptions are searchable; kind, region and language are filters. Withdrawing a listing stops Cambridge TCG’s future directory responses but cannot recall a copy already fetched by a third party.
To correct or remove a listing, the steward can turn it off in account management. Anyone can also email [email protected], including where a field contains personal data about them.
Search and pagination bounds
The JSON endpoint returns 400 INVALID_INPUT for an unknown kind, malformed or out-of-range limit/offset, or text beyond the documented maximum. It does not silently turn invalid explicit input into a different query, and repeated values are rejected as ambiguous. NUL and other Unicode general-category Cc characters are rejected before any database read. The HTML page is forgiving: unsupported or repeated URL filters are ignored with a visible notice, and a page beyond the end returns to the last available page (page one for an empty directory).
- Search text: 120 characters.
- Region: 80 characters; language: 35 characters.
- Limit: 1–100; offset: 0–2,400.
- HTML pagination exposes at most 101 pages (2,424 alphabetically ordered rows); requests above that window visibly land on page 101.
- Public profile fields are server-bounded: region 120 characters, up to 12 languages of 35 characters each, description 2,000 characters, and house rules 4,000 characters. Each facet vocabulary is capped at 100 values.
%,_and backslash are escaped before anILIKE, so “substring” means literal substring rather than caller-supplied SQL wildcard syntax.
Withdrawal and caching
Turning off the directory choice removes the collective from future HTML and JSON reads; making the profile private also clears the current directory receipt. A later listing needs a fresh choice. Withdrawal cannot recall a copy fetched earlier. Responses containing participant-authored entries are no-store. An empty result may use the directory’s ten-minute freshness class only when the consistent total is also zero and the caller supplied no free text. Count and page rows come from one materialized database statement, so a concurrent listing or withdrawal cannot split their snapshot.
Where the contract lives
- Query and bounds:
apps/storefront/src/lib/collectives/db.ts - Base substrate:
apps/storefront/drizzle/0097_collectives.sql; directory receipt:apps/storefront/drizzle/0131_collective_directory_publication.sql - HTML: /community/directory
- JSON: /api/v1/directory/organisations
- Related: collectives and bridges
Change history
v2 — 2026-08-24.The publication notice now expressly names public HTML and JSON, search and filters, indexing, AI crawlers, third-party copying, the limit of withdrawal, Cambridge TCG’s correction/removal contact, and a categorical rule against entering another person’s data. Earlier v1 receipts are not current and do not list a collective.
v1 — 2026-08-24. Initial organisation-directory contract: separate versioned opt-in with no legacy backfill; steward/platform fields separated; no ids, membership, steward identity, ranking or inference; bounded literal search.