A super-long shot: is there anyone who can recommend a carpenter in Cagliari (Sardinia)?
Christian, husband, dad, coder, trainer, speaker, rpg geek, adhd
We just released Bonfire 1.0.2, an update focused on giving you a more stable and reliable experience.
We're also heads-down working with several communities who are setting up their own Bonfire servers.
Plus updates on end to end encryption and federated groups.
More details: bonfirenetworks.org/posts/bo...
EDGEDANCER (2002)
Acrylic on Gessoboard - 28" x 22"
From the End of Nature subset of my gallery work, a cautionary tale, “All good things come to an end...” 1/2
EDGEDANCER (2002)
Acrylic on Gessoboard - 28" x 22"
From the End of Nature subset of my gallery work, a cautionary tale, “All good things come to an end...” 1/2
@[email protected] This is a beautiful piece!
On a slightly unrelated note, I've been meaning to comment for a while that (having been somewhat involved with publishing over the years) it is so refreshing to hear you talking about your book covers as someone who is obviously inspired by the content of the book so I'll take the opportunity to say that now as well.
I don't know who needs to hear this today, but you're not like everybody else, and the expert advice may not fit you. This brought to you by a reminder I had of talking to one of my son's teachers.
"Don't worry, we've taught plenty of children like your son before!"
When we told the educational psychologist they actually laughed out loud, because the piece of advice that triggered the comment would only be helpful for around 1 in every 5,000 children and would have been actively detrimental to an 'average' pupil his age. 1/2
I'm with you here Mavnn
Many years ago I read a Twitter thread written by a meth user. He was talking about the good experiences he has had while high and how frustrated he was that most people only discuss the bad parts of meth.
I absolutely believe him that he enjoys it, and has profound conversations and great sex with his girlfriend while high, and so on.
But I am absolutely going to dismiss his experiences when deciding whether I should use meth
@[email protected] Thank you! Also, that's a very classy avatar
DJ here has been doing some of the worst transitions I've heard in a set, to the point that it has become fully comical. Just straight mixing 90bpm disco into 120bpm house, zero beat or key matching, in some cases three false starts on a track or leaving the second deck fader on 1/4 volume while picking tunes and scrolling through.
@[email protected] When I was sixteen my drum teacher pulled me in at the last moment for a concert because an orchestra member was ill. I had one job: whack a huge bass drum about six times.
One of those times I whacked it a full beat late, in a moment of complete silence from the rest of the orchestra.
My drum teacher afterwards said "don't worry, the audience will have assumed it was on purpose. Apart from the musicians in the audience - they'll be having a good laugh."
I wonder if you're hitting a similar situation or whether they're just, er, not very good...
Blog: Easy, visual, camera bounds in Godot
I'm building a 2D rogue-like in #godot with one of my students and it was proving a hassle accurately setting camera and world boundaries on levels. This is one way to allow level scenes to set their own boundaries visually in the editor.
heard "be the elephant you want to see in the room" earlier and gosh if that hasn't stuck with me
Google: Would you like to see the crawled version?
Me: ...okay?
Google: Ha! The page hasn't been retrieved.
Me: The one you just told me was crawled?
Google: Maybe you need to wait a bit?
Me: ...so, telling you my website has moved means you notice more slowly than if I don't tell you?
Google: Pretty much! Thanks for telling us!
Me: You do realise that even Bing have started indexing the new domain, and I didn't even tell them?
Google: We have a button here that does nothing you can click, and we'll tell you your page is in a priority queue!
Me: Okay, so we're really doubling down on the epitaph "Woke up and chose to be worse than Bing". Good to know.
Me, to Google: I'm moving my blog from blog.mavnn.co.uk to blog.mavnn.eu. I've set up redirects and everything. Now I'm submitting a report to tell you.
Google: Okay!
Me, next day: Google, why have unindexed all my mavnn.eu sites, even the unrelated ones?
Google: We've crawled those pages but haven't indexed them yet.
Me: They were already indexed?
Google: Would you like to see the crawled version?
Me: ...okay?
Google: Ha! The page hasn't been retrieved.
Me: The one you just told me was crawled?
Google: Maybe you need to wait a bit?
Me: ...so, telling you my website has moved means you notice more slowly than if I don't tell you?
Google: Pretty much! Thanks for telling us!
Me, to Google: I'm moving my blog from blog.mavnn.co.uk to blog.mavnn.eu. I've set up redirects and everything. Now I'm submitting a report to tell you.
Google: Okay!
Me, next day: Google, why have unindexed all my mavnn.eu sites, even the unrelated ones?
Google: We've crawled those pages but haven't indexed them yet.
Me: They were already indexed?
Some updates to ActivityBot
https://shkspr.mobi/blog/2026/03/some-updates-to-activitybot/I couple of years ago, I developed ActivityBot - the simplest way to build Mastodon Bots. It is a single PHP file which can run an entire ActivityPub server and it is less than 80KB.
It works! You can follow @[email protected] to see the latest entries on OpenBenches.org, and @[email protected] for a slice of colour in your day, and @[email protected] to see what my solar panels are up to.
This is so easy to use. Copy the PHP file (and a .env and .htaccess) to literally any web host running PHP 8.5 and you have a fully-fledged bot which can post to Mastodon.
Grab the code and start today!
Features
Over the years I've added a few more features to it, so I thought I'd run through what they are. Note, this is all hand-written. No sycophantic plagiarism machines were involved in this code or blog post. I just really like emoji, OK⁉️
🔍 Be discovered on the Fediverse
This is the big one, you can find @[email protected] on your favourite Fediverse client. This is thanks to its WebFinger support.
👉 Be followed by other accounts
No point being discovered if you can't be followed. This accepts follow requests and sends back a signed accept.
🚫 Be unfollowed by accounts
Sometimes people want to unfollow. Too bad, so sad. Again, this will accept the undo request and delete the unfollowing user's information.
📩 Send messages to the Fediverse
If a bot can be followed, but never posts, does it make a sound? This sends a post to all of your followers' (shared) inboxes. Includes some HTML formatting.
💌 Send direct messages to users
Not every message is for the wider public. If you want a bot which sends you a private message, this'll set the visibility correctly.
📷 Attach images & alt text to a message 🆕🆕
A picture is worth a thousand words. But those pictures are meaningless without alt text. Attach as many images as you like. Note, most Mastodon services only accept a maximum of four.
🍿 Video Upload 🆕🆕
No transcoding or anything fancy. Upload a video and it'll be sent to your followers.
🔊 Audio Upload 🆕🆕
Same as video. Raw audio posted to your followers' feeds.
🕸️ Autolink URls, hashtags, and @ mentions
Including URls, tags, and mentions are mostly autolinked correctly. There's a lot of fuzziness in how it works.
🧵 Threads
You can reply to specific messages in order to create a thread.
👈 Follow, Unfollow, Block, and Unblock other accounts
It might be useful for you to remove followers or follow specific accounts.
🗑️ Delete posted messages and their attachments 🆕🆕
We all make mistakes. This will delete your post along with any attachments and send that delete message to everyone. Note, because of the federated nature of the Fediverse, you cannot guarantee that a remote server will delete anything.
✏️ Edit Posts 🆕🆕
If you don't want to delete and re-post, you can edit your existing posts.
🦋 Bridge to BlueSky with your domain name via Bridgy Fed
Not everyone is on the Fediverse. If you want to bridge to BlueSky, you can use the Bridgy Fed service.
🚚 Move followers from an old account and to a new account 🆕🆕
Perhaps you started as @[email protected] but now you want to become @[email protected] - no worries! You can tell followers you've moved and what your new name is.
Similarly, if ActivityBot is no longer right for you, it's simple to tell your existing follower to move to your new account.
🗨️ Allow quote posts 🆕🆕
Rather than just reposting your message, this sets the quote policy to allow people to share your message and attach some commentary of your own.
👀 Show followers
Your follower count isn't just a number, it is a living list of who chooses to follow you.
⚠️ Content Warnings 🆕🆕
Perhaps you want to hide a bit of what you're saying. Add a content warning to hide part of your message.
🔏 Verify cryptographic signatures
HTTP Message Signatures is hard. I think I've mostly got it sorted.
🪵 Log sent messages and errors
This is primarily a learning aide, so have a rummage through the logs and see what's going on.
🚮 Clear logs when there are too many
ActivityPub is a chatty protocol. Your server can easily fill up with hundreds of thousands of messages from others. This regularly prunes down to something more manageable.
#️⃣ Hashed passwords for posting 🆕🆕
Bit of a guilty moment here. I was originally storing the password in plaintext. Naughty! Passwords are now salted and hashed.
💻 Basic website for showing posts
A nice-enough looking front end if people want to view the posts directly on your domain.
Some Deficiencies
Not every piece of software is perfect. ActivityBot is less perfect than most things. Here are some of the things it can't do and, perhaps, will never do. If you'd like to help tackle any of these, fork the code from my git repo!
⏳ Retry Failed Messages
A proper Mastodon server will keep trying to send messages to unresponsive hosts. ActivityBot is one-and-done. If a remote server didn't respond in time, or was offline, or something else went wrong - it may not get the message.
🔄 Reposts / Announce / Quote
You cannot boost other posts, or even your own. Nor can you send quote posts.
🤖 Act On Instructions
This is a basic bot. It contains no logic. If you send it a message asking it to take action, it will not. You will need to build something else to make it truly interactive.
📥 Receive Messages
In fact, other than the follow / unfollow stuff, the bot can't receive any messages from the Fediverse. It doesn't know when a post has been replied to, liked, or reposted.
😎 Set Post Visibility
Your posts are either public or a DM. There's no support for things like quiet followers.
📊 Create Polls
Everyone loves to vote on meaningless polls - but this is quite a hard problem for ActivityBot. It would need to keep track of votes, prevent double voting, and probably some other difficult stuff.
🗨️ Change Quote Post Visibility
As quote posts are still quite new to Mastodon, I'm not sure how best to implement this.
🔗 Proper HTML / Markdown Support
Autolinking names, hashtags, and links just about works - but not very reliably. In theory the bot could parse Markdown and create richly formatted HTML from it. But that may require an external library which would bloat the size. Perhaps posting raw HTML could work?
🖼️ Focus Points for Images
Perhaps of less use now, but still of interest to people?
❓ Other Stuff
I don't know what I don't know. Maybe some stuff is total broken? Maybe it is wildly out of spec? If you spot something dodgy, please let me know or raise a Pull Request.
#ActivityBot #ActivityPub #mastodon #phpCollaborative #interactionfiction editing test take 2. If you're interested in the idea of collaborative editing of #ink scripts or you have 30 seconds to spare, could you try following the link below, editing the file there and then reply here to say you have done so? Thank you!
(The file will be valid for a few hours, I'll edit this post when it goes offline)
Edit: the link has expired now.
@[email protected] @[email protected] You are not alone in that frustration, believe me. And thank you for the actual conversation!
Edit: Thank you, experiment over and link removed for now. I'll be doing this again soon.
Random request moment! For a limited amount of time, it would do me a huge favour if you could follow this link, make some changes in the text editor you see, and then reply here to let me know you've done so.
I'll edit and update this post when the link becomes inactive, everything you type will be temporary but will also be visible to anybody else who follows the link.
Thank you! (link now removed)
Me, months ago: I will improve the performance of this piece of code by thunking an expensive operation!
Me, this morning: That's weird; how is thunking working when I've declared the private holding property as a const?
Reader, the thunking was not working. It never assigned to the internal private property, and in fact could not do so because it was a const.
judging online information quality based on site where it appeared: a comprehensive guide
- "How To (...)" in the title, cookie banners, lots of side-information written in a way that wastes your time: SEO slop, don't bother. You might as well make a wild guess, same likelyhood it'll be correct
- official docs for $x, autogenerated by a rube-goldberg machine and automagically pushed into whatever-pages by a fully-skidoodled, post-quantum CI pipeline: describes everything, except the exact fact you're looking for.
- no HTTPS, tilde in the name, DNS with 4+ dots, likely hosted on some dusty uni server, white background with absolutely no CSS: one of the best resources on the subject. you question how it's even still online
- site titled "Garry's blog", default wordpress favicon, last update either previous month or 12 years ago: golden. crystal-clear exposition, good examples and screenshots framed so well you don't even need arrows pointing places. likely used as a cheat-sheet daily by everyone in the community
judging online information quality based on site where it appeared: a comprehensive guide
- "How To (...)" in the title, cookie banners, lots of side-information written in a way that wastes your time: SEO slop, don't bother. You might as well make a wild guess, same likelyhood it'll be correct
- official docs for $x, autogenerated by a rube-goldberg machine and automagically pushed into whatever-pages by a fully-skidoodled, post-quantum CI pipeline: describes everything, except the exact fact you're looking for.
- no HTTPS, tilde in the name, DNS with 4+ dots, likely hosted on some dusty uni server, white background with absolutely no CSS: one of the best resources on the subject. you question how it's even still online
- site titled "Garry's blog", default wordpress favicon, last update either previous month or 12 years ago: golden. crystal-clear exposition, good examples and screenshots framed so well you don't even need arrows pointing places. likely used as a cheat-sheet daily by everyone in the community
@[email protected] @[email protected] A couple of weeks ago, somebody mentioned they were using a blog post of mine from 2013 to guide them in their current project. It is, in fact, on a blog titled Mavnn's Blog