Personal website of Jose Barbosa — Engineering Director, founder, and writer on engineering leadership, AI, and SaaS. Live at josebarbosa.dev.
Built on top of Astro Cactus and redesigned in 2026.
- Highlights
- Pages
- Stack
- Quick start
- Commands
- Project structure
- Configuration
- Content
- Internationalization
- Search
- Deploy
- Acknowledgements
- License
- 2026 redesign with a compass animation on the homepage
- Bilingual: English and Português (pt-BR) via Astro routing under
[...lang] - Light and dark themes with a toggle
- Posts and notes via Astro Content Collections (MD/MDX) with type-checked frontmatter
- Static, client-side search with Pagefind
- Auto-generated OG images via Satori
- RSS feed, sitemap, robots.txt, and web app manifest
- Print-friendly CV page (Save as PDF)
- Accessible, semantic markup with skip links and visible focus
| Path | Description |
|---|---|
/ |
Hero, selected outcomes, and featured writing |
/about/ |
Long-form intro, current focus, beyond engineering, reading list, contacts |
/portfolio/ |
Active SaaS products (Vera, .NET SaaS), past ventures, open source |
/posts/ |
Writing index with tag filters and pagination |
/cv/ |
Print-ready CV with summary, work history, education, skills, languages |
/contact/ |
Contact form with honeypot and other ways to reach me |
/pt/... |
Portuguese versions of every page |
/og-image/[slug].png |
Generated OG images per post |
/rss.xml |
RSS feed |
- Astro v6 with MDX
- Tailwind CSS v4
- Expressive Code (Dracula + GitHub Light) for code blocks
- Pagefind for static search
- Satori + Sharp for OG images
- Astro Icon (MDI)
- TypeScript, Biome, Prettier
- Deployed on the host configured by
CNAME
Requires Node 20+ and pnpm.
pnpm install
pnpm dev # http://localhost:3000| Command | Action |
|---|---|
pnpm install |
Install dependencies |
pnpm dev |
Start dev server at localhost:3000 |
pnpm build |
Build the production site to ./dist/ |
pnpm postbuild |
Run Pagefind to generate the static search index |
pnpm preview |
Preview the production build locally |
pnpm check |
Run astro check and Biome |
pnpm lint |
Apply Biome auto-fixes |
pnpm format |
Format with Prettier |
src/
├─ assets/ # Local images and static assets
├─ components/ # Astro components (Header, Footer, Search, ThemeToggle, ...)
├─ content/ # Posts, notes, and tag overrides (MD/MDX)
├─ data/ # Static data (e.g. CV-related content)
├─ i18n/ # Languages, UI strings (en, pt), helpers
├─ layouts/ # Base, BlogPost, and page layouts
├─ pages/
│ ├─ [...lang]/ # Localized pages: index, about, portfolio, cv, contact, posts
│ ├─ og-image/ # Satori-generated OG images
│ ├─ posts/ # Post pagination and per-post pages
│ ├─ tags/ # Tag index and tag pages
│ ├─ rss.xml.ts # RSS feed
│ └─ 404.astro
├─ plugins/ # Remark/rehype plugins (admonitions, etc.)
├─ styles/ # Global styles and Tailwind config
└─ site.config.ts # Site URL, author, locale, menu links, code-block themes
- Site metadata, locale, and menu —
src/site.config.ts - Astro integrations and webmanifest —
astro.config.ts - UI strings (en / pt-BR) —
src/i18n/ui.ts - Public assets —
public/(favicon, social card, CNAME) - Global styles —
src/styles/global.css
Posts and notes are managed as Astro Content Collections under src/content/. The schema lives in src/content.config.ts and validates frontmatter at build time.
Add a post by dropping a .md or .mdx file in src/content/post/. The filename becomes the slug.
Minimum frontmatter:
---
title: "Post title (≤ 60 chars)"
description: "SEO description (50–160 chars)"
publishDate: "2026-05-02"
tags: ["leadership", "ai"]
---Optional: updatedDate, coverImage, ogImage, draft. Drafts are excluded from production builds, RSS, and OG generation.
Two languages are supported: English (default) and Portuguese (pt-BR).
- Routes are generated by
src/pages/[...lang]/...withlangresolving to""(English) or"pt" - All UI copy lives in
src/i18n/ui.tsunderen/pt - The
LanguageTogglecomponent switches between the two - To add another language: add it to
languagesinsrc/i18n/ui.ts, add a translateduiblock, and addgetStaticPathsentries where needed
Pagefind builds a static search index from posts and notes during pnpm postbuild. To rebuild locally:
pnpm build && pnpm postbuild && pnpm previewFiltering by tag is enabled via data-pagefind-filter="tag" on tag links.
The site is statically rendered. Any static host works (Netlify, Vercel, Cloudflare Pages, GitHub Pages). The custom domain is set in public/CNAME.
pnpm build && pnpm postbuild
# upload ./dist/- Theme base: Astro Cactus by Chris Williams, itself inspired by Hexo Theme Cactus
- Built with Astro, Tailwind, Pagefind, Satori, and Expressive Code
MIT