A personal blog homepage built using a Grafana-inspired dashboard UI.
This project uses GitHub Pages + Jekyll to power a static blog and displays a dynamic Grafana-style dashboard as the homepage. The dashboard automatically updates to show:
- π Latest blog posts
- π§ Posts by category (donut chart)
- π Calendar with post dates
- π© GitHub commit activity (from commits.json)
- βΉοΈ βAbout Meβ panel with image
- π Auto-refreshing data panels
Everything is generated on the client side using JavaScript, with Jekyll providing valid JSON feeds (posts.json and tags.json) directly from the _posts folder. A GitHub Actions workflow can also generate and commit commits.json for reliable commit stats.
Main Layout:
Scaling:
Panels update automatically every 60 seconds. No backend required.
When you add a new blog post in _posts/, the dashboard automatically updates:
- Total post count
- Tag/category count
- Donut chart
- Latest 5 posts list
- Calendar highlighting post dates
Shows the total commits made in your repository over the last 7 days, using commits.json generated by a workflow and a backup via your GitHub commit history (though you may hit API limits so the commits.json is a handy backup optopn to always display content.)
Circular profile picture + text panel, centered and styled to match the dashboard theme.
No plugins needed. Just HTML, CSS, JavaScript, and Jekyllβs built-in Liquid templating (for auto-generating JSON feeds).
/
βββ index.html # Grafana-style homepage dashboard
βββ style.css # Dashboard styles
βββ script.js # JS logic for charts, refresh, GitHub API, etc.
βββ posts.json # Auto-generated by Jekyll (blog posts, must be valid JSON)
βββ tags.json # Auto-generated by Jekyll (tag counts, must be valid JSON)
βββ commits.json # Auto-generated by workflow (commit stats)
βββ _posts/ # Your actual blog posts (Markdown files)
βββ assets/
βββ blog # Images attatched to posts are stored here, you can use subdirectories for posts which avoids nameing collisions
βββ profile.jpg # About panel profile pictureAll blog posts live in the _posts/ folder using standard Jekyll formatting:
_posts/
2025-01-01-my-post.md
2025-01-02-another-post.mdEach post contains YAML front matter:
layout: post
title: My Example Post
date: 2025-12-20
tags: developer, personal # You can use as many as you wish and the doughnut will show eachJekyll automatically parses posts and generates:
posts.jsonβ metadata for all poststags.jsonβ tag counts Your dashboard fetches these and updates panels automatically β¨
Managed in script.js. They read data from:
posts.jsoncommits.json- tags extracted from posts These update every 60 seconds via:
setInterval(updateDashboard, REFRESH_INTERVAL);You can modify or add new panels in three steps:
Each panel is a .panel element:
<div class="panel text-panel">
<div class="panel-title">Latest Blog Posts</div>
<ul id="postsList"></ul>
</div>Create new panels by duplicating this block. Give each panel a unique ID or class so JavaScript can target it.
Each data source is handled in updateDashboard(). Examples:
- List latest posts
- Limit posts to 5
- Update stats
- Build charts
- Mark dates on the calendar
- Fetch GitHub commits
To create a new panel, write JavaScript that outputs into the HTML container:
document.getElementById("myPanel").textContent = "Hello!";Or create new Chart.js panels, tables, etc.
Panels use reusable styles:
.panel { background:#242424; padding:20px; border-radius:6px; }
.panel-title { text-transform: uppercase; font-size: 13px; }You can modify the look or create custom classes:
.my-custom-panel { background:#303030; }β Quote Panel
<div class="panel" id="quotePanel">
<div class="panel-title">Quote of the Day</div>
<p id="quoteText"></p>
</div>
document.getElementById("quoteText").textContent = "Stay curious.";
Use Chart.js + post dates.
Generate a visual tag cloud sized by tag frequency.
Update GitHub API URL in script.js if you use direct API calls:
fetch("https://api.github.com/repos/<USERNAME>/<REPO>/commits")
Replace with your GitHub username and repo name, this is also noted in script.js which currently uses my github as an example.
- Push the project to GitHub
- Go to Settings β Pages
- Set:
Source: main branch
Folder: root (/)
- Save
- Your site appears at:
https://<USERNAME>.github.io/<REPO>/
This project combines:
- Jekyll (for blog content)
- JavaScript (for dashboard logic)
- Chart.js (for charts)
- GitHub Pages (for hosting)
- GitHub Actions (for commit stats)