#Blogger Automation Research
This is a source survey for bloggers whose sites behave like personal infrastructure: custom build systems, script libraries, link preservation, publishing checks, AI helpers, and command-line workflows.
#Gwern.net
Sources:
Patterns worth copying:
- A sourced personal shell library for site work, not just a Makefile. Gwern's
bash.sh has path conversion, colored check wrappers, Cloudflare cache expiry, PDF surgery, image composition, search helpers, rename helpers, tag helpers, and upload aliases.
- A full sync script that behaves like a release engineer: dependency checks, disk-space checks, cleanup, process collision checks, priority lowering, infrastructure pulls, global text rewrites, compilation, metadata checks, backlink generation, sitemap work, link checking, and upload.
- A rich publishing helper. Gwern's
upload.sh lowercases filenames, normalizes extensions, converts media, OCR/compresses PDFs, strips metadata, handles name collisions, rsyncs, previews, adds small files to git, and keeps large files out of git.
- Preemptive link archiving.
LinkArchive.hs and linkArchive.sh map URL to stable local path by domain plus SHA1, use SingleFile for HTML, treat PDFs specially, OCR/compress PDFs, preview snapshots, and split huge single-file archives.
- Link extraction as an archiving queue:
find . -name "*.md" -type f -print0 | xargs -0 linkExtractor | filter-urls >> ~/.urls.txt.
- Style as code: global rewrites for URLs, spelling, citation conventions, typography, link cruft, and metadata normalization.
- Golden regression pages. Download known stress-test pages, strip cache-busting query strings, and diff rendered HTML against snapshots.
- Time-gated checks. A helper like
everyNDays 7 && expensive-audit keeps the default build fast.
Reusable commands:
blog-links content/**/*.md | sort -u > archive-queue.txt
while read -r url; do blog-archive-url "$url"; done < archive-queue.txt
blog-frontmatter
blog-linkrot content/**/*.md
blog-backlinks > backlinks.md
#Simon Willison
Sources:
Patterns worth copying:
- Treat the blog as an application with a database. Simon's site is Django backed by PostgreSQL, exported to JSON backups, then published through Datasette surfaces.
- Publish structured data as a first-class artifact. Datasette can turn SQLite files into searchable, filterable public websites and APIs.
- Keep many feeds: all content, long posts, links, quotations, per-tag feeds, and series feeds.
- Use AI from the command line through reusable templates and fragments, with prompts saved as named tools rather than pasted one-offs.
- Publish small web tools with source links, commit history, and transcripts where useful.
- Generated sections with stable markers. Simon's GitHub profile README bot replaces marked chunks from feeds, GraphQL, and Datasette JSON, then commits only when content changes.
- Screenshot automation.
shot-scraper multi shots.yml plus GitHub Actions can archive visual states after deploys.
- Corpus-to-prompt helpers.
files-to-prompt bundles selected files into clean model context.
Reusable commands:
llm --system 'Review this draft for weak claims and missing sources' --save blog-review
cat draft.md | llm -t blog-review
files-to-prompt content -e md -e mdx --markdown | llm -s 'Find stale claims and missing sources'
shot-scraper https://example.com/ -o screenshots/home.png
sqlite-utils insert blog.db posts posts.json --pk id
datasette publish cloudrun blog.db -m metadata.json
#Andy Matuschak
Sources:
Patterns worth copying:
- Notes as public working memory, not just finished articles.
- Atomic notes, dense links, and repeated revision beat chronological publication alone.
- Treat note status as a first-class field. The 100x scripts should index drafts, flags, and backlinks rather than assuming everything is a finished post.
- Idempotent generated backlinks for
[[wiki links]]: note-link-janitor path/to/notes.
- Notes can compile into interactive artifacts. Orbit's note-sync pattern treats Markdown prompts as source material for spaced review.
Reusable commands:
blog-draft-index
blog-backlinks > backlinks.md
blog_find 'evergreen|atomic|status'
#Maggie Appleton
Sources:
Patterns worth copying:
- Digital garden maturity states. Drafts can be marked as seed, budding, evergreen, archived, or private instead of a binary published/draft flag.
- Visual and conceptual metadata matter. Garden pages use state, topic, and relationship as interface primitives.
- Keep a public list of other gardens as research fodder.
- Content-derived garden indexes. Maggie's V3 scripts generate links, topics, webmentions, and small "smidgeon" drafts before Astro preview/build.
Reusable commands:
rg -n 'status:|growth:|stage:' content notes garden
blog-frontmatter
blog-draft-index
#Tom MacWright
Sources:
Patterns worth copying:
- Simple, fast, personal site with a clear stance on writing and tooling.
- Public archive pages and "recently" posts as a low-friction cadence.
- Explicit disclosure about AI usage. If AI is part of the writing pipeline, make that policy visible and use scripts for review, not silent authorship.
- Linkrot repair as PRs, not silent rewrites.
notfoundbot can upgrade HTTP to HTTPS, find Wayback captures, and propose small diffs.
- Markdown AST plus
MagicString minimal URL rewrites is the right shape for future citation/link tools.
- Tiny personal desk tools around existing CLIs, for example
gh search prs ... | jq ..., translate well to draft queues and publish checklists.
Reusable commands:
blog-new "Recently"
blog-stats
blog-ai-review draft.md
#Robin Sloan
Sources:
Patterns worth copying:
- AI revision loops should be auditable. Sloan's script preserves the first plan and every revision file, making each model pass inspectable.
- Separate "plan the revision" from "apply the revision" so model edits can be evaluated rather than blindly accepted.
Reusable commands:
blog-ai-review draft.md > review.txt
cp draft.md draft.v1.md
#Derek Sivers
Sources:
Patterns worth copying:
- Plain text as durable source of truth.
- Site as personal database: articles, book notes, translations, now pages, project pages, and direct sales.
- Terminal-first stack: Vim, PostgreSQL, Ruby/Go, Sinatra, OpenBSD, mutt, Beancount, sox, ffmpeg, mpv, mupdf, ssh.
- Public code and public ideas as an operating principle.
- Unusual architecture: Go servers route requests to PostgreSQL functions that generate HTML and headers.
scripts/tap wraps pgTAP tests in rollback transactions.
- Clear anti-AI disclosure: "Everything here is written by me, personally, not an AI."
Reusable commands:
blog-new "Now"
blog_words
blog_find 'plain text'
#Brendan Gregg
Sources:
Patterns worth copying:
- Posts that ship with reusable diagnostic scripts become long-lived references.
- Visualization generators are publishing tools: data in, SVG out, explanation around it.
- Keep a script archive next to explanations so readers can reproduce the picture.
- Keep intermediate folded/text artifacts because they are grep-able and reusable.
- Test visualization scripts with fixture inputs, collapsed expected outputs, and SVG generation.
Reusable commands:
python -m cProfile -o output.prof script.py
flameprof output.prof --format log > output.folded
flamegraph.pl output.folded > profile.svg
#Org Mode Static-Site Builders
Sources:
Patterns worth copying:
- A self-contained private source repo with
bib, bin, blog, css, cv, html, img, lisp, and pages.
make plus Emacs batch mode as a static-site compiler.
- Custom export backend, sitemap generator, CSS/JS minification, MathJax hosting, publication lists from BibTeX, and preprocessing/postprocessing passes.
- Jethro Kuan generates
build.ninja from build.py, then runs many Emacs batch Org exports in parallel before Hugo builds.
- Rakhim's braindump pipeline is explicit:
clean copy heading backlinks wikilinks frontmatter build publish.
- Sacha Chua uses literate Emacs publishing: Make runs Emacs batch to tangle
Sacha.org into Sacha.el, export HTML, and create backlinks from generated files to source sections.
Reusable commands:
make
emacs --batch -l lisp/build-site.el -f org-publish-all
blog-rss-check public/feed.xml
#Patrick McKenzie
Sources:
Patterns worth copying:
- Publish narrow, production-adjacent gists when the main site code is private.
- Export Markdown versions of posts for readability, LLM context, or archival use, with allowlisted frontmatter and per-post opt-outs.
- Publish hashes for important public claims or documents.
#Dan Luu
Sources:
Patterns worth copying:
- Performance posts should be reproducible: WebPageTest runs, screenshots, each intervention, each latency delta.
- Minimal static-site maintenance is a scriptable discipline: remove unused JS, move blocking JS to the footer, combine/minify assets, remove webfonts, consider inline CSS for single-entry visits.
- Maintain lightweight bibliographies as public gists.
#Julia Evans
Sources:
Patterns worth copying:
- Keep a tiny post generator task, such as a Rake
new_post, so filenames and frontmatter are never hand-typed.
- Prefer durable static binaries for authoring tools when language environments become fragile.
- Use single-command small frontend builds:
esbuild script.js --bundle --minify --outfile=bundle.js.
- Debug toolchain weirdness with system tools such as
strace -e openat -f.
#Xe Iaso
Sources:
Patterns worth copying:
- Document agent/developer entrypoints in
AGENTS.md.
- Future-dated content guard: block future dates unless the PR body contains an explicit "DO NOT MERGE until YYYY-MM-DD UTC" line.
- Validate MDX tags with a small dedicated checker.
- Keep diagrams as source plus output, for example
.dot beside .svg.
Reusable commands:
blog-future-dates
BLOG_ALLOW_FUTURE_DATES=1 blog-future-dates
#Eli Bendersky
Sources:
Patterns worth copying:
- Keep a separate
code-for-blog repo organized by year and article.
- Article directories should include runnable examples, Makefiles, tests, benchmarks, generated plots, and README notes.
- For diagram-heavy or benchmark-heavy posts, publish generation scripts, not only final images.
#Buster Benson
Sources:
Patterns worth copying:
- Treat a personal canon as a repo: beliefs, ideas, changelog, yearly review commits, and public feedback.
- The "public accountable self" idea maps cleanly to versioned
beliefs.md, ideas.md, and annual review indexes.
#Nikita Voloboev
Sources:
Patterns worth copying:
flow.toml as a task-runner control plane with commands for setup, dev, spec printing, deploy, and AI-backed commits.
- Build CLIs to temporary directories, run them, clean up, and install short symlink aliases.
- Generate prompt text from Markdown specs with a command like
spec-print note.md --stdout --no-clipboard.
#Phil Eaton
Sources:
Patterns worth copying:
- A one-file Go static-site compiler is enough for many personal sites.
- Emit per-section output, sitemap, and robots files without adopting a large framework.
#Linus Lee
Sources:
Patterns worth copying:
- JSONL is a good microblog database.
make watch with entr and a tiny formatter target gives a fast authoring loop.
- A small custom static-site generator can be maintained like any other personal tool.
#Cross-Cutting Ideas
new: create a dated draft with title, status, tags, canonical slug.
index: list drafts by age, word count, status, and TODO flags.
links: extract all external links with source file references.
archive: save every external link locally before publication.
title: fetch a page title and normalize it for citation notes.
frontmatter: fail fast on missing title/date/status/tags.
rss: validate Atom/RSS as part of the build.
linkrot: run a polite status checker on changed posts.
backlinks: generate a reverse-link report for notes.
stats: count posts, words, links, domains, and TODO flags.
ai-review: use a CLI LLM as a skeptical editor, never as silent author.
build-check: run whatever the repo provides: Makefile, npm, Hugo, Jekyll, frontmatter, RSS, stats.
future-dates: block scheduled posts unless explicitly allowed.
screenshot: archive visual states after deploys.
spec-print: turn Markdown notes/specs into reusable AI prompts.
wikilinks: convert [[Page]] and ![[file.png]] before build.
tangle-build: tangle literate source and publish generated HTML/PDF.
db-test: run database-backed site tests inside rollback transactions.