Skip to content

General Discussion

179 Topics 975 Posts View Original

General non-specific discussion about ActivityPub-related topics.

  • 0 Votes
    5 Posts
    0 Views
    evan@activitypub.spaceE
    @douwe@waag.social The protocol itself hasn't changed radically in the last 18 months. If you want to understand ActivityPub and ATProto's similarities and differences, you can't find a better analysis than Christine's. She is one of my co-authors on ActivityPub, and she really dug deep into both protocols.
  • 0 Votes
    1 Posts
    0 Views
    reiver@mastodon.socialR
    RE: https://w3c.social/@w3c/116216070362563670FWIW, I have been storing Linked Data (including ActivityPub) in an INI like format — because I find INI-like formats more human-friendly (to both read and write) than JSON.YAML is probably better than JSON, too, in that respects. But I think INI-like formats are better than YAML.#ActivityPub #ActivityStreams #JSONLD #LinkedData #RDF #YAML #YAMLLD
  • 0 Votes
    30 Posts
    0 Views
    thisismissem@hachyderm.ioT
    @m mmm, maybe, but can't really do a police report about anonymous or lacking detail social media post. The only named person in there didn't actually do libel, just a very opinionated take without reading the article. (They also apparently clearly spend time on Bluesky in order to know of most of what they wrote because it was sub obscure stuff — and also somewhat wrong)The posts insinuated being a nazi without directly calling me one, so I don't think that meets the bar for libel.Past conspiracy theories? Eh, definitely met the bar for libel but the person was based in another country, not german, so probably nothing possible here.Plus I really don't care about such shitty opinions THAT much to walk 1km to my nearest police station and attempt to try to report. Police have never been helpful in the past in any matter I've dealt with them on, so not sure why that'd start now.I just block, move on, and make sure I put out accurate information.
  • 0 Votes
    1 Posts
    0 Views
    jonny@neuromatch.socialJ
    @silverpill@general @julian Talk about an appropriate application of a merkle tree
  • @fabio why reinventing the wheel in such a complicate way?

    snac2
    3
    0 Votes
    3 Posts
    0 Views
    fabio@manganiello.blogF
    Madblog: A Markdown Folder That Federates Everywhere A lightweight blogging engine based on text files, with native Fediverse and IndieWeb support I started working on Madblog a few years ago. I wanted a simple blogging platform that I could run from my own Markdown files. No intermediaries. No bloated UI. No JavaScript. No databases and migration scripts. No insecure plugins. Just a git folder, an Obsidian vault or a synchronized SyncThing directory, and the ability to create and modify content by simply writing text files, wherever I am. Drop a Markdown file in the directory, and it's live. Edit it, and the changes propagate. Delete it, and it's gone. It's been running my personal blog and the Platypush blog for a while now. With the new release, #madblog now gets a new superpower: it supports federation, interactions and comments both through: Webmentions - already implemented some weeks ago, you can also check out the previous blog article ActivityPub Webmentions allow your site to mention and be mentioned by other sites that also implement them - like any WordPress blog with the Webmention plugin, or link aggregators like Lemmy or HackerNews. Interactions with any of your pages will be visible under them. #activitypub support allows Madblog to fully federate with Mastodon, Pleroma, Misskey, Friendica or any other #fediverse instance. It turns your blog into a federated handle that can be followed by anyone on the Fediverse. It gives you the ability to mention people on the Fediverse directly from your text files, and get replies to your articles directly from Mastodon, get your articles boosted, shared and quoted like any other Mastodon post. Demos These blogs are powered by Madblog: blog.fabiomanganiello.com — Fediverse handle: @fabio@manganiello.blog blog.platypush.tech — Fediverse handle: @blog@platypush.tech You can follow them from Mastodon (or any other Fediverse client), reply to articles directly from your instance, boost them, or quote them. You can also interact via Webmentions: link to an article from your own site, and if your site supports Webmentions, the mention will show up as a response on the original post. These blogs also have a Guestbook — mention the blog's Fediverse handle or send a Webmention to the home page, and your message appears on a public guest registry. How Does It Compare? If you've looked into federated blogging before, you've likely come across a few options: WriteFreely is probably the closest alternative — a minimalist, Go-based platform with ActivityPub support. It's well-designed, but it uses a database (SQLite or MySQL), has its own (very minimal) editor, and doesn't support Webmentions. Additionally, it lacks many features that are deal-breakers for me. No export of all the content to Markdown, nor ability to run my blog from my Nextcloud Notes folder or Obsidian vault. No support for LaTeX or Mermaid diagrams. No support for federated interactions - any interaction with your articles on the Fediverse is simply lost. The UI is minimalist and not necessarily bad, but not even sufficiently curated for something like a blog (narrow width, Serif fonts not optimized for legibility, the settings and admin panels are a mess...). No support for moderation / content blocking. No support for federated hashtags. WordPress with ActivityPub and Webmention plugins can technically do what Madblog does, but it's a full CMS with a database, a theme engine, a plugin ecosystem, and a much larger attack surface. If all you need is a blog, it's overkill. Plume and Friendica offer blogging with federation, but they're full social platforms, not lightweight publishing tools. Madblog sits in a different niche: it's closer to a static-site generator that happens to speak federation protocols. It implements a workflow like "write Markdown, push to server, syndicate everywhere". Getting Started Docker Quickstart mkdir -p ~/madblog/markdown cat <<EOF > ~/madblog/markdown/hello-world.md # Hello, Fediverse! This is my first post on [Madblog](https://git.fabiomanganiello.com/madblog)! EOF docker run -it \ -p 8000:8000 \ -v "$HOME/madblog:/data" \ quay.io/blacklight/madblog Open http://localhost:8000. That's it — you have a blog. The default Docker image (quay.io/blacklight/madblog) is a minimal build (< 100 MB) that includes everything except LaTeX and Mermaid rendering. If you need those, build the full image from source: git clone https://git.fabiomanganiello.com/madblog cd madblog docker build -f docker/full.Dockerfile -t madblog . See the full Docker documentation for details on mounting config files and ActivityPub keys. Markdown structure Since there's no database or extra state files involved, the metadata of your articles is also stored in Markdown. Some things (like title, description) can be inferred from the file name, headers of your files etc., creation date defaults to the creation timestamp of the file and author and language are inherited from your config.yaml. A full customized header would look like this: [//]: # (title: Title of the article) [//]: # (description: Short description of the content) [//]: # (image: /img/some-header-image.png) [//]: # (author: Author Name <https://author.me>) [//]: # (author_photo: https://author.me/avatar.png) [//]: # (language: en-US) [//]: # (published: 2022-01-01) ...your Markdown content... Key Configuration Madblog reads configuration from a config.yaml in your content directory. Every option is also available as an environment variable with a MADBLOG_ prefix — handy for Docker or CI setups. A minimal config to get started: title: My Blog description: Thoughts on tech and life link: https://myblog.example.com author: Your Name Or purely via environment variables: docker run -it \ -p 8000:8000 \ -e MADBLOG_TITLE="My Blog" \ -e MADBLOG_LINK="https://myblog.example.com" \ -e MADBLOG_AUTHOR="Your Name" \ -v "$HOME/madblog:/data" \ quay.io/blacklight/madblog See config.example.yaml for the full reference. It is advised to keep all of your Markdown content under <data-dir>/markdown, especially if you enable federation, in order to keep the Markdown folder tidy from all the auxiliary files generated by Madblog. Webmentions Webmentions are the IndieWeb's answer to trackbacks and pingbacks — a W3C standard that lets websites notify each other when they link to one another. Madblog supports them natively, both inbound and outbound. When someone links to one of your articles from a Webmention-capable site, your blog receives a notification and renders the mention as a response on the article page. Going the other way, when you link to an external URL in your Markdown and save the file, Madblog automatically discovers the target's Webmention endpoint and sends a notification — no manual step required. All mentions are stored as Markdown files under your content directory (mentions/incoming/<post-slug>/), so they're version-controllable and easy to inspect. You can enable pending-mode for moderation (webmentions_default_status: pending), or use the blocklist/allowlist system to filter sources by domain, URL, or regex. Webmentions are enabled by default — if you're running Madblog locally for testing, set enable_webmentions: false to avoid sending real notifications to external sites. ActivityPub Federation ActivityPub is the protocol that powers the Fediverse — Mastodon, Pleroma, Misskey, and hundreds of other platforms. Madblog implements it as a first-class feature: enable it, and your blog becomes a Fediverse actor that people can follow, reply to, boost, and quote. Enable it in your config: enable_activitypub: true activitypub_username: blog activitypub_private_key_path: /path/to/private_key.pem Madblog will generate an RSA keypair on first start if you don't provide one. Once enabled, your blog gets a Fediverse handle (@blog@yourdomain.com), a WebFinger endpoint for discovery, and a full ActivityPub actor profile. New and updated articles are automatically delivered to all followers' timelines. Here's what federation looks like in practice: Receiving mentions: when someone mentions your blog's Fediverse handle in a public post (not as a reply to a specific article), the mention shows up on your Guestbook page. Receiving replies, likes, boosts, and quotes: interactions targeting a specific article are rendered below that article — replies as threaded comments, likes/boosts/quotes as counters and cards. All stored as JSON files on disk. Sending mentions: just write the fully-qualified handle in your Markdown (@alice@mastodon.social) and save the file. Madblog resolves the actor via WebFinger and delivers a proper ActivityPub Mention tag — the mentioned user gets a notification on their instance. Federated hashtags: hashtags in your articles (#Python, #Fediverse) are included as ActivityPub Hashtag tags in the published object. Followers who track those hashtags on their instance will see your posts in their filtered feeds. Custom profile fields: configure additional profile metadata (verified links, donation pages, git repos) that show up on your actor's profile as seen from Mastodon and other Fediverse clients: yaml activitypub_profile_fields: Git repository: <https://git.example.com/myblog> Donate: <https://liberapay.com/myprofile> The federation layer also exposes a read-only subset of the Mastodon API, so Mastodon-compatible clients and crawlers can discover the instance, look up the actor, list published statuses, and search for content — with no extra configuration. Madblog also supports advanced ActivityPub features like split-domain setups (e.g. your blog at blog.example.com but your Fediverse handle at @blog@example.com), configurable object types (Note for inline rendering on Mastodon vs. Article for link-card previews), and quote policies (FEP-044f, so Mastodon users can quote your articles too). LaTeX and Mermaid Madblog supports server-side rendering of LaTeX equations and Mermaid diagrams directly in your Markdown files — no client-side JavaScript required. LaTeX uses latex + dvipng under the hood. Inline expressions use conventional LaTeX markers: The Pythagorean theorem states that \(c^2 = a^2 + b^2\). $$ E = mc^2 $$ Mermaid diagrams use standard fenced code blocks. Both light and dark theme variants are rendered at build time and switch automatically based on the reader's color scheme: ```mermaid graph LR A[Write Markdown] --> B[Madblog renders it] B --> C[Fediverse sees it] ``` Install Mermaid support with pip install "madblog[mermaid]" or use the full Docker image. Rendered output is cached, so only the first render of each block is slow. Tags and Categories Tag your articles with hashtags — either in the metadata header or directly in the body text: # My Article This post is about #Python and the #Fediverse. Madblog builds a tag index at /tags, with per-tag pages at /tags/<tag>. Hashtags from incoming Webmentions are also indexed. Folders in your content directory act as categories — if you organize files into subdirectories, the home page groups articles by folder. Feed Syndication Madblog generates both RSS and Atom feeds at /feed.rss and /feed.atom. You can control whether feeds include full article content or just descriptions (short_feed: true), and limit the number of entries (max_entries_per_feed: 10). limit and offset parameters are also supported for pagination. Aggregator Mode Madblog can also pull in external RSS/Atom feeds and render them alongside your own posts on the home page — useful for affiliated blogs, or even as a self-hosted feed reader: external_feeds: - https://friendsblog.example.com/feed.atom - https://colleaguesblog.example.com/feed.atom Guestbook The guestbook (/guestbook) is a dedicated page that aggregates public interactions — Webmentions targeting the home page and Fediverse mentions of your blog actor that aren't replies to specific articles. Think of it as a public guest registry, or a lo-fi comment section for your blog as a whole. Visitors can leave a message by mentioning your Fediverse handle or sending a Webmention. It can be disabled via enable_guestbook=0. View Modes The home page supports three layouts: cards (default) — a responsive grid of article cards with images list — a compact list with titles and dates full — a scrollable, WordPress-like view with full article content inline Set it in your config (view_mode: cards) or override at runtime with ?view=list. Moderation Madblog ships with a flexible moderation system that applies to both Webmentions and ActivityPub interactions. You can run in blocklist mode (reject specific actors) or allowlist mode (accept only specific actors), with pattern matching by domain, URL, ActivityPub handle, or regex: blocked_actors: - spammer.example.com - "@troll@evil.social" - /spam-ring\.example\..*/ Moderation rules also apply retroactively — interactions already stored are filtered at render time. Blocked ActivityPub followers are excluded from fan-out delivery and hidden from the public follower count, but their records are preserved so they can be automatically reinstated if you change your rules. Email Notifications Configure SMTP settings and Madblog will notify you by email whenever a new Webmention or ActivityPub interaction arrives — likes, boosts, replies, mentions, and quotes: author_email: you@example.com smtp_server: smtp.example.com smtp_username: you@example.com smtp_password: your-password Progressive Web App Madblog is installable as a PWA, with offline access and a native-like experience on supported devices. A service worker handles stale-while-revalidate caching with background sync for retries. Raw Markdown Access Append .md to any article URL to get the raw Markdown source: https://myblog.example.com/article/my-post.md Useful for readers who prefer plain text, or for tools that consume Markdown directly. Reusable Libraries Two key subsystems of Madblog have been extracted into standalone, reusable Python libraries. If you're building a Python web application and want to add decentralized federation support, you can use them directly — no need to adopt Madblog itself. Webmentions Webmentions is a general-purpose Python library for sending and receiving Webmentions. It comes with framework adapters for FastAPI, Flask, and Tornado, pluggable storage backends (SQLAlchemy or custom), filesystem monitoring for auto-sending mentions when files change, full microformats2 parsing, and built-in HTML rendering for displaying mentions on your pages. Adding Webmentions to a FastAPI app: from fastapi import FastAPI from webmentions import WebmentionsHandler from webmentions.storage.adapters.db import init_db_storage from webmentions.server.adapters.fastapi import bind_webmentions app = FastAPI() storage = init_db_storage(engine="sqlite:////tmp/webmentions.db") handler = WebmentionsHandler(storage=storage, base_url="https://example.com") bind_webmentions(app, handler) That's it — your app now has a /webmentions endpoint for receiving mentions, a Link header advertising it on every response, and a storage layer for persisting them. See the full documentation for details on sending mentions, custom storage, moderation, and rendering. Pubby Pubby is a general-purpose Python library for adding ActivityPub federation to any web application. It handles inbox processing, outbox delivery with concurrent fan-out, HTTP Signatures, WebFinger/NodeInfo discovery, interaction storage, a Mastodon-compatible API, and framework adapters for FastAPI, Flask, and Tornado. Adding ActivityPub to a FastAPI app: from fastapi import FastAPI from pubby import ActivityPubHandler, Object from pubby.crypto import generate_rsa_keypair from pubby.storage.adapters.db import init_db_storage from pubby.server.adapters.fastapi import bind_activitypub app = FastAPI() storage = init_db_storage("sqlite:////tmp/pubby.db") private_key, _ = generate_rsa_keypair() handler = ActivityPubHandler( storage=storage, actor_config={ "base_url": "https://example.com", "username": "blog", "name": "My Blog", "summary": "A blog with ActivityPub support", }, private_key=private_key, ) bind_activitypub(app, handler) # Publish a post to all followers handler.publish_object(Object( id="https://example.com/posts/hello", type="Note", content="<p>Hello from the Fediverse!</p>", url="https://example.com/posts/hello", attributed_to="https://example.com/ap/actor", )) Optionally, you can also expose a Mastodon-compatible API so that Mastodon clients and crawlers can discover your instance and browse statuses: from pubby.server.adapters.fastapi_mastodon import bind_mastodon_api bind_mastodon_api( app, handler, title="My Blog", description="A blog with ActivityPub support", ) Both libraries follow the same design philosophy: provide the protocol plumbing so you can wire it into your existing application with minimal ceremony. Storage is pluggable (SQLAlchemy, file-based, or bring-your-own), framework binding is a single function call, and the core logic is framework-agnostic. See the full documentation for Pubby and Webmentions. Links Madblog (Github mirror) Webmentions (Github mirror) Pubby (Github mirror) Madblog is open-source under the AGPL-3.0-only license. The source code, issue tracker, and full documentation are available at git.fabiomanganiello.com/madblog.
  • 0 Votes
    1 Posts
    2 Views
    fabio@manganiello.euF
    @silverpill@mitra.social @fabio@manganiello.blog you're right, I completely overlooked that. Also the Python HTTP machinery isn't as clever as I thought so I had to trim parameters manually, but it should work now https://git.fabiomanganiello.com/blacklight/madblog/commit/76e7b72337b1ab7406fb307eb163a9a4097fcc0e ❯ curl -I -H 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams"' https://manganiello.blog/article/Madblog-federated-blogging-from-markdown HTTP/2 200 server: nginx date: Tue, 10 Mar 2026 19:06:01 GMT content-type: application/activity+json content-length: 69389 last-modified: Tue, 10 Mar 2026 18:39:54 GMT etag: "81d02d339405c0ec" cache-control: public, max-age=0, must-revalidate language: en-US
  • 0 Votes
    1 Posts
    0 Views
    fabio@manganiello.euF
    @silverpill@mitra.social @fabio@manganiello.blog yes, I've just realized that luckily requests is smart enough to split header parameters ❯ curl -I -H 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams' https://manganiello.blog/article/Madblog-federated-blogging-from-markdown HTTP/2 200 server: nginx date: Tue, 10 Mar 2026 18:43:44 GMT content-type: application/activity+json content-length: 69389 last-modified: Tue, 10 Mar 2026 18:39:54 GMT etag: "81d02d339405c0ec" cache-control: public, max-age=0, must-revalidate language: en-US
  • @silverpill@mitra.social @fabio@manganiello.blog good catch!

    1
    0 Votes
    1 Posts
    0 Views
    fabio@manganiello.euF
    @silverpill@mitra.social @fabio@manganiello.blog good catch! https://git.platypush.tech/blacklight/madblog/commit/9024ba9c2dd1b4ad77e50892189c6a155eb199ce
  • 0 Votes
    1 Posts
    0 Views
    fabio@manganiello.euF
    @shellsharks@shellsharks.social this is still WIP https://git.platypush.tech/blacklight/madblog/issues/20 It requires properly implementing the movedTo notifications both on the receiving and sending side, but the implementation details (especially for the asynchronous migration jobs) require me to dig a bit deeper in Mastodon's implementation.
  • @tobias

    bovine python activitypub c2s
    1
    0 Votes
    1 Posts
    4 Views
    cdonat@hostsharing.coopC
    @tobias Maybe #bovine is, what you're looking for.https://codeberg.org/bovine/bovine#python #activitypub #c2s
  • This post did not contain any content.

    4
    1
    1 Votes
    4 Posts
    0 Views
    julian@activitypub.spaceJ
    @lucaswerkmeister@wikis.world I reported this post [image: 1773013879175-1000012434.jpg]
  • 0 Votes
    110 Posts
    9 Views
    mapache@hachyderm.ioM
    @inconspicuous-lurker-99
  • (digital) doodling a little

    c2s activitypub ios fediverse wordpress
    5
    3
    1 Votes
    5 Posts
    1 Views
    pfefferle@mastodon.socialP
    @liaizon yes
  • 0 Votes
    13 Posts
    0 Views
    lanske@mastodon.socialL
    @matdevdug just read it on lemmy and instantly wanted to follow you here on Mastodon. Great article!
  • 0 Votes
    3 Posts
    4 Views
    aslakr@mastodon.socialA
    @Edent At least one atproto client can show Unicode handles https://atproto.at://did:plc:2h3l5x5ocsko5cabbqwksg2r/app.bsky.feed.post/3mggmlk25f5gf i.e. using IDN. Interaction etc. probably would probably need deeper support in server implementations. On the ActivtyPub side, non-ascii usernames needs to be generally supported before @bsky.brid.gy can convert the handle @xn--atmosfrisk-i6a.xn--rdsei-vua.no correctly
  • lol the nuances I find when developing for activitypub ...

    mastodon pixelfed
    4
    0 Votes
    4 Posts
    0 Views
    mapache@hachyderm.ioM
    @julian interesting! thanks for sharing. Is the threadiverse forums like nodebb or lemmy?
  • Promoting NodeBB/fedi to city-scale organizations

    digitalurbanism fedimtl
    2
    1
    0 Votes
    2 Posts
    0 Views
    informapirata@activitypub.spaceI
    In Italy, we've attempted this experiment at https://citiverse.it, which we haven't yet adequately promoted. However, it's a NodeBB instance designed primarily to create an alternative to local Facebook groups. The entire first section is made up of categories hierarchically coordinated by regions, cities, provincial capitals, and localities. Thanks to NodeBB's features, we were able to begin capturing some posts from the Fediverse, especially from Mastodon, and some categories have finally been populated by actual users who decided to mention them directly from the Fediverse or who signed up to the forum to publish new posts. We don't claim to be the official forum for all Italian communities. But the greatest advantage NodeBB offers is that if one day someone were to decide to create an entire forum dedicated to a region or a single city, we could simply deactivate that category or subcategory and link the newly created category as a remote category. All this has been possible thanks to the fact that in just over a year, NodeBB has become a fantastic and extremely versatile tool.
  • 0 Votes
    2 Posts
    0 Views
    smallcircles@social.coopS
    @julian @frank The intermediate results of the #poll I started also strongly emphasize these points. What is nice is that people tell about their social experience, which is uniquely personal depending on individual needs and the social graph they have formed to engage with.Decentralized + federated are merely technical characteristics. But they are enablers of something more.. true social spaces that evolve and intricate social contexts that intertwine in interesting ways.https://social.coop/@smallcircles/116154415408228188
  • 0 Votes
    1 Posts
    4 Views
    strypey@mastodon.nzoss.nzS
    There have been many experiments with adding simple ActivityPub support to static blogs, enabling authors to publish their blog into the fediverse to be followed and get commented on. Some of these experimenters have documented what they did, and I've started a list of examples here;https://codeberg.org/fediverse/fediparty/wiki/Fediverse-comments-on-static-blogsI chucked this together in a hurry, so please prod me about any mistakes, or any additions that could be made to the list.#FediDevs #ActivityPub #blogs #StaticSites #FediverseParty
  • 0 Votes
    11 Posts
    10 Views
    strypey@mastodon.nzoss.nzS
    @julian FYI when you see a (1/?) at the top of my posts, it means the thoughts I'm trying to communicate require more than 500 characters to express. It's worth waiting for the full thread before replying, because otherwise, as in this case, the response to your points is made in later posts : )