- 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)
- Add `default_index` config option (blog, about, tags, guestbook)
- Add /blog route to always serve blog index
- Add Blog link to navigation menu
- Update README, config.example.yaml, CHANGELOG
- Add /about route rendered from ABOUT.md in pages_dir
- Support h-card metadata: name, email, photo, job-title, org, key, rel-me
- Fall back to config values (author, author_url, etc.) when not provided
- Add hide_email config option to suppress email on public pages
- Conditionally show About link in nav when ABOUT.md exists
- Add AboutMixin, about.html template, and about.css styling
Closes: #35
- Normalize 4-space list indents to 2-space outside fenced code blocks
- Render markdown with tab_length=2 for consistent nesting
- Add regression tests for nested lists and fenced code handling
- Adjust article list padding in blog CSS