Skip to content

kidchenko/kidchenko.github.io

Repository files navigation

josebarbosa.dev

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.

Table of contents

  1. Highlights
  2. Pages
  3. Stack
  4. Quick start
  5. Commands
  6. Project structure
  7. Configuration
  8. Content
  9. Internationalization
  10. Search
  11. Deploy
  12. Acknowledgements
  13. License

Highlights

  • 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

Pages

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

Stack

Quick start

Requires Node 20+ and pnpm.

pnpm install
pnpm dev          # http://localhost:3000

Commands

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

Project structure

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

Configuration

  • Site metadata, locale, and menusrc/site.config.ts
  • Astro integrations and webmanifestastro.config.ts
  • UI strings (en / pt-BR)src/i18n/ui.ts
  • Public assetspublic/ (favicon, social card, CNAME)
  • Global stylessrc/styles/global.css

Content

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.

Internationalization

Two languages are supported: English (default) and Portuguese (pt-BR).

  • Routes are generated by src/pages/[...lang]/... with lang resolving to "" (English) or "pt"
  • All UI copy lives in src/i18n/ui.ts under en / pt
  • The LanguageToggle component switches between the two
  • To add another language: add it to languages in src/i18n/ui.ts, add a translated ui block, and add getStaticPaths entries where needed

Search

Pagefind builds a static search index from posts and notes during pnpm postbuild. To rebuild locally:

pnpm build && pnpm postbuild && pnpm preview

Filtering by tag is enabled via data-pagefind-filter="tag" on tag links.

Deploy

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/

Acknowledgements

License

MIT

About

Tá na hora de tomar vergonha na cara e ter meu site. It's time to take shame on my face and have my site.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors