Commit 439299ee authored by Eugen Rochko's avatar Eugen Rochko

Initial commit

parents
web: hugo server -D
sass: cd static && sass -w style.scss
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---
baseURL = "http://blog.joinmastodon.org/"
languageCode = "en-us"
title = "Official Mastodon Blog"
paginate = 6
preserveTaxonomyNames = true
[permalinks]
posts = "/:year/:month/:slug/"
---
title: "Scaling Mastodon"
subtitle: "What it takes to house 43,000 users"
date: 2017-04-12
draft: false
author: gargron
categories:
- Guides
tags:
- mastodon
- post-mortem
- performance
---
My instance [mastodon.social](https://mastodon.social) has recently surpassed 43,000 users. I have closed registrations both to have more time to investigate the infrastructure and ensure a good experience for existing users, and to encourage more decentralization in the network (with a wonderful effect — the Mastodon fediverse now hosts [over 161,000 people spread out over more than 500 independent instances](https://instances.mastodon.xyz/)!)
But providing a smooth and swift service to 43,000 users takes some doing, and as some of the other instances are approaching large sizes themselves, it is a good time to share the tips & tricks I learned from doing it.
Mastodon consists of two parts that scale differently: databases, and code. Databases scale vertically. That means, it’s a lot easier and more cost efficient to buy a super beefy machine for your database, than it is to spread the database over multiple machines with sharding or replication. The Mastodon code on the other hand, scales horizontally — run it from as many machines as you want, concurrently, and load balance the web requests, and you’re good.
First of all, where does the load on Mastodon come from?
The act of browsing and using the site requires the user’s HTTP requests to be answered. Every Puma worker (WEB_CONCURRENCY) can answer MAX_THREADS of requests at the same time. If every worker’s every thread is busy answering something, the new request must wait. If it has to wait too long, it is canceled with a timeout. **That means, you need more workers and threads to be able to handle a higher request throughput.**
Being connected to the streaming API means a constantly open connection through nginx to the streaming API service. The streaming API itself, I do not notice being strained from a high number of connections, but **nginx requires a high limit on open files (worker_rlimit_nofile) and a high number of worker_connections to keep the connections up.** Thankfully, nginx is quite lightweight even with such high parameters.
Actual activity on the site, like sending messages, following or unfollowing people, and many more things that people can do, all generates background jobs that must be processed by Sidekiq. If they are not processed in time, they start queuing up in a backlog, and it becomes noticeable when a toot you wrote reaches your followers only 1 hour later. **That means, more Sidekiq workers are needed to be able to process more activity.**
Those are the basic principles of Mastodon scaling. However, there is more.
Each time you scale horizontally, you are putting more strain on the database, because web workers and background workers and the streaming API all need database connections. Each service uses connection pools to provide for their threads. This can go up to 200 connections overall easily, which is the recommended max_connections on a PostgreSQL database with 16GB of RAM. When you reach that point, it means you need pgBouncer. [pgBouncer ](https://pgbouncer.github.io/usage.html#quick-start)is a transparent proxy for PostgreSQL that provides pooling based on database *transactions*, rather than *sessions*. That has the benefit that a real database connection is not needlessly occupied while a thread is doing nothing with it. Mastodon supports pgBouncer, you simply need to connect to it instead of PostgreSQL, and set the environment variable PREPARED_STATEMENTS=false
Simply spinning up more Sidekiq processes with the default recommended settings may not be the silver bullet for processing user activity in time. Not all background jobs are created equal! There are different queues, with different priorities, which Sidekiq works with. In Mastodon, these queues are:
* **default**: responsible for distribution of toots into local follower’s timelines
* **push**: delivery of toots to other servers and processing of toots incoming from other servers, before they are queued up for distribution to local followers
* **pull**: download of conversations, user avatars and headers, profile information
* **mailers**: sending of e-mail through the SMTP server
I have ordered them in the order of importance. The default queue is the most important, because it directly and instantly affects user experience on your Mastodon instance. Push is also important, because it affects your followers and contacts from other places. Pull is less important, because downloading that information can wait without much harm. And finally, mailers — there is usually not that much e-mail being sent from Mastodon, anyway.
When you have a Sidekiq process with a defined order of queues like -q default -q push -q pull -q mailers, it first checks the first queue, if nothing is there, the next one, etc. That is, each thread defined by the -c (concurrency) parameter, does that. But I think you must see the problem — if you suddenly have 100 jobs in the default queue, and 100 in the push queue, and you only have 25 threads working on all of them, there will be a huge delay before Sidekiq will ever get to the push ones.
For this reason, I found it useful to split queues between different Sidekiq processes on different machines. A couple responsible only for the default queue, a couple only responsible for push, pull, etc. This way, you are not getting too much delay on any type of user-facing action.
Another big revelation, though obvious in hindsight, is that it is less effective to set a high concurrency setting on a single Sidekiq process, than it is to spin up a couple independent Sidekiq processes with lower concurrency settings. Actually, the same is true for Puma workers — more workers with less threads work faster than less workers with more threads. This is because MRI Ruby does not have native threads, so they cannot be run truly in parallel, no matter how many CPUs you have. The only drawback is this: While threads share the same memory, separate processes don’t. That means, more separate processes consumes more RAM. But if you have free RAM on your server doing nothing, it means you should split up a worker into more workers with less threads.
The current mastodon.social infrastructure looks like this:
2x baremetal C2M (8 cores,16GB RAM) servers:
* 1 running PostgreSQL (with pgBouncer on top) and Redis
* 1 running 4x Sidekiq processes between 10–25 threads each
6x baremetal C2S (4 cores, 8GB RAM) servers:
* 2 running Puma (8x workers, 2x threads each), Sidekiq (10 threads), streaming API
* 1 running Nginx load balancer, Puma (8x workers, 2x threads each, Sidekiq (2 threads), streaming API
* 2 running Sidekiq (20 threads)
* 1 running Minio for file storage with a 150GB volume
Most of these are new additions since the surge of Internet attention — before that mastodon.social was serving 20,000 users (most of whom were, to be fair, not active the same time) with just the DB server, 2 app servers and 1 Minio server. At the same time, the v1.1.1 release of Mastodon includes a variety of optimizations that at least doubled the throughput of requests and background jobs compared to the first day of going viral.
At the time of writing, mastodon.social is servicing about 6,000 open connections, with about 3,000 RPM and an average response time of 200ms.
---
title: "April post-mortem"
subtitle: "The rise and rise of Mastodon"
date: 2017-04-25
draft: false
author: gargron
categories:
- Op-Ed
tags:
- mastodon
- post-mortem
---
*This is an update for [my Patreon supporters](https://patreon.com/user?u=619786). It is posted on Medium because of its superiour formatting capabilities.*
So, April, huh. A lot happened. I was putting off writing an update on here because I knew I had to go into detail on all the things that happened, and that’s quite a daunting task. Before I dive into things, a couple short notices:
* The way I work with the GitHub repository has changed. I no longer work directly on the master branch. I (and other volunteers) work on feature branches. Something can only be merged into the master branch through a pull request that receives a review and approval from at least one trusted contributor. This means that the master branch is a lot more stable, and there is a lot more accountability for who does what and when. However, **the master branch is still not a stable enough medium for the (literally) thousands of Mastodon instances running in production**. Therefore, we now do **actual releases** — v1.1, v1.2, v1.2.2 etc. The releases now contain detailed changelogs, linking back to the pull requests in which the changes were made, with a list of all contributors for the release at the bottom. This replaces the changelogs I was publishing on this blog.
* With 666 patrons (hah!) individually managing the sponsors list is no longer viable. I will be automating it from the CSV export in Patreon. This means the sponsors list will be using the username you have on Patreon and link to your Patreon profile.
**So, April, huh**. Twitter changed the reply system, which everybody told them they shouldn’t do, and then removed the iconic egg avatar for new users, and suddenly all of my work of telling people that one day Twitter would do something they didn’t like and they’d need a viable alternative paid off. Mastodon caught on on Infosec Twitter, which is both huge and influential, and (somehow, I do not quite understand how) also French Twitter. France really likes free software and decentralization, as it turns out! Think explosion of users from 20,000 to 42,000 in the span of two days. Most importantly, this offset a wave of press attention, from French journals to tech journals to non-tech journals. I had phone and text interviews with The Verge, Mashable, Wired, Engadget and more. I actually don’t remember exactly, because I chose not to read the resulting (or any) articles for the sake of my mental health. (On the other hand, my mother collected them all). [The Mastodon band has playfully acknowledged the project](https://twitter.com/mastodonmusic/status/849424628401541121). We also witnessed the birth of a meme of a man not being able to be found by William Shattner.
Did I mention that Pixiv, the Japanese artist gallery company (sort of like deviantArt, but better) has opened its own Mastodon instance, Pawoo.net? They even made their own version of the Mastodon mascot. They have already contributed back some cool performance improvements, as well.
![Pawoo’s elephant friend](https://cdn-images-1.medium.com/max/2000/1*ovH0iFCU303mZgRCd6S5gg.jpeg)*Pawoo’s elephant friend*
At the time of writing, the Mastodon network includes more than 486,767 users spread out among more than a 1,212 instances. That’s how far we’ve come. But it’s not just that. A lot more people have learned and become interested in Free and Open Software and decentralization. The GitHub repository has seen an absolute explosion of activity, from bug reports and feature requests (550 at the time of writing) to code and translation contributions from the community. Many people started learning Ruby/Rails and JavaScript/React.js to be able to participate. I feel like there is a lot more documentation on how to deploy a Rails application on the Internet than there was before Mastodon.
Success brings challenges. Insane new loads on mastodon.social were reason for multiple optimizations and bug fixes, speeding up performance hotspots by more than two times, as well as exploration of more complicated deployment techniques (e.g. pgBouncer). The hardest challenges are organizational rather than technical. Tending to the bug tracker, support questions, reviewing and merging pull requests is all a huge responsibility and time sink.
Furthermore, there are other tasks like communicating the roadmap for the near future, community outreach, and coordinating efforts from contributors that I feel myself ridiculously overwhelmed by. My personal philosophy of “announce when it’s done, promise nothing” may be good for positively surprising people after the fact, but pretty bad for managing a project and people’s morale.
Seeing the Patreon pledge at over $3,000 means a lot to me. First of all, and this has come up a lot, so I feel like mentioning it — Patreon distributes the pledges on 1st of each month. That means I have seen nothing from all the new pledges yet — from last month I received about $700, which was less than my living and hosting costs. So any articles talking about me making a comfortable $3k/mo are a bit premature on that front, and ignore all the past months I was working full-time on less than a living wage.
With that out of the way, the new budget allows me more wiggling room in hosting options of mastodon.social, makes my dad worry less about me not working for another company like all the other people, and **will hopefully allow me to hire additional staff for the aforemention tasks like project management and community outreach**.
On a somewhat related topic, people love fluffy elephant friend, and there were a lot of calls for merchandise. That’s another way the project can be supported financially, with the added benefit of spreading awareness of it. I am still waiting on my artist friend to free up to work on new high-res artwork for t-shirts, but I have published an official sticker with the iconic cutie:
![[Available on Sticker Mule](https://www.stickermule.com/marketplace/18010-mastodon-fluffy-elephant-friend)](https://cdn-images-1.medium.com/max/9216/1*6iV1inXI_ADZjAwrPfLs-A.jpeg)*[Available on Sticker Mule](https://www.stickermule.com/marketplace/18010-mastodon-fluffy-elephant-friend)*
To conclude, here is the list of releases published since my last Patreon update mid-March:
* [v1.1](https://github.com/tootsuite/mastodon/releases/tag/v1.1)
* [v1.1.1](https://github.com/tootsuite/mastodon/releases/tag/v1.1.1)
* [v1.1.2](https://github.com/tootsuite/mastodon/releases/tag/v1.1.2)
* [v1.2](https://github.com/tootsuite/mastodon/releases/tag/v1.2)
* [v1.2.1](https://github.com/tootsuite/mastodon/releases/tag/v1.2.1)
* [v1.2.2](https://github.com/tootsuite/mastodon/releases/tag/v1.2.2)
The above links will take you to the detailed changelogs, but here are the most prominent changes summarized:
* Direct messages
* Avatars now finally hover-to-play
* Option to disable all GIF autoplay
* Option for confirmation dialogs for boosts
* Confirmation dialogs for deleting/blocking/muting
* Videos can be expanded
* Improved search UI, ability to open remote statuses by pasting their permalink URL into the search
* Two-factor authentication now requires one confirmation before activation, recovery codes added
* Admin UI for domain blocks has been introduced (and improved in general)
* An onboarding modal to greet new users and explain the basics
* Localization and translations have been improved and expanded respectively
* Various bug fixes, performance improvements and UX polishing
A public road map for the future is being worked on, but it’s safe to say now that the next release will be v1.3 (minor release) and not a patch release due to the amount of new features in the pipeline.
---
title: "M for Mastodon"
subtitle: "A new logo and v1.5"
date: 2017-08-01
draft: false
author: gargron
hero: https://cdn-images-1.medium.com/max/4124/1*nLBlvIEDVuc97_u6pMkZbA.jpeg
categories:
- New Features
tags:
- mastodon
---
*My name is Eugen Rochko and I’m the creator of Mastodon, a free, open-source federated social network with over 760,000 users. [You can check it out here](https://joinmastodon.org).*
The Mastodon project is finally well-represented visually. I always felt like the previous logo did not do it justice. To its credit, it was both an M, and 3 sideways speech bubbles, but it did not scale well and overall it was just a circle. Now, after months of planning and weeks of back and forth with the designer, we have a distinct shape and a distinct font.
![](https://cdn-images-1.medium.com/max/3318/1*LG72b92ZTWP9Ki8eHYh7Rg.jpeg)
Along with the logo, we now have a beautiful homepage for the project itself. The kind of link you can send to someone to show them what Mastodon is without committing to any particular instance — [joinmastodon.org](https://joinmastodon.org)
![](https://cdn-images-1.medium.com/max/2000/1*t52d6kXeB9ydAe8JLcUUjw.png)
And as all good things come in threes, the landing page distributed along with the software itself — the instance frontpage if you will — has also been refurbished. Now that there is a project homepage to differentiate itself, the instance frontpage puts more effort into presenting a particular instance’s identity, rather than the underlying software. The name and the customizable description have a lot more prominence.
And something that’s been requested since literally day one of the project is finally here too — the frontpage now features a preview of the public timeline (“firehose”, if you will) of the instance, thereby letting you get a taste of what’s inside this hip new social network. Though instances that prefer to stay mysterious can still opt-out of that new feature.
All of the above comes bundled [in our 1.5 release](https://github.com/tootsuite/mastodon/releases). But that’s just the tip of the iceberg. The other cool stuff can be classified into five main categories: quality of life improvements, admin features, mobile experience and accessibility, and other.
**Quality of Life improvements:**
* Previous behaviour of “content warning” and “media sensitivity” being completely separate was confusing to most. This has been simplified. Media can be sensitive without hiding the text, but hiding the text with a content warning will now always hide the media, too.
* A new preference setting to always pre-mark media as sensitive on your account.
* A new preference setting to opt your public profile out of search engine indexing.
* A new preference setting to have the web UI displayed using your operating system’s native font instead of Roboto.
* When editing your profile, you now get a preview of your avatar and header. The operating system’s “no file selected” label on file inputs confused people.
* The muting feature has been adjusted. Previously it was meant only to hide someone’s toots from timelines, not to hide them from your notifications (e.g. you’d mute a friend who is annoying in general but you want to hear from when they’re talking to you). By popular demand this has been changed to block notifications, too, essentially becoming a stealth-block.
* The overview of active sessions is now a lot more accurate, and you can now revoke a session.
* The disparity between toots/following/follower numbers on the local instance vs user’s origin instance was also confusing. There was an asterisk next to the numbers with a disclaimer that they may not be accurate, but it was way too invisible. Now, profiles of users who originate from a different instance display a prominent disclaimer with a link to view the full profile.
* The character counter now ignores the domain part of user handles, and treats all links as 23 characters long, regardless of how long they are. This removes the unfair penalty of users whose domain is longer, and allows you to not worry about the length of the URLs you are sharing, since they get shortened visually anyway.
**Mobile experience and accessibility:**
* We now have Web Push notifications. It is a method of sending notifications directly to the browser, without having to use a native app (opt-in, of course). It is a relatively new web standard, which more and more browsers are implementing and it blurs the line between mobile website and native app.
* The swiping gestures have not only been adjusted to be less sensitive, but are now accompanied by visual feedback — no more accidental swiping between columns.
* Another feature making use of an upcoming web standard, which is a bit newer and may not be available in any browsers yet, is the “share” button, which acts like the “share” feature of native apps.
* All dropdown menus now open as modal windows on mobile, making it much easier to hit the right item.
* Multiple accessibility improvements — too many to list here, but including improved contrasts, screen reader support, and keyboard access.
**Admin features:**
* Admins will now receive immediate e-mail notifications about new reports.
* For troubleshooting, admins now have a button to re-subscribe to accounts from a particular domain.
* Added a domain block option that does nothing but reject local cache of media files.
* The contents of the /terms page can now be customized entirely if you want a different privacy policy than the default one.
**Other:**
I have previously mentioned that Mastodon is looking to implement a newer federation protocol, ActivityPub, to replace OStatus in the very long term. This protocol itself is a work in progress incredibly close to being done, and I’m working closely with the W3C working group responsible to make sure the needs of the Mastodon project are well met, along with many other developers.
The implementation of a completely new underlying protocol in Mastodon is not easy. It has been an ongoing effort for a couple months, and it is split into stages. With this release, one stage of the implementation is ready — ActivityPub-compatible representations of public data. This is just a first step, but I’m proud of it anyway.
**The fight for an ethical, decentralized internet is not over**. We have made a significant impact in April, we’ve gotten big in Japan, but we need to keep going! We need a couple more months like April to cement our position in the public perception, to nurture the idea that no, you *don’t* have to just succumb to surveillance capitalism to hang out with friends and reach an audience. I truly hope that this release is another step in the right direction, in making it easier to convince people to use Mastodon.
I want to conclude this post by giving shout-outs to the people who make the development of this project possible —[ my patrons](https://github.com/tootsuite/documentation/blob/master/Contributing-to-Mastodon/Sponsors.md). Likewise, to [Sorin Davidoi](https://toot.cafe/@sorin) for implementing a huge chunk of the mobile experience improvements. To [Dopatwo](http://patreon.com/dopatwo), for providing me with a steady supply of adorable elephant friends, and to [Jin Nguyen](http://www.jin-nguyen-portfolio.com/), who designed our new logo.
---
title: "Mastodon and the W3C"
subtitle: "The Pub is Now Open, ActivityPub that is!"
date: 2017-09-10
draft: false
author: gargron
categories:
- New Features
tags:
- mastodon
- activitypub
---
*[Mastodon](https://joinmastodon.org) is a free, open-source federated social network spanning over 800,000 users spread across more than 2,000 servers.*
[Mastodon v1.6](https://github.com/tootsuite/mastodon/releases/tag/v1.6.0) is here, and it is the first Mastodon release which fully implements the ActivityPub protocol. [ActivityPub](https://www.w3.org/TR/activitypub/) is a new federated messaging protocol developed by the World Wide Web Consortium (W3C) which aims to fix the shortcomings of past standards like [OStatus](https://en.wikipedia.org/wiki/OStatus).
Mastodon is one of the first platforms, and certainly the first major platform to implement this new standard and prove it in the wild. It was a natural upgrade for our project, as we long ago reached the limits of what OStatus was capable of. And what we needed was better privacy, better defaults, better cryptographic verifiability, and better distribution mechanisms.
This protocol is also very flexible in what it allows you to express and it is naturally extensible as it is based on [JSON-LD](https://en.wikipedia.org/wiki/JSON-LD). Besides allowing Mastodon to fully and reliably exchange the data it currently needs to exchange, it also has a lot of potential for future developments in the area of distributed identities and end-to-end encryption.
Servers which support this new protocol will use it in version 1.6. OStatus is still available as a full-fledged fallback.
Here are some of the juicier highlights from this release:
1. We’ve improved the integrity of distributed conversations. Up until now, the only server which had a full view of a conversation was the server of the conversation’s starter, as all responders sent their replies to it. But the servers of the responders or followers had only an incidental view of the conversation conversation; to get a full view, one would have to either follow the other responders, or get a reply from the conversation starter. Now, the server that receives the replies forwards them to followers’ servers as long as they are public. This means that when opening the conversation view on a different server, it will be as complete as on the origin server. This is especially helpful to those who run single-user instances, as they are the least likely to have already been following all responders.
2. Another feature, which is small, but has a big UX effect, is that we can finally fetch account statistics from remote profiles (total toots, number of followers, etc.), as there is now a standardized way of expressing this using ActivityPub. Technically this is not a big deal, but it did confuse new users when they saw someone from another server with a seemingly empty profile, when in reality it had thousands of toots and followers.
![](https://cdn-images-1.medium.com/max/2000/1*dKhj4RnceIzmX2zs5Zn2UQ.png)
3. Speaking of profiles, this release brings you redesigned public profile pages, as well as the ability to pin certain toots on them to be permanently displayed. By default, stand-alone toots are displayed, and there are now tabs for toots with replies and toots with media.
4. The function of getting embed codes for toots is now more accessible — through a button in the web UI, and not just through the OEmbed API. The look of the embedded view has also been refurbished, and an optional script has been added to ensure the embeds have the correct height. I am excited to see Mastodon content appear on other websites.
5. To improve the experience of brand new users, we’ve added something in the old tradition of MySpace Tom — except instead of following some central Tom, new accounts will start off following their local admins (this can be adjusted by the administrator). That way, on your first login you are greeted with a populated home timeline instead of an empty one.
**All in all, this release is all about filling the gaps in the server-to-server layer, improving content discovery and first time experience of new users, and making it easier to share Mastodon content.**
Big shout-out to [Chris Webber](https://octodon.social/@cwebber), [Puck Meerburg](https://puckipedia.com/social), and [Unarist](https://mstdn.maud.io/@unarist) specifically, and to the W3C Social Working Group in general for helping put everything together.
Likewise none of this would be possible without the [support of our patrons](https://github.com/tootsuite/documentation/blob/master/Contributing-to-Mastodon/Sponsors.md). Thank you!
*Mastodon is free, open-source software. The development is crowdfunded through [Patreon](https://www.patreon.com/mastodon) and [Liberapay](https://liberapay.com/Mastodon/). The source code is available on [GitHub](https://github.com/tootsuite/mastodon). General information and a list of instances is available on [joinmastodon.org](https://joinmastodon.org)*
---
title: "Mastodon 2.0"
subtitle: "The Big Emoji Update"
date: 2017-10-19
draft: false
author: gargron
hero: https://cdn-images-1.medium.com/max/3840/1*xfxHsMRp61tbOY3VPP9ggQ.png
categories:
- New Features
tags:
- mastodon
---
About 6 months have passed since [April](https://medium.com/@Gargron/april-post-mortem-12e3d141878c), during which the major mainstream breakthrough of our decentralized social network took place. From 20,000 users to almost a million! What better time to run through a couple examples of what’s been introduced since then?
Mastodon is defined by its focus on good user experience, polished design and superior anti-abuse tools. In that vein, the web app has received numerous updates. Using the latest browser features, the web app receives real push notifications, making it almost indistinguishable from a native mobile app. It works faster and looks smoother thanks to many performance and design improvements.
![Mastodon with lots of columns pinned](https://cdn-images-1.medium.com/max/2560/1*6xTFy4K4JWq9nd6bXNbgmw.jpeg)*Mastodon with lots of columns pinned*
On the desktop, it allows you to add, remove and rearrange columns. It can even be navigated and controlled using hotkeys!
When you get annoyed by notifications for a toot of yours that’s gone viral, or a conversation you’ve been tagged in that you no longer have interest in, you have the ability to simply mute the whole thread. If you keep encountering content you hate and it always comes from a specific domain, but your admins won’t do anything about it (or perhaps it’s annoying, but merely on a personal level), you no longer have to rely on your admin: You can simply hide everything from a particular domain for yourself.
![One instance’s preview in Discord](https://cdn-images-1.medium.com/max/2000/1*CCHSuaR7daptHcIwl3J6Wg.png)*One instance’s preview in Discord*
A lot of attention has been given to how the user interface presents itself to onlookers. Both in terms of OpenGraph tags, which is to say, how links to Mastodon look when shared on other social networks or apps like Discord, and in terms of the sign-up, about, profile, toot and hashtag pages. The profile pages let you filter someone’s toots, for example to only see ones that include pictures or videos, which is a great addition for all artists and photographers. The sign up and hashtag pages do a better job of showing what’s actually inside in terms of content.
Mastodon is a global experience. That means a lot of language diversity. Since most people don’t know most languages, language filters have been added so you can decide which ones to see.
![Custom emoji in action](https://cdn-images-1.medium.com/max/2000/1*bTH8BapEkzwwDnchjAa6_w.png)*Custom emoji in action*
Another addition is custom emoji. That is a concept more familiar to Discord and Twitch users, but it’s a first for a social network. Custom emoji add flavours to instances and allow people to express very specific things that could never be conveyed by standardized Unicode characters.
There are a lot of other small features and important fixes. Better logos, better icons, ongoing improvements to accessibility such as image descriptions for screen readers; upgrades to the protocol, better APIs… [You can view the detailed release notes of 2.0 here](https://github.com/tootsuite/mastodon/releases/tag/v2.0.0).
It’s also worth mentioning that the central resource for the Mastodon project is now the [joinMastodon.org](https://joinmastodon.org) website, which explains the benefits of decentralization, links to all related resources, lists the project’s sponsors, and most importantly, provides an overview of the existing network. If you want to tell someone about Mastodon, you’ve got two options now— invite them over to the instance you’re using, or link them to joinMastodon.org where they’ll pick one on their own.
More than ever people need an escape hatch, an alternative to commercial networks that are incentivized to keep bad actors around to drive engagement, that sell your time and screen estate to advertisers and then throw you out without recourse for saying a bad word to a celebrity. Mastodon is that hatch. It’s an alternative reality where communities know and care about each other and moderators aren’t far away from the users. Free software stands first and foremost for the freedom of its user.
*To get started with Mastodon, go to [joinMastodon.org](https://joinmastodon.org/). If the choices are too overwhelming, quick recommendations of good and well-populated servers are: [octodon.social](https://octodon.social/about), [social.tchncs.de](https://social.tchncs.de/about), [mastodon.art](https://mastodon.art/about), [mstdn.io](https://mstdn.io/about), [mastodon.technology](https://mastodon.technology/about), [mastodon.rocks](https://mastodon.rocks/about)*
*Redecentralize now!*
---
title: "How to start a Mastodon server"
subtitle: "The non-technical parts"
date: 2018-02-23
draft: false
author: gargron
categories:
- Guides
tags:
- mastodon
---
So you want to be part of the Mastodon network, and you want to truly own your data, independent of anyone else. Perhaps you want to curate a niche community for a specific interest, or maybe for your own family or close circle of friends. You went [through the documentation](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md) and installed the software, or maybe you chose [one of the available](https://maastodon.net) [hosting options](https://masto.host) to avoid all the technical nonsense altogether. What’s next?
There are three categories of things you’ll be doing: Customization, federation and promotion. If your community is going to be private, you can skip that last part.
### Customization
After logging in (with admin privileges on your account!), navigate to Administration -> Site Settings. At the top of the page is the most important information about your server. You may leave the title as Mastodon, but you absolutely should:
* Specify a contact e-mail address, so people know who to reach out to if all else fails
* Username of a contact person (usually it’s your own username), so people can see who owns the server
* A one-paragraph description of what your server is about or what differentiates it from others.
You can also upload a (preferably) 1200x630px picture to be used as thumbnail for when your server is linked from other websites, such as Slack, Discord and Twitter. JoinMastodon.org also displays that thumbnail when listing your server (more on that later).
The next and last crucial part is adding a code of conduct. This is not necessary for private servers, but if you expect strangers to sign up, you need it. A code of conduct delineates what sort of community and what sort of content you want to host. If you don’t know where to start, a lot of servers have copied the [code of conduct from mastodon.social](https://gist.github.com/Gargron/c2925b9ad7f5e87bf40c57a48de50474), which has been collaboratively drafted by its community.
### Federation
You should *not* be starting your own server if you’re totally new to Mastodon, *unless* you have a private community you’re bringing with you. In a decentralized system like Mastodon, content travels through a web of personal connections, so if you don’t have any connections, you don’t have any content. You should start with an account on a reasonably active Mastodon server and find people you like.
*Then* you should bring those connections with you to your own server. That can be quite simple if, on the other server, you go to Settings -> Data Export and download your following list as a CSV file, and finally on your own server, you go to Settings -> Import and upload that file. From my experience, you should follow at least 40 or 50 active people from other servers to kickstart your own. That ensures a steady flow of new content — on your home timeline it’s just those people you follow, but on the federated timeline, it’s them and the people they share and interact with.
I might be biased, but I find that following admins of other servers is usually a good choice. Usually, they share a lot of content from their users, so you get some insight into their entire community. You might feel compelled to do the same when you get your own users, too.
When new people join your server, they will have something to look at and so will be more likely to stick around.
### Promotion
[JoinMastodon.org](https://joinmastodon.org) is meant to do some of this work for you. It pulls its data from instances.social, an independent directory of Mastodon servers. Once you have a contact e-mail address configured in your Site Settings, you should sign up on [instances.social](https://instances.social/admin) and fill out which languages and which categories you want to be listed under. As long as you have open registrations and at least one active user, you should appear on JoinMastodon.org (I cannot guarantee this, however — the priority of JoinMastodon.org is to onboard new users as smoothly as possible, not necessarily to promote each and every admin). In any case, you will appear on instances.social, and that’s important too.
Beyond that… Community building is magic, and there is no one formula for it. Spread it in your group of friends. When you see people on other social media express interest in alternatives to those platforms, plug your instance. Good luck 😋
---
title: "Twitter is not a public utility"
date: 2018-03-03
draft: false
author: gargron
categories:
- Op-Ed
tags:
- twitter
- surveillance
---
Isn’t it a bit strange that the entire world has to [wait on the CEO of Twitter to come around on what constitutes healthy discourse](https://twitter.com/jack/status/969234275420655616)? I am not talking about it being too little, too late. Rather, my issue is with “instant, public, global messaging and conversation” being entirely dependent on one single privately held company’s whims. Perhaps they want to go in the right direction right now for once, but who’s to say how their opinion changes in the future? Who is Twitter really accountable to except their board of directors?
I still find it hard to believe when Jack Dorsey says that Twitter’s actions are not motivated by a drive to increase their share price. Twitter must make their shareholders happy to stay alive, and it *just so happens* that bots and negative interactions on their platform drive their engagements metrics upwards. Every time someone quote-tweets to highlight something toxic, it gets their followers to interact with it and continue the cycle. It is known that [outrage spreads quicker](https://www.youtube.com/watch?v=rE3j_RHkqJc) than positive and uplifting content, so from a financial point of view, it makes no sense for Twitter to get rid of the sources of outrage, and their track record is a testament to that.
In my opinion, “instant, public, global messaging and conversation” should, in fact, be *global*. Distributed between independent organizations and actors who can self-govern. A public utility, without incentives to exploit the conversations for profit. A public utility, to outsurvive all the burn-rate-limited throwaway social networks. This is what motivated me to create [Mastodon](https://joinmastodon.org).
Besides, Twitter is still approaching the issue from the wrong end. It’s fashionable to use machine learning for everything in Sillicon Valley, and so Twitter is going to be doing sentiment analysis and whatnot when in reality… You just need human moderators. Someone users can talk to, who can understand context. Unscalable for Twitter, where millions of people are huddled together under one rule, but natural for Mastodon, where servers are small and have their own admins.
Twitter is not a public utility. This will never change. And every tweet complaining about it simply makes their quarterly report look better.
*To get started with Mastodon, go to [joinmastodon.org](https://joinmastodon.org/) and pick a place to call home! Use the drop-down menus to help narrow your search by interest and language, and find a community to call your own! Don’t let the fediverse miss out on what you have to say!*
---
title: "The Mastodon Spring Creator’s Release"
subtitle: "What’s in 2.3 for art and photography"
date: 2018-03-14
draft: false
author: gargron
hero: https://cdn-images-1.medium.com/max/2000/1*ZmjuwjpgJWplgio7HyWb_g.png
categories:
- New Features
tags:
- mastodon
- art
---
The development of the next version of Mastodon coincided with the reveal of Vero, yet another commercial social network silo backed by millionaires with a shady past. Vero has struck a chord, at least until people [caught on to its background](https://twitter.com/_heyheytyler/status/968301107536523265), and it wasn’t just because of its unlimited marketing budget. It has struck a chord because it promised an alternative to Instagram, which started getting progressively worse for creators after being acquired by Facebook. The algorithmic timelines have led to a reality where your post could either get lucky and be seen by all of Instagram, or never be seen by your own followers.
This led me to think — what are the concrete differences between Instagram and Mastodon, and what prevents people from using Mastodon in the same way as Instagram? When you strip away the user interface, all social networks function more or less the same way: People create posts, follow each other, the posts go to the followers, and there’s varying degrees of taxonomy to categorize and browse those posts. The real difference is in the user interface, and what that interface puts emphasis on. Instagram does not allow posts without a picture or video, and the interface is adjusted to display those pictures and videos; while Mastodon does not allow posts without text, with pictures and videos being optional. And that’s the whole difference.
With that in mind, I asked myself, are there any parts of Mastodon that could be optimized for the Instagram use case, without interfering with how Mastodon works overall? And the answer was yes.
**This release focuses heavily on the artist experience.**
![](https://cdn-images-1.medium.com/max/2000/1*Fv7moc50GJ3pWSloIWgT9g.gif)
Since Mastodon supports a thriving app ecosystem, there are many different ways in which pictures and videos could be displayed to the viewer. To make sure that whatever aspect ratio a thumbnail is displayed in, it doesn’t cut off important bits, the new “crop” function allows you to select a focal point (or “focus” point) on the uploaded picture. That point will always stay in frame.
Although you were already able to pin posts before, this feature is now complete, displaying the pinned posts in the webapp and across servers, and not just the public profile. This allows you to feature your best work, or important links or conversations. Speaking of links, attaching media to a post no longer inserts a URL into the text of the post, and image-only posts are now allowed.
The media gallery in profiles has been reworked, and is now linked prominently in the webapp, on equal footing with the text-focused profile view. It was linked from a dropdown menu before, and as everybody knows, if something is in a dropdown menu, it might as well not exist. The media modal windows now fill more of the screen and support pinch-to-zoom.
A lot has also been done with how Mastodon pages appear in previews on other sites and apps. With a recent update in Discord, Mastodon videos linked there are finally playable inline. Profile pages in search results now display the bio as description, instead of a random status from the profile. Artists and photographers who publish adult content are no longer disadvantaged by not having their pictures appear in the previews.
You can also now backup your entire Mastodon account, including all the images and videos you uploaded, every 7 days.
That’s not all. There’s a lot more, and if you want every detail, you can read the [official changelog](https://github.com/tootsuite/mastodon/releases/tag/v2.3.0) — I’m gradually getting better at writing those in a way that’s understandable to non-developers.
Mastodon is built on open web protocols like ActivityPub, so it is possible that someone will write a piece of software that acts more like Instagram, and it will still integrate with Mastodon seamlessly — that’s how federation works, and we’re already seeing it with Mastodon and [PeerTube](https://medium.com/we-distribute/peertube-decentralized-video-powered-by-activitypub-and-webtorrent-8aaa4c3749d7). But for now, I hope that this release makes artists and photographers feel more at home on the fediverse.
*If you’d like to try Mastodon today, visit [joinmastodon.org](https://joinmastodon.org/#getting-started). You can select “I am an artist” from the dropdown if you’d like to see servers made specifically for art. Unlike some other platforms, it’s free!*
---
title: "#DeleteFacebook"
subtitle: "Perspective from a platform that doesn’t put democracy in peril"
date: 2018-03-21
draft: false
slug: delete-facebook
author: gargron
hero: https://cdn-images-1.medium.com/max/2000/1*hxrq79FKzukLRoOA8kDiaw.png
categories:
- Op-Ed
tags:
- facebook
- surveillance
---
Deep down you always knew it. On the edge of your perception, you always heard the people who talked about the erosion of privacy, that there was no such thing as free cheese, that if you don’t pay — then you’re the product. Now you know that it’s true. Cambridge Analytica has [sucked the data so kindly and diligently collected by Facebook and used that data to influence the US elections](https://www.theguardian.com/news/2018/mar/17/cambridge-analytica-facebook-influence-us-election) (and who knows what else).
It doesn’t matter if you call it a “data breach” or not. **The problem is how much data Facebook collects, stores and analyzes about us**. You now know how Facebook’s platform was used by 3rd parties to meddle in elections. Now imagine how much more effective it would be, if it wasn’t 3rd parties, but Facebook itself putting its tools to use. Imagine, for example, [if Mark Zuckerberg decided to run for president](https://www.cnbc.com/2017/08/15/mark-zuckerberg-could-be-running-for-president-in-2020.html)
**#DeleteFacebook** is trending on Twitter. Rightfully so. Some say, “even without an account, Facebook tracks you across the web and builds a shadow profile.” And that is true. So what? Use browser extensions that block Facebook’s domains. **Make them work for it**. Don’t just *hand *them the data.
Some say, “I don’t want to stop using Facebook, I want them to change.” And that is wrong. Keeping up with your friends is good. **But Facebook’s business and data model is fundamentally flawed**. For you, your data is who you *are*. For Facebook, your data is their money. Taking it from you *is* their entire business, everything else is fancy decoration.
Others will say, “I need Facebook because that’s where my audience is, and my livelihood depends on that.” And it is true. But depending on Facebook is not safe in the long-term, [as others have learned the hard way](http://splitsider.com/2018/02/how-facebook-is-killing-comedy/). Ever changing, opaque algorithms make it harder and harder to reach “your” audience. So even in this case it’s wise to look for other options and have contingency plans.
There are ways to keep up with friends without Facebook. Ways that don’t require selling yourself to Big Data in exchange for a system designed around delivering bursts of dopamine in just the right way to keep you hooked indefinitely.
Mastodon is one of them. There are others, too, like [Diaspora](https://diasporafoundation.org/), [Scuttlebutt](https://www.scuttlebutt.nz/), and [Hubzilla](https://project.hubzilla.org/page/hubzilla/hubzilla-project), but I am, for obvious reasons, more familiar with Mastodon.
Mastodon is not built around data collection. No real name policies, no dates of birth, no locations — it stores only what is necessary for you to talk to and interact with your friends and followers. It does not track you across the web. The data it stores for you is yours — to delete or to download.
Mastodon does not have any investors to please or impress, because it’s not a commercial social network. It’s freely available, crowdfunded software. Its incentives are naturally aligned with its users, so there are no ads, no dark UX patterns. It’s there, growing and growing: Over 130,000 people were active on Mastodon last week.
To make an impact, we must act. It is tempting to wait until others make the switch, because what if others don’t follow? But individual actions definitely add up. One of my favourite stories from a Mastodon user is how they were asked for social media handles at a game developer conference, and when they replied with Mastodon, received understanding nods instead of confused stares. Step by step, with every new person, switching to Mastodon will become easier and easier.
Now is the time to act. [Join Mastodon today](https://joinmastodon.org).
---
title: "If you could edit tweets"
subtitle: "What’s new in Mastodon 2.4"
date: 2018-06-19
draft: false
author: gargron
categories:
- New Features
tags:
- mastodon
---
A fresh new release of the federated social network software is here, and while the primary focus of it has been on fixing bugs and improving performance, it brings a couple of notable new features to the board.
### Delete & Redraft
There are legitimate reasons why social media platforms rarely, if ever, have an editing function. In an environment where content spreads like wildfire in a matter of minutes, you could easily conceive of nefarious misuses such as creating a post about something agreeable and positive, and, once it reaches critical mass, changing the content to something malicious.
Credit where credit’s due, people have come up with a compromise a long time ago. For example, the Better Tweetdeck browser extension includes an edit function that essentially takes the contents of a tweet, deletes the tweet, and pre-fills the compose screen with the old contents ready for editing.
**Mastodon has adopted this Delete & Redraft function, with a slight change that allows us to avoid re-uploading the media altogether, so we can re-use it directly.**
![](https://cdn-images-1.medium.com/max/2000/1*eNMEH8zqbnZ9PlD865zvxg.png)
### Hide network
You can find out a lot about a person by looking at who that person associates with. Some people are more vulnerable to this than others, like dissidents, activists and people from persecuted groups.
In a social network, associations are important for other purposes, too. Finding good content by looking at who your friends follow, or confirming that an account is not a bot or sockpuppet by looking at who follows them. Still, **Mastodon now has an option to hide who you follow and who follows you from your profile.**
Of course, that isn’t perfect — the people you follow, and the people who follow *also *have profiles… But it’s at least a small obstacle to unsolicited data collection.
![](https://cdn-images-1.medium.com/max/2000/1*MHHC2NRdzytfTL6NL7mWjA.jpeg)
### Language filtering
Language filtering is vastly improved. When we released the feature, our community only had a handful of languages, and the language detection algorithm had a high rate of wrong guesses, which meant it was safer to err on the side of opting out of unfamiliar languages, rather than limiting your timelines to some particular language. Nowadays, Mastodon is extremely diverse, so the average person who speaks only their native tongue would have to go to the preferences screen and tick more than 20 boxes just to see only toots that they would understand. That’s obviously not how it should be.
**We’ve added the ability for people to select a default language for their toots to override automatic detection (therefore reducing false positives) and we turned the opt-out system around into an opt-in one**. Now, on the preferences screen, you only need to tick the boxes of the languages you want to see.
### Friend finding
The biggest challenge of any social network is, unsurprisingly, the “network effect”. It becomes more useful the more people that you care about are on it. Another one is surfacing interesting content, which is tangentially related, but a topic for another article/release.
We are adding a more prominent link to “Find Twitter friends” to the UI. The tool in question is called the [Mastodon Bridge](https://bridge.joinmastodon.org): **By having people sign in using their Twitter account and their Mastodon account, we can create a mapping between the two, and by checking the Twitter friend data, we can tell people who of their friends is on Mastodon, with a convenient “follow all” button.**
![](https://cdn-images-1.medium.com/max/2000/1*TDSbOXA2-c6JMD5BFB0aMA.jpeg)
There is a very common pattern where people would say to follow them on Mastodon, either on Twitter, Facebook, or another platform that was their primary. People who would listen to that would have to find a server, sign up, then find the person in the UI and finally follow them. We’re adding a new feature to roll all of that into one action: **You can now create personalized invite links. Send the invite link to your old friends and followers, and they will be able to sign up on the same server as you and automatically follow you straight away.** (Please mind that invites have to be enabled by your server admin — some have reasons not to allow that. Look out for the “Invite people” link in the UI, as it appears when the function is enabled)
![](https://cdn-images-1.medium.com/max/2000/1*PSeXkqRudSnlXds1zOdN3A.jpeg)
**To get started with Mastodon, you can [sign up for free here](https://mastodon.social/about) or [here](https://mstdn.io/about), or dive into the deep end of choice [by browsing the list of servers here](https://joinmastodon.org/#getting-started). Or, [use the bridge tool to find where your Twitter friends are](https://bridge.joinmastodon.org) and sign up there.**
Huge thanks to everyone who contributed to the recent releases ([see the full changelogs for accreditation](https://github.com/tootsuite/mastodon/releases/tag/v2.4.0)), to [everyone who sponsors](https://joinmastodon.org/sponsors) the project, and to everyone who makes the network worth using by being awesome tooters! 🐘
name = "Eugen Rochko"
bio = "Developer of Mastodon"
[social]
mastodon = "https://mastodon.social/@Gargron"
{{/* Used to render all list pages other than the index. */}}
<html>
<head>
{{ partial "head.html" . }}
<title>{{ .Page.Title }} </title>
</head>
<body>
{{ partial "header.html" . }}
<div class="intro">
<div class="container">
<img src="/logo.png" alt="Mastodon" />
<h1>{{ .Page.Title }}</h1>
</div>
</div>
<div class="container">
<ul class="thumbnail-grid h-feed">
{{ range .Paginator.Pages }}
<li class="h-entry">{{ .Render "summary" }}</li>
{{ end }}
</ul>
{{ template "_internal/pagination.html" . }}
</div>
<div class="container" style="margin-bottom: 30px">
{{ partial "cta.html" . }}
</div>
{{ partial "footer.html" . }}
</body>
</html>
{{/* Used to render all content pages other than the index. */}}
<html>
<head>
{{ partial "head.html" . }}
<title>{{ .Page.Title }} </title>
</head>
<body>
{{ partial "header.html" . }}
<div class="article h-entry">
<div class="container">
<header class="article-header">
<h1>{{ .Page.Title }}</h1>
{{ if isset .Params "subtitle" }}
<h2>{{ .Params.subtitle }}</h2>
{{ end }}
{{ if isset .Params "hero" }}
<div class="image-large">
<img src="{{ .Params.hero }}" alt="" />
</div>
{{ end }}
</header>
<main>
{{ .Content }}
</main>
<footer class="article-footer">
{{ partial "entry_nav.html" . }}
</footer>
</div>
</div>
<div class="container">
{{ partial "cta.html" . }}
</div>
<div class="related-articles container">
{{ partial "related.html" . }}
</div>
{{ partial "footer.html" . }}
</body>
</html>
<a class="cover" href="{{ .RelPermalink }}" rel="bookmark">
<div class="overlay">
<h2>{{ .Title }}</h2>
</div>
</a>
<div class="article-information">
<div class="author">
{{ if isset .Params "author" }}
{{ $author := index .Site.Data.authors .Params.author }}
<strong>
{{ $author.name }}
<span>&nbsp;</span>
<a href="{{ $author.social.mastodon }}">
<i class="fab fa-mastodon"></i>
</a>
</strong>
{{ else }}
Unknown
{{ end }}
</div>
<time datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">
{{ .Date.Format "Jan 2, 2006" }}
</time>
<div class="summary">{{ .Summary }}</div>
</div>
{{/* Used to render the list of posts on the index page. */}}
<html>
<head>
{{ partial "head.html" . }}
<title>Official Mastodon Blog</title>
</head>
<body>
{{ partial "header.html" . }}
<div class="intro">
<div class="container">
<img src="/logo.png" alt="Mastodon" />
<h1>Official Mastodon Blog</h1>
</div>
</div>
<div class="container">
{{ .Content }}
<ul class="thumbnail-grid h-feed">
{{ range .Paginator.Pages }}
<li>{{ .Render "summary" }}</li>
{{ end }}
</ul>
{{ template "_internal/pagination.html" . }}
</div>
<div class="container" style="margin-bottom: 30px">
{{ partial "cta.html" . }}
</div>
{{ partial "footer.html" . }}
</body>
</html>
<div class="cta-banner">
<h4>Join the social media revolution</h4>
<p>Mastodon is a free, decentralized platform with over a million people</p>
<a href='https://joinmastodon.org/#getting-started'>Join Mastodon now!</a>
</div>
{{ if gt ( len ( where .Site.RegularPages "Section" .Section ) ) 1 }}
<nav class='entry-nav'>
{{- if .PrevInSection -}}
<div class='prev-entry sep-before'>
<a href='{{ .PrevInSection.Permalink | relURL }}'>