Private repo. Holds the C-level pillar essays, doughatcher-specific Hugo layout overrides (consulting page, publications page), site branding (doug.png, custom.css), and the editorial-loop authoring workflow that drafts and ships pillars.
Theme comes from doughatcher/dougie-theme, installed as a micro.blog plugin alongside this repo's deploy.
content/blog/ — pillar essays. Edited via PRs against this repo.
content/consulting.md — doughatcher's consulting landing page.
layouts/consulting/ — doughatcher-specific consulting page template
layouts/publications/ — doughatcher-specific publications template
static/doug.png — profile image
static/custom.css — doughatcher-only CSS deltas over the Dougie theme
static/favicon.svg, static/site.webmanifest — branding
apps/editorial-loop — Node app that orchestrates idea → draft → PR → publish.
Runs via .github/workflows/blog-*.yml.
.github/workflows/ — deploy.yml, blog-publish.yml, scheduled-backup.yml,
and the editorial-loop automation chain.
.github/deploy/ — Python scripts that auth + theme-reload + backup
against micro.blog.
syndicate/ — dev.to + LinkedIn cross-post adapters.
config.json — doughatcher.com site config (title, baseURL, menu).
- Theme layouts/static — those live in
doughatcher/dougie-theme. Install that plugin in the micro.blog UI for doughatcher.com. - Workers (social-bridge, link-preview-service, slack-bot) — those stay in
doughatcher/dotcomfor now (they serve all three sites, not just doughatcher; not really blog concerns). Slack-bot'sBLOG_REPOvar still points here so vibe-edits land in this repo's PRs.
Same as it always was — pillars get drafted as PRs against this repo, reviewed, merged. On merge, the blog-publish workflow publishes the post to doughatcher.com via micro.blog Micropub.
Nothing auto-syndicates to LinkedIn. This is deliberate.
- Auto on merge (
blog-publish.yml): publishes to doughatcher.com and cross-posts only to the destinations in theMICROBLOG_SYNDICATE_TOrepo variable (currentlythreads). LinkedIn is not in that list. - No
mp-syndicate-to= suppressed, not defaulted.apps/editorial-loop/lib/microblog-poster.jsalways sends an explicit emptymp-syndicate-to[]=when no targets are configured, so micro.blog's account-level cross-posting (incl. LinkedIn) never fires implicitly. Posts made directly in the micro.blog web editor bypass this code — LinkedIn auto-cross-post is also turned off at the account level as the backstop. - The lever — to put a specific post on LinkedIn: add the
syndicate-linkedinlabel to its (merged) PR.syndicate-on-label.ymlthen cross-posts that one post to LinkedIn explicitly. This is the only path to LinkedIn; use it intentionally.
- micro.blog has Dougie plugin installed for the doughatcher.com site (pulls theme files from
doughatcher/dougie-theme) - micro.blog's theme deploy points at THIS repo (executive-blog) for content + overrides
- On render, Hugo merges:
dougie-theme/layouts/*(base) +executive-blog/layouts/*(overrides) +executive-blog/content/* - Per-site plugin params from the Dougie plugin settings inject branding/CTA/etc
Created 2026-05-30 as part of the dougie-theme extraction. Renamed from executive-blog to blog shortly after. Live cutover from doughatcher/dotcom happens once Doug points doughatcher.com's micro.blog theme at this repo (theme id 102559) instead of dotcom (theme id 102558).