A personal technical blog designed for reflective engineering reports, systems architecture notes, and field retrospectives.
Crafted with the organic handwriting aesthetic of Excalifont (from Excalidraw), the spatial organization of an Obsidian Vault, deep SEO optimization, and 1-click GitHub Pages deployment.
- ✏️ Excalifont Typography Engine: Uses the official Excalidraw handwritten font (
Virgil&Excalifont) bundled locally (.woff2) for zero latency and zero external network dependencies. - 🎛️ Live Typography Switcher: Seamlessly switch between Excalifont (Default), Inter Sans, Newsreader Serif, and JetBrains Mono with instant cascading across all contents.
- 🗃️ Obsidian Vault Layout:
- Left Sidebar: Vault Explorer with folder hierarchy (
01-Reflections,02-Systems-Architecture,03-Retrospectives,04-Mental-Models), tag cloud, and filter search. - Center Pane: Obsidian reading document with status pills (
🌱 Seedling,🌿 Growing,🌲 Evergreen), breadcrumbs, reading time, and previous/next navigation. - Right Sidebar: Interactive table of contents (Outline) with real-time scrollspy and Linked Mentions / Backlinks.
- Left Sidebar: Vault Explorer with folder hierarchy (
- 💡 Native Obsidian Callouts / Admonitions:
[!NOTE],[!TIP],[!WARNING],[!DANGER],[!BUG],[!INFO],[!SUMMARY],[!QUOTE],[!QUESTION]- Distinct colors, signature icons, and custom title support.
- 🔗 Wikilinks: Support for
[[Note Title]]or[[Note Title|Custom Label]]internal links. - 🔍 Quick Switcher (
⌘K/Ctrl+K): Instant fuzzy search modal across all notes, tags, and summaries with keyboard navigation (↑,↓,↵,Esc). - 🌓 Themes: Obsidian Dark Slate (Default) and Obsidian Light Paper with persistent preference.
- 🚀 SEO & Syndication Suite:
- OpenGraph & Twitter Cards.
TechArticle/BlogPostingJSON-LD structured data.- Automated
sitemap-index.xmlandrobots.txt. - RSS 2.0 Feed at
/rss.xml.
- 🚢 Deploy Anywhere: Pre-configured for GitHub Pages with automated GitHub Actions workflow (
.github/workflows/deploy.yml).
excaliblog/
├── public/
│ ├── fonts/
│ │ ├── Virgil/ <-- Virgil-Regular.woff2 (Excalidraw font)
│ │ └── Excalifont/ <-- Excalifont glyph subsets
│ └── robots.txt
├── src/
│ ├── components/
│ │ ├── Header.astro <-- Top bar, font switcher, theme toggle
│ │ ├── SidebarLeft.astro <-- Vault explorer, folders, tags
│ │ ├── SidebarRight.astro <-- Table of contents & backlinks
│ │ ├── QuickSwitcher.astro<-- Ctrl+K search modal
│ │ └── SEOHead.astro <-- OpenGraph & JSON-LD metadata
│ ├── content/
│ │ └── posts/ <-- Your Markdown technical reports!
│ │ ├── the-cost-of-premature-abstractions.md
│ │ ├── rethinking-distributed-state.md
│ │ ├── postmortem-the-ghost-in-the-event-loop.md
│ │ └── visual-thinking-and-codebases.md
│ ├── layouts/
│ │ └── ObsidianLayout.astro
│ ├── pages/
│ │ ├── index.astro <-- Digital garden overview & notes list
│ │ ├── posts/[...id].astro<-- Individual technical report pages
│ │ ├── tags/[tag].astro <-- Tag archive pages
│ │ └── rss.xml.ts <-- RSS feed generator
│ └── styles/
│ └── global.css <-- Design tokens, themes, callouts
├── .github/
│ └── workflows/
│ └── deploy.yml <-- 1-click GitHub Pages deployment
├── astro.config.mjs
└── package.json
Simply create a .md file inside src/content/posts/ (you can also organize them inside folders or open this folder in Obsidian):
---
title: "Your Reflection Title"
description: "A 1-2 sentence reflective summary for SEO and feed preview."
pubDate: "2026-10-01"
tags: ["architecture", "systems", "reflections"]
category: "01-Reflections"
status: "growing" # "seedling" | "growing" | "evergreen" | "retrospective"
author: "Your Name"
---
Your reflection content here...
> [!NOTE] Insight Title
> This callout will render automatically with Obsidian styling!
> [!TIP] Pro Tip
> Use Wikilinks to link between thoughts: [[the-cost-of-premature-abstractions]]
```typescript
// Code blocks are automatically syntax-highlighted!
const value = calculateConsensus();
---
## 💻 Local Development
```bash
# 1. Install dependencies
npm install
# 2. Start local dev server
npm run dev
# 3. Build static production bundle (outputs to dist/)
npm run build
# 4. Preview the built static site
npx astro preview
- Create a repository on GitHub (e.g.
excaliblogorusername.github.io). - Initialize git and push:
git init git add . git commit -m "feat: initial reflective technical blog" git branch -M main git remote add origin https://github.com/<your-username>/<your-repo>.git git push -u origin main
- In your GitHub repository:
- Go to Settings → Pages.
- Under Build and deployment > Source, select GitHub Actions.
- That's it! GitHub Actions will automatically run
.github/workflows/deploy.ymland publish your blog.
[!NOTE] Custom Base Path If your repo is named
my-blog(hosted atusername.github.io/my-blog/), inastro.config.mjsset:site: 'https://<your-username>.github.io', base: '/my-blog',
- Font Toggle: Click the ✏️ icon in the header to switch between Excalifont, Inter, Newsreader, and JetBrains Mono.
- Theme Toggle: Click the 🌙 / ☀️ icon to toggle between Obsidian Slate Dark and Paper Light. Your preference is automatically remembered in
localStorage.