WeDistribute wrote an article that dives into those features, so jump over there if you want a closer look.
My goal is to learn a bit more about how Bonfire works: the deployment process, the maintenance required, how plugins are managed, and the backend administration of the platform.
Additionally, I thought it would also be good exercise to document my installation process and share for others to reivew. That’s where we are today.
Do not expect a fully usable, production ready instance at the end of this process. Installing this software should be considered experimental in nature. If you do decide to install it, be sure to provide feedback to the contributors.
There’s a growing repository of docs for the install process. One thing to be aware of if you search “bonfire documentation” is that there are two distinct domains with the same documentation. I’ve verified in the official Matrix support channel that either version is fine, they are deployed from the same source.
I prefer the latter because it has search.
Here’s the GitHub Repo - I looked at the Issues list to see if something I was running up against was already reported.
Bonfire runs a support channel on Matrix. I found it helpful and friendly. As always, remember that this is an open source project and treat it as such. This isn’t paid support, so be kind, patient, and considerate when requesting assistance
If you’re interested enough in a project to attempt an install and end up needing some additional support through the chat rooms, consider contributing to the cause.
Let’s get started!
We all want to jump in, get it installed and GO! But as is the case with most platform installs, there are decisions best to make up front. I find it interesting as I try out different types of fediverse platforms, that many of these decisions are the same:
Bonfire’s preferred method for installation is using CoOp Cloud, which I think is similar to using something like YunoHost. Here are the instructions for getting started as an “Operator” with the CoOp Cloud. After install of their server client, you can then install various recipes (including Bonfire) with a single click. I wasn’t familiar with this configuration, so I went with the Docker B1 easy install path.
Bonfire comes in various flavors (classic is available right now, more to come) For this install, I chose “classic” which is your normal social media feed.
Classic is also the recommended flavor by the Bonfire team at this stage of development.
Fediverse domains are extremely important. Once set, consider it committed for the long-term to your installation. Fediverse traffic will be delivered to it for ages to come. If you had a popular instance, then sell your domain, I feel sorry for the poor soul wondering what all these /inbox requests are coming at their server.
Switching to a different platform on the same domain, or even to a fresh install of the same platform can cause havoc as you’ll continue to receive requests related to the previous instance.
Note if you install through the CoOp Cloud, you will have two sites, one for the app you’re installing (bonfire) and one for the installer itself. The installer site doesn’t necessarily need a sub-domain, you can just use the IP address.
I’m going to try and attend a live stream of co-op being installed and used to setup several sites, so I’ll provide a bit more info here, and may even do another tutorial just for that process.
If you are going bare metal or docker, you can just use a sub-domain.
I chose this sub-domain.
An SSL Certificate for root and wildcard, pointing to your server (or proxy…hopefully) So this is what I did.
Just to ensure we don’t have any conflicts later, I like to set this new ProxMox VM ip address as static in the LAN.
I’m using PiHole for DHCP , so I jumped over there to make this change. This is setup in PiHole > Settings > DHCP
My homelab sends all traffic through an NGINX Proxy Manager, then on to local IPs. Bonfire by default includes a Caddy Proxy.
However, it’s simple to exclude. When you run Bonfire, you set it to only run the db and not spin up caddy.
just rel-run db
or just rel-run-bg db
to run in the background once you get the basics configured.
I setup my proxy to pass requests to bonfire.box464.social over to the IP and port 4343.
I decided to use SendGrid for email as I am familiar with the prodcut. Setup steps are below. Just making a note of it here.
You can just store media on the local device, and if you’re just testing this, I might recommend that instead of setting up another complication here.
I have wanted to try out Cloudflare R2 as a storage backend, so going with that.
I have a nice ProxMox system in my homelab. It’s plenty powerful and I can run lots of experimental things on here without issue.
I’m only using this for a single or low usage instance (5 users at most) for testing and exploration.
The configuration I ran with is a little beefy for a 1 user instance. Why not.
TIP: After the initial Ubuntu VM creation, create a snapshot so you can start from HERE instead of going through the entire install process again if you screw up!
During install these choices were made:
This doesn’t happen by default, but is a recommended step when setting up a new VM on ProxMox.
What does this get you? Cleaner snapshots when you backup your system, among others. Always a good thing.
Also, in the ProxMox UI, under the VM’s Options tab, you will now see the VM’s IP address, which had alluded me previously.
Fairly simple to do on my Ubuntu system:
1
2
3
sudo apt-get install qemu-guest-agent
sudo systemctl start qemu-guest-agent
sudo systemctl enable qemu-guest-agent
If you run all three commands, a reboot isn’t necessary to get the agent up and running.
I recommend installing the agent, but if you don’t want to, there are a few other ways to find the IP:
hostname -I
to get the IP addressA big thanks to Івась Тарасик for pointing me to the right direction here with the missing qemu agent install.
Since I set the terminal to only allow connections wtih SSH keys, I setup my terminal with that information and login (I use Termius and it makes it pretty easy!)
Now it’s time to install dependencies.
just is a way to organize scripts for project specific commands and make shortcuts, basically.
1
sudo snap install --edge --classic just
I had originally added docker as a snap but that was a mistake, I think. I reinstalled, then I had to add myself to the docker group so I don’t have to sudo everything.
Following the post install steps, at least add your user to the docker group.
If you’re running on a ProxMox VM, this is a great time to take a snapshot and even setup a full backup in case the install goes south!
I did both.
1
git clone --depth 1 https://github.com/bonfire-networks/bonfire-app.git bonfire && cd bonfire
You should be in the bonfire directory. Run this.
1
export MIX_ENV=prod FLAVOUR=classic
1
vim ~/.bashrc
Add the following lines at the bottom:
1
2
# Bonfire Flavor Config
export MIX_ENV=prod FLAVOUR=classic
There are several parts to configuration. The first is to just get a baseline environment config setup. Be sure you’ve setup the appropriate flavor and environment (prod or dev) from the steps above before you continue.
This creates some default configuration files. It uses the FLAVOUR
and MIX_ENV
configurations we set above to produce the files.
1
just config
After running this, I see a suggestion in the console (not the docs) to run the following command.
Now make sure to finish the flavour setup with
just setup
. You can also edit your config for flavour ‘classic’ in /.env and ./config/ more generally.
When I asked in Matrix, it was determined I should skip over this as the command is only for local builds, not using docker.
We’re setting up the /configuration/prod/.env file that is also linked from ./.env, so from the base Bonfire project directory, open this file.
1
vim ./.env
These setting are throughout the ./.env file, so just find them and update them. Remember, I’m using my own Proxy Manager (NPM) so traffic will be forwarded to 4000. Public port will be 443.
IMPORTANT: You need to include the “APP_DOCKER_IMAGE” variable with the latest image flag here. This does not exist in the .env file by default. Setup will not work without this addition!
1
2
3
4
5
6
7
# custom docker image
APP_DOCKER_IMAGE=bonfirenetworks/bonfire:latest-classic-amd64
FLAVOUR=classic
HOSTNAME=bonfire.box464.social
SERVER_PORT=4000
PUBLIC_PORT=443
MAIL_BACKEND=sendgrid
In the env file there’s some secrets that need to be generated. There’s a handy tool you can use to generate a few. Make sure to store these securely somewhere outside of the env file as well!
1
just secrets
I stored the actual secrets in my password manager.
1
2
3
4
5
SECRET_KEY_BASE=<your-secret-01>
SIGNING_SALT=<your-secret-02>
ENCRYPTION_SALT=<your-secret-03>
POSTGRES_PASSWORD=<your-secret-04>
MEILI_MASTER_KEY=<your-secret-05>
The default mail vendor is Mailgun. Going against the grain here and using SendGrid, because I’m more familiar with it. With a bit of digging, it worked fine.
Bonfire uses an extension called bonfire_mailer that is a shell for running bamboo
Bamboo has quite a few setups for various providers, it’s likely you will find your own. Initially I had setup to use SMTP with SendGrid but I switched to using the API since it’s simpler to configure.
Note that you also need to find MAIL_BACKEND
, which is near the top of the config file, and update it to “sendgrid”
1
2
3
4
# email delivery if you use mailgun.com, edit with your domain and API key
MAIL_KEY=<your-api-key>
MAIL_DOMAIN=<your-root-domain>
MAIL_FROM=noreply@<your-root-domain>
I tested the API config in Postman successfully.
Be sure to store your SendGrid API Key somewhere safe.
I’ll say it again, if you’re just kicking the tires, you might just want to skip this and just store images locally. It’s not a long term soultion, tho, as the fediverse tends to fill up storage buckets quickly with media.
It looks like there is some extra setup necessary for this because I’m not using their default bucket provider, Scaleway
Cloudflare R2 storage is S3 compatible and should work fine.
The region is: us-east-1
always, which is just made up for S3 API compatibility.
The necessary environment variables weren’t in the .env file by default, and I wasn’t sure where to look.
I reached out to Bonfire devs for pointers to the exact parameters I need to set and got the following response.
The upload settings are defined in https://github.com/bonfire-networks/bonfire_files/blob/main/lib%2Fruntime_config.ex#L26
This is a compiled file, so you’re not going to find it on the server directly. You’re just looking at that file and pulling out the environment variables needed:
1
2
3
4
5
6
7
UPLOADS_S3_BUCKET=<bucket_name>
UPLOADS_S3_ACCESS_KEY_ID=<access_key_id>
UPLOADS_S3_SECRET_ACCESS_KEY=<secret_access_key>
UPLOADS_S3_REGION=us-east-1
UPLOADS_S3_HOST=<cf-account-id>.r2.cloudflarestorage.com
UPLOADS_S3_SCHEME=https://
UPLOADS_S3_PORT=443
One this missing as a variable is an UPLOADS_S3_HOST_ALIAS
which is useful with Cloudflare in particular as it serves cached and proxied files only if you use an alias. This option exists in other configurations like Mastodon, so I hope to see it make it into Bonfire as well.
[!WARNING] While Cloudflare R2 worked, and I am able to upload images and have them stored in the bucket, some other platforms are having some difficulty with it - Pixelfed and Friendica and Catodon.
I’m beginning to think this is a ME problem (my Cloudflare R2 setup) and not Bonfire….I bet it has something to do with requiring signed URLs maybe?
At this point we’re almost ready to spin up the docker images. One last verification is to check the 3 items you’ll need installed for this process.
1
2
3
docker version
docker compose version
just --version
If any of those don’t return a response or error out, you’ve missed something. Re-install / fix docker permissions for your user.
At this point, all the config values are set! It’s time to take a snapshot again before I run the next steps and mux something up.
You stuck through it and made it here! Let’s do this.
Following the documentation, after triple checking my work, I ran the following. Remember! I have my own NGINX Proxy Manager, so by adding the “db” parameter, I am EXCLUDING the packaged caddy spinup.
If you don’t have a proxy and want to use caddy, just exclude the “db” parameter.
1
just rel-run db
With that, you should see a streaming list whizz by of all the activities going on as your instance spins up!
Finally, you need to run the migration plan for the database. This streaming console of activity means you’re already in Elixir, and that’s where you need to run this command. Just start typing, and a prompt will appear at the bottom of your terminal while the stream continues. Hit enter, and ensure it runs successfully.
1
Bonfire.Common.Repo.migrate
If you visit your domain now, you should see Bonfire up and running!
At this point, you’re streaming the activity log in your terminal, so you probably want to run it in the background now that’s it’s all setup.
I stopped the system and then asked it to run in the background with this command:
1
just rel-run-bg db
I took another snapshot and then setup daily, weekly and monthly backups - locally for now.
The first account you create is going to be the admin account, although it isn’t clear that’s what is happening when you sign up. I would recommend creating an admin@yourdomain.com account, then you can create a normal user account for yourself.
I looked around at preferences and noticed that it was defaulted to open sign up. I immediately changed that to invite only after logging in.
Federation if turned off by default. You can turn it on, but be warned you will need to deal with some bugs.
A few things to be aware of in this build:
An external user noted that when I replied in a conversation thread, my reply-tos were not included in my message body and they thought it a bit confusing not to see. I’ve seen similar confusion when hashtags are not included in the body on another platform (postmarks) but we fixed that.
I think this is a ME problem, but I’m seeing this:
Outgoing posts with images display for a bit on other instances, but a day or two later aren’t accessible. This may be an issue with Cloudflare R2 and signed URLs.
There are more things I want to experiment with before I close down this experimental instance!
I noticed that you can RSVP through webmentions, so I thought, why not give it a shot?!
My site is already configured to work with Bridgy, so that work is completed. All I need to do is add some HTML to my page to submit it. Let’s do this!
There’s an event in late March that looks fun! Build anything you want, from scratch, in an hour. Share with the group at the end. A challenge and some fun!
So here’s my RSVP for the event:
📆 Jeff Sikes RSVPs yes to
The code to send the RSVP looks like this:
1
2
3
4
5
6
7
8
9
10
11
12
<div class="h-entry">
<p class="p-summary">
📆 <a href="https://box464.com" class="p-author h-card">Jeff Sikes</a> RSVPs
<span class="p-rsvp" style="color:green;font-weight:bold;">yes</span> to
<a
href="https://events.indieweb.org/2024/03/build-a-website-in-an-hour-lUYv5DntQ3Sr"
class="u-in-reply-to"
rel="webmention"
>Build a Website in an Hour</a
>
</p>
</div>
When this page is picked up in Telegraph, it should find the u-in-reply-to
link and send it along.
Let’s see if it works! If it does, my RSVP should appear at the bottom of the event page listed above.
Let’s get this out of the way early. I’m all in with the fediverse. Both feet, stomping the grapes. Being stubborn, refusing to even look at alternatives, is not productive. What can we learn from the AT protocol? Let’s find out.
Portable Data Servers (PDS) provide individuals and groups the freedom to own their data and their identity. @box464.com can move their data (in theory) to another PDS and still be @box464.com - along with all their posts, followers, and media. We’re not there yet in the fediverse. It’s exciting! It’s simple to setup, too!
But also boring as all get out.
Because that’s where it stops. There is no room for creativity other than a unique avatar and banner once you sign in. No spicy platform flavors, which the fediverse has in spades. Mastodon, Akkoma, Friendica, Sharkey, GoToSocial…the list goes on, take your pick! No custom css for your instance. No local timeline to peruse with a safe, known community that shares a common bond or interest. At least, not yet.
In fact - here. This is what you get by default after a succesful install. 🥱
Then, your posts get gobbled up into the relays and spit out into a few common apps, following a common look and feel right now, all with the same featuresets. No cat ears. No emoji reactions. No custom skins.
I’m happy where I am, but hope the fediverse takes what it can from PDS (hello ActivityPods) and makes it better.
Still with me? Alight, let’s dive into it.
This week, I saw this headline in my Mastodon feed: “Bluesky now officially supports federated instances.” But for those of us knee deep in all things fediverse, that doesn’t quite mean what you think it means. I want to know more.
When someone in the fediverse says “I’m going to start my own server!”, it entails many tasks:
The list goes on…
Basically setting up a fediverse platform handles EVERYTHING related to your social media experience, and forces you to become expert in all the things. You can get pretty cheap hosting for fediverse platforms, but in the end, you’re still responsible for the health of your instance and everyone that relies on it.
Setting up a PDS is pretty simplistic in comparison. It’s just going to host posts in a database. There’s no flashy timeline, no custom css or other pieces of flair to show off. It’s just a place to store data and be freed from a large corporation controlling that content.
Although…as soon as you write something, up it goes into a large corporation’s inbox right now.
Being able to control your own content, move it from one PDS to another, and still retain your core identity may be boring but it’s the missing piece in the fediverse right now. Sure, you can move your followers. But not your posts nor your identity (your username changes every time you switch instances). And your posts are important. I want to get a better understanding of how that works.
The major difference noted in the article is that by default, Bluesky provides access to the entire stream of posts globally. In this world, there’s really no reason for a like minded community to build their own instances - you can have your own PDS account and connect it up to whatever relays you want to find your clique. Just because you’re besties, you all might want the same PDS domain, like besties.lol. But that’s just fun, it’s not necessary.
In the fediverse, your instance and your conversations are hand picked. You choose your instance, you choose who you follow. It’s up to you to do the work to find cool people and a comfy, safe place to call home. You may not see every single post, or even every single reply to a conversation. Once you find that magic space, it’s no wonder people fight to keep them safe and secure.
I find it funny this is represented as a fault of the fediverse, because it’s exactly why I enjoy it. I don’t need to be everywhere all at once - I’m fine having conversations with the people I like and the servers I choose to interact with. My only complaint is when you dive deep into a conversation thread, we do really need a way to pull all messages from that conversation in. There’s already work being done on this, so there’s hope!
Anyway, back to the PDS install. Here are the docs.
Bluesky is taking a more modular approach to setting up access to the blueyverse.
A Personal Data Server is just a small part of a bigger environment. It’s a way to own your data, kept separate from a large organization’s control. This is really the main reason I wanted to experiment with this configuration, as this is one area I’ve been disappointed with in the fediverse. It’s getting better, slowly, with unofficial post migration processes already in Sharkey and Misskey for instance.
A PDS only hosts the posts you create (and those of the accounts you are hosting, if any). It doesn’t pull down posts from other instances and store them locally, along with all the media, like most AP servers do.
One thing I’m not clear about is if the PDS stores any interactions with your posts (likes, comments, etc.). I assume since that’s not content you OWN, that is not the case.
There are some pretty major limitations to PDS configurations right now as they see how this is going to work.
If you’re expecting to see a fancy timeline full of interactions and content when you visit my PDS, you’re going to be disappointed. There’s currently nothing shown except a sad little text message:
This is an AT Protocol Personal Data Server (PDS): https://github.com/bluesky-social/atproto
Most API routes are under /xrpc/
There’s not even a way for people to request an account - those have to be generated on the backend right now via a command line interface.
In these early days, Bluesky has set these limits to have better control over the infrastructure:
The process of installing a PDS was straight forward if you do it via a cloud hosting service like Hetzner and follow directions as outlined in their repository - and I mean SIMPLE. Compared to even the smallest fediverse install, it just took less than 45 minutes total, and that included setting up a new domain and creating a new account on Hetzner to try this out.
That’s it.
I’m..not going to run through the steps to install. I was going to, but…I mean…they have it laid out very well in the documentation, and it’s basically two commands after you get the server up:
1
2
wget https://raw.githubusercontent.com/bluesky-social/pds/main/installer.sh
sudo bash installer.sh
Everything else is configuration prompts and configuration files…really.
However, I spent probably 2-3 hours trying to get this to work on my home lab, which has the following basic configuration:
Internet > Firewall > Router > NGINX Proxy Manager > Portainer / ProxMox
That NGINX Proxy Manager piece threw the official Bluesky PDS installer for a loop because it installs docker and a caddy server inside the container. The caddy server and NGINX Proxy Manager weren’t playing nice. I’m sure if I played around with it for a bit longer I could figure something out. But to be honest, I’m not really invested in Bluesky and don’t want to waste my time when I just want to poke on it for a few weeks.
For later: I found some references to a Portainer / NPM config in the official Discord channel. And I really hate having a Discord chat channel as official support. Sounds like I fiddle with the compose.yaml file after install.
Once I gave up on my hopes and dreams of using my new ProxMox VM and moved it to a Hetzner VM, it really took no time at all and I was up and running. The total monthly cost is estimated at less than $7 and that includes daily backups.
I honestly gave up too quickly on running it locally, and I now see people have figured out how to disable the proxy.
I can’t leave good enough alone, of course.
One thing to note, out of the box, this base configuration does NOT include sending out invitations and new account information through email. You run a command line wizard and it spits out a password. You’d have to provide that directly to someone - and then - they would not be able to reset it because you don’t have email configured.
More than likely, Bluesky was just wanting to keep this as simple as possible, because setting up email is a whole other hurdle. It was probably expected that hobbyists would be loading this up for personal fiddling for now, and only sharing with a few good friends at most.
Someone in the PDS discord channel mentioned the two environment variables that allow you to add an SMTP server (in this case SendGrid, which I am very familiar with already)
Since this was easy for me, I went ahead and did it.
On your server with the PDS running, open the file /pds/pds.env
and add these lines with your specific setup. The SMTP url is something specific to SendGrid using SMTP with a Token. username is normally the term apikey
and the password is the generated token.
If you do go the SendGrid route, I recommend restricting access for mail delivery to your home and server IPs for access.
1
2
PDS_EMAIL_FROM_ADDRESS="noreply@mailing.example.com"
PDS_EMAIL_SMTP_URL="smtp://username:password@smtp.sendgrid.net:587"
And we’re up and running.
Wheee!
Not even a Bluesky logo? An animated butterfly floating around? Boring.
It still works. Very well. No downtime, running like a dream. Still boring.
]]>The code is now public and has a “CRAPL” licensce, which makes me chuckle.
This server is a single PHP file, along with an avatar photo and an .htaccess file for routing.
I’m calling it “ActivityPub Edent Server”, or “A.P.E.S.” for short.
Taking directly from Terence’s own words, this code is complete crap and shouldn’t be run in production. It’s just a lab to demonstrate how ActivityPub works.
Here’s the end result! You can follow me at @box464@ape.box464.social and see my posts just like a grown up ActivityPub server.
The site is up for now but this is just for fun and most likely I will kill it at some point.
I used a prepackaged docker container with an Apache/PHP image including mod_rewrite.
I couldn’t help it and created my own avatar just to be a bit different, but I veered away from touching any of the code for now (adding a banner image, some styling, etc.)
My homelab on a BeeLink MiniPC in Portainer
It’s running behind Nginx Proxy Manager
Cloudflare is my DNS, but I’m not using the proxy. I might turn it on later.
Most of the configuration wasn’t that bad. As with all AP implementations, you need to give your domain a good thought before using it. Whatever you choose, even long after you’re tired of fiddling with it for fun, will continue to receive requests to it’s inbox (if it’s there or not). Be aware, if you ever lose control of your domain, the next person that owns it will have access to those incoming messages as well.
I always use a sub-domain, and in this instance chose ape.box464.social. Hopefully, this means that only ape.box464.social will be affected, and I can create a mastodon.box464.social and a friendica.box464.social and a bonfire.box464.social without them being hurt.
This is what would probably scare off the most people. It’s not bad, really. Use the tool Edent linked to in the code to create your Public and Private keys - and then store them in your password vault so you don’t lose them. Use the 2048 key length option, as it’s currently the most common.
After that, you’ve got to do some trickyness by removing the actual line returns (\n) with the text “\n” instead so it’s just one long string.
I found BBEdit the easiest way to do this on my Mac, and that was with these Search and Replace settings.
You can achieve this using the Find and Replace functionality with regular expressions. Here’s a step-by-step guide:
\n
(which represents the end of a line).\\n
(double backslash followed by ‘n’, which will be replaced by the literal string “\n”).Copy the public and private strings into their appropriate locations in the file.
All tests worked as expected.
During my build, I ran into two issues:
Used PHP 7.4 and /write endpoint failed
1
Fatal error: Uncaught Error: Cannot unpack array with string keys in /var/www/html/index.php:411 Stack trace: #0 /var/www/html/index.php(91): send() #1 {main} thrown in /var/www/html/index.php on line 411
Used PHP 8.3 and now I receive a warning on Line 74, but everything works. I set my container to run in production mode so the error doesn’t appear right now.
1
Warning: Undefined array key "path" in /var/www/html/index.php on line 74
After a day or so connected to a single follower on mastodon.social, I can see a lot of DELETE requests coming in. This is something I’ve noticed with my Postmarks and GtS instances as well, tons of DELETE requests along the way for people and objects that have never reached my instance. I guess in the fediverse, this is a necessity because you never know how a post would end up on a specific server, so you have to blast it out to everyone you’re aware of.
Logs are a bit cumbersome to review and there isn’t a way to remove older logs yet. Fun little weekend project and you can say “I’m on the fediverse!”.
I’d like to see some simple sprucification of the home page and posting pages. With the followers available as a JSON it wouldn’t be hard to bring that on the page either.
Homepage could at least include the About Me and Profile Image, maybe the followers list.
To iterate through posts, you’d have to do so via PHP and then parse each JSON file.
I submitted a merge request, and now we have a little home page displaying basic info as expected. 😀
Also added one for converting line breaks to <br/>
tags in posts prior to hitting the outboxes. Fingers crossed it will be accepted!
This was fun. It’s easy to read the code, it’s simple, and breaking it has no major effect on anyone else. Go have fun, hit it with hammers, destroy it, recreate it. Don’t be scared to play and learn.
]]>Here’s a list of some of my current favorites, in no particular order. I’m linking to websites here so you can find them on your favorite platform. Some have video versions as well. All have RSS feeds of course!
I’m sure I’m missing some, so I’ll update this list as I remember them. Would love to hear about your favorites as well!
https://dot-social.simplecast.com/
From the creators of Flipboard, this podcast is a great way to keep up with what’s happening in the fediverse. Just a few episodes in, but I’m really enjoying it so far.
https://wedistribute.org/series/decentered/
It’s just so great to hear the people from the fediverse, talking about the fediverse. There’s only been a couple of episodes so far, but I really enjoyed listening to the Sora developer discuss his app - such excitement and joy for their creation!
A great podcast about the indie developer scene, with a focus on Apple platforms. It’s not new, but I found it recently after joining the Micro.blog bandwagon.
https://bookmarks.box464.com/tagged/Podcast/Fediverse
My own hodgepodge collection of fediverse specific episodes I’m found. If you only check out one series, I’d recommend this three part series from Libre Lounge that goes into more detail about the specifics of the ActivityPub protocol.
I’ve found a few. Would like to find more. For me, there’s a fine line - I want to hear interesting stories about interesting people. Sometimes these types of podcasts can get too caught up in the technical details, and I lose interest. But these are good.
https://geeking-out.simplecast.com/
This one is kind of serious, about software delivery and DevOps, but when I have focus, I always learn something with this one.
https://www.waitingforreview.com/
Learn about some great indie apps. I pretend to be an indie developer and nod along in understanding. I’m not, but I can dream. One day I’ll have an app in the App Store. One day.
The Fresh Air of nerdery. Scott Hanselman is a great interviewer, and I’ve learned a lot from his guests. Plenty of episodes to browse and find something interesting.
Not EVERYTHING has to be about tech and the fediverse. Right? Right? Here’s some stuff I’ve enjoyed listening along as I drive or do chores around the house and want a chuckle or a good story.
https://www.pendantaudio.com/shows/tillystranstuesdays
Starting out with this one and enjoying the discourse. I’m listened to the first two episodes, and it’s interesting to hear her story. You’ll laugh, get mad at the world, then laugh again.
https://thismightgetweird.libsyn.com/website
This has absoulutely nothing to do with the fediverse or nerdery, but I love listening to these two. They’re hilarious, and I love their friendship. I’ve been a fan of Mamrie Hart for a long time, and I’m glad they’ve found ways to stay together and continue to make me laugh.
https://pods.boostie.social/@chaos/episodes
Just dropped! A solid first episode of a grab bag of topics. I love it when friends just get together and use a podcast as an excuse to chat. Definite This Might Get Weird vibes here.
https://www.npr.org/programs/fresh-air/archive
I mean, could it BE a podcast list without Fresh Air? I’ve been listening to Terry Gross for years, and I love her interviews. I don’t listen to every episode, but I’ll browse the archives and find something interesting to listen to. Whenever I hear Fresh Air start up, and it turns out NOT to be Terry doing the interview, I’m always a little disappointed.
What am I missing? What are you listening to? Let me know on the fediverse! Your comments will appear here as well.
]]>One of those extras is Pages, which is really your own playground for creating just about any type of content, long or short form. I’ve seen pages used to go into a deeper introduction, as blogs, FAQs, all kinds of things.
Pages can be private to yourself (create a collection of MFMs or scripts you like to copy/paste into your posts) or public (share with not only your local Forkey friends, but anyone on the internet).
Catodon is calling this “Blogs” now, and for the moment, the functionality is the same. But there are plans to make changes to this in the future!
Forkey Pages are found in the More menu by default, unless you’ve rearranged them.
More > Pages
{your-instance}/pages
From here, you most likely can see three tabs:
Tab | Description |
---|---|
Popular | Pages that get a lot of views on the local instance. |
Liked Pages | Pages that you liked / favorited show up here |
My Pages | This is where your own pages SHOULD appear. |
All pages have a similar structure.
Some pages have banners, or blue colored background if none uploaded.
The title of the page will appear inside the banner area, so it’s best to choose a neutral color for the graphic that will contrast against your title nicely.
In addition, two icons appear if you aren’t the author:
The author will see the following icons as well:
Pages consist of the following:
Area | Description |
---|---|
Metadata | Title, Description, custom url, public or private page toggle, thumbnail settings |
Content | Sections of text, images, posts, etc. |
Variables | Lots of things in here, but we’re going to focus on variables and AiScript variables |
Script | A place to write AiScript that will can then provide content on your page. |
These are broken down into various tabs.
View Source allows you to view the Page configuration of any page, not just your own. A bit of an oddity here, when you’re viewing someone else’s page, it appears as a form, as if you would be able to make changes to someone else’s page! But the save button is missing, so it’s really not possible. This may or may not be fixed depending on your Forkey of choice.
Jump over to the Content tab (the second one), and here’s something I just found out recently! If you view source > content of one of your own pages OR someone elses, there is a “Duplicate” button. Click it, and the entire page configuration gets copied over to your OWN profile as a new page. For my developer friends, it’s basically forking the code. 🍴 Unfortunately, there’s no notifications built in to let you know when someone duplicates your page.
This opens up some really interesting concepts. We could create templates for others to utilize. For example, I could create some AiScript code to include in a page to make it do something cool. Someone else could just duplicate that page, not have to worry about how to setup the page or how to write the code. Lots to think about here.
If you open a page, you’ll see whatever content the user has created, and at the bottom, you’ll see several types of interactions.
Like the page Let the creator know you appreciate it the page, but also makes this page appear in your “Liked Pages” tab
Boost Icon: Share with Post I think this is supposed to open a post dialog with a link to the page, but it doesn’t seem like it’s working. You can still post, but you’ll need to manually copy the page url to share it.
Follow You can see a short author profile and related actions, and even follow the author (not the page) from here. This appears both at the top and bottom of the page.
This seems to show other pages the author recently worked on. Click through to view them.
I do not recommend using these as the future of AiScript in Forkeys is uncertain. Don’t waste your time here when it may not even work a few months down the line.
In general, you declare variables of different kinds on the variables page. I have only ever used AiScript Variable type. The name you provide for the variable is what you will use to display the results in your content text areas. But you have to provide yet another name for the same variable that will be referenced from your Script tab. Confusing!
The script tab is AiScript. This is where you can do just about whatever you want, and then display the results back to the end user. Figure out WHAT to do is the hurdle and let me tell you, debugging AiScript is a bear.
I have a love/hate relationship with AiScript. I studied it pretty extensively, and you can do some cool things with it - really fun stuff and even some useful things. I even built a catalog of plugins and a way to build your own simple snippet plugins!
But AiScript’s future in the Forkeys isn’t so bright. Sharkey has followed Misskey’s lead and removed it from Pages. It’s available in another area called Play over there in a different form. Catodon is going to remove AiScript from the platform as a whole.
Great news! It appears in the latest versions of Firefish, Sharkey and Catodon, these issues have been resolved. I’m still seeing the issue on IceShrimp, but might just be my instance.
As stated above, your experience may vary, depending on the platform you chose and the current version. There are fixes out there in the latest versions of Firefish.
I have a feeling pages are going to be changing quite a bit over the next year. There’s discussion of making them federated, similar to a Wordpress Blog. I DO think it would be a good feature to keep, out of all the other fun niche things (galleries, MFM, etc.)
I hope other Forkeys take a similar turn and focus on revamping this area. Right now, Pages are not widely used.
Love it or lose it!
]]>I may not have always appreciated it in the moment. But I’m now grateful for those lessons in kindness and duty. And a little in awe of both of them.
Recently, my mom was finally added to our local community’s hall of fame for her work with children, and recognition of the fact she was the first ever woman elected to the school board (back in 1979).
The celebration of this honor is bittersweet. When we let mom know of the honor, she was so thrilled and surprised! Then we told her again the next day and she again accepted with suprise and humility. A few days later we reminded her of her win and she was just a thrilled as the first time we told her.
That’s because my mom has been diagnosed with dimentia. But my mom is smart. Her political leaderhsip roles have made her a pro at steering conversations her way. Talking about something that happened yesterday? Switch gears and talk about a time 30 years ago that she remembers like yesterday. It’s faily easy for her to maneuver a short convesation in passing at the grocery store this way.
I’ve gone through the emotions of dealing with the situation, and continue to manage them. But we knew that giving an acceptance speech in front of 100 people wasn’t going to happen.
I decided to step in and make the speech, knowing I would be speaking to a group of peers and older adults who were my classmates and teachers growing up that I have avoided for decades.
Why? Because I was a closeted, depressed kid with loving parents and caring friends that watched them give quiet acceptance to statements that I was invalid as a person. And some of them weren’t so quiet. The last thing I wanted to do was stand up in front of them and say anything, or at least anything pleasant.
I’ve made my piece with those times. It wasn’t easy. I still believe that most all of those individuals are good people to this day. I know for a fact that many are more accepting now and probably some would have been back then if I had let them know. I certainly never spoke up and gave them the chance to prove it one way or another. It’s heart wrenching to think of the relationships I let dwindle in the ashes of fear.
But I did it. And I stayed true to mom’s firy spirit to stand up for those who need help the most - this time, herself. I was going to make sure all those people knew how amazing she is.
So the night came. The room is filled with farmers and cowboys wearing their best formal boots and hats for the evening (I’m talking the fancy stuff, seriously!). And me in my suit and tie. While I truly did grow up there from age 4 to 22, I somehow lost the southern drawl we all had along the way, too. So yet another thing that made me different. That and a husband.
As I walked to the stage, my mom was puzzled. As the speech began, she was just as surprised and teary eyed as the first time we mentioned it to her, months ago. In that moment, I was proud of her, and I hope she was proud of me. I hope a spark of that memory can stay with her. Just a feeling, or a momentary vision of the standing ovation she received and her awkward geeky son doing his best to get through the speech in one piece.
Below you can read the full speech (some things were stripped for privacy reasons). I’m happy to share my mom’s dedication and hope it can inspire others to be active in their own communities - locally or online.
Good evening. I'm honored to present this award tonight to an amazing woman, who also happens to be my mother.
Some of you in this room may know her as your fellow classmate walking the halls of Main right here at this high school.
Or you might remember her as your school PTO volunteer, in the workroom running the mimeograph machine, waving at students in the hall with stained purple fingers.
She might have taken over your class for a few minutes to give you a well deserved sanity break.
Or maybe Ms. G, your 4-H leader or bible school teacher.
Or maybe you knew her as your school board president.
Some of you in this room are even lucky enough to know her as aunt gale, mom or wife.
She wore all of these hats, many times all at once. She is dedicated to making the world brighter for children. And tonight, I'm honored to recognize that dedication and service to our local public schools.
Gale was born right next door in a small farming community. She began her educational journey in and graduated from the high school in 1964. Her father also served on this same school board while she was a student there.
She later pursued her studies in business education at a state college. She married and raised three sons, also attending school here. With my brother's daughter, we now have 4 generations of graduates.
By the late 80s, she was fully engaged in serving the students of our public schools. She served as the President of the local elementary Parent Teacher Organization and played a vital role in organizing Volunteers in Public Schools, also known as VIPS.
In 1982, she made history by becoming the first woman ever elected to this city's school board, serving as its president and being re-elected in 1987, where she continued her service until 1991.
I still remember walking through the kitchen on a school night as she literally juggled dinner in the oven, dishes in the sink, and making lists of todos on the refrigerator dry erase board.
All while having conversations with very concerned parents as she whipped a 10 foot phone cord around, sometimes accidentally clotheslining her boys as they ran recklessly through the kitchen.
Now, as you might imagine, being the first woman on the board was not without its challenges. But she faced each hurdle, and with her unique perspective as a mother and a woman, made significant contributions to the educational landscape.
Her leadership encouraged a balanced curriculum. She was dedicated to providing every employee within the school district a direct channel to express their innovative ideas and make them a reality. Considering we became and remain one of the most academically strong school systems in the state, these early efforts were not in vain.
Because of her dedication to listening to all those school workers, mom knew just about everyone. All three of her sons were quite aware that if we did anything at school, on the way to school, or after school, she would know about it before we got home that night.
But my mom's service extended far beyond the school board. She organized the local 4-H Club in 1979, leaving a lasting impact on the local community. The club was active over 3 decades. Her dedication to youth development was recognized with the 1984 State 4-H Key Leader and the State 4-H Alumni Award in 1985.
Her achievements reached beyond the local community as well, serving as an Extension Service Program Assistant for the county from 1988 to 1991 and later as a Program Associate. Both positions gave her the opportunity to promote and expand the 4-H program to the youth of our state, as well as develop new adult volunteer leadership to keep the momentum going.
Her passion for education and community improvements were further recognized by being named the City Chamber of Commerce Woman of the Year in 1988, an award category that did not exist previously.
You can imagine that juggling these responsibilities, while dealing with three mischievous boys, was difficult at best. But she handled it graciously. There were times her schedule didn't allow her to drop her youngest off with family or a babysitter before a board meeting. It never stopped her from making her voice and those she represented heard.
She would walk into those meetings with her son in hand, a collection of books, crayons and more than a few prayers that it was enough to keep him entertained. It usually was.
I also know my mother would agree on this point. She could not have done it alone. An army of parents, volunteers, friends and relatives had her back. Our thanks goes out to each and every one of them for supporting her and being part of our extended family.
After a move to to southwest part of the state, she decided to complete her own education, attending the County Community College, garnering Dean's List and President's Award commendations. I was in college at the same time, and I remember discussing her coursework and how excited she was with the topics and the camaraderie she found with her younger classmates.
I know the impact my mother had on kids in the community. I was one of them. So many opportunities were provided to youth in need through schools, 4-H and her work with programs like the Open Arms Shelter.
As the first woman elected to the school board, she led be example, providing a new path forward for generations of local women interested in serving their community through elected positions and volunteerism.
These accolades were not what made her a special person and a leader in the community. And it was never her goal to achieve these recognitions.
It was her dedication to the children and teaching staff she swore to protect that made her stand out. She wasn't just attending board meetings. She was stacking chairs after the meeting. Painting the aging community building, sweeping the floor to ensure youth had a place to meet. Selling funnel cakes to raise money. Sitting in for teachers than needed a break. Helping battered women find security and self confidence as they started anew.
Whatever it took, she was there in the midst of it. Leading by example.
Thank you for being an incredible mom and a remarkable contributor to the success and protection of this city's youth. We love you, and are so proud of you today and always!
These are my cleaned up notes from setting up Grafana and Prometheus. I’m very new at all this, and thought this might be useful to others in the same boat. It’s not a walk through, it’s just all the materials I’ve gathered and troubles I ran into along the way.
Decided to do this on my “routing” server, Polgara, because it is separate from my work horse server Durnik and is only running one other item (an important one, but only the proxy manager)
This may have been a mistake, as I kept running into issues with stopping/starting the stack, and Polgara is running the NGINX Proxy Server…it went down multiple times because of issues with the deployments.
Changes to the stack seem to take a long time or fail completely. Maybe portainer stacks are just like that? Or something is wrong with how I’m setting it up.
The stack includes the following:
Note: cAdvisor has it’s own Web UI. But it also has a scraper /metrics endpoint for Prometheus.
This was my first attempt at creating a docker stack, prior to this I would just run one container per app.
The first thing you need to do is create a configuration YAML for Prometheus to pick up and use (scrapers).
These are all the places Prometheus should use to consume metrics and data - each has to be setup appropriately, of course. Kind of a chicken v egg thing here.
I put this at /docker-volumes/prometheus/config
and ensured that folder and all sub-folders were owned by box464 (user 1000) but I don’t know if that’s correct or not.
I can see these job_names
needing to be more descriptive as I add scrapers from other servers. Like, job_name: 'durnik-prometheus', etc
/docker-volumes/prometheus/config/prometheus.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
global:
scrape_interval: 1m
external_labels:
monitor: "node"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["192.168.1.57:9091"]
- job_name: "node-exporter"
static_configs:
- targets: ["192.168.1.57:9100"]
- job_name: "cadvisor"
static_configs:
- targets: ["192.168.1.57:8085"]
Next up, the Stack build for Docker. This took a lot of work to get just right. Note all the volume entries with :ro
at the end of the volume. This means they are being accessed as read-only, especially important as it’s giving access to very privileged areas of the system.
I think the way I have Prometheus setup below, every time the container restarts, I lose all the data it has collected.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
version: "3.8"
services:
node-exporter:
image: "quay.io/prometheus/node-exporter:latest"
network_mode: host
pid: host
volumes:
- "/:/host:ro,rslave"
prometheus:
container_name: prometheus
ports:
- "9091:9090" #modify 9091 to your setup needs
volumes:
- "/docker-volumes/prometheus:/etc/prometheus" #modify the path for your install location
image: prom/prometheus
restart: unless-stopped
command:
- "--config.file=/etc/prometheus/config/prometheus.yml"
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
user: "0"
ports:
- "3457:3000" #modify 3457 to your setup needs
volumes:
- "/docker-volumes/grafana:/var/lib/grafana"
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
container_name: cadvisor
ports:
- 8085:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
devices:
- /dev/kmsg
privileged: true
restart: unless-stopped
Following the YouTube guide, I installed these dashboards, which do seem relevant. You have to pick the appropriate data source for each during setup. Not sure how this will work when I expand over to Durnik with this.
I assume I need to repeat the Node Exporter and cAdvisor installs on Durnik and anything else I might want to monitor, like piHole. Then update the Prometheus YAML accordingly, with appropriate job names. For another day.
None of these how to’s got me through from beginning to end, but I did use bits and pieces from each to understand the Portainer configuration.
It feels like this setup might be a bit dated and home labbers have moved on the Loki? Not sure.
This is the one I found most helpful, but still not a copy/paste of the exact commands seen in the video.
Others I viewed while working on this
]]>In all honestly, prior to this past year, I had only posted a total of 182 times on Twitter over 13 years with few interactions. It took me a few months to finally click the join button and sign on to mastodon.social and I wasn’t expecting to post much here either.
Things changed quickly. I found a community that was tech oriented, LGBTQ+ focused (not just friendly) and responsive. It sparked something in me that wanted to participate and give back, whatever that looked liked.
For the first time, I donated to not only open source platforms like Mastodon and Firefish, but to individual developers to assist with their work. Happily! I even purchased several subscriptions to fediverse and indie apps, enjoying every single one of them. I plan to continue doing so.
Elk, an alternative front end for Mastodon, was the true kickstarter for my interests when I awkwardly put forward a pull request for the bell notification icon displayed on profile pages.
Later, on a cold Sunday morning, Thomas Ricouard sent out a call for a notification sound for his new app, Ice Cubes. I gave it a shot in my own kitchen, recording ice cubes clinking in a whiskey glass. It was accepted and pushed into the app! It’s still there and has even been modded to provide other sounds throughout the app as well. All from just a friendly conversion on Mastodon during a lazy Sunday.
Both of these events spurred my interest even farther, wanting to understand more about this platform and how it works.
I want to thank the people and communities I’ve found this year, in all kinds of corners I had never considered before. Fediverse, Discord and Matrix communities are welcoming and helpful. I interact or arm-chair discussions as people smarter than me talk through problems and come up with solutions, right in public in front of the community. Sharing what they learn along the way.
So here’s my list. I have to say I was shocked at the amount I have learned (or tried to learn) over the past year. It’s been a time of growth, and if you’re reading this, you’re part of the reason for that. Thank you!
Mastodon, Pixelfed, Firefish, OwnCast, Postmarks, GoToSocial, FunkWhale, PeerTube, Kbin, Friendica
So what’s next? Recently I’ve started down the Home Lab path. It’s introducing me to linux, docker, and virtual machines in ways I had never considered before. I’m enjoying it when I have time to put into it. When that is stable, I can imagine installing all kinds of things and feeling more comfortable tweaking things and contributing more code to open source projects.
I’d like to smooth out some rough edges on a project that never quite took off, but which I thoroughly enjoyed working on - the Mastodon Starter Kit. It was supposed to be a very small codebase that authenticated a user and displayed the main mastodon timeline. But it grew beyond that as I learned about all the things that go into display a timeline itself. I’m considering stripping it back down to those core items and creating a separate project for my more broad tinkering with the Mastodon API.
Finally, work wise I have some new applications most likely coming into my daily life - ZenDesk and Salesforce. I’ll be taking a deeper look into these large systems which will take quite a bit of time.
]]>After making your selections, a random set of 4 of them would appear on your public profile page. Unforunately, this UI component was lost in the 4.0 release and hasn’t made it back yet.
This was initially announced all the way back in 2018.
This blog entry is my collections of notes as I researched this feature, developed the app, and inspired ideas for how it should be presented when it makes a return.
If you just want to try out the app, you can find it at https://featured-profiles.box464.com, and if you want to learn more about the app first, check out the About page. Finally, the code is opensourced and available on GitHub.
I’d love to see what you find when you visit - any surprising accounts? Have your social media interests changed since you last saw them? Take a screenshot and share with me, I’d love to know!
While the design element has been removed from the account page, you can still select accounts to feature through the account profile’s action menu in the official Mastodon web UI, but not the apps. It’s zombified - not quite alive, not quite dead. 🧟
It’s not well supported in third-party apps, either. The single non-official app is, unsurpisingly, Toot!, one of the most fantastical clients to date.
It’s currently on the official roadmap under the “Exploring” section, see lucky number MAS-13. It’s pretty far down the list, but it exists, so there’s hope it will be returned to it’s full glory.
Want to see the feature return in Mastodon? Add a like or comment to the official GitHub issue to show your interest.
The is where things get a bit confusing. The concept has several different names even within Mastodon itself.
So, which is it? Well, the official UI listed it as “Choices” on the public account page back when it was displayed, but currently noted as “Feature on profile” in the sub-menus on the same page. I even dug up the initial discussion on discord about why it’s shown in the UI as ‘Choices’. (Sidenote - I had no idea Discord discussions were stored long term like that, or even searchable)
When you review Mastodon’s documentation, even the names of the endpoints like “Endorsements”, “Pin” and “Unpin” all pop up, making it a bit confusing to understand how to affect this feature without some digging.
To keep things consistent, I’ll be calling it “Featured Profiles” throughout. Be alert for references to the other terms within sample code, and know it all ends up being the same thing.
Even when the random 4 featured profiles start appearing in our profiles again, there’s not a great way to manage your selections. Currently, you have to go to each account profile you want to feature and choose an option from the action menu to add or remove them.
How do you remember which profiles you endorsed? There’s currently no visible indication at all. You’d have to go through each of your followed profiles and check the action menu on each one. Or, I suppose refreshing your profile page over and over again to get a new random set of 4 (when that existed).
Mastodon would have to build out a page similar to the Followed and Followers GUIs in order to have similar functionality. That’s a lot of work for the developers just for the display of four items on the bottom right of your profile page. I can see why it’s not a priority for them. I’d rather see Groups and Passkeys!
So why not help out? The app I created can be used to view and manage your featured profiles all in one place, at least until Mastodon proper comes out with a better solution. The only thing missing is adding back in the “display random four”.
This sounded like a great area to tinker with, so I dove right in to create a management tool. At the very least, it brings light to this concept for further discussion.
I’m not going to go deep into the specifics of how to use the app here, but there’s plenty of info on the About page of the app itself.
Try it out @ https://featured-profiles.box464.com
Ready for some fedi geek talk? Let’s get into the design and research I had to do in order to build it.
A bit of disappointment is that I can’t return someone else’s featured profile selections other than my own via the API. It would have been fun to include the option to view other people’s currently invisible selections, too!
I believe the UI component that showed the top 4 random featured profiles was not an API call, and isn’t exposed anywhere right now. My assumption is that it worked similar to how featured hashtags do right now, giving the instance administrator some say over how many featured hashtags can appear on the profile page.
One suprising find is that there seems to be either no limit or a very high cap on the number of profiles you can feature! While the front end UI limited the display to 4, those 4 will rotate between all your selections. In reality, it appears you could feature every person you follow. Not a big deal for most users, but for those that have 1,000s or more followed accounts it can get unwieldy.
Once I realized this was the case, I had to reconsider how I built that section of the management tool. Imagine a bot doing something crazy like following back every follower, then adding each one as a featured profile. Yikes!
Searching your followed and featured profile accounts was also a challenge. Initially, I made the assumption that all users were similar to me - around 500 or less accounts followed. That was a bad assumption.
I went through several iterations, especially with how to retrieve your list of followed accounts. At first, I was just iterating through a search with only followers set. This got the job done, but I soon realized I was only taking my own number of users into consideration. What if I had thousands of followed accounts?
I ran a couple of unofficial polls to see how many followed accounts people have on average. 85% of respondents had fewer than 1,000 followed account. Of those 85%, 73% had fewer than 500 followed accounts, tho the participation was much lower for the second poll. I chose 500 as a break point because that’s about where I saw performance being affected.
I settled on a compromise - if you have less than 550 followed accounts, they get loaded upfront. If you have more than that (551+) then we actually use the search endpoint.
This meant making a more complicated workflow, but I was determined to make it happen. I think it works nicely.
I think there needs to be a limit on the number of accounts you can feature, even if it’s a admin configurable limit with a sane default - say 10 accounts.
You can pull back your OWN featured profiles, but there’s currently no way for someone else to pull your featured profiles from the API. This is disappointing, as no one can see more than the top 4 random featured profiles on your account page (when it comes back).
Any or all of these ideas could work. One issue to consider is that currently there isn’t a real limit on how many people you can feature so paging is required.
It could be in a similar spot as the featured tag endpoint.
Note that you CAN pull relationships to other accounts and that includes the endorsed flag!
But this would require quite a bit of back and forth to make you way through someone’s entire followed list.
Saved the best for last - the account search endpoint. There’s already a following query parameter. An “endorsed” parameter could be added fairly easily, I’d think.
Wouldn’t it be odd if your account is showing up on some random user’s account page and you have no idea about it? I think there needs to be a notification delivered each time someone features your account, similar to a follow.
We should be able to review accounts that have endorsed our OWN profile. And maybe even remove ourselves from them.
It would be fun and useful to identify the relationship between featured accounts. This could be displayed simiarly to the Admin, Automated, and Group flags or perhaps a different display of the account card, etc.
This terminology doesn’t sound very Fediversy, but you get the drift.
What’s the fun of setting this all up if you can’t share your selections? It’s like curating a record collection without being able to show it off.
Obviously I’d like for Mastodon to add the feature back in. But in the meantime, I’ve considered adding a way to share a nicely formatted “card” to Mastodon that shows your featured accounts. It would mean sharing your preferences back to a server that then generates a stored HTML static page. Right now, everything is just living on the client and no data is stored in any way.
Or, perhaps it generates an image that you can share? Thoughts! Ideas!
You could say I wasted my time on a feature that may never see the light of day. But I was able to learn lots of new things and have fun doing so.
That’s worth the effort in my book.
And, now it’s open sourced, so I hope you enjoy it as well.
If you’re looking through GitHub at the code, search for “endorse”.