| 1 | # alexfrison.net |
| 2 | |
| 3 | Personal site, portfolio and resume for Alex Frison. Built with [Astro](https://astro.build/), |
| 4 | fully static, **zero CDN dependencies** in production (fonts, icons and the one JS library are |
| 5 | vendored under `public/assets/vendor/`). Deployed to GitHub Pages on every push to `main` |
| 6 | (`.github/workflows/deploy.yml`), served at https://alexfrison.net via the `public/CNAME` file. |
| 7 | |
| 8 | ## Quick start |
| 9 | |
| 10 | ```bash |
| 11 | npm install |
| 12 | npm run dev # http://localhost:4321 |
| 13 | npm run build # outputs dist/ |
| 14 | npm run preview # preview the built site |
| 15 | npm run vendor:fetch # re-download pinned vendor libraries (only needed after editing the list) |
| 16 | npm run resume:pdf # regenerate public/Alex_Frison_Resume_Sep_2026.pdf (needs python3 + reportlab) |
| 17 | ``` |
| 18 | |
| 19 | ## Where the content lives |
| 20 | |
| 21 | Everything the site and the PDF say comes from one set of files, so they never drift: |
| 22 | |
| 23 | | What | Where | |
| 24 | |---|---| |
| 25 | | Name, pitch, contact, metrics, network tiles, "open to" | `src/data/profile.json` | |
| 26 | | Roles / experience | `src/content/experience/*.json` (sorted by `order`) | |
| 27 | | Skill groups | `src/content/skills/*.json` | |
| 28 | | Projects and case notes | `src/content/projects/*.mdx` (frontmatter + body) | |
| 29 | | Site screenshots for the network section | `public/assets/img/sites/*.webp` | |
| 30 | | Portrait | `public/assets/img/me-cut1.png`, `me-cut2.png` | |
| 31 | |
| 32 | Edit JSON or MDX, run `npm run build`, and push. To refresh the PDF after a content change run |
| 33 | `npm run resume:pdf` and commit the regenerated file (the filename is read from |
| 34 | `profile.resumePdf`, so bump it there when you want a new dated version). |
| 35 | |
| 36 | ## Structure |
| 37 | |
| 38 | - `src/layouts/Base.astro`: head, SEO and JSON-LD, theme boot, smooth scroll (Lenis), reveal |
| 39 | animations, custom cursor, spotlight and tilt cards, magnetic buttons. |
| 40 | - `src/components/`: `Hero` (aurora canvas, kinetic name, scramble rotator), `Metrics` (count-up), |
| 41 | `Marquee`, `Now`, `Network` (bento + architecture diagram), `ProjectGrid` (filterable), |
| 42 | `Timeline`, `Skills`, `Contact`, `Nav`, `Footer`. |
| 43 | - `src/pages/`: `index`, `resume`, `portfolio`, `portfolio/[slug]`, `404`. |
| 44 | - `resume/build_resume.py`: reportlab PDF builder driven by the same content files. |
| 45 | - `scripts/fetch-vendor.mjs`: downloads the pinned vendor files. |
| 46 | |
| 47 | ## Deploy |
| 48 | |
| 49 | Push to `main`. The workflow builds with Node 20 and publishes `dist/` to GitHub Pages. The custom |
| 50 | domain is configured in the repository's Pages settings and pinned by `public/CNAME`. |
| 51 | |
| 52 | ## License |
| 53 | |
| 54 | Code: MIT. Vendored libraries retain their own licenses, see `public/assets/vendor/README.md`. |
| 55 | Content, copy and images are © Alex Frison. |
| 56 | |