Key decisions shaping the AI systems and portfolio architecture.
ADR-001: Astro 7 + Tailwind v4 + GSAP
Migrated from React 19 to Astro 7.2.0 for better performance, static generation, and ecosystem integrations. Chose GSAP over Framer Motion for ScrollTrigger capabilities and finer control over scroll-based animations.
Status: AcceptedADR-002: MDX for Content Pages
Used MDX for résumé and docs pages to enable component usage within markdown while maintaining frontmatter metadata for SEO.
Status: AcceptedADR-003: Static Output on Vercel (ISR removed)
Originally enabled ISR with a 24-hour expiration. Reverted to fully static output: the portfolio has no dynamic data, so ISR only added edge-function overhead. Static output serves instantly from the CDN edge.
Status: Accepted (supersedes the earlier ISR decision)ADR-004: Google Fonts via Preconnect + Stylesheet Link
Initially attempted to load Google Fonts through Partytown’s web worker. Partytown cannot inject stylesheets from a worker, so fonts silently failed. Replaced with standard <link rel=“preconnect”> and a stylesheet link, loading only the used weights (400–700).
Status: Accepted (supersedes the Partytown approach)ADR-005: Dark Gradient Background with Grid + Glow Orbs
The site uses a CSS-only background: two radial gradient glows (violet + cyan), a subtle 40px grid overlay, and animated pulsing orbs in the hero. Surface colors are runtime CSS variables with a dark default and a light theme via :root[data-theme=‘light’] (see ADR-009). No canvas or JS background — keeps the payload tiny and respects reduced-motion preferences.
Status: AcceptedADR-006: Résumé as MDX with PDF Export
Kept the résumé as an MDX page for web viewing and generated a PDF via Puppeteer for download, balancing maintainability with traditional résumé formats. The MDX page reads from the same data files as the site (skills, experience, projects) so it stays in sync.
Status: AcceptedADR-007: Résumé Route Normalized to /resume
The résumé page originally lived at the Unicode URL /résumé. Moved the canonical route to /resume and added permanent 301 redirects in vercel.json for the old URLs (including /résumé.pdf), so links, crawlers, and copy-paste work reliably.
Status: AcceptedADR-008: CI with Build + Test + Type-Check + Lint
Added a GitHub Actions workflow that runs npm ci, astro build, vitest, astro check, and ESLint on every push and PR. Prevents regressions like the skill-bar ScrollTrigger reference error from reaching production.
Status: AcceptedADR-009: Dark / Light Theme with System Default
Surface colors are runtime CSS variables under :root (dark default) with :root[data-theme=‘light’] overrides, so Tailwind utilities resolve through the chain. A boot script in <head> applies the stored preference before first paint (no flash), falling back to prefers-color-scheme; a nav toggle persists the choice in localStorage, and a live system-preference listener updates the theme while no explicit choice is stored.
Status: AcceptedADR-010: Vercel Web Analytics
Adopted the official @vercel/analytics Astro integration instead of a third-party snippet. The loader is injected at runtime only when Vercel provides the project ID at build time — a clean no-op in local dev and non-Vercel hosts.
Status: AcceptedADR-011: Vercel Speed Insights
Added the official @vercel/speed-insights Astro integration alongside Web Analytics (ADR-010). Like analytics, the loader activates only when Vercel provides the project ID at build time — a no-op in local dev and non-Vercel hosts — so Core Web Vitals can be collected without adding third-party scripts.
Status: AcceptedADR-012: Companion Repos for Shared Workspaces
Where two repos share a codebase (e.g. nexus-kernel is the alpha-track sibling of the NexusAOS Rust workspace), the secondary repo is marked companionOf in the projects data. Its test suite is attributed once (under the primary project) to avoid double-counting, and its card shows a “Companion to” note linking to the primary project’s docs.
Status: Accepted