[status: rough draft]

This post is just meant to briefly document the current state of my blogging workflow.

The basic version is:

  • I plan to now write the majority of my posts in Markdown on my local machine (or, write in Docs/Word then convert to Markdown so I have a plaintext copy of the content).
  • I push these markdown files to a GitHub repo (/blog).
  • I use a script (lightweight, mainly produced using Codex + GPT5.5. -- fairly confident this can be reproduced and modified from any coding agent quickly as needed) to sync those Markdown files to my Leaflet Data Leverage publication.
  • I use another script to produce a copy-pastable HTML version that I can paste into Substack manually.
  • I usually try to crosspost or announce the post on Twitter/X, Bluesky, and LinkedIn.
  • I am also starting to categorize posts into lanes: longer Data Leverage posts, short focus posts, short reaction posts that stay in the main Data Leverage publication, and these meta notes about writing/blogging/process.

Right now the repo has four main writing lanes:

  • 00_drafts/ for private-ish local drafts that I do not intend to publish directly.
  • 01_posts/ for longer Data Leverage pieces and short reaction posts that should remain in the main Data Leverage publication.
  • 02_shortposts/ for short focus posts.
  • 03_notesonnotes/ for this meta-blog / notes-on-writing track.

I keep track of publication routing in a file: state/publications.json. In practice, this means the repo knows about three Leaflet destinations: the main Data Leverage publication, the focus short-posts publication, and notesonnotes. Short reactions stay in the main Data Leverage lane and are sorted separately only in the garden view. This is nice because it lets the same local Markdown-first pattern apply across multiple public surfaces without forcing every kind of writing to pretend to be the same thing.

The main loop, when I am being disciplined, is something like this:

  1. Write or edit a Markdown file locally.
  2. Run the local helpers that extract references, build backlinks, render HTML, and build the little garden view.
  3. Check status to see what the repo thinks is changed, publish-relevant, or stale.
  4. Dry-run the Leaflet sync.
  5. Commit and push, because the live publish path currently insists that publish-relevant files are clean and pushed.
  6. Run the live Leaflet sync.
  7. Generate the Substack paste preview if the post is also going to Substack.
  8. Manually paste into Substack, tweak anything weird, publish there.
  9. Announce the post on the social sites, and ideally record those announcements in the distribution ledger.

The social distribution step is the least automated part. Usually I want some combination of:

  • a Twitter/X post,
  • a Bluesky post,
  • a LinkedIn post,
  • maybe some other targeted sharing if the post is relevant to a particular community.

The repo has a distribution.md ledger and helper commands for recording mirrors and announcements. The idea is that full mirrors, like Substack copies, can be marked stale if the source Markdown changes after the recorded commit, while social announcements are treated as "non-blocking".

The broader philosophy here is that I want the canonical version of a post to be something I can edit locally, diff, render, cite from, and move between platforms. I also want a relatively simple way to handle versioning.