Personal portfolio website built with Astro, showcasing my work as a software engineer and designer. β¨
π Live: literallysofia.github.io
| Layer | Technology |
|---|---|
| Framework | Astro 5.x |
| Styling | Vanilla CSS + Custom Properties |
| Images | Astro Image + Sharp |
| Deployment | GitHub Actions β GitHub Pages |
- π Dark/light mode with
localStoragepersistence - π± Responsive design across all breakpoints
- πΌοΈ Optimized images with automatic WebP conversion and lazy loading
- π¨ CSS-only animations (no heavy libraries)
- π Type-safe content collections with Zod schemas
- π View transitions for smooth page navigation
- π Optional password-protected access gate
- π Encrypted CV download (AES-256-GCM + PBKDF2)
- π Scroll-triggered timeline animations
/
βββ .github/workflows/
β βββ deploy.yml # GitHub Actions deployment
βββ public/ # Static assets (favicon, encrypted CV)
βββ scripts/
β βββ encrypt-cv.mjs # CV encryption utility
βββ src/
β βββ assets/ # Images (processed by Astro)
β βββ components/
β β βββ *.astro # Astro components
β β βββ icons/ # SVG icon components
β βββ content/ # Content collections
β β βββ hero/ # Homepage hero
β β βββ about/ # Education, languages
β β βββ experience/ # Work timeline
β β βββ extra-curricular/ # Volunteering, speaking
β β βββ portfolio/ # Side projects
β β βββ *.md # Collection markdown files
β βββ layouts/
β β βββ Layout.astro # Base layout
β βββ pages/
β β βββ index.astro # Home
β β βββ about.astro # About
β β βββ work.astro # Work experience
β β βββ misc.astro # Extra-curricular & projects
β β βββ 404.astro # Not found
β βββ styles/ # CSS modules
β β βββ theme.css # Design tokens & dark/light mode
β β βββ global.css # Global styles
β β βββ animations.css # Animation definitions
β β βββ ... # Component styles
β βββ content.config.ts # Collection schemas (glob loaders)
β βββ config.ts # Site metadata
βββ astro.config.mjs
βββ tsconfig.json
βββ package.json
- Node.js 18+
- npm 9+
# Install dependencies
npm install
# Copy environment variables
cp .env.example .env
# Start dev server
npm run dev| Script | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Type-check and build for production |
npm run preview |
Preview production build locally |
npm run encrypt-cv |
Encrypt CV PDF (requires CV_PASSWORD env var) |
See .env.example for available options:
PUBLIC_SITE_PASSWORDβ password for the access gatePUBLIC_ENABLE_PASSWORD_GATEβ force-enable gate in dev modeCV_PASSWORDβ password for CV encryption/decryption
Content lives in src/content/ as Markdown files with typed frontmatter. Schemas are defined in src/content.config.ts.
To update content, edit the Markdown files under the relevant collection directory and changes will reflect immediately in dev mode.
Pushes to the source branch trigger a GitHub Actions workflow that builds and deploys to GitHub Pages.
To set up:
- Go to repository Settings β Pages
- Set Source to GitHub Actions
- Add
PUBLIC_SITE_PASSWORDas a repository secret (if using the password gate)
MIT