Skip to content
Choose a tag to compare


@Gargron Gargron released this
Choose a tag to compare


Note: This is a release candidate. It is intended to be stable, but not guaranteed.

Breaking changes

  • Remove OStatus support
    • Please use ActivityPub instead
  • Remove deprecated REST API GET /api/v1/search API
    • Please use GET /api/v2/search instead
  • Remove deprecated REST API GET /api/v1/statuses/:id/card
    • Please use the card attribute on statuses instead
  • Remove deprecated REST API POST /api/v1/notifications/dismiss?id=:id
    • Please use POST /api/v1/notifications/:id/dismiss instead
  • Remove deprecated REST API GET /api/v1/timelines/direct
    • Please use GET /api/v1/conversations instead




  • Change conversations UI (Gargron)
  • Change dashboard to short number notation (noellabo, noellabo)
  • Change REST API GET /api/v1/timelines/public to require authentication when public preview is off (ThibG)
  • Change REST API POST /api/v1/follow_requests/:id/(approve|reject) to return relationship (ThibG)
  • Change rate limit for media proxy (ykzts)
  • Change unlisted custom emoji to not appear in autosuggestions (Gargron)
  • Change max length of media descriptions from 420 to 1500 characters (Gargron, ThibG)
  • Change deletes to preserve soft-deleted statuses in unresolved reports (Gargron)
  • Change tootctl to use inline parallelization instead of Sidekiq (Gargron)
  • Change account deletion page to have better explanations (Gargron, Gargron)
  • Change hashtag component in web UI to show numbers for 2 last days (Gargron, Gargron, Gargron)
  • Change OpenGraph description on sign-up page to reflect invite (Gargron)
  • Change layout of public profile directory to be the same as in web UI (Gargron)
  • Change detailed status child ordering to sort self-replies on top (ThibG)
  • Change window resize handler to switch to/from mobile layout as soon as needed (ThibG)
  • Change icon button styles to make hover/focus states more obvious (ThibG)
  • Change contrast of status links that are not mentions or hashtags (ThibG)
  • Change hashtags to preserve first-used casing (Gargron, Gargron, Gargron, Gargron, Gargron)
  • Change unconfirmed user login behaviour (Gargron, ThibG, Gargron)
  • Change single-column mode to scroll the whole page (Gargron, Gargron, Gargron, ThibG, Gargron, Gargron, ThibG, Gargron)
  • Change tootctl accounts follow to only work with local accounts (angristan)
  • Change Dockerfile (Shleeble, ykzts, Shleeble)
  • Change supported Node versions to include v12 (abcang)
  • Change Portuguese language from pt to pt-PT (Gargron)


  • Remove OStatus support (Gargron, Gargron, Gargron, ThibG, ThibG)
  • Remove Atom feeds and old URLs in the form of GET /:username/updates/:id (Gargron)
  • Remove WebP support (angristan)
  • Remove deprecated config options from Heroku and Scalingo (ykzts)
  • Remove deprecated REST API GET /api/v1/search API (Gargron)
  • Remove deprecated REST API GET /api/v1/statuses/:id/card (Gargron)
  • Remove deprecated REST API POST /api/v1/notifications/dismiss?id=:id (Gargron)
  • Remove deprecated REST API GET /api/v1/timelines/direct (Gargron)


  • Fix manifest warning (ykzts)
  • Fix admin UI for custom emoji not respecting GIF autoplay preference (ThibG)
  • Fix page body not being scrollable in admin/settings layout (Gargron)
  • Fix placeholder colors for inputs not being explicitly defined (Gargron)
  • Fix incorrect enclosure length in RSS (tsia)
  • Fix TOTP codes not being filtered from logs during enabling/disabling (Gargron)
  • Fix webfinger response not returning 410 when account is suspended (Gargron)
  • Fix ActivityPub Move handler queuing jobs that will fail if account is suspended (Gargron)
  • Fix SSO login not using existing account when e-mail is verified (Gargron)
  • Fix web UI allowing uploads past status limit via drag & drop (Gargron)
  • Fix expiring polls not being displayed as such in web UI (ThibG)
  • Fix 2FA challenge and password challenge for non-database users (Gargron, Gargron)
  • Fix profile fields overflowing page width in web UI (Gargron)
  • Fix web push subscriptions being deleted on rate limit or timeout (Gargron)
  • Fix display of long poll options in web UI (ThibG, ThibG)
  • Fix search API not resolving URL when type is given (Gargron)
  • Fix hashtags being split by ZWNJ character (Gargron)
  • Fix scroll position resetting when opening media modals in web UI (Gargron)
  • Fix duplicate HTML IDs on about page (ThibG)
  • Fix admin UI showing superfluous reject media/reports on suspended domain blocks (ThibG)
  • Fix ActivityPub context not being dynamically computed (ThibG)
  • Fix Mastodon logo style on hover on public pages' footer (ThibG)
  • Fix height of dashboard counters (ThibG)
  • Fix custom emoji animation on hover in web UI directory bios (ThibG)
  • Fix non-numbers being passed to Redis and causing an error (Gargron)
  • Fix error in REST API for an account's statuses (Gargron)
  • Fix uncaught error when resource param is missing in Webfinger request (Gargron)
  • Fix uncaught domain normalization error in remote follow (Gargron)
  • Fix uncaught 422 and 500 errors (Gargron, Gargron)
  • Fix uncaught parameter missing exceptions and missing error templates (Gargron)
  • Fix encoding error when checking e-mail MX records (Gargron)
  • Fix items in StatusContent render list not all having a key (ThibG)
  • Fix remote and staff-removed statuses leaving media behind for a day (Gargron)
  • Fix CSP needlessly allowing blob URLs in script-src (ThibG)
  • Fix ignoring whole status because of one invalid hashtag (Gargron)
  • Fix hidden statuses losing focus (ThibG)
  • Fix loading bar being obscured by other elements in web UI (Gargron)
  • Fix multiple issues with replies collection for pages further than self-replies (ThibG)
  • Fix blurhash and autoplay not working on public pages (Gargron)
  • Fix 422 being returned instead of 404 when POSTing to unmatched routes (Gargron, Gargron)
  • Fix client-side resizing of image uploads (ThibG)
  • Fix short number formatting for numbers above million in web UI (Gargron)
  • Fix ActivityPub and REST API queries setting cookies and preventing caching (ThibG, ThibG, ThibG, ThibG)
  • Fix some emojis in profile metadata labels are not emojified. (kedamaDQ)
  • Fix account search always returning exact match on paginated results (Gargron)
  • Fix acct URIs with IDN domains not being resolved (Gargron)
  • Fix admin dashboard missing latest features (Gargron)
  • Fix jumping of toot date when clicking spoiler button (ariasuni)
  • Fix boost to original audience not working on mobile in web UI (ThibG)
  • Fix handling of webfinger redirects in ResolveAccountService (ThibG)
  • Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker (Gargron)
  • Fix support for HTTP proxies (ThibG)
  • Fix HTTP requests to IPv6 hosts (ThibG)
  • Fix error in ElasticSearch index import (mayaeh)
  • Fix duplicate account error when seeding development database (ysksn)
  • Fix performance of session clean-up scheduler (abcang)
  • Fix older migrations not running (zunda)
  • Fix URLs counting towards RTL detection (ahangarha)
  • Fix unnecessary status re-rendering in web UI (ThibG)
  • Fix http_parser.rb gem not being compiled when no network available (petabyteboy)

Upgrade notes

As always, make sure you have backups of the database before performing any upgrades. If you are using docker-compose, this is how a backup command might look: docker exec mastodon_db_1 pg_dump -Fc -U postgres postgres > name_of_the_backup.dump

Non-Docker only:

  • The recommended Ruby version has been bumped to 2.6.4. You can upgrade, or you can continue using the old version by overwriting the .ruby-version file with e.g. 2.6.1 or 2.5.3 which were recommended previously
  • Install dependencies: bundle install and yarn install

Both Docker and non-Docker:

  1. Run the pre-deployment database migrations by specifying the SKIP_POST_DEPLOYMENT_MIGRATIONS=true environment variable:
    • Non-Docker: SKIP_POST_DEPLOYMENT_MIGRATIONS=true RAILS_ENV=production bundle exec rails db:migrate
    • Docker: docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web rails db:migrate
  2. Precompile the assets:
    • Non-Docker: RAILS_ENV=production bundle exec rails assets:precompile
    • Docker: The assets are already precompiled during the build step
  3. Restart all Mastodon processes
  4. Clear cache:
    • Non-Docker: RAILS_ENV=production bin/tootctl cache clear
    • Docker: docker-compose run --rm web bin/tootctl cache clear
  5. Now that the new code is running, we can finish the database migrations. This will run the post-deployment ones:
    • Non-Docker: RAILS_ENV=production bundle exec rails db:migrate
    • Docker: docker-compose run --rm web rails db:migrate
  6. Restart all Mastodon processes
  7. If you are using ElasticSearch, there are new indices to be deployed (this step is likely to take a considerable amount of time, so running it through screen or tmux is advisable):
    • Non-Docker: RAILS_ENV=production bin/tootctl search deploy
    • Docker: docker-compose run --rm web bin/tootctl search deploy


  • Zoltán Gera (Hungarian)
  • Kristijan Tkalec (Slovenian)
  • Evert Prants (Estonian)
  • borys_sh (Ukrainian)
  • Muha Aliss (Turkish)
  • 唐宗勛 (Chinese Simplified)
  • Jeong Arm (Korean; Esperanto; Japanese)
  • Roboron (Spanish)
  • Osoitz (Basque)
  • ButterflyOfFire (French; Arabic)
  • Alix Rossi (Corsican; French)
  • Aditoo17 (Czech)
  • Masoud Abkenar (Persian)
  • Xosé M. (Galician)
  • Koyu Berteon (German)
  • Maya Minatsuki (Japanese)
  • d5Ziif3K (Ukrainian)
  • Thai Localization (Thai)
  • Marek Ľach (Slovak; Polish)
  • lamnatos (Greek)
  • atarashiako (Chinese Simplified)
  • 101010 (Polish)
  • Jeroen (Dutch)
  • silkevicious (Italian)
  • Diluns (Occitan)
  • Jaz-Michael King (Welsh)
  • spla (Catalan)
  • FédiQuébec (French)
  • tykayn (French)
  • carolinagiorno (Portuguese, Brazilian)
  • Alessandro Levati (Italian)
  • taoxvx (Danish)
  • shioko (Chinese Simplified)
  • Yi-Jyun Pan (Chinese Traditional)
  • Emyn Nant Nefydd (Welsh)
  • Sasha Sorokin (Russian)
  • Tiago Epifânio (Portuguese)
  • dxwc (Bengali)
  • liffon (Swedish)
  • Vanege (Esperanto)
  • kat (Ukrainian; Russian)
  • oti4500 (Hungarian; Ukrainian)
  • Juan José Salvador Piedra (Spanish)
  • diazepan (Spanish)
  • christalleras (Norwegian Nynorsk)
  • Saederup92 (Danish)
  • sabri (Spanish)
  • Stasiek Michalski (Polish)
  • Dewi (Breton; French)
  • oɹʇuʞ (Spanish, Argentina)
  • ariasuni (French)
  • AW Unad (Indonesian)
  • Ray (Spanish)
  • Unmual (Spanish)
  • Ryo (Korean)
  • juanda097 (Spanish)
  • ruine (Japanese)
  • MadeInSteak (Finnish)
  • frumble (German)
  • dragnucs2 (Arabic)
  • erikstl (Esperanto)
  • PPNplus (Thai)
  • EPEMA YT (German)
  • Rhys Harrison (Esperanto)
  • KEINOS (Japanese)
  • JzshAC (Chinese Simplified)
  • Rintan1 (Japanese)
  • hiphipvargas (Portuguese)
  • tctovsli (Norwegian Nynorsk)
  • SamitiMed (Thai)
  • vjasiegd (Polish)
  • Adrián Lattes (Spanish)
  • Renato "Lond" Cerqueira (Portuguese, Brazilian)
  • filippodb (Italian)
  • Marcin Mikołajczak (Polish)
  • 森の子リスのミーコの大冒険 (Japanese)
  • Hinaloe (Japanese)
  • Sahak Petrosyan (Armenian)
  • Daniel Dimitrov (Bulgarian)
  • Hugh Liu (Chinese Simplified)
  • Rakino (Chinese Simplified)
  • SnDer (Dutch)
  • eichkat3r (German)
  • Karol Kosek (Polish)
  • Akarshan Biswas (Bengali)
  • Tradjincal (French)
  • sergioaraujo1 (Portuguese, Brazilian)
  • mmokhi (Persian)
  • Evgeny Petrov (Russian)
  • JackXu (Chinese Simplified)
  • Zoé Bőle (German)
  • Lukas Fülling (German)
  • Dremski (Bulgarian)
  • cybergene (Japanese)
  • OpenAlgeria (Arabic)
  • 硫酸鶏 (Japanese)
  • Cutls (Japanese)
  • Ch. (Korean)
  • skaaarrr (German)
  • djoerd (Dutch)
  • さっかりんにーさん (Japanese)
  • Abijeet Patro (Basque)