The v3 patch bug allowed Micropub to update MongoDB with aiTextLevel/
aiCodeLevel values but write post files without the ai: frontmatter
block (supportsAiDisclosure was always false). Re-saving with the same
values correctly returned "no properties changed" — but the file on disk
remained stale.
New patch (patch-micropub-ai-block-resync.mjs) adds _aiBlockVersion to
each post document in MongoDB. On update, if a post has AI fields but
_aiBlockVersion != "v4", the no-change check is bypassed and the file
is force-rewritten exactly once. Subsequent no-change saves behave
normally.
Also adds AI transparency section to README documenting the full
implementation, patch chain, v4 root cause, and re-save instructions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Switches to github:svemagie/indiekit-endpoint-microsub#bookmarks-import
which adds a contentNegotiationRoutes hook to auto-follow bookmarked
URLs as Microsub feed subscriptions when a bookmark-of post is created.
Mirrors the same pattern already in place for the blogroll fork.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Indiekit's getPostTemplateProperties() explicitly removes the post-type
property before passing JF2 to postTemplate(). The v3 patch relied on
post-type to set supportsAiDisclosure, which was therefore always false —
causing the ai: frontmatter block to never be written regardless of what
was selected in the backend form.
v4 patch falls back to permalink URL pattern (/articles/, /notes/) to
correctly detect the post type when post-type is absent.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The core bug: stored post content (post.properties.content.html) is only
the post body text. Template-rendered microformat links (u-in-reply-to,
u-like-of, u-bookmark-of, u-repost-of) live in the 11ty HTML output, not
in MongoDB. So replies, likes, bookmarks and reposts never had their target
URLs extracted — webmentions were silently skipped.
- patch-webmention-sender-livefetch: always fetch the live page; fall back
to stored content only if the page is unavailable; skip (don't mark sent)
when no content is available so the next poll retries it. Handles both
original upstream code and the older retry-patch variant.
- patch-webmention-sender-reset-stale: bump to v2 so posts incorrectly
marked as sent today (empty results due to the content bug) get reset
and retried on next deploy.
- Remove patch-webmention-sender-retry: superseded by livefetch.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- start.example.sh: replace fixed sleep 30 with /status poll loop (up to 2min)
so the webmention poller waits exactly until indiekit is ready, not longer
- indiekit.config.mjs: remove redundant webmentionIoMountPath variable and
mountPath from webmention-io config (package default /webmentions is correct)
- .env.example: remove all stale proxy and unused WEBMENTION_SENDER_* vars
(HOST, PORT, ENDPOINT, READY_TIMEOUT, STOP_TIMEOUT, AUTO_POLL) that were
never read by start.example.sh; keep only WEBMENTION_SENDER_POLL_INTERVAL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The poller fired immediately after indiekit was backgrounded, before
the HTTP server finished initializing — causing curl error 52 (empty
reply). A 30s initial sleep gives indiekit time to become ready.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two startup scripts:
patch-webmention-sender-retry: patches the package controller so that
when a post has no stored content and the live page fetch fails (page not
yet deployed), the post is skipped instead of being permanently marked as
webmention-sent with zero results. On the next poll the page will be live
and webmentions will be sent correctly.
patch-webmention-sender-reset-stale: one-time migration (guarded by a
migrations collection entry) that resets all posts already incorrectly
marked as webmention-sent with all-zero results, so they are retried on
the next poll.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove @rmdes/indiekit-endpoint-webmentions-proxy (redundant with
webmention-io which already provides a public JSON API from MongoDB)
- Remove proxy-related variables (webmentionsProxyMountPath, cacheTtl)
- Add explicit mountPath to webmention-io config to avoid future surprises
- Increase WEBMENTION_SENDER_POLL_INTERVAL to 600s so deploys complete
before the poller fires, preventing silent data loss where posts with
no stored content get marked webmention-sent before the page is live
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove complex PID tracking, readiness probe, graceful-shutdown and
daemon-parent machinery. Replace with the minimal polling loop from
the @rmdes/indiekit-endpoint-webmention-sender README: generate JWT,
POST to 127.0.0.1 (local), sleep 300s. Also drop the related tuning
vars from .env (WEBMENTION_SENDER_READY_TIMEOUT, STOP_TIMEOUT,
INDIEKIT_STOP_TIMEOUT, KILL_DAEMON_PARENT_ON_SHUTDOWN).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Passes the micropub post's category (first tag) through to the blogroll
blog entry. Falls back to "bookmarks" when no category is set.
Handles all micropub body formats (form-encoded, JF2, MF2 JSON).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When a micropub bookmark post is created, the bookmarked site's
origin URL is discovered for RSS/Atom feeds and added to the blogroll
under category "bookmarks".
Integration is self-contained in the blogroll plugin via
contentNegotiationRoutes — no micropub patches needed.
Source: github:svemagie/indiekit-endpoint-blogroll#bookmark-import
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds an explicit patch loop in the deploy step to ensure all
scripts/patch-*.mjs run even if npm ci postinstall was skipped.
This guarantees changelog categorization and other patches are
always applied on the server regardless of npm install mode.
Only display post types with defined fields; backend filters out types lacking fields.
Require fields for backend visibility, not just post path/url.
Add support for custom post form fields by requiring matching templates; missing templates are ignored.
Normalize legacy AI taxonomy values (3 → 2) in frontmatter.
Strip empty AI fields before jf2ToMf2 to avoid empty-string metadata in Micropub payloads.
Wires up the already-installed Micropub endpoint (aliased to
@rmdes/indiekit-endpoint-micropub) at /micropub.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds Microsub social reader endpoint at /microsub, enabling feed
subscription and management via the Microsub protocol.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>