The site for the Michigan Student Artificial Intelligence Lab (MSAIL) at the University of Michigan, built as a fully static export for GitHub Pages at https://msail.github.io.
- Next.js 16 (App Router) with
output: "export"—next buildemits the whole site as static HTML into./out. No server. - Tailwind CSS v4 — design tokens (colors, type scale, spacing) live in
src/app/globals.cssunder@theme. - Typed content layer — all copy, links, rosters, talks, and resources live
in
src/data/so future maintainers can edit content without touching React. Each migrated item carries a provenanceFlag(verified/stale/unverified/awaiting) — seesrc/data/content-status.ts. Flag notes are internal; pages render the separate user-facingnoticestrings. - Fonts — Inter (body), Anton (display, single weight), IBM Plex Mono
(labels) via
next/font.
npm install
npm run dev # dev server at http://localhost:3000npm run build # static export → ./out
npm run start # serve ./out locally (what GitHub Pages will serve)
next startdoes not work withoutput: "export";npm run startserves the static artifact instead.
npm run deployThat runs scripts/deploy.sh: local checks (types, lint,
build) → push main → watch the GitHub Actions run → smoke-test the live
site. It needs the gh CLI authenticated with push access to
MSAIL/MSAIL.github.io.
Plain git push origin main deploys too — pushes to main build and publish
./out to GitHub Pages via
.github/workflows/deploy.yml; the script
just adds the pre-flight checks and post-deploy verification. For the root
domain, the repo must live at MSAIL/MSAIL.github.io with Pages set to
GitHub Actions (Settings → Pages → Build and deployment). There is no
basePath; trailingSlash: true emits /about/index.html-style paths, and
public/.nojekyll keeps Pages from mangling _next/ assets. The old Hugo
site is archived on the master branch (tag hugo-site-final) — never
delete either.
npx tsc --noEmit # types
npm run lint # eslint