Bloomfolio Complete Guide: Building Your Portfolio
A comprehensive guide to customizing and deploying your Bloomfolio portfolio template. Learn about Keystatic CMS, configuration, content management, and deployment.
Introduction
Bloomfolio is a configuration-driven portfolio template designed for developers, designers, and creatives. It combines the power of Astro's static site generation with the flexibility of Tailwind CSS and the beautiful components of DaisyUI.
Key Features
- Keystatic CMS: Visual content editor with live preview and GitHub integration
- Configuration-Driven: Customize your portfolio through a central config file
- 6 Content Collections: Blog, Projects, Work, Education, Hackathons, and About
- Type-Safe: Full TypeScript support for content and configuration
- Modern Stack: Astro 5 + TailwindCSS 4 + DaisyUI 5
- Markdoc Support: Enhanced markdown with custom tags (Spotify, YouTube, Twitter)
- 6 Built-in Themes: Light, Dark, Synthwave, Retro, Valentine, Dim
- Responsive Design: Mobile-first approach with DaisyUI components
- View Transitions: Smooth page transitions with Astro's View Transitions API
- FAB Flower: Expandable floating action button for extra links
- Image Optimization: Automatic image optimization with Astro
Tech Stack
Core Technologies
- Astro 5: Modern static site generator with component islands
- Keystatic: Git-based headless CMS for content management
- TailwindCSS 4: Utility-first CSS framework with CSS-first configuration
- DaisyUI 5: Tailwind CSS component library
- TypeScript: Type-safe development experience
- Markdoc: Markdown with custom tag support
- Lucide Icons: Beautiful, consistent icon library
Integrations
- @keystatic/astro: Keystatic CMS integration with visual editor
- @astrojs/markdoc: Markdoc integration for enhanced content
- @tailwindcss/vite: Tailwind CSS 4 Vite plugin
- View Transitions API: Smooth page transitions
Quick Start
Prerequisites
- Node.js 18+ or 20+
- npm, pnpm, or yarn package manager
- Code editor (VS Code recommended)
Installation
# Clone the repository git clone https://github.com/lauroguedes/bloomfolio.git # Navigate to project directory cd bloomfolio # Install dependencies npm install # Start development server npm run dev
Visit http://localhost:4321 to see your portfolio.
Access Keystatic CMS:
http://localhost:4321/keystatic
Use the visual editor to create and manage your content!
Project Structure
bloomfolio/ ├── public/ # Static assets │ └── favicon.svg ├── src/ │ ├── assets/ # Image assets │ │ └── bloomfolio.png │ ├── components/ # Reusable components (20+) │ │ ├── About.astro │ │ ├── Blog.astro │ │ ├── BlogCard.astro │ │ ├── Contact.astro │ │ ├── FabFlower.astro │ │ ├── Hackathons.astro │ │ ├── Hero.astro │ │ ├── ProjectCard.astro │ │ ├── Projects.astro │ │ ├── SkillBadge.astro │ │ ├── ThemeSelector.astro │ │ ├── ThemeToggle.astro │ │ ├── Timeline.astro │ │ ├── Spotify.astro │ │ ├── Twitter.astro │ │ └── YouTube.astro │ ├── content/ # Content collections │ │ ├── about/ # About section │ │ ├── blog/ # Blog posts │ │ ├── education/ # Education history │ │ ├── hackathons/# Hackathon entries │ │ ├── projects/ # Portfolio projects │ │ └── work/ # Work experience │ ├── layouts/ # Page layouts │ │ ├── Layout.astro │ │ ├── BlogLayout.astro │ │ └── ProjectLayout.astro │ ├── pages/ # File-based routing │ │ ├── index.astro │ │ ├── blog/ │ │ └── projects/ │ ├── styles/ │ │ └── global.css # Tailwind + DaisyUI │ ├── config.ts # Site configuration │ └── content.config.ts # Content schemas ├── astro.config.mjs # Astro configuration ├── package.json ├── tsconfig.json └── README.md
Configuration Guide
All site configuration is centralized in src/config.ts. This file controls your site's metadata, social links, theme settings, section visibility, and more.
Basic Information
export const siteConfig: SiteConfig = {
name: "Your Name",
title: "Your Title/Tagline",
description: "Brief description of your portfolio",
avatar: "../assets/your-avatar.png",
location: "Your City, Country",
email: "your@email.com",
// ... more config
};
Social Links
Add your social media profiles:
socialLinks: {
github: "https://github.com/username",
linkedin: "https://linkedin.com/in/username",
twitter: "https://twitter.com/username",
bluesky: "https://bsky.app/profile/username",
instagram: "https://instagram.com/username",
youTube: "https://youtube.com/@username",
codetips: "https://codetips.cloud/u/username",
}
All fields are optional - only include the platforms you use.
Theme Settings
Choose between theme selector (dropdown) or theme toggle (checkbox):
enableThemeSelector: true // true = dropdown, false = checkbox
Available themes:
light- Clean light theme (default)dark- Dark themesynthwave- Retro cyberpunkretro- Vintage computingvalentine- Warm pink tonesdim- Dimmed dark theme
Section Visibility
Control which sections appear on your homepage:
sections: {
about: true, // About section
projects: true, // Projects showcase
blog: true, // Latest blog posts
work: true, // Work experience
education: true, // Education history
hackathons: true, // Hackathon participation
contact: true, // Contact section
}
Set any section to false to hide it. The Hero section is always visible.
Extra Links (FAB Flower)
Configure the floating action button menu:
extraLinks: {
enable: true,
links: [
{
link: "/blog/guide",
icon: BookOpen,
label: "Guide"
},
// Add more links...
],
}
Set enable: false to hide the FAB entirely.
Content Management
Bloomfolio offers two powerful ways to manage your content:
Option 1: Keystatic CMS (Recommended)
The easiest way to create and edit content without touching code.
Access the visual editor at http://localhost:4321/keystatic when your dev server is running.
Key Benefits:
- Visual Interface: Form-based content editing with live preview
- No File Management: Keystatic handles file creation, naming, and organization
- Image Uploads: Upload images directly through the interface
- Type Validation: Automatic validation ensures all required fields are filled
- Media Embeds: Easy Spotify, YouTube, Twitter embeds (blog posts only)
- Git-Based: All changes are saved as files in your repository
Content Types Available:
- Singletons: Hero, About
- Collections: Blog, Projects, Work, Education, Hackathons
Learn more: Keystatic Documentation
Option 2: Direct File Editing (For Developers)
Edit markdown files directly in src/content/ with your code editor.
Perfect for:
- Bulk content changes
- Version control workflows
- Advanced markdown editing
- Scripting content generation
Both approaches work together - changes made in files appear in Keystatic and vice versa!
Content Collections
Bloomfolio uses Astro's Content Collections for type-safe content management. There are 6 collections:
1. About Collection
Single entry describing who you are.
Location: src/content/about/about.md
--- title: "About Me" photo: "https://your-photo-url.com/photo.jpg" --- Write your bio here using Markdown...
2. Blog Collection
Blog posts support both .md (standard markdown) and .mdoc (Markdoc with media components).
Location: src/content/blog/*.{md,mdoc}
File Extensions:
.md- Standard Markdown for regular blog posts.mdoc- Markdoc with component support (required for Spotify, YouTube, Twitter embeds)
⚠️ Important: Media components only work in
.mdocfiles and are currently only available in the blog collection.
--- title: "Post Title" description: "Brief description" image: "./featured-image.png" publishDate: "2024-01-25" updatedDate: "2024-01-26" # Optional tags: ["Tag1", "Tag2"] # Optional --- Your blog post content...
3. Projects Collection
Showcase your work and projects.
Location: src/content/projects/*.md
--- title: "Project Name" description: "Brief description" image: "./project-screenshot.png" startDate: "2023-01-15" endDate: "2023-06-30" # Optional (omit for ongoing) skills: ["React", "TypeScript", "Node.js"] demoLink: "https://demo.example.com" # Optional sourceLink: "https://github.com/..." # Optional --- Detailed project description...
4. Work Collection
Professional experience timeline.
Location: src/content/work/*.md
--- title: "Company Name" subtitle: "Job Title" startDate: "2020-01-15" endDate: "2023-06-30" # Optional (omit for current role) logo: "https://company-logo-url.com" # Optional link: "https://company-website.com" # Optional --- Job description and achievements...
5. Education Collection
Academic background.
Location: src/content/education/*.md
--- title: "University Name" subtitle: "Degree/Course Name" startDate: "2016-09-01" endDate: "2020-06-15" # Optional logo: "https://university-logo.com" # Optional link: "https://university-website.com" # Optional --- Additional education details...
6. Hackathons Collection
Hackathon participation and wins.
Location: src/content/hackathons/*.md
--- title: "Hackathon Name" location: "City, Country" description: "Brief description" startDate: "2023-11-23" endDate: "2023-11-25" # Optional logo: "https://hackathon-logo.com" # Optional sourceLink: "https://github.com/project" # Optional --- Project details and achievements...
Components Reference
Layout Components
Layout.astro
Base layout for all pages. Includes:
- Global styles
- Theme controls
- Page transitions
- Meta tags
- FAB Flower (if enabled)
BlogLayout.astro
Specialized layout for blog posts with:
- Featured image
- Post metadata (date, reading time)
- Tags display
- Navigation buttons
ProjectLayout.astro
Project detail page layout with custom styling.
Section Components
Hero.astro
Main hero section with:
- Avatar/logo
- Name and title
- Description
- Location
- Social media links
About.astro
About section displaying bio with optional photo.
Projects.astro
Projects showcase section showing all projects in a grid.
Blog.astro
Latest blog posts section (shows 3 most recent).
Timeline.astro
Versatile component for Work and Education sections.
Variants:
timeline: Visual timeline with iconslist: Clean list view
Props:
{
collection: "work" | "education"
variant: "timeline" | "list"
color: "primary" | "secondary" | "accent"
backgroundColor?: "base-200" | "base-300"
icon: LucideIcon
sectionTitle: string
}
Hackathons.astro
Display hackathon participation with cards.
Contact.astro
Contact section with email display.
Card Components
ProjectCard.astro
Individual project card with:
- Project image
- Title and description
- Date period
- Skills badges
- Action buttons (Demo, Source, View)
BlogCard.astro
Blog post card with:
- Image overlay effect
- Title and description
- Publish date
- Clickable to full post
Utility Components
SkillBadge.astro
Displays skill/tag badges with consistent styling.
ThemeSelector.astro
Dropdown menu for theme selection (6 themes).
ThemeToggle.astro
Simple checkbox for light/dark toggle.
FabFlower.astro
Floating action button with expandable link menu.
Media Components
Spotify.astro
Embed Spotify tracks, albums, or playlists using Markdoc tags.
{% Spotify url="https://open.spotify.com/track/..." /%}
YouTube.astro
Embed YouTube videos using Markdoc tags.
{% YouTube id="video-id" /%} or {% YouTube url="https://youtube.com/watch?v=..." /%}
Twitter.astro
Embed tweets using Markdoc tags.
{% Twitter url="https://twitter.com/user/status/..." /%} or {% Twitter id="tweet-id" username="username" /%}
Styling System
Tailwind CSS 4
Bloomfolio uses Tailwind CSS 4 with the new CSS-first configuration approach. Global styles are defined in src/styles/global.css:
@import "tailwindcss"; @plugin "daisyui";
DaisyUI Components
DaisyUI components are available throughout the project:
- Cards
- Buttons
- Badges
- Timelines
- Dividers
- And more...
Custom Styling
Add component-scoped styles using <style> tags in .astro files:
<div class="custom-class">Content</div>
<style>
.custom-class {
/* Your styles */
}
</style>
Deployment
Build for Production
npm run build
Output is generated in the dist/ directory.
Preview Build
npm run preview
Deployment Platforms
Vercel
- Connect your GitHub repository
- Vercel auto-detects Astro
- Deploy!
Netlify
- Connect repository
- Build command:
npm run build - Publish directory:
dist
Cloudflare Pages
- Connect repository
- Build command:
npm run build - Build output directory:
dist
GitHub Pages
- Use GitHub Actions
- Configure Astro for GitHub Pages
- Push to deploy
Troubleshooting
Images not loading
- Ensure images are in
src/assets/or use proper URLs - Use
image()helper in frontmatter for relative paths - Check image paths are correct
Theme not changing
- Clear browser cache
- Check localStorage is enabled
- Verify theme names match DaisyUI themes
Build errors
- Run
npm installto ensure all dependencies are installed - Check TypeScript errors with
npm run astro check - Verify all content frontmatter matches schemas
Content not appearing
- Check collection name matches folder name
- Verify frontmatter schema is correct
- Ensure files have
.mdor.mdxextension
Tips & Best Practices
- Keep config.ts updated: This is your central control panel
- Use type-safe content: Let TypeScript catch errors early
- Optimize images: Keep images under 1MB for best performance
- Write meaningful descriptions: Helps with SEO
- Test on mobile: Use responsive design utilities
- Use consistent dates: ISO format
YYYY-MM-DDworks best - Leverage Markdoc: Use custom tags for rich content
- Commit regularly: Use git to track changes
- Preview before deploy: Always test builds locally
Next Steps
- Check out the Markdown & Content Guide for detailed content creation instructions
- Customize your theme colors in
global.css - Add more projects to showcase your work
- Write blog posts to share your knowledge
- Deploy your portfolio to your preferred platform
Happy building with Bloomfolio! 🌼