A Macintosh-inspired personal computer portfolio. Next.js App Router + TypeScript + Three.js / React Three Fiber / Drei. Static export deployed to GitHub Pages at https://ethereal49.github.io/.
npm ci
npm run dev
npm test
npm run typecheck
npm run build
python3 -m http.server 3000 --directory out
python3 tests/browser_qa.py
Stop the development server before building: both Next.js processes use .next. Browser QA requires agent-browser, uses the isolated austin-final session, and writes screenshots/results into ignored qa/.
src/data/siteConfig.ts: email, GitHub, LinkedIn and resume URL. Empty values render honest unavailable states.profile.ts,projects.ts,research.ts,interests.ts: editable biography and project/research entries.blog.ts: typed posts with title/date/tags/summary/readingTime and Markdown body. Add a post, rebuild, and its static route and metadata are generated. Raw HTML is not executed.
Project descriptions express the supplied project directions. No publication, date, result, external account, or screenshot is invented. Replace provisional case-study copy with verified work before public release.
help, whoami, about, projects, research, blog, interests, stack, contact, resume, github, open <page>, home, exit, clear, neofetch, fortune; hidden sudo, rm, coffee, matrix.
Arrow keys browse history. Tab completes nonempty commands; empty Tab preserves native focus navigation. Ctrl+L clears. Escape releases input or exits a page. Suggested commands use the same registry. Terminal state persists in sessionStorage; no remote collection.
The desk has live pointer, single-button mouse, deforming cable, instanced keyboard keypresses, limited parallax and an approximately 1.5-second camera entrance. The scene renders on demand: input and active animations request frames, while settled scenes stop rendering. Paper physics runs in a dedicated Worker with transferred snapshots and a local-physics fallback. Internal pages pause both rendering and physics. Mobile uses a front-facing simplified machine with a readable HTML terminal. WebGL failure uses the same terminal in a flat surface. Reduced-motion disables CRT animation and camera entrance/parallax. Direct HTML routes and conventional navigation remain available independently of WebGL.
See DESIGN.md for interaction constraints, QA.md for verification history, and PERFORMANCE.md for the optimization process, measurements and reproduction steps. All geometry is original and procedural; no Apple logo or third-party model/images ship. Fonts are locally bundled IBM Plex Mono (OFL). No audio or analytics.
print resume (or print, lp resume, lpr resume) spools a one-page profile résumé to the ImageWriter II-inspired AustinWriter II. The carriage, ink reveal, roller and paper share one timeline. Blank lines advance paper without a carriage traverse; the head parks before the final feed. A busy printer rejects overlapping jobs. Completed sheets remain in the scene when another copy prints, stacking at the outlet or on the desk. Dragging a sheet can nudge neighboring sheets through contact and friction. A user-dropped sheet focuses after settling; only a stationary click on the focused page downloads its PDF. The sheet picker and status actions provide keyboard access.
The PDF is generated from src/data/resume.ts, which reads the existing profile/project/research configuration. It contains no invented career history. Install the build-time Python dependency once:
python3 -m venv .venv
.venv/bin/pip install -r requirements-resume.txt
npm run resume:build
npm run dev and npm run build regenerate the PDF. AUSTIN_PYTHON may select another Python interpreter with ReportLab installed. The generated public PDF and .venv are ignored; the validated static export includes the PDF. Changing the résumé source updates both the printed page content and the downloadable document.
Install the résumé build dependency above before the first development server or production build. Run npm test, npm run typecheck and npm run build for implementation changes. With out/ served locally, run python3 tests/browser_qa.py for terminal/navigation checks and python3 tests/printer_browser_qa.py for retained sheets, focus and download checks. Set AUSTIN_PREVIEW_URL to use a different preview address.
Run npx tsx scripts/benchmark-performance.ts local for the deterministic CPU benchmark. New local evidence goes in ignored qa/; the archived optimization measurements live in docs/performance/2026-09-12/.
Keep only the latest useful local QA captures; remove superseded screenshots, duplicate downloads and intermediate profiles after recording their conclusions. Do not delete source, dependencies, the Python environment or the current static export as part of routine evidence cleanup. QA.md identifies historical captures that were removed.
Push to main to run .github/workflows/deploy.yml. Actions installs Node.js and Python build dependencies, runs typecheck and tests, builds the PDF and static site, and publishes out/ to GitHub Pages. Generated files remain outside Git.