toolspace › registry › Muninn whtwnd
Muninn whtwnd
Publish, update, delete, and list WhiteWind blog entries via ATProto. Posts land in the user's PDS as `com.whtwnd.blog.entry` records and federate to the WhiteWind AppView.
Install
install-manifest install https://raw.githubusercontent.com/oaustegard/muninn-utilities/main/manifests/whtwnd/muninn-whtwnd.v0.4.json
manifest JSON · source · docs · issues · homepage
Security
| Kill switch | url Manual: revoke at |
|---|---|
| Smoke contract | shell timeout 15s |
Scopes
-
atproto.reporead, write, delete app-password (coarse; full repo write except DMs and account deletion)Creates, updates, deletes `com.whtwnd.blog.entry` records on the user's PDS. Uploads image blobs and embeds them in entries.
-
net.outboundread, write *.bsky.social, *.bsky.networkTalks to the user's PDS (default bsky.social) for atproto operations. No other outbound destinations — WhiteWind's AppView reads federated content directly from the PDS without this tool contacting whtwnd.com.
Data boundary
Reads
atproto.repo.postssensitivity: lowfs.localsensitivity: low
Transmits
-
bsky.social persistent-indefinite
publish whtwnd entry to user's PDS; PDS federates to whtwnd.com AppView. Entries are public by design.
input.titleinput.contentinput.blobsuploaded_image_bytes
Persists
Nothing persisted by the tool itself.
Tool-local retention: 0 day(s).
Actions
-
post destructive
Create a new WhiteWind blog entry on the user's PDS. ·
atproto.reponet.outbound- Goal
- Publish a new WhiteWind blog post.
- Inputs
content (req, markdown), title (req), blobs (optional blob_metadata array)- Outputs
{post_url, uri, cid, rkey}- Errors
auth_invalid, content_too_long, blob_not_found, network_unreachable- Example
post content='# Title\n\nBody...' title='My Post'
-
update write idempotent
Update an existing WhiteWind entry by rkey. ·
atproto.reponet.outbound- Goal
- Edit a previously-published WhiteWind entry.
- Inputs
rkey (req), content (req), title (req), blobs (optional)- Outputs
{post_url, uri, cid, rkey}- Errors
auth_invalid, rkey_not_found, network_unreachable- Example
update rkey='3l5...' content='...' title='Edited'
-
delete destructive idempotent
Delete a WhiteWind entry by rkey. ·
atproto.reponet.outbound- Goal
- Retract a WhiteWind entry.
- Inputs
rkey (req)- Outputs
{deleted: bool}- Errors
auth_invalid, network_unreachable- Example
delete rkey='3l5...'
-
list read idempotent
List the user's WhiteWind entries (read-only). ·
atproto.reponet.outbound- Goal
- Enumerate the user's published WhiteWind entries.
- Inputs
limit (int, default 50, max 100)- Outputs
{entries: [{rkey, title, createdAt, preview}]}- Errors
auth_invalid, network_unreachable- Example
list limit=20
-
upload_image write
Upload a local image as an ATProto blob and return blob_metadata for embedding in a post/update. ·
atproto.reponet.outbound- Goal
- Upload an image so it can be embedded in a WhiteWind entry.
- Inputs
image_path (req, local file path)- Outputs
{blob_metadata, markdown, url, cid}- Errors
file_not_found, mime_unsupported, blob_too_large, network_unreachable- Example
upload_image image_path='/tmp/header.png'
Environment
BSKY_HANDLE |
The atproto handle whose PDS hosts the WhiteWind entries, e.g. 'austegard.com'. Same credential pair as bsky_card — handles do not differ between AppViews on the same PDS. required · secret: no · obtain |
|---|---|
BSKY_APP_PASSWORD |
App password for the handle. Treat as a secret. Cannot be programmatically revoked — revoke at https://bsky.app/settings/app-passwords. required · secret: yes · obtain |
Verify & cost
| Install fee | 0¢ |
|---|---|
| Monthly fee | 0¢ |
| Usage model | none |
Runtime
runtime: python-module · install method: preinstalled · entrypoint: python -m muninn_utils.whtwnd
Five operations: post, update, delete, list, upload-image. Auth via the same `com.atproto.server.createSession` flow as bsky_card — the same handle and app password reach two distinct AppViews (Bluesky's and WhiteWind's) because both ride on the same PDS. Image attachments are uploaded as ATProto blobs and embedded in the entry's `blobs[]`; the URL pattern is the PDS-served `getBlob` endpoint, NOT the bsky CDN (which 500s for non-Bluesky records). The tool's only persistence is the records it creates on the user's PDS — those are the user's own data on the user's own infrastructure, not third-party transmissions. Issue #5 calls this out as the third atproto-credential utility (after bsky_card and the bsky-announce chain in blog_publish), the third publishing target (after perch_publish and blog_publish), and a novel-domain test (a federated atproto blog rather than a Bluesky post).
Tags: atprotowhtwndblogpublishingfederated
License: MIT
Last fetched 2026-06-18T09:09:17Z (live)