Digital study in violet dusk — a multi-page portfolio built with React + Vite + TailwindCSS and deployed via GitHub Pages.
- Install dependencies
npm install- Local development
npm run dev- Build
npm run build- Manual deploy
npm run deployThis repo includes a GitHub Actions workflow (.github/workflows/deploy.yml) that automatically builds and deploys dist/ to the gh-pages branch whenever main is pushed.
Key files and folders:
public/— favicon, og-image, robots, 404.html for routingsrc/pages/— Individual page components (Home, About, Projects, etc.)src/components/— Reusable components (Navbar, Footer, cards)src/data/— JSON files for projects, research, blog posts
The site uses React Router for multi-page navigation:
/— Home/landing page/about— About section/projects— Projects grid/research— Research publications/blog— Blog posts (Markdown-ready)/contact— Contact form and links/archive— Legacy works (optional)
Each page is lazy-loaded for performance. GitHub Pages routing is handled via 404.html fallback.
- Projects: Add objects to
src/data/projects.jsonwithid,title,description,link,tags - Research: Add entries to
src/data/research.json(abstract, links) - Blog: Add previews to
src/data/blog.json; full posts can be integrated with Markdown later - Blog: Add previews to
src/data/blog.json; each post should include aslugandcontent(Markdown). Generic detail pages are generated client-side from JSON: add new items to the JSON and use theirslugto link - New Pages: Create in
src/pages/, add route inApp.jsx, and link inNavbar.jsx
- Add an entry to the appropriate JSON file in
src/data/using theslugfield (URL-friendly lower-case, hyphen-separated). - Include
content(Markdown) for full-page rendering. - Link to the item from lists with
/projects/:slug,/research/:slug, or/blog/:slug.
The site uses a generic detail component that renders pages from JSON at runtime. If you prefer build-time static pages for SEO, run the optional generator (not included by default).
- Placeholders for GitHub API (live stats), MathJax/KaTeX (academic papers), Obsidian sync, and dynamic "Lab / Vault" area
- Blog supports Markdown via
react-markdown
Built with care for accessibility and a calm, mysterious aesthetic.