Skip to content

New paid orders and subscriptions are retired. Existing records, settlement and refunds remain available through your account.

Become a tributary — contribute your data source to Cambridge TCG

Establish rights, document the source, then implement a bounded module.

If you operate or are authorized to share a TCG data source, start by documenting written rights for the intended automated access, storage, use, and redistribution. A SourceModule is a technical adapter, not a license. Nothing is fetched or emitted until the relevant gate passes.

90 min· 5 steps· last verified 2026-07-12· revised 2026-10-10

Steps revised after the last walk-through; the revised steps have not been walked through yet.

Prerequisites

  • • You control the source or hold written approval for the intended access and use
  • • TypeScript familiarity
  • • Repository collaborator access (the source repository is private; request it via [email protected])

Steps

  1. 1

    Read the source protocol

    Start with docs/methodology/source-protocol.md in the repository (private; not publicly readable) and the public summary at /methodology/upstream-sources. Understand the pre-network rights gate, SourceMeta, inert blocked modules, read + normalize, and the independent pre-publication review. CardRush is a blocked policy example, not a runnable reference implementation.

  2. 2

    Add the row to the-tributaries catalog

    Edit docs/connections/the-tributaries.md to add a row for your source: name, upstream URL, access method, license tier, freshness budget, ToS notes, written-rights evidence, game coverage, and status: blocked until reviewed. Submit this first; no probe request is part of intake.

  3. 3

    Implement the SourceModule

    Create packages/data-ingest/src/<your-source-id>/ with index.ts exporting `SourceMeta`, `read`, `normalize`. Type the raw row and the canonical record. Keep `read` inert while status is blocked. For an approved source, declare a bounded rate limit, cancellation, and a pure normalizer.

  4. 4

    Pass the audits

    Run `pnpm audit:tributaries` — it runs ten checks (module exists, shape conforms, required meta non-empty, id parity, catalog anchor resolved, ToS non-empty, license coherence, game codes valid, ingest-run recency for shipped sources, license-propagation drift). Pass all of them. Then send the change to the operator; outside pull requests are not possible while the repository is private.

  5. 5

    Operator review + first dry-run

    The operator reviews the code and current source-specific rights. Only if acquisition is affirmatively covered may a bounded dry-run occur. Public emission remains off until a separate field-level redistribution review passes.

Common gotchas

  • If your source has redistribute: false, declare it

    Set the conservative metadata, but do not confuse metadata with permission. `redistribute: false`, authentication, attribution, or an internal-only label cannot authorize acquisition or publication.

  • Your normalizer must be pure

    Same input → same output. No I/O, no clock reads, no random. Failed normalizations return `{ ok: false, reason }` — never throw. The reason must be actionable ('unmapped lang qya; add to LANG_MAP'), not 'normalization failed'.

Next guide

How to carry Cambridge TCG provenance and rights →

Cite the exact resource, source chain, and declared license.

See also