The Blog Was a Demo, Not a Brand
The blog existed for 6 months. The home page rendered fine. The about page said this is a Jekyll theme demo. The posts were placeholder text.
The reason: I built the blog as a demo, not as a brand. The theme was elegant. The content was empty. I never wired the blog to the vault. I never wired the blog to the resume. I never wrote a publish script. The blog was a folder on a server. The vault was a folder on my laptop. The two folders did not know about each other.
The asymmetry was embarrassing. The vault had 126 markdown files, 10 strategy pages, 30 concept pages, 8 entity pages, 1 corpus analysis. The blog had 1 page that said demo. The brain was full. The mouth was empty.
The fix is the publish layer. The publish layer is a script that takes a vault draft, transforms it for Jekyll, commits it, and pushes to GitHub Pages. One command. One URL. One published post.
CLI Mode, Broken Ruby, One Terminal
The session that produced this rebuild was a CLI session.
The 4-File Pipeline
Vault → queue → script → live URL. That is the whole thing.
content/queue/<draft>.md (vault side, status: ready-to-publish)
scripts/parse-frontmatter.py (YAML → bash, helper)
scripts/publish-blog.sh (the pipeline: transform + copy + commit + push)
~/ShayanSpiel.github.io/ (GH Pages side, _posts/, auto-builds on push)User writes a draft In content/queue/<date>-<slug>.md. The draft has status: ready-to-publish in the frontmatter.
User runs one command bash scripts/publish-blog.sh <draft-path> —yes. The script takes over from here.
Script transforms frontmatter Adds Jekyll fields (layout, date, author). Drops vault fields (status, standalone_test, pillar). Whitelist, not blacklist. Stable contract.
Script copies screenshots Scans body for image references. Resolves paths. Copies to assets/uploads/<date>-<slug>/. Rewrites paths in the post.
Script commits and pushes Stages the new post and uploads. Commits with a meaningful message. Pushes to origin main. GitHub Pages rebuilds. The post is live in ~30 seconds.
The whole flow is one command. The user runs the command, walks away, and the post is live. The script is the publish layer.
The Result
The rebuild shipped 4 deliverables in 4 hours. The brand hierarchy is now consistent.
The brand hierarchy is now consistent. The blog about-page mirrors the wiki shayanspiel page. Every surface points to the same person.
Publishing Is the Part No One Teaches
Most blog advice is about writing. Most content-engine advice is about drafting. Nobody talks about the publish step.
The publish step is the layer between I have a draft and the draft is live. The publish step is the friction. The publish step is the part that makes people not post. The fix is a script. The script takes a file path. The script does the rest.
You can not post if you can not publish. You can not publish if the publish step is 10 minutes of clicking. The 10 minutes is the friction. The friction is the reason you do not post. The script is the friction-killer.
If You Have a Vault, Build the Script
The script is 4 hours. The script is the publish layer of Session-as-Content Infrastructure.
You can not post if you can not publish. The script is the friction-killer.
4 files. 4 hours. One command. The vault is now wired to the blog. Clone the Spiel OS repo. Build the publish layer. Ship the same night.
Clone the SpielOS repo