Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
a3a6487
New Crowdin Translations (automated) (#40218)
github-actions[bot] Aug 21, 2026
9831c5a
Bump version to v4.7.0 (#40231)
ClearlyClaire Aug 21, 2026
1f5adeb
Redesign: Add 'navigation' type to Menu component (#40222)
diondiondion Aug 21, 2026
0e4c2dc
Replace `__dirname` with `import.meta.dirname` in vite config (#40223)
mjankowski Aug 21, 2026
72baf43
Redesign: Add account navigation menu (#40224)
diondiondion Aug 21, 2026
4529926
Redesign: Change heading font to Cal Sans UI (#40233)
diondiondion Aug 21, 2026
a7f2e22
Stop scheduling the `RepairRemoteCollectionsScheduler` (#39887)
ClearlyClaire Aug 21, 2026
ea123f3
Remove deprecated `tootctl accounts fix-duplicate` command (#40232)
ClearlyClaire Aug 21, 2026
c6a148c
Composer redesign: Tile message background image (#40234)
ChaosExAnima Aug 21, 2026
5041572
Add RACK_COMPRESS env to enable Rack::Deflater middleware (#39927)
shleeable Aug 21, 2026
3737cf5
Redesign: Card component (#40227)
ChaosExAnima Aug 21, 2026
450e1a7
Redesign: Move notifications, messages, saved into nav footer (#40240)
diondiondion Aug 21, 2026
2f40549
Redesign: Add admin/moderation links, fix relationships link (#40244)
diondiondion Aug 21, 2026
c3eadc8
Prefer autoload to require in misc `app/` files (#40243)
mjankowski Aug 24, 2026
3fb0d03
Fix email blocks domain filter not being kept through pagination (#40…
ClearlyClaire Aug 24, 2026
2bd80bd
New Crowdin Translations (automated) (#40246)
github-actions[bot] Aug 24, 2026
192fc7d
Add validation assertion in `AccountWarningPreset` model spec (#40242)
mjankowski Aug 24, 2026
45db0ba
Add the `config/` directory to Bootsnap precompilation in Dockerfile …
ClearlyClaire Aug 24, 2026
68fb4de
Redesign: Add "custom feeds" and "followed hashtags" sections to main…
diondiondion Aug 24, 2026
7e3bd2e
Add counters for which features result in users following each other …
Gargron Aug 24, 2026
71504e6
Add more features to feature usage counter (#40258)
Gargron Aug 24, 2026
98c7b86
Redesign: Auto-focus search when opening Explore from new navigation …
diondiondion Aug 24, 2026
1bb1aba
Redesign: Add new tonal variant button (#40262)
ChaosExAnima Aug 24, 2026
9b7ba58
Redesign: Remove old navigation in single-column mode (#40249)
diondiondion Aug 24, 2026
2e1e96e
Redesign: Change account menu link to "Edit profile" (#40265)
diondiondion Aug 24, 2026
d9a5fe4
Redesign: Add app icon to navigation header (#40270)
diondiondion Aug 25, 2026
9e7f369
Fix search being auto-focused randomly (#40271)
diondiondion Aug 25, 2026
868ea99
Fix description text overflowing on Overview landing page (#40272)
diondiondion Aug 25, 2026
e685d00
New Crowdin Translations (automated) (#40268)
github-actions[bot] Aug 25, 2026
e3d8f5c
Allow moderators and admins to see media reports of suspended account…
jhbabon Aug 25, 2026
d79f2c5
Fix account creation failing on ActiveRecord::Encryption configuratio…
ClearlyClaire Aug 25, 2026
8a64fab
New Crowdin Translations (automated) (#40280)
github-actions[bot] Aug 26, 2026
d097491
Update rubocop to version 1.90.0 (#40260)
mjankowski Aug 26, 2026
d30ae91
Redesign: Add navigation scroll fades (#40286)
diondiondion Aug 26, 2026
3f22a7b
Update dependency ox to v2.14.29 (#40098)
renovate[bot] Aug 26, 2026
98d171b
Update dependency ioredis to v6 (#40013)
renovate[bot] Aug 26, 2026
47ac677
Composer redesign: useScrollSensor (#40287)
ChaosExAnima Aug 26, 2026
dc317af
Make some of 4.7 migrations more resilient to being interrupted (#40264)
ClearlyClaire Aug 27, 2026
68f71e3
New Crowdin Translations (automated) (#40292)
github-actions[bot] Aug 27, 2026
c37a05d
Use bundler version 4.0.19 (#40261)
mjankowski Aug 27, 2026
7cab718
Redesign: Add logged-out state for navigation (#40288)
diondiondion Aug 27, 2026
2798c08
Composer redesign: Autocomplete (#40276)
ChaosExAnima Aug 27, 2026
bafbdd4
Composer redesign: Update language picker and toolbar button design (…
ChaosExAnima Aug 27, 2026
2e5a80a
New Crowdin Translations (automated) (#40303)
github-actions[bot] Aug 28, 2026
37abf08
Composer redesign: Restrict width and fix autosuggest scroll (#40297)
ChaosExAnima Aug 28, 2026
99ce391
Redesign: Add mobile navigation bar (#40304)
diondiondion Aug 28, 2026
1dddf27
Redesign: Change navigation wording to title-case (#40305)
diondiondion Aug 28, 2026
e6f117d
Add some spec coverage (#40306)
ClearlyClaire Aug 28, 2026
fd70a5a
Redesign: Tweak button sizes (#40308)
diondiondion Aug 28, 2026
c6450d4
5.0: Fixes bugs with menu items (#40319)
ChaosExAnima Aug 28, 2026
b7cf8dc
Redesign: Add mobile navigation menu (#40318)
diondiondion Aug 28, 2026
c9537f1
5.0: Border tokens (#40317)
ChaosExAnima Aug 28, 2026
0f1610a
Composer redesign: Quote post start (#40315)
ChaosExAnima Aug 28, 2026
6f49b98
5.0: Adds CaretIcon component (#40320)
ChaosExAnima Aug 28, 2026
b59ddc7
Typo: Update useHandlersForStatus to reference account.id in hooks.ts…
shleeable Aug 28, 2026
82b08bc
Merge remote-tracking branch 'parent/main' into upstream-20260830
kmycode Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

All notable changes to this project will be documented in this file.

## [4.7.0] - UNRELEASED
## [4.7.0] - 2026-08-20

### Added

Expand Down Expand Up @@ -39,6 +39,10 @@ All notable changes to this project will be documented in this file.

### Fixed

- Fix autosuggestions overstaying their welcome in languages that don't use spaces (#40217 by @Gargron)
- Fix error when processing remote actors with `null` public keys (#40194 by @ClearlyClaire)
- Fix various off-by-one errors in statistics time ranges (#40193 by @ClearlyClaire)
- Fix `/deck` being removed from path when resizing window (#40180 by @ClearlyClaire)
- Fix error in `tootctl media refresh` when cleaning some incompletely processed files (#40056 by @shleeable)
- Fix plain-text formatter not treating `<BR>` as newline (#40079 by @shleeable)
- Fix performance of listing follow requests by adding appropriate index (#40033 by @ClearlyClaire)
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ RUN \

RUN \
# Precompile bootsnap code for faster Rails startup
bundle exec bootsnap precompile --gemfile app/ lib/;
bundle exec bootsnap precompile --gemfile app/ lib/ config/;

RUN \
# Pre-create and chown system volume to Mastodon user
Expand Down
36 changes: 18 additions & 18 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ GEM
ast (2.4.3)
attr_required (1.0.2)
aws-eventstream (1.4.0)
aws-partitions (1.1279.0)
aws-partitions (1.1281.0)
aws-sdk-core (3.254.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
Expand Down Expand Up @@ -276,12 +276,12 @@ GEM
raabro (~> 1.4)
globalid (1.4.0)
activesupport (>= 6.1)
google-protobuf (4.35.1)
google-protobuf (4.36.0)
bigdecimal
rake (~> 13.3)
googleapis-common-protos-types (1.23.0)
google-protobuf (~> 4.26)
haml (7.3.0)
haml (7.4.1)
prism (>= 1.1.0)
temple (>= 0.8.2)
thor
Expand All @@ -291,7 +291,7 @@ GEM
activesupport (>= 5.1)
haml (>= 4.0.6)
railties (>= 5.1)
haml_lint (0.77.0)
haml_lint (0.78.0)
haml (>= 5.0)
parallel (>= 1.10)
rainbow
Expand Down Expand Up @@ -341,7 +341,7 @@ GEM
inline_svg (1.10.0)
activesupport (>= 3.0)
nokogiri (>= 1.6)
io-console (0.8.2)
io-console (0.9.2)
ipaddr (1.2.9)
irb (1.18.0)
pp (>= 0.6.0)
Expand Down Expand Up @@ -582,7 +582,7 @@ GEM
opentelemetry-api (~> 1.0)
orm_adapter (0.5.0)
ostruct (0.6.3)
ox (2.14.28)
ox (2.14.29)
bigdecimal (>= 3.0)
parallel (2.1.0)
parser (3.3.12.0)
Expand All @@ -600,7 +600,7 @@ GEM
mime-types (>= 3.0)
pp (0.6.4)
prettyprint
premailer (1.29.0)
premailer (1.30.0)
addressable
css_parser (>= 1.19.0)
htmlentities (>= 4.0.0)
Expand Down Expand Up @@ -684,7 +684,7 @@ GEM
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.4.2)
rbs (4.1.3)
rbs (4.2.0)
logger
prism (>= 1.6.0)
tsort
Expand Down Expand Up @@ -754,8 +754,8 @@ GEM
rspec-mocks (~> 3.0)
sidekiq (>= 5, < 9)
rspec-support (3.13.7)
rubocop (1.89.0)
json (~> 2.3)
rubocop (1.90.0)
json (>= 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (>= 1.10)
Expand Down Expand Up @@ -802,7 +802,7 @@ GEM
ruby-vips (2.3.0)
ffi (~> 1.12)
logger
rubyzip (3.4.1)
rubyzip (3.5.0)
rufus-scheduler (3.9.2)
fugit (~> 1.1, >= 1.11.1)
safety_net_attestation (0.5.0)
Expand All @@ -816,7 +816,7 @@ GEM
securerandom (0.4.1)
shoulda-matchers (8.0.1)
activesupport (>= 7.2)
sidekiq (8.1.6)
sidekiq (8.1.7)
connection_pool (>= 3.0.0)
json (>= 2.16.0)
logger (>= 1.7.0)
Expand Down Expand Up @@ -844,7 +844,7 @@ GEM
stackprof (0.2.28)
starry (0.2.0)
base64
stoplight (5.8.2)
stoplight (5.8.3)
concurrent-ruby
zeitwerk
strong_migrations (2.8.0)
Expand All @@ -856,17 +856,17 @@ GEM
faraday (~> 2.0)
faraday-follow_redirects
sysexits (1.2.0)
temple (0.10.6)
temple (0.10.7)
terminal-table (4.0.0)
unicode-display_width (>= 1.1.1, < 4)
terrapin (1.1.1)
climate_control
test-prof (1.6.3)
logger
thor (1.5.0)
tilt (2.8.0)
tilt (2.9.0)
timeout (0.6.1)
tpm-key_attestation (0.14.1)
tpm-key_attestation (0.14.2)
bindata (~> 2.4)
openssl (> 2.0)
openssl-signature_algorithm (~> 1.0)
Expand Down Expand Up @@ -913,7 +913,7 @@ GEM
activesupport
faraday (~> 2.0)
faraday-follow_redirects
webmock (3.26.2)
webmock (3.26.3)
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
Expand Down Expand Up @@ -1091,4 +1091,4 @@ RUBY VERSION
ruby 4.0.6

BUNDLED WITH
4.0.18
4.0.19
6 changes: 6 additions & 0 deletions app/controllers/admin/base_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ class BaseController < ApplicationController
include Authorization
include AccountableConcern

content_security_policy do |p|
policy = ContentSecurityPolicy.new
p.img_src(*p.img_src, *policy.admin_media_hosts)
p.media_src(*p.media_src, *policy.admin_media_hosts)
end

layout 'admin'

before_action :require_moderator_or_admin_permissions
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/admin/email_domain_blocks_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def create

def filter_by_domain
scope = EmailDomainBlock.parents.includes(:children).order(id: :desc)
scope.merge!(EmailDomainBlock.matches_domain(params[:domain])) if params[:domain].present?
scope.merge!(EmailDomainBlock.matches_domain(params[:by_domain])) if params[:by_domain].present?
scope
end

Expand Down
2 changes: 0 additions & 2 deletions app/controllers/admin/export_domain_allows_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# frozen_string_literal: true

require 'csv'

module Admin
class ExportDomainAllowsController < BaseController
include Admin::ExportControllerConcern
Expand Down
2 changes: 0 additions & 2 deletions app/controllers/admin/export_domain_blocks_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# frozen_string_literal: true

require 'csv'

module Admin
class ExportDomainBlocksController < BaseController
include Admin::ExportControllerConcern
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/api/v1/accounts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def create
end

def follow
follow = FollowService.new.call(current_user.account, @account, reblogs: params.key?(:reblogs) ? truthy_param?(:reblogs) : nil, notify: params.key?(:notify) ? truthy_param?(:notify) : nil, languages: params.key?(:languages) ? params[:languages] : nil, with_rate_limit: true)
follow = FollowService.new.call(current_user.account, @account, reblogs: params.key?(:reblogs) ? truthy_param?(:reblogs) : nil, notify: params.key?(:notify) ? truthy_param?(:notify) : nil, languages: params.key?(:languages) ? params[:languages] : nil, with_rate_limit: true, ref: params[:ref])
options = if @account.locked? || current_user.account.silenced? || (current_user.account.bot? && @account.user&.setting_lock_follow_from_bot)
{}
else
Expand Down
4 changes: 2 additions & 2 deletions app/controllers/media_proxy_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def reject_media?
end

def media_attachment_file_path
if @media_attachment.discarded?
if @media_attachment.on_hold?
expiring_asset_url(media_attachment_file, 10.minutes)
else
full_asset_url(media_attachment_file.url(attachment_style))
Expand All @@ -76,6 +76,6 @@ def preview_requested?
end

def requires_file_streaming?
Paperclip::Attachment.default_options[:storage] == :filesystem && @media_attachment.discarded?
Paperclip::Attachment.default_options[:storage] == :filesystem && @media_attachment.on_hold?
end
end
2 changes: 0 additions & 2 deletions app/controllers/settings/imports_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# frozen_string_literal: true

require 'csv'

class Settings::ImportsController < Settings::BaseController
before_action :set_bulk_import, only: [:show, :confirm, :destroy]
before_action :set_recent_imports, only: [:index]
Expand Down
3 changes: 1 addition & 2 deletions app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,8 @@ def render_initial_state
state_params[:owner] = Account.local.without_suspended.without_internal.first if single_user_mode?

json = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(state_params), serializer: InitialStateSerializer).to_json
# rubocop:disable Rails/OutputSafety
# rubocop:disable-next Rails/OutputSafety
content_tag(:script, json_escape(json).html_safe, id: 'initial-state', type: 'application/json')
# rubocop:enable Rails/OutputSafety
end

def grouped_scopes(scopes)
Expand Down
3 changes: 1 addition & 2 deletions app/helpers/statuses_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,7 @@ def render_seo_schema(status)
adapter: SEO::Adapter
).to_json

# rubocop:disable Rails/OutputSafety
# rubocop:disable-next Rails/OutputSafety
content_tag(:script, json_escape(json).html_safe, type: 'application/ld+json')
# rubocop:enable Rails/OutputSafety
end
end
3 changes: 1 addition & 2 deletions app/helpers/wrapstodon_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ def render_wrapstodon_share_data(report)

json_string = payload.to_json

# rubocop:disable Rails/OutputSafety
# rubocop:disable-next Rails/OutputSafety
content_tag(:script, json_escape(json_string).html_safe, type: 'application/json', id: 'wrapstodon-data')
# rubocop:enable Rails/OutputSafety
end
end
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
Copyright 2017 The Syne Project Authors (https://gitlab.com/bonjour-monde/fonderie/syne-typeface)
Copyright (c) 2025, Mark Davis <mark@wordmark.nyc> <https://www.designermarkdavis.com>,
with Font "Cal Sans UI" and “Cal Sans Text”. Commissioned by Peer Richelsen for Cal.com <https://refer.cal.com/davis>.

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
http://scripts.sil.org/OFL


-----------------------------------------------------------
Expand Down
Binary file not shown.
Binary file added app/javascript/fonts/inter/inter-medium.woff2
Binary file not shown.
Binary file not shown.
Binary file removed app/javascript/fonts/inter/inter-semibold.woff2
Binary file not shown.
Binary file removed app/javascript/fonts/syne/syne-bold.woff2
Binary file not shown.
9 changes: 8 additions & 1 deletion app/javascript/images/composer_message.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions app/javascript/images/icons/icon_fediverse.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions app/javascript/mastodon/actions/accounts.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ export function fetchAccountFail(id, error) {
* @param {Object} options
* @param {boolean} [options.reblogs]
* @param {boolean} [options.notify]
* @param {string} [options.ref]
* @returns {function(): void}
*/
export function followAccount(id, options = { reblogs: true }) {
Expand Down
3 changes: 2 additions & 1 deletion app/javascript/mastodon/api/accounts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ export const apiSubmitAccountNote = (id: string, value: string) =>
export const apiFollowAccount = (
id: string,
params?: {
reblogs: boolean;
reblogs?: boolean;
ref?: string;
},
) =>
apiRequestPost<ApiRelationshipJSON>(`v1/accounts/${id}/follow`, {
Expand Down
1 change: 1 addition & 0 deletions app/javascript/mastodon/api_types/instance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export interface ApiInstanceJSON {
description: string;
versions?: Record<string, string>;
};
icon: { src: string; size: string }[];
contact: {
email: string | null;
account: ApiAccountJSON | null;
Expand Down
Loading
Loading