# 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: - Local source: `/home/krisyotam/src/parsing/gwern.net/build/bash.sh` - Local source: `/home/krisyotam/src/parsing/gwern.net/build/sync.sh` - Local source: `/home/krisyotam/src/parsing/gwern.net/build/linkArchive.sh` - https://gwern.net/Design - https://gwern.net/archiving - https://gwern.net/static/build/ 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: ```sh 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: - https://simonwillison.net/about/ - https://simonwillison.net/series/blogging/ - https://datasette.io/for/websites - https://github.com/simonw/simonw - https://github.com/simonw/shot-scraper - https://github.com/simonw/files-to-prompt - https://llm.datasette.io/en/stable/templates.html - https://llm.datasette.io/en/latest/usage.html - https://tools.simonwillison.net/ 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: ```sh 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: - https://notes.andymatuschak.org/About_these_notes - https://notes.andymatuschak.org/Evergreen_notes - https://github.com/andymatuschak/note-link-janitor - https://github.com/andymatuschak/orbit 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: ```sh blog-draft-index blog-backlinks > backlinks.md blog_find 'evergreen|atomic|status' ``` ## Maggie Appleton Sources: - https://maggieappleton.com/garden-history - https://github.com/MaggieAppleton/digital-gardeners - https://github.com/MaggieAppleton/maggieappleton.com-V2 - https://github.com/MaggieAppleton/maggieappleton.com-V3 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: ```sh rg -n 'status:|growth:|stage:' content notes garden blog-frontmatter blog-draft-index ``` ## Tom MacWright Sources: - https://macwright.com/writing - https://tmcw-ama.val.run/ - https://macwright.com/2023/12/14/blog-about-blog - https://macwright.com/2020/05/02/linkrot - https://macwright.com/2025/04/03/personal-tools - https://github.com/tmcw/notfoundbot 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: ```sh blog-new "Recently" blog-stats blog-ai-review draft.md ``` ## Robin Sloan Sources: - https://www.robinsloan.com/lab/claude-revision/ - https://gist.github.com/robinsloan/6d5f4247b5f2239872bea8391fd63016 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: ```sh blog-ai-review draft.md > review.txt cp draft.md draft.v1.md ``` ## Derek Sivers Sources: - https://code.sivers.org/ - https://data.sivers.org/uses - https://wiki.sive.rs/plaintext - https://sive.rs/7 - https://code.sivers.org/ws - https://github.com/sivers/sivers 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: ```sh blog-new "Now" blog_words blog_find 'plain text' ``` ## Brendan Gregg Sources: - https://github.com/brendangregg - https://github.com/brendangregg/FlameGraph - https://github.com/brendangregg/perf-tools - https://cacm.acm.org/practice/the-flame-graph/ 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: ```sh 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: - https://ogbe.net/blog/emacs_org_static_site - https://github.com/jethrokuan/braindump - https://github.com/freetonik/rakhim.org - https://github.com/freetonik/braindump.rakhim.org - https://github.com/sachac/.emacs.d 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: ```sh make emacs --batch -l lisp/build-site.el -f org-publish-all blog-rss-check public/feed.xml ``` ## Patrick McKenzie Sources: - https://www.kalzumeus.com/ - https://gist.github.com/patio11 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: - https://danluu.com/octopress-speedup/ - https://danluu.com/about/ - https://gist.github.com/danluu 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: - https://jvns.ca/blog/2016/10/09/switching-to-hugo/ - https://jvns.ca/blog/2017/12/22/how-i-set-up-an-automatic-weekly-blog-digest/ - https://jvns.ca/blog/2021/11/15/esbuild-vue/ - https://github.com/jvns 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: - https://github.com/Xe/site - https://github.com/Xe/site/blob/main/scripts/validate-blog-dates.js - https://github.com/Xe/site/blob/main/scripts/check-mdx-tags.go - https://github.com/Xe/site/blob/main/Earthfile 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: ```sh blog-future-dates BLOG_ALLOW_FUTURE_DATES=1 blog-future-dates ``` ## Eli Bendersky Sources: - https://eli.thegreenplace.net/pages/about - https://github.com/eliben/code-for-blog 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: - https://github.com/busterbenson/public 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: - https://github.com/nikivdev/go 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: - https://github.com/eatonphil/eatonphil.com 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: - https://github.com/thesephist/stream - https://github.com/thesephist/sistine 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.