Published: Mon 15 December 2025
Updated: Mon 15 December 2025
By John McCardle
In programming .
Lowering The Barrier To Blogging
I can't seem to get posts out for all of the cool stuff I do. But I keep doing cool stuff, so it must be that the writing about it is what's too hard, right?
So, I wrote Backblog . ... in 2021.
...2021?
Yes, I wrote a script in 2021 for this. I think some of the articles created by it were even published, but I couldn't tell you which at this point. The premise was this:
Create a directory
Toss a bunch of image files into it
run the script
Replace "LOREM IPSUM" everywhere with actual content, rearrange the images, and rebuild the Pelican static site
This is article 24, and I still have 4 unpublished "backblogs" from that system:
Article
Subject
Images
11
basket_stacker
11 photos (Feb 21-24, 2022)
12
weird_tubes
8 photos/screenshots (Feb 19-20, 2022)
13
wgj238 (Weekly Game Jam)
0
14
commitexploder
0
if I ever get around to publishing those, I'll keep the article numbers, but revise the publishing date...
What Changed?
Since last year, I make voice notes. I'll talk to an audio recording app on my smartphone, sometimes for an hour at a time. With the help of local Whisper and LLMs, I turn those giant audio files, including all the background noise and interruptions of playtime in the backyard, into outlines for whatever's on my mind. I don't do one every day, but I get several in a week sometimes. There are 102 *.m4a.transcript-cleaned.txt files in my processing directory right now, from June 2025 to yesterday.
Month
Transcripts
undated
2
June
13
July
18
August
12
September
5
October
22
November
23
December (through the 15th)
8
Well, I decided to use that growing pile of data to reflect on how I'm doing - as an independent developer, as a person.
Claude Opus 4.5 opines:
You built a ClientPortal specifically to "address burnout through systematic stakeholder management and project prioritization." It's marked critical_priority. It's been untouched for 3 months.
You built a scheduling system (JohnTask). You built a work tracking concept (JohnWork). You built voice notes processing. You built Goblin Corps to parallelize development.
And yet you describe today: "I feel like my brain is a mess. I don't feel like I've presented this in a very organized way at all."
The tools exist. The systems are built or designed. The gap is in actually using them to constrain scope and force completion.
...
The 40+ projects aren't the problem. The problem is the gap between building systems to help yourself and actually submitting to them.
so I feel called out my by own automation...
To fix things I'm dusting off anything I can, pushing things out the door, and trying to compress "doing a thing" down to doing EXACTLY what the thing is.
This includes:
A secret thing that I'll tell you about later. DONE!
Updating the home page at ffwf.net . DONE!
Update this blog. DONE!
..."Update this blog" is not technically done until YOU can read this post. It's a bit of a lie as I'm writing the draft. So, to truly finish my to-do list for using my systems, I'll have to use backblog to completion, and republish kn4obl.net. So let's review my mental model for Doing The Thing :
Automate Everything That Isn't The Thing
For writing a blog post, "The Thing" is writing the words that will go on the post. Resizing images, tinkering with the static site build, uploading the files are not "The Thing", and the thought of all the "Not The Thing"s I have to do to do things stops me from doing anything.
Blog posts have this workflow now:
inbox: creates a new empty folder by naming the article. I can throw my images in here.
scaffolded: automatic via scripts/scaffold.py - resizes images, creates a markdown file that displays all of them with some outline headings.
drafting: This is "The Thing". Write the actual text.
review: scripts/validate.py - basically checks for LOREM IPSUM to make sure it was actually filled out; more of a tech demo for what backblog could eventually be capable of. But validate also makes sure that the frontmatter is correct for Pelican (though, the template includes a valid one, so it usually is).
ready: I can review this document at the end of the workflow for unpublished posts, then publish them to Pelican, where the ordinary static site build process takes over.
How it works
Let's just look at the help output:
$ backblog -h
usage: backblog.py [ -h] { new,status,advance,validate,set,publish,stages} ...
Manage blog article drafts through a configurable pipeline.
positional arguments:
{ new,status,advance,validate,set,publish,stages}
new Create a new article
status Show article status
advance Advance article through stages
validate Validate article ( dry run)
set Manually set article stage
publish Publish article to Pelican
stages List configured stages
options:
-h, --help show this help message and exit
Examples:
backblog new "My Cool Project" Create a new article
backblog status List all articles by stage
backblog status 0024 Show details for article 0024
backblog advance 0024 Advance article through stages
backblog validate 0024 Dry-run validation without advancing
backblog set 0024 drafting Manually set stage
backblog publish 0024 Publish to Pelican
backblog stages List configured stages
When advancing, a transition from "new" to "scaffolded" executes a script, that can automatically advance the article to "drafting":
$ backblog advance 0024
Running scaffolded script...
Scaffolding: 0024_backblog-20-lowering-the-barrier-to-blogging
Processing Screenshot from 2025 -12-15 13 -37-04.png -> image00.png
Processed 1 images
Generated article.md
Scaffolding complete.
Advanced to 'scaffolded'
Advanced to 'drafting'
While somewhat basic now, it's already totally workable, and has resulted in the blog post you see here.
Backstory
I actually have been looking into regaining "access" to this blog site for a few weeks. I had misplaced the git repo after reformatting my laptop, so I couldn't regenerate the static site. To compound the issue, my git remote was missing content that was live: rebuilding the site from the last commit would have lost like a third of the articles. I looked into re-writing the markdown from the output HTML, but this is quite messy. Ultimately I went through a quest into my backups to find the repository.
I found it! No data loss at all.
I put Claude on the job to fix up the theme after getting a new Pelican version. Fixing the pagination by overriding the new Pelican paginator in the theme briefly destroyed all styles: One Smashing Magazine example asset seems to have befallen similar issues, and the style that this site has is no longer visible on the example page. We rearranged the existing theme to fit new Pelican directory organization. Am I really using a Pelican theme from 2009..?! Well, I still like it. Thanks, Enrique!
I'm not sure if this is even detectable as a reader of the blog, even when inspecting the HTML, but in markdown I can now use {attach} as part of image URLs to keep separate blog posts in their own directories. Previous images are all in one directory with articleX_ as a prefix on the filenames.
Future Potential
Having arbitrary scripts execute as stages of a workflow gives me a lot of ideas. Maybe automatically searching my phone's photos for relevant images to include? I could start with a prompt for timeframe and what the images are, then let AI pick images. I can review by just deleting stuff that shouldn't be there before advancing to the next stage.
I hope that backblog will now quietly be an element in the background of all future posts here. I'll even leave the default backblog footer in:
This article was scaffolded with backblog.