Skip to content


Choose a tag to compare
@Gargron Gargron released this 18 Oct 16:16


Breaking changes:

  • All id attributes in the REST API responses, including attributes that end in _id, are now returned as strings instead of integers. This is because large integers cannot be encoded in JSON losslessly, and all IDs in Mastodon are now bigint. Some apps will not work with this release until they are updated
  • Mastodon will no longer deliver private and direct statuses to OStatus-based recipients (that means pre-1.6.0 Mastodon, too)
  • Stylesheet customizations now work differently due to the new theme feature. See upgrade notes for details.


Custom emoji (#4988, #5243, #5258, #5002)

Admins may upload 50KB PNG images and assign them shortcodes. These images act as custom emojis that can be embedded inline in statuses using those shortcodes, like :example:. The emojis display correctly between different instances, but users can only use their local emojis. However, it is simple enough to make a local copy of a desired emoji.

Admins may disable individual remote emojis from being displayed on their instance. The domain block reject media option also works on them.

Add support for multiple themes (#4959, #5336)

Besides the old custom.scss way, admins may install additional themes. When more than one theme is installed, the option to select your preference appears in user's preferences.

Replace EmojiOne emoji pack with Twemoji (#5046)

The newer releases of EmojiOne have switched their license and availability. To get access to all the latest standard emojis, we switched packs to Twemoji, which has a more permissive license, which is used by Twitter and Discord.

Add emoji autosuggestions (#5053)

When beginning to type a shortcode, an autosuggestion appears instantly, like for usernames. Upon selection it inserts the unicode character into the text. Entering a standard emoji's shortcode and leaving it as such now is interpreted as you meaning to leave it as plain text, it will not be converted to unicode server-side to avoid garbling code and IPv6 addresses that contain syntax that is similar to shortcodes.

New emoji picker (#5046, #5275)

The emoji picker has been improved. It will display your instances's custom emojis as well as keep track of the emojis you use frequently and your selected skin tone modifier.

New error page graphic. Other error page improvements (#5067, #5099)

The 500 error page is now generated during the assets:precompile rake task, meaning that it can use the same stylesheets and assets as the rest of the application. The loading of external Google Fonts was removed from the page. Custom style adjustments will also work on it now. And there's a new elephant graphic on it.

Better primary ID generation (#4801, #5260)

The so-called Snowflake algorithm of generating primary IDs for statuses is used now. It includes timestamps in the ID, making it possible to sort items chronologically regardless of when they were actually inserted into the database, without giving up performance or the uniqueness required for keyset pagination. It also makes it harder to guess how large someone's database table truly is. When resolving old statuses from other instances, such as for boosts, search or thread resolving, this means that newly resolved old statuses will no longer appear at the top of public timelines.

Hotkeys in web UI (#5164)

The web UI can now be navigated and controlled with a variety of hotkeys.

For example, 1-9 will focus a corresponding column (skipping the compose drawer, that is). n will focus the compose textarea, while alt+n will not only focus it but also reset it. s will focus the search form.

When a timeline is focused, j/down-arrow and k/up-arrow move the focus down/up; o/enter expands the status, p opens the author's profile, r to reply, m to mention author, f to favourite, b to boost.

In terms of general navigation, backspace is bound to navigating backward. A quick combination of g and certain letters will take you to a particular page: s to start, h to home, n to notifications, l to local timeline, t to federated timeline, f to your favourites, u to your own profile, p to your pinned toots, b to your blocked users, m to your muted users.

Add ability to specify alternative text for media attachments (#5123)

After uploading a media attachment but before submitting the toot, the description of the upload can be specified to allow people who use screen readers to enjoy the upload, too. Up to 420 characters can be used.

Redesign public hashtag pages (#5237)

The public hashtag pages are used almost exclusively by non-logged-in users, so they should act more like landing pages. The updated design uses the same embedded timeline component as the frontpage, meaning there are auto-updates and infinite scroll and it looks more like what you get if you sign up. It also displays login and sign-up buttons on the side, as well as a few benefits of Mastodon.

Implement dynamic e-mail blacklist for admins (#5109)

Previously the only way to prevent an e-mail domain from being used by new sign-ups was to specify an environment variable and restart Mastodon. This does not work well enough. Now this setting can be changed inside the admin UI without restarting Mastodon, instead.


  • After 7 days of repeated delivery failures, give up on inbox delivery to reduce wasted effort (#5131)
  • Send streaming API delete to people mentioned in status, so they would get it even if they don't follow the author (#5103)
  • In detailed status view, display the attachment uncropped if there's only one of it (#5054)
  • When a streaming API status arrives, sort it into conversations live so you don't have to reload the conversation to see it (#5206)
  • New Material app icon for Chrome, new icons for iOS, Microsoft (#5291, #5321)
  • New API: GET /api/v1/apps/verify_credentials to confirm app works (#5112)
  • Reorganize preferences page (#5161, #4447)
  • Admins can now add moderation notes to accounts (#5240)
  • New preference for reducing animations in web UI to prevent motion sickness (#5393)

Upgrade notes:

Non-Docker only:

  • The recommended Ruby version has been bumped to 2.4.2. However, it is only a recommendation. If you would like to stay with 2.4.1, simply overwrite the value in .ruby-version
  • Dependency updates: bundle install and yarn install

Both Docker and non-Docker:

  • This release includes database migrations, that means you need to run RAILS_ENV=production bundle exec rails db:migrate (in Docker: docker-compose run --rm web rails db:migrate). Depending on your database size, this migration may take a long while! It may also lead to some downtime. Make sure you have backups. This is because we are upgrading a multitude of database columns from int to bigint to make sure they're future-proof.
  • This release includes changes to assets, that means you need to run RAILS_ENV=production bundle exec rails assets:precompile (in Docker: docker-compose run --rm web rails assets:precompile)


  • custom.scss is no longer automatically loaded because the feature has been reworked into themes. Change to default: styles/custom.scss in config/themes.yml to restore old behaviour


  • If you have upgraded to the master branch before v2.0.0rc1 and your custom emoji now fail to load, perform this rake task: RAILS_ENV=production bundle exec rake paperclip:refresh:thumbnails CLASS=CustomEmoji


  • Web UI: Make sure formatted numbers don't contain insignificant zeroes (#4993)
  • Bump recommended Ruby version to 2.4.2 (#4958)
  • Fix performance on stats queries (#4996)
  • OpenGraph: Fix error when generating OpenGraph tags for images without metadata (#4995)
  • ActivityPub: Add published property to activity for reblogs (#5000)
  • Re-allow final underscore in parsed URLs (#4999)
  • Web UI: Improve scrolling performance on Chrome (#5001)
  • Remove ubuntu-toolchain-r-test dependency (#5005)
  • Fix account records being read before processing finished (#4998)
  • Web UI: Hide sensitive image by default on the public pages (#5009)
  • ActivityPub: Use OrderedCollectionPage to return followers/following list (#4949)
  • Web UI: Improve scrolling performance in general (#5011, #5152)
  • Web UI: Fix remote statuses being html_encoded in public pages (#5012)
  • Fix race condition when processing incoming OStatus messages (#5013)
  • API: Change IDs to strings rather than numbers in API JSON output (#5019)
  • Web UI: Use file extensions in addition to MIME types for file picker (#5029)
  • Disable private status federation over OStatus (#5027)
  • Web UI: Reduce wasted renders (#5021, #5036)
  • Web UI: Improve mobile style of /about/more (#5034)
  • Web UI: Make dropdowns render into portal, expand animation (#5018, #5140)
  • Document REDIS_NAMESPACE (#5038)
  • Do not filter statuses with unknown languages (#5045)
  • Web UI: Fix overflowing tabs in account__action-bar (#5056)
  • Web UI: Fix media gallery CSS (#5064)
  • Web UI: Change mobile layout breakpoint from 1024px to 630px (#5063)
  • Suppress backtrace when failed to communicate with a remote instance (#5076)
  • Thread notification e-mails for mentions by conversation (#5061)
  • Web UI: Increase max height of preview card image (#5092)
  • Stop processing of payload if it originates from a local account (#5100)
  • API: When OAuth password verification fails, return 401 instead of redirect to login (#5111)
  • Web UI: Remove now redundant warnings about OStatus privacy (#5102)
  • Improve worker performance by flushing body when performing POST requests (#5128)
  • ActivityPub: If HTTP signature is wrong and webfinger cache is stale, retry with resolve (#5129)
  • Web UI: Improve performance of modal and swipe animations (#5135)
  • Change max redirects followed to 2 (#5136)
  • When using statsd to track Mastodon performance, it will now get more useful metrics (#5118)
  • Web UI: Upgrade to React 16 (#5119)
  • Web UI: Make emoji autosuggestions immediate, usernames appear sooner (#5149)
  • Fix bug with OpenStack v2 (#5155)
  • Fix order of paginated accounts on authorized followers page (#3357)
  • Mobile: Make Chrome splash screen the same color as web UI's background color for smoother transition (#5169)
  • Web UI: Toggle contain:strict on fullscreen (#5159)
  • Append confirmation link as plain text in e-mails (#5146)
  • Web UI: When muting someone, clear web UI of their content like for blocks (#5172)
  • Web UI: Fix emoji sequence bug in substring-trie (#5191)
  • Web UI: Compress and combine emoji data (#5201, #5229)
  • Improve HTTP responses for Salmon and ActivityPub inbox processing (#5200)
  • ActivityPub: Fix possible acct URI usurpation in account discovery (#5208)
  • Use separate workers to process imports, retry failures (#5207)
  • ActivityPub: Validate id of objects (#5114)
  • Web UI: Use own, shorter relative timestamps in web UI to save space (#5171)
  • OpenGraph: Use summary_large_image card only when media attachments present (#5219)
  • Web UI: Fix remote profile being displayed as HTML on remote follow page (#5249)
  • Improve error handling in LinkCrawlWorker (#5250)
  • Web UI: Fix overflowing (#5246)
  • Web UI: Show buffering in video player (#5261)
  • Web UI: Dynamically calculate card height for embeds instead of using CSS padding trick (#5265)
  • ActivityPub: Use object URI only in Announce, instead of embedding (#5266)
  • Fix pagination in blocks API (#5285)
  • Web UI: Center error layout (#5289)
  • Fix offline-plugin warning in dev mode (#5411)
  • Disable reblog counter for private toots (#5397)
  • Fix unreblogged toot being at wrong position in the home timeline (#5418)
  • Ensure that home feed regeneration after inactivity restores non-zero items (#5409)
  • Properly remove unreblogged toots from timelines by keeping references of all reblogs (#5419)
  • Web UI: Replace newlines in desktop notifications with spaces instead of removing them (#5361)
  • Allow unreblogging pre-ActivityPub reblogs (#5376)
  • ActivityPub: Fix remote status fetching for ActivityPub-only WEB_ACCOUNT users (#5372)
  • Web UI: Avoid confusing messaging: When unfollowing, remove toots from home in web UI immediately (#5369)
  • Web UI: Avoid confusing messaging: Do not try to guess why home timeline is empty in web UI (#5370)
  • Fix user sign in count updating on every request, optimize some queries (#5368)
  • Optimize Status#permitted_for 500x (account timeline) (#5373)
  • Make HTTP deliveries faster by closing connection right after posting (#5390)
  • Fix some failure cases when fetching link preview cards (#5347)
  • Web UI: Reduce discrepancies between server and client-side character count (#5360)
  • Fix reblog count increasing without reason (#5363)
  • Web UI: Fix React warning about tabIndex on status with CW (#5432)
  • Don't capture scheme-less URLs in the status (#5435)
  • When status is fetched instead of delivered, do not stream it (#5437)
  • Web UI: Fix unwanted content warning gap in CSS (#5436)
  • OpenGraph: OpenGraph tags on sign in and sign up pages (#5308)
  • Web UI: Only preload JS on /web pages (#5325)
  • Web UI: In thread view, only scroll on first update, and scroll to replied-to post (#5322)

Contributors to this release: