Newsletter
Join the Community
Subscribe to our newsletter for the latest news and updates
Navfolio is a serene Astro theme for personal publishing—bringing your homepage, blog, portfolio, and digital garden together.

A dark portfolio & blog theme for Astro with a live 5,000-particle Three.js background, blog system, and glassmorphism UI.
Navfolio is a portfolio-first Astro starter that merges a personal homepage, blog, project documentation, short-form Vibe notes, full-text search, and comment systems into a single static site.
Navfolio is a static-site starter built on Astro that combines a personal navigation page, portfolio, blog, project docs, and a lightweight digital garden in one repository. It takes Markdown and MDX content plus a TOML site configuration as input and produces a static dist folder ready for deployment to any static host. The project is maintained by dodolalorc on GitHub under the name astro-navfolio, and a live preview is available at https://astro.navfolio.site/.
Navfolio's core features keep a personal publishing site lightweight and self-contained. The following capabilities are all included in the starter:
dist/pagefind; the search modal opens from the top navigation or via the Ctrl+K / Cmd+K shortcut, with configurable placeholder and max results in site.toml.[config.comments], with per-article opt-out by setting comments: false in frontmatter.bun run build automatically generates WOFF2 subsets for Chinese, Japanese, and Korean characters using Python 3, FontTools, and Brotli, keeping font payloads small without manual font preparation.bun run post:new, project:new, vibe:new, and media:new scaffold new content with safe filenames, default frontmatter copied from editable templates, and optional --mdx flags.src/config/site.toml validated by a Zod schema at build time.astro.config.mjs handles the project-page base automatically in GitHub Actions.Navfolio suits developers, creators, and writers who want a single static site for their homepage, portfolio, blog, and project documentation. It is especially useful for developers who prefer managing content as Markdown and MDX files rather than through a visual editor. For people publishing in Chinese or other CJK languages, the built-in font subsetting keeps the static site lightweight without manually preparing web fonts.
Here are concrete ways Navfolio's sections are used:
/ page configured in site.toml./blog, with optional sidebars for TOC and related articles, and an RSS feed at /rss.xml./projects, each with hero images, tags, and optional sidebar settings, suitable for open-source project pages or case studies./vibe timeline without writing a full article, using bun run vibe:new to scaffold entries.Navfolio is developed locally with Bun and Astro, then built into static files with automated font subsetting and search indexing. After creating a Python 3 virtual environment with FontTools and Brotli installed, you run bun install and bun run dev to start a local server. You edit src/config/site.toml and add content files under src/content/, using CLI scripts to scaffold new posts, projects, vibe notes, and media entries. When you run bun run build, the pipeline first builds the Astro site, generates WOFF2 font subsets for CJK characters, and produces a Pagefind search index inside dist, which you can preview with bun run preview.
Navfolio's strengths and limitations are documented directly in the README:
Pros:
Cons:
Navfolio is free and open source. The starter is distributed through its public GitHub repository at https://github.com/dodolalorc/astro-navfolio, and the author asks for a star if the template is useful.
AstroPaper is an alternative Astro blog theme focused primarily on articles, without the portfolio, projects, and Vibe sections that Navfolio adds.
Yes. Production builds hard-depend on Python 3, FontTools, and Brotli to generate WOFF2 font subsets for CJK characters. Without those tools, bun run build fails. The README recommends creating a .venv virtual environment; the build scripts automatically prefer it if present.
Navfolio supports giscus, utterances, waline, and none. You set the provider globally in src/config/site.toml under [config.comments] with enabled, provider, and show_on_posts keys, and you can disable comments on a single article by adding comments: false to its frontmatter.
Run bun run post:new my-first-post from the project root. The script creates a Markdown file with default frontmatter in src/content/blog/. Add the --mdx flag or use a .mdx filename to author the post in MDX instead. The default template lives in scripts/templates/post.md and is editable without changing TypeScript.
Vibe is a short-form timeline for life snippets, quick updates, and development notes, stored as Markdown files in src/content/vibe/. You scaffold new entries with bun run vibe:new and control its display behavior through the [config.vibe] section in site.toml.
Yes. The build outputs a static dist folder, and the repository includes a GitHub Actions workflow for GitHub Pages project sites. astro.config.mjs automatically sets the correct base in GitHub Actions environments; you can also override the site URL and base manually with the SITE_URL and SITE_BASE environment variables during bun run build.
