This repository contains the source code and documentation for the McCal Media website. The main site is built with Vite and serves as the public-facing portfolio and project hub. Legacy widget code is archived and no longer the focus of development.
Requirements: Node.js 20.19+ and npm.
- Install dependencies:
npm install - Start the dev server for the production site:
cd sites/mcc-cal-vite && npm run dev - Open http://localhost:5173 to view the site.
sites/mcc-cal-vite/— Production site (Vite + React, main public site)sites/mcc-cal-admin/— Admin console (Vite + React, Vercel auth and admin APIs)src/— Shared source content and assets, including portfolio images and blog contentdocs/— Documentation, standards, and migration notesscripts/— Build, manifest, and utility scripts
Available Scripts:
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run lint- Run ESLintnpm run test:e2e- Run end-to-end testscd sites/mcc-cal-vite && npm run test:run- Run public app unit/API tests
Code Quality:
- TypeScript for type safety
- ESLint for code standards
- Prettier for formatting
- Component-based architecture with React
Performance Features:
- Lazy loading for large components
- Image optimization and CDN delivery
- Skeleton loaders for portfolio grids
- Code splitting for better bundle sizes
- Production Site (
sites/mcc-cal-vite): The main site, built with Vite. All new public content and features are developed here. - Admin Console (
sites/mcc-cal-admin): Internal operations app for health, bookings, content, and settings surfaces.
Legacy widget code and documentation are archived. All new public-site development is focused on the Vite site.
docs/— All documentation, standards, and migration notesdocs/standards/— Coding, performance, and accessibility standardsdocs/2026-COMPLETE.md,docs/2026-READY.md— Project status and migration notes
- Run
npm installat the repo root, thennpm run devfor the main site - Use
npm run dev:adminfor the admin console - Use
npm run dev:apifor the local public-site API shim, orcd sites/mcc-cal-vite && npm run dev:vercelwhen testing Vercel Functions - Run manifest/image scripts as needed for portfolio updates
- CDN-hosted manifests (no API required): see docs/manifest-cdn.md for jsDelivr URLs and the publish workflow.
- End-to-end portfolio manifest pipeline: see docs/workflows/portfolio-manifest-pipeline.md.
Manifest workflows notify the API (if secrets set) so caches can be warmed automatically.
- Composite action:
/.github/actions/notify-manifest-webhookcentralizes webhook logic. - Secrets required:
MANIFEST_WEBHOOK_URL(orMANIFEST_WEBHOOK_BASE) andWEBHOOK_SECRET. If absent, notification step is skipped safely.
- Canonical blog source:
src/content/blog/ - Authors:
src/content/blog/authors.json - Preferred authored post source:
src/content/blog/posts/<slug>/post.md - Generated runtime post document:
src/content/blog/posts/<slug>/post.json - Compile Markdown posts and rebuild the blog manifest:
npm run manifest:blog - Compile Markdown posts only:
npm run blog:compile - Validate blog authors, post metadata, and referenced local assets:
npm run blog:validate - Generate JSON/RSS feeds:
npm run blog:feed - Run the full blog publish prep (compile, validate, manifest, feeds):
npm run blog:generate - Migrate existing JSON posts to Markdown:
npm run blog:migrate-markdown - Import Google Docs into canonical blog posts:
npm run blog:sync-docs
- Production site (
sites/mcc-cal-vite) is deployed via Vercel or static hosting. - Admin console (
sites/mcc-cal-admin) is deployed separately with noindex headers. - Manifest CDN publishing remains in this repo. Cloudflare Worker/API deployment should happen from the companion API repository when that source is available.
This is a personal project. No outside contributors are accepted at this time.
See LICENSE for details.
Squarespace-era widgets are no longer the active development surface. Keep new work in the Vite app unless a legacy embed specifically needs maintenance.
We use tag-based releases for deploying widgets to Squarespace via jsDelivr:
- Tag format:
widget-name@MAJOR.MINOR.PATCH(e.g.,interactive-thesis@0.4.0) - Pre-publish CI: archived widget workflows live under
.github/workflows/archive/. - CDN pattern:
https://cdn.jsdelivr.net/gh/<owner>/<repo>@<tag>/<path-to-versioned-html> - Example:
https://cdn.jsdelivr.net/gh/McCal-Codes/McCals-Website@interactive-thesis@0.4.0/src/widgets/interactive-thesis/versions/v0.4-thesis-blog-format.html
Fixing archived widget validation errors:
- Run locally:
node scripts/utils/validate-widget-html.js - Read error output for offending files.
- Update HTML per
docs/standards/widget-standards.md. - Commit & push; CI re-validates.
- Test files consolidated under
tests/ - Docs categorized (workflows, automation, integrations, standards, etc.)
- Widget status clarity (archives, WIP markers)
- Root directory cleaned (legacy test artifacts removed)
Production:
- Concert Portfolio — performance + SEO reference (v4.x line)
- Event Portfolio — dynamic category & shuffle (v2.6.x)
- Featured Portfolio — curated highlights
- Photojournalism Portfolio — news/journalism (v5.x in progress)
- Portrait Portfolio — vertical composition (v1.x)
- Video Portfolio — accessible multimedia (v0.1)
- About Page / Client Carousel — bio & logos
- Podcast Feed — auto-hydrating episodes
- Hero Slideshow — landing hero sections
- Site Footer — accessible glass footer
- Hire to Unlock Résumé — interactive résumé experience
- Admin Portfolio Importer — private image ingestion tool
Work In Progress:
- Photojournalism Portfolio v5.1 optimization
- Blog Feed integration
- Nature Portfolio gallery
Performance Regression CI:
- A headless Playwright-based performance scaffold runs basic metrics for widgets and uploads HTML reports. Lighthouse integration will be added in a subsequent iteration.
Quick Reference: docs/standards/widget-reference.md
Architecture & Patterns: docs/standards/widget-standards.md
Code Annotations: docs/standards/code-annotations.md — TODO, FIXME, BUG, SECURITY, and other annotation keywords
Enhancements: docs/standards/widget-enhancements.md
Performance: docs/standards/performance-standards.md
SEO Starter: docs/standards/seo-starter-guide.md
Image SEO: docs/standards/image-seo-standards.md
- Copy latest version HTML from
src/widgets/<name>/versions/ - Paste into a Squarespace Code Block
- Adjust data attributes (see widget README)
- Regenerate manifests after adding images
- Validate with the relevant archived/manual widget validator if restoring widget work
Security & recovery events: docs/important-notes/ (latest: 2025-10-09-secret-removal.md)
- Photojournalism Portfolio v5.1 (
src/widgets/photojournalism-portfolio/versions/v5.1-performance-optimized.html) - Performance optimization pass in development - Blog Feed (
src/widgets/blog-feed/) - External blog integration (in development) - Nature Portfolio (
src/widgets/nature-portfolio/) - Nature photography displays (in development)
- Navigate to
src/widgets/[widget-name]/versions/ - Copy the latest version HTML file (e.g.,
v4.1.0.html) - In Squarespace, add a Code Block
- Paste the widget HTML code
- Adjust
data-panesor other attributes as needed - Each widget has its own README with specific instructions
- Quick Reference:
docs/standards/widget-reference.md- Essential checklist for widget development - Complete Guide:
docs/standards/widget-standards.md- Comprehensive architecture and design standards - Enhancement Patterns: Proven improvement patterns for optimizing existing widgets
- SEO Testing Guide:
docs/standards/seo-testing-guide.md- Comprehensive SEO testing and validation methods - SEO Starter Guide:
docs/standards/seo-starter-guide.md- Practical Squarespace SEO playbook for McCal Media
Common scripts:
npm run dev— Start the local dev servernpm run build— Build the test sitenpm run preview— Preview the built public sitenpm run repo:health— Repository health checksnpm run lint— ESLintnpm run test— Playwright tests
Quick task aliases:
| Script | What it does |
|---|---|
npm run ai:preflight:short |
Fast context/standards preflight (no writes) |
npm run dev |
Serve the public Vite site at http://localhost:5173 |
npm run dev:admin |
Serve the admin console at http://localhost:4310 |
npm run manifest:dry-run |
Dry-run manifest generation (no writes) |
npm run repo:health |
Clean + preflight + large-file scan |
- See
CONTRIBUTING.mdfor branching, testing, and review expectations. - Contributions are expected to follow our Code of Conduct.
- Repository-wide improvement roadmap:
docs/repo-improvement-plan.md.
Widget Documentation:
- See
docs/widgets/index.mdfor per-widget usage summaries and links.
Full documentation lives in docs/README.md and includes:
- Standards:
docs/standards/ - Workflows:
docs/workflows/ - Automation:
docs/automation/ - Integrations:
docs/integrations/ - Deployment:
docs/deployment/ - Tutorials:
docs/tutorials/
Security and recovery events are tracked in docs/important-notes/. The latest entry is 2025-10-09-secret-removal.md.