CLCTN · TYPE MANIFEST · THING — THE GENERIC TYPE · SEPTEMBER 2026
TYPE 00 · THE SHELF
The type for everything we haven't built yet.
Sixteen types cover maybe sixty percent of the people who will open this app. The other forty collect enamel pins, concert lanyards, running trophies, vintage band tees, hotel keycards, matchbooks, gig tickets, Lego minifigs, perfume miniatures — and if the answer to them is sorry, not supported, the app is a demo. Thing is the type that says yes to all of them on day one, and then quietly turns the popular ones into real types.
Three things in one document: the generic field set (01–03), the route from a Thing to a proposed type (04–05), and the shared board where other collectors' types are downloaded (06). Screens for notype and propose exist already — this is the schema and the policy underneath them.
01 · THE ONE HARD CONSTRAINT
A generic type fails in one of two directions, and both are fatal. Too empty and it is a notes app with a photo. Too full and the pin collector faces forty blank fields about provenance and dimensions and gives up on object three. The field set below is the smallest one that still answered every question, tested against six hobbies that share almost nothing.
{{ s.t }}
{{ s.n }}
{{ s.b }}
{{ s.f }}
02 · THING.YML — TWELVE FIELDS, NINE OF THEM OPTIONAL
Nothing here is invented. Every key already exists in a shipped type; Thing is the intersection rather than a new schema, which is why it costs a manifest file and no code. Switch the starter kit in Tweaks to see which fields a hobby actually turns on.
RESOURCES/TYPES/THING.YML
TYPE 00
{{ manifestYaml }}
STARTER KIT
{{ kitName }}
{{ kitNote }}
FIELDS ON · {{ kitCount }} OF 12
{{ f.k }}
PLUS, DECLARED BY THE COLLECTOR
{{ c }}
Custom fields are typed, not free text — that is the whole difference between a spreadsheet and a catalogue. A typed field sorts, filters, charts and exports; a text field does none of those.
03 · FOUR FIELD KINDS, AND NO MORE
Asking a collector to pick a field type is asking a normal person to do database design. So the picker offers four plain-language kinds with an example each, and the manifest keys stay hidden. Everything the shipped types use beyond these four — grading scales, logs, composites — is deliberately unavailable here, because those are the things that earn a real type.
{{ k.tag }}
{{ k.t }}
{{ k.b }}
{{ k.ex }}
The rule that keeps this honest: a custom field is the same primitive a shipped type uses, stored the same way, exported the same way. When a Thing becomes a real type, the collector's fields map onto the official ones and their data survives — no re-entry, no export-and-reimport. A contribution that costs you your own data is a tax, and nobody pays it twice.
04 · FROM A THING TO A TYPE — THE LADDER
A collector never sits down to design a schema. They catalogue forty pins, and somewhere around the fifteenth they have already invented one — three custom fields, used consistently. The proposal is not a form we ask them to fill in; it is a summary of the work they have already done, offered back to them at the right moment.
Five rungs. Each one is a state on the public board, and each one has an exit that is not shipping — because most proposals will not ship, and the ones that close have to close well or nobody proposes a second time.
{{ r.n }}
{{ r.state }}
{{ r.t }}
{{ r.b }}
{{ r.ck }}
{{ r.c }}
05 · THE BOARD, AND BORROWING SOMEONE ELSE'S TYPE
Waiting for us to ship a type is a bad deal for the collector — a month at best, never at worst. So a published type is usable the moment it is published, by anyone, without our involvement. Shipping it later is a quality upgrade, not the unlock. That reordering is the single most important decision on this page.
PROPOSED TYPE
WANTS
STATE
IN USE
{{ b.name }}
{{ b.by }}
{{ b.wants }}
{{ b.state }}
{{ b.use }}
Sorted by wants, filtered to your interests, and closed proposals stay visible with their reason written out. Cassettes became a format inside Vinyl is a better answer than silence, and it teaches the next proposer where the line is.
{{ x.k }}
{{ x.t }}
{{ x.b }}
06 · CAN ICLOUD BE THE BACKEND FOR THIS?
Yes — for almost all of it, and it is the right call. CloudKit's public database gives you shared storage, a stable per-app identity for every user, and record-level permissions, for no monthly cost and no server to run. Publishing a type, downloading one, voting and reporting all fit inside it. Two things do not, and both are countable rather than architectural.
It also protects the promise on the website, which matters more than the saving: the public database holds manifests, votes and reports — schemas and counters. No shelf, no object, no photo, no value ever leaves the user's private iCloud. "We run no server that could hold your collection" stays literally true.
WORKS AS-IS
{{ i.rec }}
{{ i.t }}
{{ i.b }}
{{ g.k }}
{{ g.t }}
{{ g.b }}
THE FIX
{{ g.fix }}
THE MODERATION PIPELINE YOU DESCRIBED
On-device first, AI second, you last.
{{ m.k }}
{{ m.t }}
{{ m.b }}
{{ m.w }}
Only the schema is free-for-all; the words are moderated. A type carries a name, a paragraph and field labels written by a stranger, which makes this user-generated content under App Review guideline 1.2 — filtering, reporting, blocking and a contact route are required, not optional. The good news is that it is three short strings per type, not a feed.
07 · STILL OPEN
{{ o.k }}
{{ o.q }}
{{ o.b }}