toolspace › registry › Muninn blog_publish
Muninn blog_publish
Publish HTML pages to austegard.com via GitHub Pages, optionally update the Atom feed, optionally announce on Bluesky with a follow-up engagement-link commit. Encoded as a flowing DAG so the bsky chain is detached and partial-failure-tolerant.
Install
install-manifest install https://raw.githubusercontent.com/oaustegard/muninn-utilities/main/manifests/blog-publish/muninn-blog-publish.v0.4.json
manifest JSON · source · docs · issues · homepage
Security
| Kill switch | manual Manual procedure: — |
|---|---|
| Smoke contract | shell timeout 10s |
Scopes
-
github.repo.contentsread, write github-pat (coarse; full account write access)Reads the existing feed file (when a feed_entry is supplied), writes the new page commit, optionally commits the updated feed, optionally appends a follow-up engagement-link commit referencing the bsky post. Lands directly on the publish branch with no PR.
-
atproto.repowrite bsky-app-password (coarse; full repo write except DMs)When MUNINN_BSKY_HANDLE+PASSWORD are set, creates an app.bsky.feed.post record on the user's repo announcing the published page. Detached side-effect: failure does not abort the publish.
-
net.outboundread, write api.github.com, austegard.com, bsky.socialTalks to api.github.com for git operations, polls the eventually-served page URL on austegard.com to confirm GitHub Pages deploy, and (when bsky configured) talks to bsky.social for the announce.
Data boundary
Reads
github.repo.contentssensitivity: low
Transmits
-
api.github.com none-per-vendor-tos
publish page commit + feed-update commit + engagement-link commit
env.GH_TOKENinput.contentinput.path
-
bsky.social persistent-indefinite
announce published page; PDS federates publicly to the network firehose
input.bsky_textcomputed.page_url
-
— unknown
poll page URL to confirm GH Pages deploy
computed.page_url
Actions
-
publish_and_announce destructive
Commit a page, wait for GH Pages to serve it, optionally update the Atom feed, optionally announce on Bluesky with a follow-up engagement-link commit. ·
github.repo.contentsatproto.reponet.outbound- Goal
- Publish an HTML page and optionally announce it on Bluesky with engagement linking.
- Inputs
path (req), content (req), bsky_text (req if announcing), feed_entry (optional), repo (default oaustegard/austegard.com)- Outputs
{page_url, commit_sha, feed_sha, deployed, bsky_post, update_sha, detached_failures}- Errors
auth_invalid, commit_failed, deploy_timeout, bsky_text_too_long, target_unreachable- Example
publish_and_announce path='blog/post.html' content='<html>...</html>' bsky_text='New post: ...'
Environment
GH_TOKEN |
GitHub personal access token. Needs write access to the publish-target repo (oaustegard/austegard.com by default). Same coarse credential as perch_publish, issue_close, perch_triage, verify_patch — share-by-default is intentional. Falls back to GITHUB_TOKEN if GH_TOKEN is not set. required · secret: yes · obtain |
|---|---|
GITHUB_TOKEN |
Optional fallback for GH_TOKEN. The source reads `os.environ.get('GH_TOKEN') or os.environ.get('GITHUB_TOKEN')`, so either name works. Same scope/sensitivity as GH_TOKEN. optional · secret: yes · obtain |
MUNINN_BSKY_HANDLE |
The Bluesky handle to post the announcement as, e.g. 'austegard.com'. Optional — leave blank to skip the bsky chain entirely (the page-publish path still runs). optional · secret: no · obtain |
MUNINN_BSKY_APP_PASSWORD |
App password for the Bluesky handle above. Format is four hyphen-separated four-character groups. Treat as a secret. Required only if MUNINN_BSKY_HANDLE is set; otherwise leave blank. Bsky app passwords cannot be programmatically revoked. optional · secret: yes · obtain |
Verify & cost
| Install fee | 0¢ |
|---|---|
| Monthly fee | 0¢ |
| Usage model | external |
Runtime
runtime: python-module · install method: preinstalled · entrypoint: python -m muninn_utils.blog_publish
Encoded as a flowing graph: page-commit → wait-for-deploy → (when feed_entry given) feed-update; bsky-announce + engagement-link-commit run as detached side-effects. Caller gets the page URL the moment GH Pages serves it; bsky failures land in `flow.detached_failures` and never bubble up as publish failures. The 300-grapheme bsky cap is enforced as a `validate=` gate BEFORE any createRecord call. Same primary credential as `perch_publish` (GH_TOKEN), same secondary credentials as `bsky_card` (MUNINN_BSKY_HANDLE, MUNINN_BSKY_APP_PASSWORD) — third publishing target after perch_publish and (planned) whtwnd. Issue #5 calls this out as the test for whether v0.4 `writes[]` generalises across multiple publishing surfaces in the same agent.
Tags: publishinggithub-pagesatom-feedblogblueskyflowing
License: MIT
Last fetched 2026-06-18T09:09:16Z (live)