diff --git a/.env.dev b/.env.dev
index 40774610bb72e98787d8ee831551c4a64148fda6..75ae332dcddf21b066ad48e321d35129813cef72 100644
--- a/.env.dev
+++ b/.env.dev
@@ -13,6 +13,7 @@ BROWSABLE_API_ENABLED=True
 FORWARDED_PROTO=http
 LDAP_ENABLED=False
 FUNKWHALE_SPA_HTML_ROOT=http://nginx/front/
+PYTHONTRACEMALLOC=1
 
 # Uncomment this if you're using traefik/https
 # FORCE_HTTPS_URLS=True
diff --git a/api/config/settings/local.py b/api/config/settings/local.py
index b51ec273edac11ab8c1d63285016251de44429f2..2fc121612d47dd5a4da1abd747c65f0f8c175a8f 100644
--- a/api/config/settings/local.py
+++ b/api/config/settings/local.py
@@ -104,4 +104,5 @@ if env.bool("WEAK_PASSWORDS", default=False):
 MIDDLEWARE = (
     "funkwhale_api.common.middleware.DevHttpsMiddleware",
     "funkwhale_api.common.middleware.ProfilerMiddleware",
+    "funkwhale_api.common.middleware.PymallocMiddleware",
 ) + MIDDLEWARE
diff --git a/api/funkwhale_api/common/middleware.py b/api/funkwhale_api/common/middleware.py
index 4752159106ca2de510f4c8b1ba0fcae32615a4ff..f7d2acda4ca95cfd601da81df17a66d592cf60dd 100644
--- a/api/funkwhale_api/common/middleware.py
+++ b/api/funkwhale_api/common/middleware.py
@@ -14,6 +14,7 @@ from django.middleware import csrf
 from django.contrib import auth
 from django import urls
 from rest_framework import views
+import tracemalloc
 
 from funkwhale_api.federation import utils as federation_utils
 
@@ -405,3 +406,20 @@ class ProfilerMiddleware:
         response = http.HttpResponse("<pre>%s</pre>" % stream.getvalue())
 
         return response
+
+
+class PymallocMiddleware:
+    def __init__(self, get_response):
+        self.get_response = get_response
+
+    def __call__(self, request):
+
+        if tracemalloc.is_tracing():
+            snapshot = tracemalloc.take_snapshot()
+            stats = snapshot.statistics("lineno")
+
+            print("Memory trace")
+            for stat in stats[:25]:
+                print(stat)
+
+        return self.get_response(request)