A personal portfolio website built with Astro + React, showcasing my work as a software engineer.
- Framework: Astro 4.x
- UI Library: React 18 (Islands Architecture)
- Styling: Vanilla CSS with CSS Custom Properties
- Deployment: GitHub Actions β GitHub Pages
- Image Optimization: Astro Image + Sharp
- β‘ Fast static site generation with minimal JavaScript
- π¨ Dark/light mode toggle with localStorage persistence
- π± Fully responsive design
- βΏ Accessible navigation and smooth scrolling
- πΌοΈ Optimized images with automatic WebP conversion
- π CSS animations (no heavy animation libraries)
- π§ Type-safe content collections
Only 5 production dependencies (79% reduction from previous Gatsby build):
astroreactreact-domsharp(for image optimization)@astrojs/react(dev dependency)
- React Islands (interactive): Header, MobileMenu, DarkModeToggle
- Astro Components (static): Banner, About, Timeline, Portfolio, Footer
- SVG Icons (inline): GitHub, LinkedIn, Behance, Link
/
βββ public/ # Static assets (favicon, etc.)
βββ src/
β βββ assets/ # Images (processed by Astro)
β βββ components/
β β βββ react/ # React island components
β β βββ icons/ # SVG icon components
β β βββ *.astro # Static Astro components
β βββ content/ # Content collections (markdown)
β β βββ hero/
β β βββ about/
β β βββ experience/
β β βββ extra-curricular/
β β βββ portfolio/
β βββ layouts/
β β βββ Layout.astro
β βββ pages/
β β βββ index.astro
β β βββ 404.astro
β βββ styles/ # Vanilla CSS modules
β βββ config.ts # Site configuration
βββ package.json
- Node.js 18.x or higher
- npm 9.x or higher
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run build
# Preview production build
npm run previewContent is managed through Astro Content Collections in the src/content/ directory. Each collection has:
- Type-safe schemas defined in
src/content/config.ts - Markdown files with frontmatter for structured data
- Automatic validation and TypeScript types
To update content:
- Edit the markdown files in
src/content/{collection}/index.md - Follow the existing frontmatter structure
- Run
npm run devto see changes instantly
The site automatically deploys to GitHub Pages via GitHub Actions when you push to the source branch.
- Go to repository Settings β Pages
- Set Source to "GitHub Actions"
- Push to
sourcebranch to trigger deployment
The workflow is defined in .github/workflows/deploy.yml.
Uses vanilla CSS with CSS Custom Properties for:
- Zero build dependencies for styles
- Future-proof CSS that works forever
- Easy theme customization via CSS variables
- Responsive design with standard media queries
Theme variables are defined in src/styles/theme.css:
:root {
--font-playfair: "Playfair Display", serif;
--color-primary: #c38352;
--color-secondary: #71a7b2;
/* ... */
}- Chrome/Edge (last 2 versions)
- Firefox (last 2 versions)
- Safari (last 2 versions)
- Mobile browsers (iOS Safari, Chrome Mobile)
- Lighthouse scores: 95+ performance, 100 accessibility/best-practices/SEO
- Minimal JavaScript (< 150KB total, mostly React islands)
- Optimized images with responsive srcsets
- Fast initial page load with static HTML
MIT
- Email: sofialcfsilva@gmail.com
- GitHub: @literallysofia
- LinkedIn: sofialcfsilva
Built with Astro and β€οΈ