A professional static personal website with blog functionality, built for GitHub Pages.
- Professional, responsive design
- Blog system with Markdown-to-HTML conversion
- Separate resume page
- Image asset management
- No CMS required - just write Markdown files
- Optimized for GitHub Pages deployment
personal-website/
├── index.html # Blog homepage
├── resume.html # Resume page
├── post-template.html # Template for blog posts
├── build.py # Build script to convert markdown to HTML
├── requirements.txt # Python dependencies
├── css/
│ └── style.css # Main stylesheet
├── posts/
│ ├── *.md # Your markdown blog posts
│ └── *.html # Generated HTML posts (created by build.py)
├── assets/
│ └── images/ # Image files for blog posts
└── js/ # JavaScript files (optional)
First, create a virtual environment and install the required Python packages:
cd personal-website
# Create virtual environment
python3 -m venv venv
# Activate virtual environment
source venv/bin/activate # On Linux/Mac
# OR
venv\Scripts\activate # On Windows
# Install dependencies
pip install -r requirements.txtNote: The virtual environment directory (venv/) is already in .gitignore so it won't be committed to your repository.
Create a new markdown file in the posts/ directory. Each post must include frontmatter with title, date, and excerpt:
---
title: Your Post Title
date: 2025-01-15
excerpt: A brief description of your post that will appear on the blog homepage.
---
## Your Content Here
Write your blog post content using standard Markdown syntax...- Headings (
#,##,###, etc.) - Bold and italic text
- Links:
[text](url) - Images:
 - Code blocks with syntax highlighting
- Lists (ordered and unordered)
- Tables
- Blockquotes
- Place your images in
assets/images/ - Reference them in your markdown:

Run the build script to convert your markdown posts to HTML:
# Make sure your virtual environment is activated
source venv/bin/activate # On Linux/Mac
# Run the build script
python build.pyThis will:
- Convert all
.mdfiles inposts/to HTML - Generate individual post pages
- Update
index.htmlwith the list of posts
You can preview your site locally using Python's built-in HTTP server:
python -m http.server 8000Then open your browser to http://localhost:8000
-
Create a new repository on GitHub (e.g.,
username.github.ioor any repository name) -
Initialize git in your project directory (if not already done):
git init git add . git commit -m "Initial commit: Personal website"
-
Add your GitHub repository as remote:
git remote add origin https://github.com/username/repository-name.git git branch -M main git push -u origin main
- Go to your repository on GitHub
- Click Settings → Pages
- Under Source, select:
- Branch:
main - Folder:
/ (root)
- Branch:
- Click Save
Your site will be available at https://username.github.io/repository-name/ (or https://username.github.io/ if using a username repository).
Whenever you write a new post:
# 1. Write your markdown post in posts/
# 2. Activate virtualenv and build the site
source venv/bin/activate
python build.py
# 3. Commit and push
git add .
git commit -m "Add new blog post"
git pushGitHub Pages will automatically update your site within a few minutes.
- Resume: Edit
resume.htmlto update your professional information - Blog homepage: Edit the hero section in
index.html - Footer: Update footer information in all HTML files
- Navigation: Modify the nav links in header sections
Edit css/style.css to customize:
- Colors (see CSS variables at the top of the file)
- Fonts
- Layout
- Responsive breakpoints
Modify post-template.html to change the structure of blog post pages.
- Frontmatter is required: Every markdown file must have valid frontmatter (title, date, excerpt)
- Date format: Use
YYYY-MM-DDformat for dates (e.g.,2025-01-15) - File names: Use descriptive file names for your markdown files (e.g.,
my-first-post.md) - URL slugs: Post URLs are automatically generated from titles (e.g., "My First Post" →
my-first-post.html) - Images: Store all images in
assets/images/and use relative paths from the posts directory
- Write markdown post in
posts/your-post-name.md - Activate virtualenv:
source venv/bin/activate - Run
python build.py - Test locally with
python -m http.server 8000 - Commit and push to GitHub
- GitHub Pages updates automatically
- "No frontmatter found": Make sure your markdown file starts with
---and includes title, date, and excerpt - "Missing required field": Check that all three frontmatter fields are present
- Check that you committed and pushed all files
- Verify GitHub Pages is enabled in repository settings
- Wait 2-3 minutes for GitHub to rebuild the site
- Check the Actions tab for build errors
- Verify the image path is correct relative to the post location
- Ensure images are committed to the repository
- Check image file names match exactly (case-sensitive on Linux/GitHub)
This is a personal website template. Feel free to use and modify it for your own site.
- Email: ilya at ovsy dot com
- LinkedIn: linkedin.com/in/iliao