Personal site of Caio Fonseca — software engineer & researcher. Built with Astro, Tailwind CSS and a few React islands; deployed to GitHub Pages.
npm install
npm run dev # local dev server at http://localhost:4321
npm run build # production build into dist/
npm run preview # preview the production build
npm run check # type-check (astro check)| Path | What |
|---|---|
src/consts.ts |
Site config: name, URLs, socials, service keys (see below) |
src/data/experience.ts |
Experience + education timeline |
src/content/publications/ |
One Markdown file per paper |
src/content/projects/ |
One Markdown file per project |
src/content/posts/ |
Blog posts (Markdown / MDX) |
src/components/ |
UI + React islands (terminal, command palette, etc.) |
src/pages/ |
Routes |
public/ |
Static assets (favicon.svg, og.svg, drop a cv.pdf here) |
- A paper → add
src/content/publications/my-paper.mdwith frontmatter (title,authors,venue,year,type, optionaldoi/url/pdf). - A project → add
src/content/projects/my-project.md(kind: software | research). - A post → add
src/content/posts/my-post.md(title,description,date).
All of these live in SERVICES in src/consts.ts and no-op until filled in:
- Contact form — create a Formspree form, set
formspreeId. - Comments — enable GitHub Discussions, configure at giscus.app, fill the
giscusblock. - Analytics — register a GoatCounter site, set
goatcounterCode. - Live GitHub repos — set
githubUser; the Projects page fetches public repos at runtime.
Pushing to main triggers .github/workflows/deploy.yml, which builds and
deploys to GitHub Pages. In the repo settings, set Pages → Build and
deployment → Source to GitHub Actions.
This is deployed as a project page at
https://engcaiofonseca.github.io/website(site+base: '/website'inastro.config.mjs). All internal links go throughwithBase()insrc/utils/url.ts. To move to a clean root URL later, create a repo named<account>.github.io, setbase: '/', and updatesite+SITE.url.