Goal
Add a blog to the website with a clean, professional template that supports dark/light mode and matches the existing design.
Architecture
Source of truth
Each blog post lives in its own directory:
blogs/
open-leaderboard/
blog.md
figures/
figure1.png
figure2.html
figure2.png (static fallback for HTML figures)
blog.md is standalone — it should work when copy-pasted to other platforms (HuggingFace, GitHub, etc.)
- Figures can be images (png, jpg, svg) or HTML (interactive). HTML figures must also have an image fallback (same name, .png extension) for the standalone markdown version
- Blog metadata (title, date, author, description, slug) lives in the markdown frontmatter
URL structure
- Blog listing:
exgentic.ai/blog/ (or exgentic.ai/blog/index.html)
- Individual posts:
exgentic.ai/blog/<slug>/index.html
Build pipeline
A Python script (scripts/build_blog.py) that:
- Reads all
blogs/*/blog.md files
- Parses frontmatter + markdown content
- Generates
blog/index.html (listing page with all posts, sorted by date)
- Generates
blog/<slug>/index.html for each post using a shared HTML template
- Copies figures to
blog/<slug>/figures/
- For HTML figures, embeds them as iframes in the blog page (with the image fallback for non-JS environments)
Dependencies should be minimal — python-markdown and pyyaml or similar. No heavy frameworks.
GitHub Actions integration
Add a build step to the deploy workflow that runs python3 scripts/build_blog.py before GitHub Pages deploys. The blog/ output directory should be in .gitignore — it's generated, not committed.
Website integration
- Add "Blog" to the header navigation (between existing nav items and the GitHub link)
- Blog listing page: grid/list of posts with title, date, description, and thumbnail
- Blog post template:
- Professional, readable typography
- Dark/light mode support (reuse existing CSS variables)
- Table of contents (auto-generated from headings)
- Code syntax highlighting
- Responsive images and figures
- Back to blog listing link
- Match the existing website aesthetic (terminal/CRT feel, glassmorphism)
First blog post
Convert the blog from the HuggingFace space Exgentic/blog ("The Open General Agent Leaderboard") into the blogs/open-leaderboard/ format. This serves as the first post and validates the entire pipeline.
Acceptance criteria
Goal
Add a blog to the website with a clean, professional template that supports dark/light mode and matches the existing design.
Architecture
Source of truth
Each blog post lives in its own directory:
blog.mdis standalone — it should work when copy-pasted to other platforms (HuggingFace, GitHub, etc.)URL structure
exgentic.ai/blog/(orexgentic.ai/blog/index.html)exgentic.ai/blog/<slug>/index.htmlBuild pipeline
A Python script (
scripts/build_blog.py) that:blogs/*/blog.mdfilesblog/index.html(listing page with all posts, sorted by date)blog/<slug>/index.htmlfor each post using a shared HTML templateblog/<slug>/figures/Dependencies should be minimal —
python-markdownandpyyamlor similar. No heavy frameworks.GitHub Actions integration
Add a build step to the deploy workflow that runs
python3 scripts/build_blog.pybefore GitHub Pages deploys. Theblog/output directory should be in.gitignore— it's generated, not committed.Website integration
First blog post
Convert the blog from the HuggingFace space
Exgentic/blog("The Open General Agent Leaderboard") into theblogs/open-leaderboard/format. This serves as the first post and validates the entire pipeline.Acceptance criteria
scripts/build_blog.pygenerates blog pages from markdown source/blog//blog/<slug>/blog.mdis standalone — works when pasted elsewhere