Goal
- Convert the member-projects collection to an "organizations" collection, with boolean props for
isMemberProject and isAngelMinter.
- Add a "people" collection with a boolean prop for
isAngelMinter.
We have multiple data types describing organizations (functionally categorized as "Member projects" and "Angel minters") with some duplicates between them, but only one (member projects) is implemented as a collection — the other is a folder of md files. We need a single "organizations" collection with frontmatter props indicating which organizations are member projects and/or angel minters. This replaces both the member-projects collection and the angel-minter directory; the member-projects and angel-minters galleries in the Starlight UI are populated from the collection(s) by filtering on the props.
Because not all Angel Minters are organizations, we also need a "people" collection to hold non-organization angel minters (same prop). The angel-minters galleries/pages aggregate from both collections, filtered by isAngelMinter.
Implement dynamic routing and nav-entry generation for the new member-projects and angel-minters pages so they appear as typical docs pages when slotted into Starlight's docs structure and nav.
Current state (grounding)
The memberProjects collection exists in both keystatic.config.tsx and content.config.ts, but there is no getCollection rendering anywhere in the repo — the member-projects page (.../member-projects/index.md) is just prose. So "populate the galleries from the collection by filtering" is greenfield; there's no existing pattern to copy. The estimate should reflect building the rendering layer, not just the schema.
Recommended approach
Schema (Keystatic):
organizations collection (replaces memberProjects): add booleans isMemberProject and isAngelMinter via fields.checkbox(...); carry over existing fields (lead, email, treasury, url, image, status).
people collection: isAngelMinter boolean + person fields.
- Galleries:
getCollection('organizations').filter(o => o.data.isMemberProject), etc. The Angel Minters view aggregates organizations + people, both filtered on isAngelMinter.
⚠️ Architectural caveat (the crux)
Pages rendered with <StarlightPage> from a data collection are not part of the docs collection and cannot be added to an autogenerated sidebar group (per Starlight's pages guide). So "appear as typical docs pages slotted into Starlight's nav" isn't free — it needs either manual sidebar links or the topics plugin from #18. #19 and #18 should be sequenced together.
Migration checklist
- Rename the collection in
keystatic.config.tsx (+ ui.navigation) and content.config.ts.
- Migrate existing member-project
.md frontmatter to the new boolean props.
- Fold the angel-minters md folder into the collection(s).
- Update
redirects in astro.config.mjs that reference /member-projects and /angel-minters.
- Build the gallery + per-entry routing (
getStaticPaths).
References
Goal
isMemberProjectandisAngelMinter.isAngelMinter.We have multiple data types describing organizations (functionally categorized as "Member projects" and "Angel minters") with some duplicates between them, but only one (member projects) is implemented as a collection — the other is a folder of md files. We need a single "organizations" collection with frontmatter props indicating which organizations are member projects and/or angel minters. This replaces both the member-projects collection and the angel-minter directory; the member-projects and angel-minters galleries in the Starlight UI are populated from the collection(s) by filtering on the props.
Because not all Angel Minters are organizations, we also need a "people" collection to hold non-organization angel minters (same prop). The angel-minters galleries/pages aggregate from both collections, filtered by
isAngelMinter.Implement dynamic routing and nav-entry generation for the new member-projects and angel-minters pages so they appear as typical docs pages when slotted into Starlight's docs structure and nav.
Current state (grounding)
The
memberProjectscollection exists in bothkeystatic.config.tsxandcontent.config.ts, but there is nogetCollectionrendering anywhere in the repo — the member-projects page (.../member-projects/index.md) is just prose. So "populate the galleries from the collection by filtering" is greenfield; there's no existing pattern to copy. The estimate should reflect building the rendering layer, not just the schema.Recommended approach
Schema (Keystatic):
organizationscollection (replacesmemberProjects): add booleansisMemberProjectandisAngelMinterviafields.checkbox(...); carry over existing fields (lead, email, treasury, url, image, status).peoplecollection:isAngelMinterboolean + person fields.getCollection('organizations').filter(o => o.data.isMemberProject), etc. The Angel Minters view aggregatesorganizations+people, both filtered onisAngelMinter.Pages rendered with
<StarlightPage>from a data collection are not part of thedocscollection and cannot be added to an autogenerated sidebar group (per Starlight's pages guide). So "appear as typical docs pages slotted into Starlight's nav" isn't free — it needs either manual sidebar links or the topics plugin from #18. #19 and #18 should be sequenced together.Migration checklist
keystatic.config.tsx(+ui.navigation) andcontent.config.ts..mdfrontmatter to the new boolean props.redirectsinastro.config.mjsthat reference/member-projectsand/angel-minters.getStaticPaths).References
getCollection<StarlightPage>limitations