AstroPortfolioBlog

folio-astro — Astro Portfolio Template

By fazleyrabby

A minimalist Astro-based portfolio and blog theme that uses Markdown content collections to manage blog posts, projects, and work experience, with single-file configuration and multiple switchable themes.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-13View source

What stands out

A quick read of the recorded project description.

01

Personal details, navigation, social links, and homepage metrics are centralized in a single configuration file at src/config.ts

02

Blog posts, projects, and work experience use Markdown content collections, with field structures defined in content.config.ts

03

Four built-in themes: Light, Dark, Brutal, and Mono, switchable at runtime

04

Project entries automatically generate detail pages when problem or highlights are filled in

05

Article body text is styled with @tailwindcss/typography, and code blocks are highlighted by Shiki

06

Static output with an included GitHub Actions deployment workflow for GitHub Pages

Template Details

Folio is a content-first portfolio and blog theme built with Astro and Tailwind CSS. It centralizes personal details, navigation, social links, and homepage metrics in a single file at src/config.ts, while blog posts, project case studies, and work experience live in Markdown content collections under src/content, with their field structures defined in src/content.config.ts. If a project entry includes a problem or highlights, a corresponding detail page is generated.

The theme includes four built-in appearances: Light, Dark, Brutal, and Mono. They can be switched at runtime via the ThemeIcon component in the top-right corner, and the default theme can be adjusted in the initialization script in MainLayout.astro. Article body text is styled with @tailwindcss/typography, and code blocks are highlighted by Shiki. Animations are provided by GSAP and Lenis and can be disabled by removing the relevant references. The site outputs statically, with build artifacts in the dist directory. The repository includes a GitHub Actions workflow for GitHub Pages, and it can also be deployed to Vercel, Netlify, or Cloudflare Pages.

Before use, replace the sample Markdown content with your own and update the site address in config.ts and astro.config.mjs. The code is MIT licensed and free for personal and commercial use, but third-party assets such as demo images, fonts, and icons require separate license verification, and external services such as domains and hosting may incur costs.

AstroPortfolioBlog

Is it right for your project?

Use Cases

  • Building a personal portfolio site to showcase project case studies and work experience
  • Adding a Markdown-based blog alongside a portfolio
  • Sites that need multiple color themes and allow visitors to switch them
  • Static sites deployed to GitHub Pages, Vercel, Netlify, or Cloudflare Pages

Suitable For

  • Developers, designers, and writers who want to manage content with Markdown
  • Personal site authors who prefer single-file configuration and do not want to maintain a complex backend
  • Users who need a portfolio and blog combined into one static site
  • Astro users who are willing to replace sample content and images themselves

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Requires Node 18.17+; install dependencies with pnpm (or npm/yarn) and start local development with pnpm dev

  2. 2

    Replace placeholder data such as name, bio, social links, navigation, and metrics in src/config.ts

  3. 3

    Update the site address in astro.config.mjs to match the sitemap and canonical URL

  4. 4

    Place the avatar at public/avatar.png, or modify CONFIG.hero.avatar to point to another path

  5. 5

    Before going live, delete the sample Markdown in src/content/blog, projects, and experiences and replace it with your own content

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This listing covers the free version in the public repository under the MIT license; the free scope applies to that version's code and does not mean external services or third-party assets are free.

Must comply with when using

  • You may use, modify, commercialize, and distribute this version's code for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
  • The author only states that linking back when using the theme is 'appreciated but not required'; this does not constitute a mandatory attribution or backlink obligation, and you may use it freely.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

If you use this theme, a link back is appreciated but not required.

Original README
https://github.com/fazleyrabby/folio-astro/blob/main/LICENSEhttps://github.com/fazleyrabby/folio-astro/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-13. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 85 / 100
Technologies
Astro
Website type
Portfolio · Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-06-06
Screenshot last checked
2026-10-13

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Astro as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: [email protected] · 2026-10-13

Inspect the recorded source material

SHA-256: 65501f041f44e4c6ad313c1e35e689b15dfb0eba30723c2540ee334634e9d085

2026-10-13T00:30:57.189Z

Source file / repository
# Folio — Minimalist Astro Portfolio Theme

A content-first portfolio & blog theme built with **Astro 5** and **Tailwind CSS**. Editorial typography, four built-in themes, and a single config file. Designed for developers, designers, and writers who want a premium aesthetic without the bloat.

[**Live Demo**](https://folio.fazleyrabbi.xyz) · [**Report Issue**](https://github.com/fazleyrabby/folio-astro/issues)

![Folio Theme Preview](./.github/assets/preview.jpg)

## Contents

- [Features](#features)
- [Quick Start](#quick-start)
- [Project Structure](#project-structure)
- [Customization](#customization)
- [Content Collections](#content-collections)
- [Themes](#themes)
- [Deployment](#deployment)
- [License](#license)

## Features

- **Astro 5** — zero JS by default, content collections, type-safe frontmatter.
- **Tailwind CSS 3** — utility-first styling, easy to override.
- **Four themes** — Light, Classic Dark, Brutal, Mono. Switchable at runtime.
- **Content collections** — Blog, Projects, and Work Experience as markdown.
- **Single-file config** — name, bio, socials, nav, metrics all live in `src/config.ts`.
- **Pre-styled prose** — `@tailwindcss/typography` + Shiki syntax highlighting (`github-light` / `nord`).
- **Smooth animations** — GSAP + Lenis (opt-out by removing imports).
- **SEO ready** — sitemap, canonical URLs, OpenGraph fields in `<Head>`.
- **One-click GitHub Pages deploy** — Actions workflow included.
- **Responsive & accessible** — mobile menu, keyboard nav, semantic HTML.

## Quick Start

Requires Node 18.17+ and pnpm (or npm/yarn).

```bash
git clone https://github.com/fazleyrabby/folio-astro.git my-portfolio
cd my-portfolio
pnpm install
pnpm dev
```

Open `http://localhost:4321`.

### Scripts

| Command | Action |
|---------|--------|
| `pnpm dev` | Start dev server with hot reload |
| `pnpm build` | Build production site to `./dist/` |
| `pnpm preview` | Preview the build locally |

## Project Structure

```
src/
├── components/      # Hero, Projects, Experience, LatestPosts, ContactCTA…
├── content/         # Markdown content
│   ├── blog/        # Blog posts
│   ├── projects/    # Project case studies
│   ├── experiences/ # Work experience entries
│   ├── about.md     # About page body
│   └── uses.md      # Uses page body
├── layouts/         # MainLayout, Head, Nav, Footer
├── lib/             # url() helper for base-path-safe links
├── pages/           # Routes
├── scripts/         # animations.js (GSAP/Lenis)
├── styles/          # global.css (theme tokens + utilities)
├── config.ts        # ← all personal data lives here
└── content.config.ts# Collection schemas
```

## Customization

Open `src/config.ts` and replace placeholder data:

```ts
export const CONFIG = {
  name: "Your Name",
  title: "Full-Stack Developer",
  tagline: "I build delightful, fast, and accessible web experiences.",
  bio: "Short bio shown in the hero section.",
  email: "[email protected]",
  available: true,

  social: {
    github: "https://github.com/yourusername",
    linkedin: "https://linkedin.com/in/yourusername",
    twitter: null,
    codepen: null,
    youtube: null,
  },

  nav: [
    { label: "Work", href: "/#projects" },
    { label: "Experience", href: "/#experience" },
    { label: "Posts", href: "/blog/" },
    { label: "About", href: "/about/" },
    { label: "Uses", href: "/uses/" },
  ],

  hero: {
    greeting: "Hi, I'm",
    avatar: "/avatar.png",   // drop image in public/
    resumeLabel: "Resume",
    viewProjectsLabel: "View Projects",
  },

  metrics: [
    { value: "5+", label: "Years" },
    { value: "30+", label: "Projects" },
  ],

  site: {
    url: "https://your-domain.com",
    description: "Portfolio of <Your Name>",
  },
};
```

Also update `astro.config.mjs` → `site` to match your domain (for sitemap/canonical URLs).

### Replace the avatar

Drop your image at `public/avatar.png` (or update `CONFIG.hero.avatar`).

### Delete demo content

Before launching, remove the example markdown files in `src/content/blog/`, `src/content/projects/`, and `src/content/experiences/`. Replace with your own.

## Content Collections

Each collection has a strict schema defined in `src/content.config.ts`.

### Blog (`src/content/blog/*.md`)

```yaml
---
title: "Post title"
description: "Short summary used in lists and meta tags"
publishedAt: "2026-01-15"     # ISO date
tags: ["astro", "web-dev"]    # optional
cover: "/covers/post.jpg"      # optional
---

Markdown body…
```

### Projects (`src/content/projects/*.md`)

```yaml
---
title: "Project name"
description: "One-line summary"
type: "Web App"               # optional
thumbnail: "/projects/img.jpg" # optional
live: "https://demo.example.com"
github: "https://github.com/..."
tech: ["Astro", "Tailwind"]
status: "Live"                 # optional
position: 1                    # optional ordering
period: "2025"
role: "Designer & Developer"
highlights: ["Bullet 1", "Bullet 2"]
problem: "What problem did this solve?"
solution: "How did you solve it?"
scope: ["UX", "Frontend", "Backend"]
---
```

If `problem` or `highlights` is set, the project gets a detail page at `/projects/<slug>`.

### Experiences (`src/content/experiences/*.md`)

```yaml
---
title: "Company Name"
role: "Senior Engineer"
from: "Jan 2023"
to: "Present"
skills: "TypeScript, React, PostgreSQL"
link: "https://company.com"   # optional
timeline: "2023-01-01"         # sort key (newest first)
---

- Contribution one
- Contribution two
```

## Themes

Four built-in themes, switched via the `ThemeIcon` component (top-right):

| Theme | `data-theme` | Vibe |
|-------|--------------|------|
| Light | *(default)* | Warm minimalist |
| Dark | `dark` (class) | Editorial dark |
| Brutal | `brutal` | Neo-brutalist (yellow accent, hard shadows) |
| Mono | `mono` | Black & white, terminal-inspired |

To set a default theme, edit the init script in `src/layouts/MainLayout.astro`.

## Deployment

The site is static (`output: "static"`) — deploy anywhere.

```bash
pnpm build   # outputs to ./dist/
```

### GitHub Pages

This repo ships with `.github/workflows/deploy.yml`.

1. In your repo: **Settings → Pages → Build and deployment → Source → GitHub Actions**.
2. Push to `main`. The workflow builds and publishes.
3. (Optional) Custom domain: edit `public/CNAME` and update `astro.config.mjs` `site`. For project-page hosting (no custom domain), add `base: "/<repo-name>"` to `astro.config.mjs`.

### Vercel / Netlify / Cloudflare Pages

Build command: `pnpm build` · Output dir: `dist`. No further config needed.

## Author

Built by **[Md. Fazley Rabbi](https://github.com/fazleyrabby)** — [folio.fazleyrabbi.xyz](https://folio.fazleyrabbi.xyz)

If you use this theme, a link back is appreciated but not required.

## License

[MIT](./LICENSE) — free for personal and commercial use.
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.