Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. General Discussion
  3. **#ActivityPub support in #Madblog**

**#ActivityPub support in #Madblog**

Scheduled Pinned Locked Moved General Discussion
activitypubfediversemadblogplatypushpubby
49 Posts 12 Posters 130 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • fabio@manganiello.euF fabio@manganiello.eu

    @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.socialS
    silverpill@mitra.socialS
    silverpill@mitra.social
    wrote on last edited by
    #21

    @fabio @fabio In your curl command, the closing quote (") is missing after https://www.w3.org/ns/activitystreams. When I make a request with the full media type string, the server still returns text/html

    1 Reply Last reply
    0
    • silverpill@mitra.socialS silverpill@mitra.social

      @julian

      If you investigate NodeBB's actors, all of their outboxes return an empty OrderedCollection because I simply haven't gotten around to it yet, and I don't know many implementations that read it.

      I read from outboxes all the time. But I can't do that with NodeBB 😒

      https://github.com/NodeBB/NodeBB/issues/13478

      julian@activitypub.spaceJ
      julian@activitypub.spaceJ
      julian@activitypub.space
      wrote on last edited by
      #22

      @silverpill@mitra.social I recall Mitra may be one of a select few 😝

      Do you use it to backfill a profile? How often do you query the outbox?

      1 Reply Last reply
      0
      • silverpill@mitra.socialS
        silverpill@mitra.socialS
        silverpill@mitra.social
        wrote on last edited by
        #23

        @fabio @fabio It's working, thanks!

        1 Reply Last reply
        0
        • silverpill@mitra.socialS
          silverpill@mitra.socialS
          silverpill@mitra.social
          wrote on last edited by
          #24

          @julian Yes, to backfill a profile. It is a manual action.

          I don't know who else does that, but @jonny is working on adding automatic profile backfill to Mastodon: https://github.com/mastodon/mastodon/pull/34597

          julian@fietkau.socialJ jonny@neuromatch.socialJ 2 Replies Last reply
          1
          • silverpill@mitra.socialS silverpill@mitra.social

            @julian Yes, to backfill a profile. It is a manual action.

            I don't know who else does that, but @jonny is working on adding automatic profile backfill to Mastodon: https://github.com/mastodon/mastodon/pull/34597

            julian@fietkau.socialJ
            julian@fietkau.socialJ
            julian@fietkau.social
            wrote on last edited by
            #25

            @silverpill @julian@activitypub.space I believe @hollo does it as well.

            @general

            1 Reply Last reply
            1
            • fabio@manganiello.euF fabio@manganiello.eu

              #ActivityPub support in #Madblog

              I am glad to announce that Madblog has now officially joined the #Fediverse family.

              Madblog has already supported #Webmentions for the past couple of weeks, allowing your blog posts to be mentioned by other sites with Webmentions support (WordPress, Lemmy, HackerNews...) and get those mentions directly rendered on your page.

              It now adds ActivityPub support too, using #Pubby, another little Python library that I've put together myself (just like Webmentions) as a mean to quickly plug ActivityPub support to any Python Web app.

              Webmentions and Pubby follow similar principles and implement a similar API, and you can easily use them to add federation support to your existing Web applications - a single bind_webmentions or bind_activitypub call to your existing Flask/FastAPI/Tornado application should suffice for most of the cases.

              Madblog may have now become the easiest way to publish a federated blog - and perhaps the only way that doesn't require a database, everything is based on plain Markdown files.

              If you have a registered domain and a certificate, then hosting your federated blog is now just a matter of:

              mkdir -p ~/madblog/markdown
              cat <<EOF > ~/madblog/markdown/hello-world.md
              
              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
              

              And Markdown files can be hosted wherever you like - a Git folder, an Obsidian Vault, a Nextcloud Notes installation, a folder on your phone synchronized over SyncThing...

              Federation support is also at a quite advanced state compared to e.g. #WriteFreely. It currently supports:

              • Interactions rendered on the articles: if you like, boost, quote or reply to an article, all interactions are rendered directly at the bottom of the article (interactions with WriteFreely through federated accounts were kind of lost in the void instead)

              • Guestbook support (optional): mentions to the federated Madblog handle that are not in response to articles are now rendered on a separate /guestbook route

              • Email notifications: all interactions can have email notifications

              • Support for quotes, also on Mastodon

              • Support for mentions, just drop a @joe@example.com in your Markdown file and Joe will get a notification

              • Support for hashtag federation

              • Support for split-domain configurations, you can host your blog on blog.example.com but have a Fediverse handle like @blog@example.com. Search by direct post URL on Mastodon will work with both cases

              • Support for custom profile fields, all rendered on Mastodon, with verification support

              • Support for moderation, either through blocklist or allowlist, with support for rules on handles/usernames, URLs, domains or regular expressions

              • A partial (but comprehensive for the provided features) implementation of the Mastodon API

              If you want you can follow both the profiles of my blogs - they are now both federated:

              • My personal blog: @fabio@manganiello.blog (it used to run WriteFreely before, so if you followed it you may need to unfollow it and re-follow it)

              • The #Platypush blog: @blog@platypush.tech

              https://blog.fabiomanganiello.com/article/Madblog-federated-blogging-from-markdown

              akavel@merveilles.townA
              akavel@merveilles.townA
              akavel@merveilles.town
              wrote on last edited by
              #26

              @fabio I really, really love it!! I wanted to do the same for quite a long time - but I didn't; and now maybe I can eventually steal your code and RIIR in glorious AGPL!

              That said, unfortunately at the moment it's not working for me, I can't open it either in my client, or through my instance's search 😒 FWIW, through my instance I'm seeing some "503 Remote SSL certificate could not be verified", while the client just spins a throbber endlessly. No idea where the fault lies, but I do remember reading many times that Mastodon is a flustercluck and a fishy citizen in ActivityPub 😞...

              Anyway, huge applause from me regardless, and hopefully one day I can get to fave the actual post on the blog!

              fabio@manganiello.euF 1 Reply Last reply
              0
              • fabio@manganiello.euF fabio@manganiello.eu

                #ActivityPub support in #Madblog

                I am glad to announce that Madblog has now officially joined the #Fediverse family.

                Madblog has already supported #Webmentions for the past couple of weeks, allowing your blog posts to be mentioned by other sites with Webmentions support (WordPress, Lemmy, HackerNews...) and get those mentions directly rendered on your page.

                It now adds ActivityPub support too, using #Pubby, another little Python library that I've put together myself (just like Webmentions) as a mean to quickly plug ActivityPub support to any Python Web app.

                Webmentions and Pubby follow similar principles and implement a similar API, and you can easily use them to add federation support to your existing Web applications - a single bind_webmentions or bind_activitypub call to your existing Flask/FastAPI/Tornado application should suffice for most of the cases.

                Madblog may have now become the easiest way to publish a federated blog - and perhaps the only way that doesn't require a database, everything is based on plain Markdown files.

                If you have a registered domain and a certificate, then hosting your federated blog is now just a matter of:

                mkdir -p ~/madblog/markdown
                cat <<EOF > ~/madblog/markdown/hello-world.md
                
                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
                

                And Markdown files can be hosted wherever you like - a Git folder, an Obsidian Vault, a Nextcloud Notes installation, a folder on your phone synchronized over SyncThing...

                Federation support is also at a quite advanced state compared to e.g. #WriteFreely. It currently supports:

                • Interactions rendered on the articles: if you like, boost, quote or reply to an article, all interactions are rendered directly at the bottom of the article (interactions with WriteFreely through federated accounts were kind of lost in the void instead)

                • Guestbook support (optional): mentions to the federated Madblog handle that are not in response to articles are now rendered on a separate /guestbook route

                • Email notifications: all interactions can have email notifications

                • Support for quotes, also on Mastodon

                • Support for mentions, just drop a @joe@example.com in your Markdown file and Joe will get a notification

                • Support for hashtag federation

                • Support for split-domain configurations, you can host your blog on blog.example.com but have a Fediverse handle like @blog@example.com. Search by direct post URL on Mastodon will work with both cases

                • Support for custom profile fields, all rendered on Mastodon, with verification support

                • Support for moderation, either through blocklist or allowlist, with support for rules on handles/usernames, URLs, domains or regular expressions

                • A partial (but comprehensive for the provided features) implementation of the Mastodon API

                If you want you can follow both the profiles of my blogs - they are now both federated:

                • My personal blog: @fabio@manganiello.blog (it used to run WriteFreely before, so if you followed it you may need to unfollow it and re-follow it)

                • The #Platypush blog: @blog@platypush.tech

                https://blog.fabiomanganiello.com/article/Madblog-federated-blogging-from-markdown

                jonny@neuromatch.socialJ
                jonny@neuromatch.socialJ
                jonny@neuromatch.social
                wrote on last edited by
                #27

                @fabio@manganiello.eu @fabio@manganiello.blog @blog omg thank you for the python lib. i was getting ready to write one but extremely good to see i can draw from (credit/depend on/etc.) prior art. adding to the inspo docs!!!

                1 Reply Last reply
                0
                • silverpill@mitra.socialS silverpill@mitra.social

                  @julian Yes, to backfill a profile. It is a manual action.

                  I don't know who else does that, but @jonny is working on adding automatic profile backfill to Mastodon: https://github.com/mastodon/mastodon/pull/34597

                  jonny@neuromatch.socialJ
                  jonny@neuromatch.socialJ
                  jonny@neuromatch.social
                  wrote on last edited by
                  #28

                  @silverpill @julian @general Collections are one of the best parts of activitypub/streams and i have no idea why nobody uses them or works on them. like if we embraced the underlying graph structure of the data and used the canonicalization algos that have been developed in the meantime we get all the good parts of atproto (mostly efficient updating the pds system) basically for free

                  jonny@neuromatch.socialJ 1 Reply Last reply
                  1
                  • jonny@neuromatch.socialJ jonny@neuromatch.social

                    @silverpill @julian @general Collections are one of the best parts of activitypub/streams and i have no idea why nobody uses them or works on them. like if we embraced the underlying graph structure of the data and used the canonicalization algos that have been developed in the meantime we get all the good parts of atproto (mostly efficient updating the pds system) basically for free

                    jonny@neuromatch.socialJ
                    jonny@neuromatch.socialJ
                    jonny@neuromatch.social
                    wrote on last edited by
                    #29

                    @silverpill @julian @general account backfilling is issue number THIRTY FOUR in mastodon and has >700 thumbs, >200 comments hemming and hawing about how possible it would be for TEN YEARS.

                    the solution is just "enumerate the outbox" and it's 200 lines.

                    like we already have a mechanism for reply controls: the reply collection.
                    for fine-grained post visibility: access control on the outbox collection.
                    broadcasting feeds and posts between instances: collections
                    migrations: collections
                    store and forward, offline-focused AP: collections

                    and so on.

                    silverpill@mitra.socialS 1 Reply Last reply
                    0
                    • django@social.coopD
                      django@social.coopD
                      django@social.coop
                      wrote on last edited by
                      #30

                      @julian @silverpill ActivityPub API clients dont need their server to backfill thanks to proxyURL, but Actors will look like they haven’t posted 😒

                      julian@activitypub.spaceJ 1 Reply Last reply
                      1
                      • django@social.coopD django@social.coop

                        @julian @silverpill ActivityPub API clients dont need their server to backfill thanks to proxyURL, but Actors will look like they haven’t posted 😒

                        julian@activitypub.spaceJ
                        julian@activitypub.spaceJ
                        julian@activitypub.space
                        wrote on last edited by
                        #31

                        @django@social.coop sounds like I'll have to implement it sooner rather than later!

                        1 Reply Last reply
                        0
                        • jonny@neuromatch.socialJ jonny@neuromatch.social

                          @silverpill @julian @general account backfilling is issue number THIRTY FOUR in mastodon and has >700 thumbs, >200 comments hemming and hawing about how possible it would be for TEN YEARS.

                          the solution is just "enumerate the outbox" and it's 200 lines.

                          like we already have a mechanism for reply controls: the reply collection.
                          for fine-grained post visibility: access control on the outbox collection.
                          broadcasting feeds and posts between instances: collections
                          migrations: collections
                          store and forward, offline-focused AP: collections

                          and so on.

                          silverpill@mitra.socialS
                          silverpill@mitra.socialS
                          silverpill@mitra.social
                          wrote on last edited by
                          #32

                          @jonny @julian

                          i have no idea why nobody uses them or works on them

                          There is a FEP in the works:

                          https://codeberg.org/silverpill/feps/src/branch/main/9f9f/fep-9f9f.md

                          1 Reply Last reply
                          0
                          • akavel@merveilles.townA akavel@merveilles.town

                            @fabio I really, really love it!! I wanted to do the same for quite a long time - but I didn't; and now maybe I can eventually steal your code and RIIR in glorious AGPL!

                            That said, unfortunately at the moment it's not working for me, I can't open it either in my client, or through my instance's search 😒 FWIW, through my instance I'm seeing some "503 Remote SSL certificate could not be verified", while the client just spins a throbber endlessly. No idea where the fault lies, but I do remember reading many times that Mastodon is a flustercluck and a fishy citizen in ActivityPub 😞...

                            Anyway, huge applause from me regardless, and hopefully one day I can get to fave the actual post on the blog!

                            fabio@manganiello.euF
                            fabio@manganiello.euF
                            fabio@manganiello.eu
                            wrote on last edited by
                            #33

                            @akavel@merveilles.town thanks for your response πŸ™‚

                            Did you manage to get to the bottom of it? From the description of the error it sounds like your certificate may be broken? Can you access the blog index from a normal browser? Do you perhaps have a split-domain situation (link != activitypub_link) but the certificate only applies to one?

                            akavel@merveilles.townA 1 Reply Last reply
                            0
                            • julian@fietkau.socialJ julian@fietkau.social

                              @fabio @liaizon Oh excellent! Please let me know when the new version is live on your blog and I'll test again. πŸ™‚

                              fabio@manganiello.euF
                              fabio@manganiello.euF
                              fabio@manganiello.eu
                              wrote on last edited by
                              #34

                              @julian@fietkau.social @liaizon@wake.st it's all live, let me know if it works πŸ™‚

                              julian@fietkau.socialJ 1 Reply Last reply
                              0
                              • fabio@manganiello.euF fabio@manganiello.eu

                                @julian@fietkau.social @liaizon@wake.st it's all live, let me know if it works πŸ™‚

                                julian@fietkau.socialJ
                                julian@fietkau.socialJ
                                julian@fietkau.social
                                wrote on last edited by
                                #35

                                @fabio @liaizon New quote test, wooo!

                                https://blog.fabiomanganiello.com/article/Madblog-federated-blogging-from-markdown

                                fabio@manganiello.blogF 1 Reply Last reply
                                0
                                • fabio@manganiello.euF fabio@manganiello.eu

                                  @akavel@merveilles.town thanks for your response πŸ™‚

                                  Did you manage to get to the bottom of it? From the description of the error it sounds like your certificate may be broken? Can you access the blog index from a normal browser? Do you perhaps have a split-domain situation (link != activitypub_link) but the certificate only applies to one?

                                  akavel@merveilles.townA
                                  akavel@merveilles.townA
                                  akavel@merveilles.town
                                  wrote on last edited by
                                  #36

                                  @fabio I didn't investigate further as I had no idea how.

                                  Which link specifically do you mean by "blog index"?

                                  As to domain/instance I mean this one I'm writing from - I don't control it, sorry I see I wrote it in a confusing way, I'm just a plain citizen here.

                                  Seeing you mention certs I will try on a laptop then, not on phone, to compare. Or could it be that the instance I'm on has some certs problems internally? πŸ€”

                                  fabio@manganiello.euF 1 Reply Last reply
                                  0
                                  • julian@activitypub.spaceJ
                                    julian@activitypub.spaceJ
                                    julian@activitypub.space
                                    wrote on last edited by julian@activitypub.space
                                    #37

                                    @silverpill@mitra.social @django@social.coop @hongminhee@hollo.social Okay, I implemented user outboxes for posts, votes, and shares (post edits are a little harder πŸ˜“)

                                    https://activitypub.space/uid/1/outbox

                                    Hopefully I did it ok, had to re-invent some collection logic because I couldn't re-use the helper I wrote before, as that relies on a pagination cursor, which, long story short, is not at all scalable when navigating through a user inbox.

                                    Group outboxes to follow, but just hoping for a sanity check for now.

                                    1 Reply Last reply
                                    0
                                    • silverpill@mitra.socialS
                                      silverpill@mitra.socialS
                                      silverpill@mitra.social
                                      wrote on last edited by
                                      #38

                                      @julian I can read the outbox and activities πŸ‘

                                      There is a minor problem with Like activities, which don't have a to field (this means nobody should be able to see them).

                                      And while we're at it: when NodeBB sends a signed GET request, does it add a Digest header? I see warnings in my log due to invalid header value.

                                      @django @hongminhee

                                      1 Reply Last reply
                                      0
                                      • akavel@merveilles.townA akavel@merveilles.town

                                        @fabio I didn't investigate further as I had no idea how.

                                        Which link specifically do you mean by "blog index"?

                                        As to domain/instance I mean this one I'm writing from - I don't control it, sorry I see I wrote it in a confusing way, I'm just a plain citizen here.

                                        Seeing you mention certs I will try on a laptop then, not on phone, to compare. Or could it be that the instance I'm on has some certs problems internally? πŸ€”

                                        fabio@manganiello.euF
                                        fabio@manganiello.euF
                                        fabio@manganiello.eu
                                        wrote on last edited by
                                        #39

                                        @akavel@merveilles.town I mean if you open the home page of your blog from a normal browser (any browser, mobile or desktop) do you still see the certificate error? If that's not the case and you have a split domain configuration (so your blog is on a URL and your federated domain is on another) then double-check that both the certificates are valid.

                                        akavel@merveilles.townA 1 Reply Last reply
                                        0
                                        • fabio@manganiello.euF fabio@manganiello.eu

                                          @akavel@merveilles.town I mean if you open the home page of your blog from a normal browser (any browser, mobile or desktop) do you still see the certificate error? If that's not the case and you have a split domain configuration (so your blog is on a URL and your federated domain is on another) then double-check that both the certificates are valid.

                                          akavel@merveilles.townA
                                          akavel@merveilles.townA
                                          akavel@merveilles.town
                                          wrote on last edited by
                                          #40

                                          @fabio Oh I didn't install your blog on my host yet! For now I wanted to comment/fave in _your_ blog and I couldn't do that - this is my problem...

                                          fabio@manganiello.euF 1 Reply Last reply
                                          0

                                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                          With your input, this post could be even better πŸ’—

                                          Register Login
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          Powered by NodeBB Contributors
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups