#ActivityPub support in #Madblog

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

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

If you want to test it out, search for this URL on your Fediverse client.

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 # My first post 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 @[email protected] 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 @[email protected]. 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 (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

Madblog: A Markdown Folder That Federates Everywhere

A lightweight blogging engine based on text files, with native Fediverse and IndieWeb support

Fabio Manganiello

📰 New blog article

Self-host your own multi-service #music server on #Android

How to replace your music streaming apps with a setup that supports multiple streaming services, multiple devices and multiple outputs from a single Webapp.

#mopidy #platypush #termux #ntfy #Tasker #python

@Selfhosted @Android @python

https://blog.platypush.tech/article/Self-host-your-music-experience-on-mobile

Self-host your music experience on mobile

Build your mobile music streaming experience with Mopidy, Platypush, ntfy and Tasker

Platypush

In 2024 I should try to learn and explore #platypush!

Maybe learn some CI/CD? ... https://blog.platypush.tech/article/Set-up-self-hosted-CI-CD-git-pipelines-with-Platypush

Maybe it will help me make an artsy Mastodon bot?

Who knows...

Set up self-hosted CI/CD git pipelines with Platypush

The Platypush blog

And there we go with my top tracks of the year too - powered by #Platypush and #SQL.

A big change for #Platypush - and more are on their way before the next (very big) release.

The #YouTube integration has been completely rewritten to remove all the references to the YouTube API. I've tried my best to play fair, but the YouTube API has seen way too many breaking changes recently, as a result of Google's strategy against scrapers and 3rd-party clients. I just can't keep maintaining an integration with an API provided by a company with such a hostile stance against developers.

I want to spend my time making new things work, not fixing stuff purposefully broken by someone else. Even just searching for videos now requires a registered and approved Google project, and the user to be logged in: this isn't exactly the kind of stuff that is easy for anybody to set up and run.

Also, scraping results from the Web interface is no longer possible unless the user has JS enabled - which means no more easy beautifulsoup scripts, one has to summon Selenium and its whole frontend suite to scrape stuff.

From now on, the YouTube integration will use #Piped as a backend instead. A simple public API, subscribe to search results and feeds through simple RSS syndacation, and no more headaches with Google. This is what the developer experience with YouTube used to be until a few years ago, and how it should have remained.

https://git.platypush.tech/platypush/platypush/commit/2b12984c81e83d54d1135300b0dc5031615fe6a3

platypush

A versatile and extensible platform automation, with hundreds of supported integrations

Platypush Git

@futzle if you don't mind using software that may still be a bit in beta, you can give #Platypush a try.

I wrote an article a while ago on how to set it up as a #Zigbee and #ZWave bridge: https://blog.platypush.tech/article/Transform-a-RaspberryPi-into-a-universal-Zigbee-and-Z-Wave-bridge

Both the Zigbee and Z-Wave integration require an intermediate broker though - zigbee2mqtt and zwavejs respectively.

Some changes and improvements are also coming up in the next release (I'm speeding them up a bit now that Hue has left a lot of orphans behind).

Transform a RaspberryPi into a universal Zigbee and Z-Wave bridge

The Platypush blog

There we go - the technological #enshittification pandemic has also reached Philips #Hue.

Apparently they weren't making enough money by selling bulbs at $50/70 each. They'll now force you to log in through their app to the bridge too, or all of your bulbs will just stop working.

What this means, among the other things, is that tons of unofficial integrations that have been built over the years (phue being one of them, which I contributed to in the past, and is also used by Platypush to interact with Hue bridges) are also likely to stop working once you upgrade your bridge's firmware. Those integrations leverage the old push-the-pairing-button mechanism to pair with the client, but now in-app authentication through a registered account seems to be a requirement - and I definitely have better things to do with my time than reverse engineer again their shitty authentication flow and push a PR to phue.

Philips Hue (sorry, Signify B.V.; Philips has actually given up on building anything, they're just waiting for everybody who works there to retire) has joined the long wagon of companies that have realized that scooping up as much data as they can from their users (that probably includes at what time you usually wake up and go to sleep, from your bedroom lights patterns, or how often you go to the toilet) and selling it to data brokers provides a much steadier revenue stream than selling actual products that people want (even if those products are already quite pricey). And they don't care if fullfilling their new missions of being a mere data collector rather than a tech company means to literally break overnight the lights in the houses of millions of customers.

Of course, I was kind of prepared for this. I have #Platypush installed on a RPi with a Zigbee dongle and zigbee2mqtt, and it already does the job for a bunch of Hue, Ikea and other cheap Zigbee lights. That's all you need to make your own Zigbee bridge. #HomeAssistant and #OpenHAB are other popular options.

But it'll still take me a while to unpair a few tens of Hue devices in my house that are still connected to my Hue bridge (which I purchased a decade ago btw), and reconfigure tens of groups, scenes and automation routines on my self-managed bridge instead.

I used to love being a software engineer, building things and solving problems. Now being an engineer sucks, even as a hobby, and I don't feel anymore like this is what I want to do with my life.

It's not up to me to decide what to build anymore. It's up to Spotify killing their streaming libraries, Twitter or Reddit killing their API, Hue breaking their products if you don't log in through their app, YouTube coming up with ways to break youtube-dl on a daily basis, Google breaking your browser extensions, Red Hat and Docker turning suddenly hostile towards the FOSS community that made their fortunes, Messenger periodically logging out your alternative clients and locking your account, an increasing number of companies who insult the large community of unpaid volunteers that builds against their ecosystems as "free-riders" and make it their business mission to break their implementations, and the list could go on forever.

I'm no longer working with ecosystems built by companies who genuinely want to build good things that people want to use, who treat the community of developers around them as an asset rather than a liability, and even sport "don't be evil" among their core values. I'm working in an industry that continuously takes hostile stances against the FOSS community, unofficial clients, and anything that doesn't fit neatly into the quarterly vision for profitability outlined in the PowerPoint deck of a sociopath product manager with no tech background, and who couldn't care less if they are selling IoT devices or bricks. And I have to dodge these attacks on a daily basis, one line of code at the time, for the hundreds of integrations available in the projects I maintain or contribute to, just to keep things working without losing features overnight.

I wake up the morning thinking "how will tech companies decide to fuck me up today just to get one more byte about me to sell to data brokers, and which activities will I be forced to put aside in order to write some code that fixes the UX-breaking shitshow that one of their greedy managers has decided to put up today in an effort to beef up their quarterly bonus with a +1% uptick in revenue?"

Congratulations, motherfuckers. Your broken business models have broken tech for everyone.

https://rachelbythebay.com/w/2023/09/26/hue/

The Philips Hue ecosystem is collapsing into stupidity

#Platypush can now be installed via #RPM too!

After setting up in the past few days my Drone CI automation to spit out a .deb package on every push and tag, I've decided to go the extra mile and also repeat the exercise for .rpm.

I'm also satisfied with having both my APT and RPM repos now completely served from an S3-compatible bucket, with my Drone CI automation being completely in charge of updating the bucket on every push.

Installing Platypush from RPM on Fedora is now as simple as:

> wget -O /etc/yum.repos.d/platypush.repo 'https://rpm.platypush.tech/platypush.repo'

> yum install platypush

(or platypush-git, if you want the bleeding edge version updated on every push).

https://rpm.platypush.tech

#Platypush now has an APT repo! https://apt.platypush.tech/

`apt install platypush` is now finally a thing!

This will make the installation process easier on the RPi and other Debian-based systems.

My CI/CD pipelines so far were only spitting out an AUR build, but now we've also got some dear ol' .deb files automatically generated.

It's also my first experience with serving a static website completely through an S3-compatible bucket. Big kudos to the folks at #Scaleway for providing an alternative to AWS that is much cheaper and also EU-based.

```
$ uptime
10:06:46 up 698 days, 7 min, 0 users, load average: 0.30, 0.24, 0.18
```

Just realized that I've got #Platypush running my cameras on some Raspberry Pi Zeros in my house that haven't been rebooted in two years.

The Platypush process itself has remained up and running in all this time, all while serving tens of camera feed requests per day.

I guess I'll have to restart these machines some time soon, or get stuck with Python 3.7 indefinitely...