madblog/config.example.yaml
Fabio Manganiello 59cfd06149
All checks were successful
continuous-integration/drone/push Build is passing
feat(moderation): Add shared blocklist for webmentions and activitypub
- Add `blocked_actors` config/env and moderation matcher (domain/url/fqn/regex)
- Drop blocked interactions at ingestion and filter at render time
- Document configuration and add unit tests
2026-03-09 20:46:41 +01:00

228 lines
8.8 KiB
YAML

# Example configuration file for Madblog
# All the fields can also be specified via environment variables (prefixed with
# MADBLOG_, all uppercase, and with underscores, e.g. MADBLOG_TITLE for the
# "title" field)
# The title of the blog (*strongly* recommended)
title: My Blog
# The description of the blog (recommended)
description: A blog about various topics.
# The base external link to the blog (*strongly* recommended, required for
# Webmentions)
link: https://myblog.example.com
# The home link that will be rendered in the header, if different from the main
# link (optional, but useful for blogs hosted on a different domain)
# home_link: https://myblog.example.com/home
# External links to social media profiles (optional)
# These will be rendered on each page as <link rel="me" href="...">
# These can also be specified via the MADBLOG_EXTERNAL_LINKS environment
# variable as a comma-separated list of URLs
# external_links:
# - https://x.com/myprofile
# - https://mastodon.social/@myprofile
# Listening address for the built-in web server (optional, default: "0.0.0.0")
# host: 0.0.0.0
# Listening port for the built-in web server (optional, default: 8000)
# port: 8000
# The path to the directory that contains the blog posts (optional, default:
# ".", the current directory)
# content_dir: .
# A link to a logo image (optional)
# logo: https://myblog.example.com/logo.png
# The language of the blog (optional, default: "en-US")
# NOTE: The language can also be overridden on a per-article basis by
# specifying e.g. `[//]: # (language: en-US)` in the Markdown file
# language: en-US
# Default author name to be used when no author is specified (optional)
# author: Your Name
# Default author URL to be used when no author URL is specified (optional)
# mailto: links are also supported
# author_url: https://myblog.example.com
# Default author photo to be used when no author photo is specified (optional)
# author_photo: https://myblog.example.com/author.png
# View mode for the blog home page (optional, default: "cards")
# Supported values: "cards" (grid of article cards), "list" (compact title/date/description),
# "full" (scrollable WordPress-like view with full article content)
# view_mode: cards
# Whether to show the blog header in the generated pages (optional, default: true)
# header: true
# If set to true then the RSS/Atom feed will contain only short summaries
# of each post (optional, default: false)
# short_feed: false
# Max number of entries returned by the RSS/Atom feeds (optional, default: 10)
# max_entries_per_feed: 10
# Whether to enable Webmentions support (optional, default: true)
# enable_webmentions: true
# If set to true, then deleted Webmentions will be hard-deleted (their stored files
# will be removed) instead of being marked as deleted (optional, default: false)
# webmentions_hard_delete: false
# Default status for incoming Webmentions (if Webmentions are enabled) (optional,
# default: "confirmed"). If set to "pending" then the Webmention will be stored
# under the `mentions` directory as a Markdown file, with metadata header `status`
# set to "pending". If set to "confirmed" then the Webmention will be displayed
# on the site.
# webmentions_default_status: "confirmed"
# A list of categories for the blog (optional)
# categories:
# - Technology
# - Lifestyle
# - Travel
# - Food
#### (Optional) Feed aggregator mode ####
# A list of external RSS/Atom URLs that should also be rendered in the blog
# external_feeds:
# - https://example.com/atom.xml
# - https://example.com/rss.xml
#
# How often cached external feeds should be refreshed (in seconds).
# This prevents frequent requests to the external feed URLs.
# A value of zero disables the cache.
# feeds_cache_expiry_secs: 300
#### (Optional) Email Settings ####
# The email address of the author. Mention notifications will be delivered here
# author_email: 0q9aA@example.com
# Outgoing mail server configuration (optional)
# smtp_server: smtp.example.com
# smtp_port: 587
# smtp_username: username
# smtp_password: password
# smtp_starttls: true
# smtp_enable_starttls_auto: true
#### (Optional) ActivityPub Federation ####
# Requires: pip install 'madblog[activitypub]'
# Enable ActivityPub federation (optional, default: false)
# enable_activitypub: false
# The username for the ActivityPub actor (optional, default: "blog")
# The full handle will be @username@yourdomain.com
# activitypub_username: blog
# Override the base URL used for ActivityPub actor/object IDs (optional).
#
# By default, Madblog uses `link` as the ActivityPub base URL, so actor ID will
# be like: <link>/ap/actor.
#
# If you want your blog to be served at one hostname (e.g. https://blog.example.com)
# but you want ActivityPub actor IDs to live on another hostname (e.g. https://example.com)
# you can set this.
#
# Note: If you set this, you must ensure that the ActivityPub endpoints are
# reachable on that hostname (at least `/ap/*` and the `.well-known` endpoints).
# activitypub_link: https://example.com
# Override the domain used in WebFinger `acct:` identifiers (optional).
# This is useful if you serve the blog at one hostname (e.g.
# https://blog.example.com) but you want to advertise the fediverse handle as
# @username@example.com.
#
# Note: this only affects WebFinger `acct:` domain. It does NOT change where the
# actor and objects are hosted; those still use `link`.
# activitypub_domain: example.com
# Display name for the ActivityPub actor (optional, falls back to author or title)
# activitypub_name: My Blog
# Summary/bio for the ActivityPub actor (optional, falls back to description)
# activitypub_summary: A blog about various topics.
# Avatar URL for the ActivityPub actor (optional, falls back to author_photo)
# activitypub_icon_url: https://myblog.example.com/img/avatar.png
# Label used for the primary profile field that points to your blog URL.
# This will be advertised as a Mastodon-compatible "verified" profile field.
# (optional, default: "Blog")
# activitypub_profile_field_name: Blog
# Additional profile fields to advertise via ActivityPub.
# This is a mapping of field name -> field value.
# If the value is an http(s) URL, it will be rendered as a rel="me" link.
# (optional)
# activitypub_profile_fields:
# Git repository: https://git.example.com/myblog
# Donate: https://liberapay.com/myprofile
# About: A personal blog about technology
# Path to the RSA private key PEM file (optional).
# If not set, a keypair will be auto-generated on first start.
# The file must be readable only by the owner (chmod 600).
# activitypub_private_key_path: /path/to/private_key.pem
# Whether to require manual approval for new followers (optional, default: false)
# activitypub_manually_approves_followers: false
# Whether to send email notifications to the blog's author email when
# new ActivityPub activities occur, if ActivityPub is enabled, an email
# address is provided, and an SMTP server is configured (optional, default: true)
# activitypub_email_notifications: true
# ActivityPub object type: "Note" (default) renders content inline on
# Mastodon/Pleroma. "Article" only shows as a link preview card.
# activitypub_object_type: Note
# If true, only send the article description (not the full body) in
# ActivityPub posts (default: false).
# activitypub_description_only: false
# If true, the article title is sent as the ActivityPub "summary" field,
# which Mastodon/Pleroma render as a Content Warning / spoiler header
# that must be clicked to reveal the body. The description is kept as
# bold text at the top of the body. When false (default), title and
# description are both rendered inline in the post body with no CW.
# activitypub_posts_content_wrapped: false
# Quote policy for ActivityPub posts (optional, default: "public").
# Mastodon will refuse quote-boosts unless this is set to "public".
# activitypub_quote_control: public
# Automatically send a QuoteAuthorization when a remote actor quotes one
# of your posts. Without this, Mastodon keeps quotes in "pending" state.
# (optional, default: true)
# activitypub_auto_approve_quotes: true
#### (Optional) Moderation ####
# A list of blocked actors whose Webmentions and ActivityPub interactions
# will be silently rejected and not stored or rendered.
#
# Each entry can be one of:
# - A domain name: e.g. "spammer.example.com"
# Blocks all URLs/actors from that domain.
# - A full URL: e.g. "https://mastodon.social/users/spammer"
# Blocks that exact actor/source.
# - An ActivityPub FQN: e.g. "@spammer@mastodon.social" or "spammer@mastodon.social"
# Blocks that specific federated identity by matching domain + username.
# - A regular expression: delimited by "/", e.g. "/spammer\.example\..*/"
# Matched against the full source URL / actor ID.
#
# Can also be specified via the MADBLOG_BLOCKED_ACTORS environment variable
# as a comma- or space-separated list.
#
# blocked_actors:
# - spammer.example.com
# - "@troll@evil.social"
# - /spam-ring\.example\..*/