Personal website and blog of Gabriel Vitali.
Live website: https://gabcvit.dev
This repository contains a statically generated website built with Vue 3 + TypeScript and powered by Vite.
Main characteristics:
- Static-site generation with
vite-ssg - File-based routing from the
pages/directory (.mdand.vue) - Markdown-driven pages and blog posts with frontmatter metadata
- Tailwind CSS styling with shared global styles
- RSS/Atom/JSON feed generation during the build pipeline
- GitHub Pages deployment via
gh-pages
- Vue 3
- TypeScript (strict mode)
- Vite
vite-ssgunplugin-vue-routerunplugin-vue-markdownunplugin-auto-importunplugin-vue-components- Tailwind CSS + PostCSS
- Cypress (E2E)
.
├─ pages/ # Route source of truth (.md/.vue -> routes)
│ ├─ index.md # /
│ ├─ resume.md # /resume
│ ├─ portfolio.md # /portfolio
│ ├─ [...404].md # catch-all route
│ └─ blog/
│ ├─ index.md # /blog
│ └─ *.md # /blog/<slug>
├─ src/
│ ├─ main.ts # ViteSSG app creation + route progress
│ ├─ App.vue # global app layout
│ ├─ components/ # reusable + page-level components
│ ├─ data/ # static typed datasets used by pages
│ ├─ styles/style.css # global CSS + typography/base styling
│ └─ types.ts # shared interfaces
├─ scripts/
│ ├─ update-rss.ts # generates feed.xml/feed.atom/feed.json
│ └─ add-cname.ts # writes dist/CNAME for custom domain
└─ cypress/e2e/ # end-to-end tests
- Routes are auto-generated from files in
pages/. - Both
.mdand.vuefiles can become routes. - Markdown frontmatter is attached to route metadata by Vite config.
- Blog post cards/list are generated dynamically from router metadata, so there is no manual blog manifest file.
Create new posts in pages/blog/ using frontmatter like:
---
title: My New Post
description: Short summary
date: 2026-03-17
duration: 5min
---
# Post content- Node.js (current LTS recommended)
- npm
npm installnpm run devOpen: http://localhost:5173
npm run dev— Start Vite dev server with HMRnpm run lint— Run ESLint checksnpm run test— Run Cypress E2E testsnpm run build— Build static site, generate feeds, add CNAMEnpm run preview— Preview production buildnpm run deploy— Build and publish to GitHub Pagesnpm run rss— Generate RSS/Atom/JSON feeds onlynpm run add-cname— Write CNAME intodist/only
npm run build executes the full production pipeline:
- Build static pages via
vite-ssg - Generate RSS/Atom/JSON feeds from
pages/blog/*.md - Write
dist/CNAME
npm run deploy runs the build and publishes dist/ to GitHub Pages.
E2E tests are implemented with Cypress in cypress/e2e/.
Run all E2E tests:
npm run test- Keep blog posts inside
pages/blog/to preserve auto-discovery. - Keep frontmatter valid for metadata-dependent features (blog list, feeds).
- Do not manually edit generated declaration files:
auto-imports.d.tscomponents.d.tstyped-router.d.tsshms.d.ts
- Prefer
@/alias for imports fromsrc/.
Gabriel Vitali
Website: https://gabcvit.dev