Source for the public blog at bytenoob.io, plus an LLM-powered knowledge base.
This repository is public. Everything committed here is readable on GitHub, including
kb/(raw sources and wiki). Onlyposts/is published to the website. Never commit credentials, private notes, or personal data.
- Emacs (for blog build + GTD)
- Doom Emacs (with config from bufrr/emacs-config)
- Claude Code CLI (
claudecommand available in PATH) - Node.js 22+ and npm (for blog asset minification and formatting)
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 blog-directory "~/bufrr.github.io/")
;; GTD stays separate at ~/org/gtd/
(setq org-current-file "~/org/gtd/current.org")
(setq org-archive-file "~/org/gtd/archive.org")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 (gitignored; built and deployed by CI)
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: ingest a file or URL (adds metadata, logs it, then absorbs it)
claude -p "Read kb/skills/ingest.md. Ingest ~/Downloads/article.md"
# Option B: Emacs capture, then compile it into the wiki yourself
# SPC k n → paste content → save
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."
# → kb/artifacts/YYYY-MM-DD-eth-block-building.org, with post headers and #+DRAFT: true
# 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 (or run make publish): the Publish workflow builds the site and deploys it to GitHub Pages at https://bytenoob.io.
GTD lives separately at ~/org/gtd/ (not in this repo). Managed in Doom Emacs with SPC g keybindings.
| Prefix | System | Keys |
|---|---|---|
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 |
SPC g |
GTD (separate) | c capture, a agenda, w current work, A archive |
| 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 |