Skip to content

Add App Catalog: a searchable front door to every app in this repo - #233

Merged
kyle-lesinger merged 1 commit into
mainfrom
feat/app-catalog
Aug 20, 2026
Merged

Add App Catalog: a searchable front door to every app in this repo#233
kyle-lesinger merged 1 commit into
mainfrom
feat/app-catalog

Conversation

@kyle-lesinger

Copy link
Copy Markdown
Member

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.

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 build fails on a missing or empty one:

  • limitations (min 1) — every entry states what it costs you
  • solves — every entry states the problem it removes

Verified: a missing limitations, an empty [], a missing solves, and an unknown type each 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.md and CLAUDE.md, because both fail silently:

  1. MDX parses markdown inside inline SVG. A leading-space _ 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 of algorithm-catalog.mdx. Wrap such text in a {"string literal"}. Guarded now by comparing grep -c '<text' in each source against the built HTML.
  2. Astro scopes component styles, so a rule targeting another component's elements silently doesn't apply. [data-entry].is-hidden in CatalogGrid.astro tied on specificity with EntryCard.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 in global.css. Test computed display/opacity, never just the class — asserting the class is what let this through.

Verification

  • npm run build clean; 15 pages; Pagefind indexes 14 detail pages + 2 filters
  • Schema gate confirmed to fail on each of the four bad-input cases above
  • Type/tag facets, search, clear-filters and hover-spotlight driven in a real browser and asserted on computed style
  • Free-text search confirmed to hit Pagefind (a body-only term returns 1 result where the substring fallback would return 0)
  • All 21 outbound repo/homepage URLs return 200
  • No label collisions or page overflow in any of the 7 figures

Notes for review

  • Root .gitignore gains an !app-catalog/ negation block so a plain git add app-catalog/ picks up its build config.
  • No SPA redirect in 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.
  • The Netlify site does not exist yet, so README.md marks the App Catalog link as pending. It needs base directory app-catalog with 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).
  • Unrelated, spotted in passing: .github/workflows/board-explorer.yml still sets DASHBOARD_URL to veda-board-explorer.netlify.app, which 404s — the live site is veda-projectboard-dashboard.netlify.app.

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-github-actions canceled.

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-github-actions/deploys/6a870ea6d2d298000814ffac

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-pr-dashboard canceled.

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-pr-dashboard/deploys/6a870ea6ec65b60008979cb6

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-projectboard-dashboard ready!

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-projectboard-dashboard/deploys/6a870ea63ff42800088dde71
😎 Deploy Preview https://deploy-preview-233--veda-projectboard-dashboard.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-dse-hub canceled.

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-dse-hub/deploys/6a870ea6d2d298000814ffae

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-leave-dashboard canceled.

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-leave-dashboard/deploys/6a870ea676fe0f000727bb16

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-algorithm-catalog canceled.

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-algorithm-catalog/deploys/6a870ea6f4a86f00087cdd22

@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for veda-aws-dashboard canceled.

Name Link
🔨 Latest commit 03ecc83
🔍 Latest deploy log https://app.netlify.com/projects/veda-aws-dashboard/deploys/6a870ea6de814a00088d47db

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
kyle-lesinger merged commit 1673012 into main Aug 20, 2026
29 checks passed
@kyle-lesinger
kyle-lesinger deleted the feat/app-catalog branch August 20, 2026 14:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant