Add App Catalog: a searchable front door to every app in this repo - #233
Merged
Conversation
✅ Deploy Preview for veda-github-actions canceled.
|
✅ Deploy Preview for veda-pr-dashboard canceled.
|
✅ Deploy Preview for veda-projectboard-dashboard ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for veda-dse-hub canceled.
|
✅ Deploy Preview for veda-leave-dashboard canceled.
|
✅ Deploy Preview for veda-algorithm-catalog canceled.
|
✅ Deploy Preview for veda-aws-dashboard canceled.
|
The only place all the live URLs appeared together was a flat list in
README.md, which renders on GitHub and nowhere else. This adds an 8th
Netlify site that indexes the repo: 14 entries (the 7 SPAs + the 7 docs/
deep-dives), each linking out to the real thing.
Modelled on NASA-IMPACT/odsi-app-catalog, which solves the same problem
org-wide. Astro 5 + Pagefind + MDX rather than the Vite+React house style:
this is a content catalog, not a data dashboard, so entries are prose with
typed frontmatter and the requirement is full-text search over it with no
backend. Astro validates every entry at build; Pagefind indexes the built
HTML; the page ships almost no JS.
Two frontmatter fields are REQUIRED and gated by `astro build`, so they
cannot quietly rot into optional:
- `limitations` (min 1) — every entry states what it costs you
- `solves` — every entry states the problem it removes
Apps additionally carry a "What it solves" before/after SVG figure with
animation behind prefers-reduced-motion; docs entries are text-only.
Two Astro-specific traps hit while building this, both now documented in
docs/APP_CATALOG.md and CLAUDE.md:
- MDX parses markdown inside inline SVG. A leading-space `_` opens an
emphasis span and `[^x]` reads as a footnote ref, silently truncating
the rest of the <svg> with no error. Wrap such text in {"literals"}.
- Astro scopes component styles, so a rule targeting another component's
elements silently does not apply. `[data-entry].is-hidden` lost to
EntryCard's own `.card{display:flex}`, leaving the type filter applying
classes while hiding nothing. Cross-component rules live in global.css.
Root .gitignore gains an !app-catalog/ negation block so a plain
`git add app-catalog/` picks up its build config.
kyle-lesinger
force-pushed
the
feat/app-catalog
branch
from
August 20, 2026 14:26
4f00fe7 to
03ecc83
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The only place all the live URLs appeared together was a flat list in
README.md, which renders on GitHub and nowhere else. This adds an 8th Netlify site that indexes the repo: 14 entries (the 7 SPAs + the 7docs/deep-dives), each linking out to the real thing.Modelled on
NASA-IMPACT/odsi-app-catalog, which solves the same problem org-wide.Why Astro, not Vite + React
This is the only app here that isn't the house stack, deliberately. It's a content catalog, not a data dashboard: entries are prose with typed frontmatter, and the requirement is full-text search over that prose with no backend. Astro validates every entry at build (Zod), Pagefind indexes the built HTML, and the page ships almost no JS. odsi's own ADR #1 rejected a Vite+React SPA for exactly this job — it would mean hand-rolling routing, MDX and a search index, and shipping a bundle to do it.
Two required fields, gated by the build
Neither can quietly rot into optional, because
astro buildfails on a missing or empty one:limitations(min 1) — every entry states what it costs yousolves— every entry states the problem it removesVerified: a missing
limitations, an empty[], a missingsolves, and an unknowntypeeach exit non-zero."What it solves"
Each of the 6 apps carries a before/after inline-SVG figure with animation behind
prefers-reduced-motion; the docs entries are text-only, so the figures mark the apps rather than the reading material. The framings come from how the work actually used to be done — e.g. FTE ends the Word-doc ↔ GitHub double-entry, and PR Finder's point is that a repo boundary becomes an edge to follow rather than a wall.Two Astro traps hit while building this
Both now documented in
docs/APP_CATALOG.mdandCLAUDE.md, because both fail silently:_opens an emphasis span and[^x]reads as a footnote reference — either one swallows the rest of the<svg>with no error; the figure just ends early looking plausible. This ate three rows ofalgorithm-catalog.mdx. Wrap such text in a{"string literal"}. Guarded now by comparinggrep -c '<text'in each source against the built HTML.[data-entry].is-hiddeninCatalogGrid.astrotied on specificity withEntryCard.astro's own.card { display: flex }and lost on source order — the type filter applied its class and updated the count while hiding nothing. Cross-component rules now live inglobal.css. Test computeddisplay/opacity, never just the class — asserting the class is what let this through.Verification
npm run buildclean; 15 pages; Pagefind indexes 14 detail pages + 2 filtersrepo/homepageURLs return 200Notes for review
.gitignoregains an!app-catalog/negation block so a plaingit add app-catalog/picks up its build config.app-catalog/netlify.toml, unlike the six Vite siblings — Astro emits a real file per route, and a/*catch-all would shadow the 404 page and the/pagefind/assets.README.mdmarks the App Catalog link as pending. It needs base directoryapp-catalogwith build command and publish dir left empty in the UI, connected via the GitHub App (a deploy-key connection can't produce PR Deploy Previews)..github/workflows/board-explorer.ymlstill setsDASHBOARD_URLtoveda-board-explorer.netlify.app, which 404s — the live site isveda-projectboard-dashboard.netlify.app.