diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index 2b9580b049458c75a70a5ec18236cabcda1ac0d1..7eb409830d7d3531d38f3b7e3f2924213b89376e 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -433,6 +433,7 @@ ADMIN_URL = env('DJANGO_ADMIN_URL', default='^api/admin/')
 CSRF_USE_SESSIONS = True
 
 # Playlist settings
+# XXX: Deprecated, use playlists__max_tracks instead
 PLAYLISTS_MAX_TRACKS = env.int('PLAYLISTS_MAX_TRACKS', default=250)
 
 ACCOUNT_USERNAME_BLACKLIST = [
diff --git a/api/funkwhale_api/playlists/dynamic_preferences_registry.py b/api/funkwhale_api/playlists/dynamic_preferences_registry.py
new file mode 100644
index 0000000000000000000000000000000000000000..21140fa1495adb734aa64e41be4bae218ba74304
--- /dev/null
+++ b/api/funkwhale_api/playlists/dynamic_preferences_registry.py
@@ -0,0 +1,15 @@
+from dynamic_preferences import types
+from dynamic_preferences.registries import global_preferences_registry
+
+from funkwhale_api.common import preferences
+
+playlists = types.Section('playlists')
+
+
+@global_preferences_registry.register
+class MaxTracks(preferences.DefaultFromSettingMixin, types.IntegerPreference):
+    show_in_api = True
+    section = playlists
+    name = 'max_tracks'
+    verbose_name = 'Max tracks per playlist'
+    setting = 'PLAYLISTS_MAX_TRACKS'
diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py
index 6bb8fe17820a20b82b2a4468c2c0421350cfa53d..a208a5fd05e82258ad887b8f7dac06facf6f1167 100644
--- a/api/funkwhale_api/playlists/models.py
+++ b/api/funkwhale_api/playlists/models.py
@@ -6,6 +6,7 @@ from django.utils import timezone
 from rest_framework import exceptions
 
 from funkwhale_api.common import fields
+from funkwhale_api.common import preferences
 
 
 class Playlist(models.Model):
@@ -81,10 +82,11 @@ class Playlist(models.Model):
         existing = self.playlist_tracks.select_for_update()
         now = timezone.now()
         total = existing.filter(index__isnull=False).count()
-        if existing.count() + len(tracks) > settings.PLAYLISTS_MAX_TRACKS:
+        max_tracks = preferences.get('playlists__max_tracks')
+        if existing.count() + len(tracks) > max_tracks:
             raise exceptions.ValidationError(
                 'Playlist would reach the maximum of {} tracks'.format(
-                    settings.PLAYLISTS_MAX_TRACKS))
+                    max_tracks))
         self.save(update_fields=['modification_date'])
         start = total
         plts = [
diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py
index 6caf9aa4aa13de423c0fd322afc0af6c02f2afd3..fcb2a412d49b6501eed5d880c5a93f14d87985d8 100644
--- a/api/funkwhale_api/playlists/serializers.py
+++ b/api/funkwhale_api/playlists/serializers.py
@@ -3,6 +3,7 @@ from django.db import transaction
 from rest_framework import serializers
 from taggit.models import Tag
 
+from funkwhale_api.common import preferences
 from funkwhale_api.music.models import Track
 from funkwhale_api.music.serializers import TrackSerializerNested
 from funkwhale_api.users.serializers import UserBasicSerializer
@@ -32,10 +33,11 @@ class PlaylistTrackWriteSerializer(serializers.ModelSerializer):
                 raise serializers.ValidationError(
                     'You do not have the permission to edit this playlist')
         existing = value.playlist_tracks.count()
-        if existing >= settings.PLAYLISTS_MAX_TRACKS:
+        max_tracks = preferences.get('playlists__max_tracks')
+        if existing >= max_tracks:
             raise serializers.ValidationError(
                 'Playlist has reached the maximum of {} tracks'.format(
-                    settings.PLAYLISTS_MAX_TRACKS))
+                    max_tracks))
         return value
 
     @transaction.atomic
diff --git a/api/tests/playlists/test_models.py b/api/tests/playlists/test_models.py
index c9def4dab85c4798c337b8876387c2ff5a6f05ed..fe5dd40a8518aa6507f980fed06e2e7b45012d17 100644
--- a/api/tests/playlists/test_models.py
+++ b/api/tests/playlists/test_models.py
@@ -116,8 +116,8 @@ def test_can_insert_many(factories):
         assert plt.playlist == playlist
 
 
-def test_insert_many_honor_max_tracks(factories, settings):
-    settings.PLAYLISTS_MAX_TRACKS = 4
+def test_insert_many_honor_max_tracks(preferences, factories):
+    preferences['playlists__max_tracks'] = 4
     playlist = factories['playlists.Playlist']()
     plts = factories['playlists.PlaylistTrack'].create_batch(
         size=2, playlist=playlist)
diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py
index 8e30919e6eaab42e3d8111c59cff3a2118271abc..908c1c79644d0ec44bcef36fe986f160f7e06cd5 100644
--- a/api/tests/playlists/test_serializers.py
+++ b/api/tests/playlists/test_serializers.py
@@ -2,8 +2,8 @@ from funkwhale_api.playlists import models
 from funkwhale_api.playlists import serializers
 
 
-def test_cannot_max_500_tracks_per_playlist(factories, settings):
-    settings.PLAYLISTS_MAX_TRACKS = 2
+def test_cannot_max_500_tracks_per_playlist(factories, preferences):
+    preferences['playlists__max_tracks'] = 2
     playlist = factories['playlists.Playlist']()
     plts = factories['playlists.PlaylistTrack'].create_batch(
         size=2, playlist=playlist)