Posted on

Table of Contents

Shameless Advert

Join our open fedi relay! relay.disobey.net

Shameless Complaint

Why doesn't Mastodon gGmbH allow admins to change this in the GUI admin panel?

Introduction

I run the disobey.net and nautical.social Mastodon instances and I very much dislike the max character limitations in posts (toots) and in my profile bio(s). I've documented the changes i've made to increase the limits from 500 to 2000. I self-host Mastodon on a standalone server built from source, not Docker.

  • Mastodon v4.2.x needs steps 1 - 4 below.
  • Mastodon v4.3.0-rc.1 needs steps 1 and 4 only.

Mastodon v4.3.x notes

  • When updating Mastodon from v4.3.0-beta.1 to v4.3.0-beta.2, and from v4.3.0-beta.2 to v4.3.0-rc.1, I needed to "git stash" or "git reset --hard HEAD" my changes before updating. Then I needed to manually re-apply these max character count changes.
  • When updating from v4.3.0-beta.2 to v4.3.0-rc.1, I found that step 3 is no longer needed when reapplying these changes.
  • It appears that after completing the final step, specifically the restart, the UI displaying "500" takes about a minute to refresh to the updated number (like "2000" in my example).

Mastodon changes

All file editing below is from my Mastodon root directory, "~/live". Pay attention to any of my lines below that specify "2000", it used to say the default "500":

Post increase

Step 1

vim app/validators/status_length_validator.rb

class StatusLengthValidator < ActiveModel::Validator
  MAX_CHARS = 2000
  URL_PLACEHOLDER_CHARS = 23
  URL_PLACEHOLDER = 'x' * 23

Step 2

Step 2 is not needed in Mastodon v4.3.0-rc.1! Only steps 1 and 4 are needed. Skip to step 4.

vim app/javascript/mastodon/features/compose/components/compose_form.jsx

  canSubmit = () => {
    const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;
    const fulltext = this.getFulltextForCharacterCounting();
    const isOnlyWhitespace = fulltext.length !== 0 && fulltext.trim().length === 0;

    return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > 2000 || (isOnlyWhitespace && !anyMedia));
  };

and in the same compose_form.jsx file:

            <div className='character-counter__wrapper'>
              <CharacterCounter max={2000} text={this.getFulltextForCharacterCounting()} />
            </div>
          </div>
        </div>

Profile bio increase

Step 3

Step 3 is not needed in Mastodon v4.3.0-rc.1! Only steps 1 and 4 are needed. Skip to step 4.

vim app/views/settings/profiles/show.html.haml

  .fields-row
    .fields-row__column.fields-row__column-6
      .fields-group
        = f.input :display_name, wrapper: :with_block_label, input_html: { maxlength: 30, data: { default: @account.username } }

      .fields-group
        = f.input :note, wrapper: :with_block_label, input_html: { maxlength: 2000 }

Step 4

vim app/models/account.rb

  # Local user validations
....
  validates :note, note_length: { maximum: 2000 }, if: -> { local? && will_save_change_to_note? }
....

Finally

As the mastodon user:

RAILS_ENV=production bundle exec rails assets:precompile

As root user:

systemctl restart mastodon-web mastodon-sidekiq mastodon-streaming