Skip to content

Refactor team roster to data-driven JSON files#7

Merged
kcarnold merged 4 commits into
mainfrom
claude/summer-student-contributions-b1uj7q
Jun 29, 2026
Merged

Refactor team roster to data-driven JSON files#7
kcarnold merged 4 commits into
mainfrom
claude/summer-student-contributions-b1uj7q

Conversation

@kcarnold

Copy link
Copy Markdown
Contributor

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

  • Data-driven team roster: Replaced hardcoded HTML markup with a dynamic system that reads JSON files from src/data/people/. Each team member is now a single JSON file with fields for name, photo, role, status, order, and optional link.
  • Automatic sorting and filtering: Current team members are sorted by order field (then alphabetically), while alumni are sorted alphabetically. The About page automatically categorizes people based on their status field.
  • Contributor documentation: Added CONTRIBUTING.md and CLAUDE.md to guide human and AI contributors on how to add team members and maintain the site.
  • Team member JSON files: Created individual JSON files for all current and alumni team members, with an _example.json template for future contributors.
  • Layout improvements:
    • Added dynamic canonical URL generation in Layout.astro
    • Changed LabHeader from client:only to client:load for better performance
    • Updated footer copyright to use dynamic year
    • Added Vision page link to footer navigation
  • SEO and deployment enhancements:
    • Added Astro sitemap integration for better search engine discoverability
    • Added robots.txt and favicon.svg
    • Fixed favicon path and canonical URL handling
    • Updated deployment documentation to reflect Cloudflare setup
  • Code cleanup: Removed unused imports and cleaned up whitespace across modified files

Implementation Details

  • Team members are loaded via import.meta.glob() with eager loading, filtering out files starting with _
  • Avatar fallback uses ui-avatars.com API when no photo is provided
  • Optional links on team member names allow for personal websites or GitHub profiles
  • The system supports future role customization beyond "Undergraduate Researcher"

https://claude.ai/code/session_01Xuat3bQWtEEeWMwoBwNfBL

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.astro with import.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 build on 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.

Comment thread src/pages/about.astro Outdated
Comment thread src/pages/about.astro Outdated
claude and others added 3 commits June 29, 2026 19:57
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>
@kcarnold kcarnold merged commit 02ebdb5 into main Jun 29, 2026
1 check passed
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.

3 participants