- Forward *args/**kwargs in ActivityPubMixin.get_followers wrapper
- Isolate tests by saving/restoring config.state_dir
- Stabilize follower-removal ETag test with explicit monotonic mtimes
- Update changelog for 1.3.10
Cache validators now walk nested interaction and reply trees, include
folder-scoped page mtimes, and account for ActivityPub follower
changes. CachedPage.effective_mtime is memoized to avoid repeated
recursive walks.
- Run outgoing webmentions sync in a background thread under uWSGI
- Filter outgoing discovery to skip localhost/private IP targets
- Add tests for target safety and extraction filtering
- Validate cached file/reply URLs start with http(s) and regenerate if stale
- Add tests for scheme-less cache entries
- Update changelog for 1.3.5 fix
- Skip outgoing webmentions for posts with visibility: direct,
followers, or draft (previously only AP federation respected
visibility)
- Extract parse_metadata_header into madblog.markdown to
deduplicate metadata parsing across webmentions, tags, and
activitypub modules
- Extract human-readable URL from metadata.raw_object when building
thread nodes, allowing reply-to fields using short Mastodon URLs
(e.g., /@user/ID) to match interactions stored with canonical AP URLs
- Add test for raw_object.url aliasing
- Add ReplyMetadataIndex class with JSON persistence and ContentMonitor
integration for incremental updates
- Store per-file: reply_to, like_of, visibility, published, has_content,
title
- Query methods: get_unlisted_slugs(), get_ap_reply_slugs(),
get_article_reply_slugs(), get_likes_for_target()
- Migrate author_likes lookup from AuthorReactionsIndex to new index
Reference: #36
This mimics the most common Mastodon implementation:
- Posts: Only unlisted posts with no `reply-to`
- Posts and Replies: Unlisted posts + public/unlisted posts with
`reply-to`
The `guess_lang` flag can cause rendering of large chunks of Markdown to
fail with timeouts, causing a SIGABRT to bubble all the way up and kill
uWSGI workers.
- Move content monitor start from module-level to a before_request hook
so threads are created after fork
- Add malloc arena and thread stack optimizations to the uwsgi entry
point (matching cli.py)
- Enable --preload in Dockerfile and README examples
- _get_article_replies now accepts None article_slug to scan
root-level replies as candidate descendants
- _add_interaction_urls now includes fediverse URL aliases
(/@user/ID ↔ /users/user/statuses/ID) for parent matching
- Add regression tests for both fixes
- rel_me: links rendered as <link rel="me"> in <head> for identity
verification (e.g., Mastodon), not displayed visually
- external_links: links displayed on /about page, now supports both
URLs and objects with display_name/url fields
- nav_links: custom links in navigation panel with url, display_name,
and icon (supports emoji or image URL)