Skip to content

Add blog infrastructure and first blog post #7

Description

@elronbandel

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:

  1. Reads all blogs/*/blog.md files
  2. Parses frontmatter + markdown content
  3. Generates blog/index.html (listing page with all posts, sorted by date)
  4. Generates blog/<slug>/index.html for each post using a shared HTML template
  5. Copies figures to blog/<slug>/figures/
  6. 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

  • scripts/build_blog.py generates blog pages from markdown source
  • Blog listing page at /blog/
  • Individual blog pages at /blog/<slug>/
  • "Blog" link in website header
  • Dark/light mode works on blog pages
  • First blog post (open leaderboard) is live
  • GitHub Actions builds blog before deploy
  • blog.md is standalone — works when pasted elsewhere
  • HTML figures render interactively on website, with image fallback in standalone markdown

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions