Private monorepo: blog + GTD + LLM-powered knowledge base.
- Emacs (for blog build + GTD)
- Doom Emacs (with config from bufrr/emacs-config)
- Claude Code CLI (
claudecommand available in PATH) - Node.js 16+ and npm (for blog asset minification)
git clone git@github.com:bufrr/bufrr.github.io.git ~/bufrr.github.io
cd ~/bufrr.github.io
npm ci
cp .blogrc.example .blogrc # edit with your valuesThe Doom config lives in ~/.config/doom/ (separate emacs-config repo). It points all paths to this repo:
(setq org-directory "~/bufrr.github.io/")
(setq org-current-file "~/bufrr.github.io/gtd/current.org")
(setq org-archive-file "~/bufrr.github.io/gtd/archive.org")
(setq blog-directory "~/bufrr.github.io/")After cloning the emacs-config, run:
doom sync # installs org-roam, org-roam-ui, org-ql# Blog
./build.sh # should generate HTML in public/
# Knowledge base (requires Claude Code CLI)
claude -p "Read CLAUDE.md. Then read kb/wiki/index.org. Report what you see."
# Or use Makefile shortcuts
make kb-lint # health check
make kb-absorb # compile new raw filesIn Emacs:
SPC g w— should opengtd/current.orgSPC k k— should openkb/wiki/directorySPC B n— should create a new blog post
posts/ Blog source files (.org)
static/ CSS, JS, assets
templates/ Blog post templates
public/ Generated HTML (GitHub Pages)
gtd/ GTD system (current.org + archive.org)
kb/ Knowledge base
raw/ Immutable source material
wiki/ LLM-maintained wiki (org-roam nodes)
brainstorm/ Brainstorming drafts
artifacts/ Query outputs, blog drafts, reports
skills/ Skill files defining Claude's behavior
# Option A: save a file directly
cp article.org kb/raw/articles/
# Option B: use Emacs capture
# SPC k n → paste content → save
# Then compile it into wiki
claude -p "Read kb/skills/absorb.md. Absorb kb/raw/articles/article.org"claude -p "Read kb/skills/query.md. Summarize everything I know about Solana."claude -p "Read kb/skills/query.md. Based on my wiki, draft a blog post about Ethereum block building. Save to kb/artifacts/eth-block-building.org"
# Then publish
# SPC k p → select draft → copies to posts/
# SPC B p → publish
# git pushmake kb-lint # find issues
make kb-breakdown # find missing articles./build.sh # build site
make serve # preview at localhost:8000
make build-prod # build + minifyCreate posts in posts/ using YYYY-MM-DD-slug.org naming with #+TITLE:, #+AUTHOR:, #+DATE: headers. Set #+DRAFT: true to keep unpublished.
Push to main to deploy via GitHub Pages.
Managed in Doom Emacs. Files: gtd/current.org (active work) and gtd/archive.org (completed).
| Prefix | System | Keys |
|---|---|---|
SPC g |
GTD | c capture, a agenda, w current work, A archive |
SPC k |
KB | n new raw, c compile file, C compile all new, k browse wiki, g graph, h health check, p publish draft |
SPC B |
Blog | n new post, p publish |
| Command | CLI | Makefile | What it does |
|---|---|---|---|
| Ingest | claude -p "Read kb/skills/ingest.md. Ingest ..." |
— | Import source into raw/ |
| Absorb | claude -p "Read kb/skills/absorb.md. Absorb ..." |
make kb-absorb |
Compile raw → wiki |
| Query | claude -p "Read kb/skills/query.md. ..." |
— | Answer questions from wiki |
| Lint | claude -p "Read kb/skills/lint.md. ..." |
make kb-lint |
Health check |
| Breakdown | claude -p "Read kb/skills/breakdown.md. ..." |
make kb-breakdown |
Find missing articles |
| Reorganize | claude -p "Read kb/skills/reorganize.md. ..." |
— | Restructure categories |
| Rebuild Index | claude -p "Read kb/skills/rebuild-index.md. ..." |
— | Regenerate index.org |