Refactor team roster to data-driven JSON files#7
Merged
Conversation
Team page: move people to per-person JSON files in src/data/people/ so the About page auto-splits Current Team vs Alumni and students can add themselves with a single new file (no merge conflicts). Jiho is current; the rest are alumni. People without photos fall back to generated initials avatars. Scaffolding: add CONTRIBUTING.md, CLAUDE.md, and a GitHub Actions CI workflow that builds on every PR. Housekeeping: add favicon.svg (was a 404), derive canonical URL per page (every page previously claimed to be the homepage), hydrate header/footer with client:load so nav renders in static HTML, dynamic copyright year, Vision link in footer, 404 meta description, robots.txt + @astrojs/sitemap, contact now links to kenarnold.org, and remove the duplicate header/footer on the AI for Writers project page. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xuat3bQWtEEeWMwoBwNfBL
Contributor
There was a problem hiding this comment.
Pull request overview
Refactors the About page’s team roster from hardcoded markup into a data-driven model backed by per-person JSON files, alongside a set of SEO/site-shell improvements (canonical URL, sitemap/robots, favicon), contributor docs, and a basic CI build check.
Changes:
- Replace hardcoded team member HTML on
about.astrowithimport.meta.glob()-loaded JSON data, plus sorting/filtering for current vs. alumni. - Improve site shell/SEO (dynamic canonical URL, sitemap integration, robots.txt, favicon path) and minor layout/nav updates.
- Add contributor/agent documentation and introduce CI that runs
npm run buildon PRs.
Reviewed changes
Copilot reviewed 23 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/pages/projects/ai-writers-2024-25/index.astro | Removes page-level header/footer usage (relies on shared Layout). |
| src/pages/about.astro | Implements JSON-driven team roster (sorting/filtering, avatar fallback, optional links). |
| src/pages/404.astro | Adds meta description for SEO. |
| src/layouts/Layout.astro | Adds dynamic canonical URL, fixes favicon path, switches header/footer hydration to client:load. |
| src/data/people/README.md | Documents how to add/update people JSON files. |
| src/data/people/_example.json | Template JSON for future team members. |
| src/data/people/*.json | Adds per-person JSON records used by the About page. |
| src/components/lab/LabFooter.tsx | Dynamic year + adds “Vision” link in footer navigation. |
| README-astro.md | Updates deployment notes for Cloudflare. |
| public/robots.txt | Adds robots rules + sitemap URL. |
| public/favicon.svg | Adds a new SVG favicon. |
| package.json | Adds @astrojs/sitemap dependency. |
| CONTRIBUTING.md | Adds contributor onboarding and repo structure guidance. |
| CLAUDE.md | Adds standing guidance for AI coding agents in this repo. |
| astro.config.mjs | Adds sitemap integration and sets site. |
| .github/workflows/ci.yml | Adds CI workflow to build on PRs/pushes. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
He has graduated and continues to contribute as a current group member, so "Undergraduate Researcher" no longer fits; he stays in Current Team. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xuat3bQWtEEeWMwoBwNfBL
Drop the vestigial "Lab" prefix (a leftover from the original template) now that there are no competing components. Header keeps its mobile-nav toggle, so it stays a React island (client:load). Footer has no interactivity, so it becomes a static .astro component — no React, no hydration, no client JS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xuat3bQWtEEeWMwoBwNfBL
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
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.
Summary
Converted the hardcoded team member list on the About page into a data-driven system using individual JSON files. This eliminates merge conflicts when multiple team members add themselves simultaneously and makes it easier to manage team status changes (current vs. alumni).
Key Changes
src/data/people/. Each team member is now a single JSON file with fields for name, photo, role, status, order, and optional link.orderfield (then alphabetically), while alumni are sorted alphabetically. The About page automatically categorizes people based on theirstatusfield.CONTRIBUTING.mdandCLAUDE.mdto guide human and AI contributors on how to add team members and maintain the site._example.jsontemplate for future contributors.Layout.astroLabHeaderfromclient:onlytoclient:loadfor better performancerobots.txtandfavicon.svgImplementation Details
import.meta.glob()with eager loading, filtering out files starting with_ui-avatars.comAPI when no photo is providedhttps://claude.ai/code/session_01Xuat3bQWtEEeWMwoBwNfBL