diff --git a/api/config/routing.py b/api/config/routing.py
index 249bf51a83cfba8cc09e5660872e18cbe2404461..574d5a18e2eba402b7b3c7620f195d83767b632e 100644
--- a/api/config/routing.py
+++ b/api/config/routing.py
@@ -4,14 +4,15 @@ from channels.auth import AuthMiddlewareStack
 from channels.routing import ProtocolTypeRouter, URLRouter
 
 from funkwhale_api.common.auth import TokenAuthMiddleware
-from funkwhale_api.music import consumers
+from funkwhale_api.instance import consumers
 
 
 application = ProtocolTypeRouter({
     # Empty for now (http->django views is added by default)
     "websocket": TokenAuthMiddleware(
         URLRouter([
-            url("^api/v1/test/$", consumers.MyConsumer),
+            url("^api/v1/instance/activity$",
+                consumers.InstanceActivityConsumer),
         ])
     ),
 })
diff --git a/api/funkwhale_api/common/channels.py b/api/funkwhale_api/common/channels.py
index a2f85ee4e1df0a8d33cf67d80b56ed7886fdf1e8..a009ab5abf4bce698897cbacef0b263a49d5208e 100644
--- a/api/funkwhale_api/common/channels.py
+++ b/api/funkwhale_api/common/channels.py
@@ -3,3 +3,4 @@ from channels.layers import get_channel_layer
 
 channel_layer = get_channel_layer()
 group_send = async_to_sync(channel_layer.group_send)
+group_add = async_to_sync(channel_layer.group_add)
diff --git a/api/funkwhale_api/common/consumers.py b/api/funkwhale_api/common/consumers.py
index 26e57fc8ae5441cbb0b1cc91f0864da08bced672..300ce5e26e50068c88e91edd5dcedef5ce3de412 100644
--- a/api/funkwhale_api/common/consumers.py
+++ b/api/funkwhale_api/common/consumers.py
@@ -1,4 +1,5 @@
 from channels.generic.websocket import JsonWebsocketConsumer
+from funkwhale_api.common import channels
 
 
 class JsonAuthConsumer(JsonWebsocketConsumer):
@@ -9,3 +10,8 @@ class JsonAuthConsumer(JsonWebsocketConsumer):
             return self.close()
 
         return self.accept()
+
+    def accept(self):
+        super().accept()
+        for group in self.groups:
+            channels.group_add(group, self.channel_name)
diff --git a/api/funkwhale_api/favorites/activities.py b/api/funkwhale_api/favorites/activities.py
index a9deef552586c0cc210dcf0745d224f90c42e6a8..a2dbc4e2fa69afae2b8677f166ea72d8a9118f6a 100644
--- a/api/funkwhale_api/favorites/activities.py
+++ b/api/funkwhale_api/favorites/activities.py
@@ -8,10 +8,12 @@ record.registry.register_serializer(
 
 
 @record.registry.register_consumer('favorites.TrackFavorite')
-def broadcast_track_favorite_to_instance_timeline(data, obj):
+def broadcast_track_favorite_to_instance_activity(data, obj):
     if obj.user.privacy_level not in ['instance', 'everyone']:
         return
-    channels.group_send('instance_timeline', {
-        'type': 'event',
+
+    channels.group_send('instance_activity', {
+        'type': 'event.send',
+        'text': '',
         'data': data
     })
diff --git a/api/funkwhale_api/instance/consumers.py b/api/funkwhale_api/instance/consumers.py
new file mode 100644
index 0000000000000000000000000000000000000000..eee5f7f0e38641bfd2d9c16fce49c8cd10d8c8a9
--- /dev/null
+++ b/api/funkwhale_api/instance/consumers.py
@@ -0,0 +1,8 @@
+from funkwhale_api.common.consumers import JsonAuthConsumer
+
+
+class InstanceActivityConsumer(JsonAuthConsumer):
+    groups = ["instance_activity"]
+
+    def event_send(self, message):
+        self.send_json(message['data'])
diff --git a/api/funkwhale_api/music/consumers.py b/api/funkwhale_api/music/consumers.py
deleted file mode 100644
index 452346d193328235c56037ae7ba94fb26a7024a1..0000000000000000000000000000000000000000
--- a/api/funkwhale_api/music/consumers.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from funkwhale_api.common.consumers import JsonAuthConsumer
-
-
-class MyConsumer(JsonAuthConsumer):
-    groups = ["broadcast"]
-
-    def receive_json(self, payload):
-        print(payload, self.scope["user"])
-        # Called with either text_data or bytes_data for each frame
-        # You can call:
-        self.send_json({'test': 'me'})
-        # Or, to send a binary frame:
-        # self.send(bytes_data="{Hello} world!")
-        # Want to force-close the connection? Call:
-        # self.close()
-        # # Or add a custom WebSocket error code!
-        # self.close(code=4123)
diff --git a/api/tests/favorites/test_activity.py b/api/tests/favorites/test_activity.py
index 84778fd0fc8779ca1bf32ddfa8e69621ad6fa492..74695ed8dbbf1c6fdf3e288e34eb9482b14b3016 100644
--- a/api/tests/favorites/test_activity.py
+++ b/api/tests/favorites/test_activity.py
@@ -37,32 +37,32 @@ def test_track_favorite_serializer_is_connected(activity_registry):
 def test_track_favorite_serializer_instance_activity_consumer(
         activity_registry):
     conf = activity_registry['favorites.TrackFavorite']
-    consumer = activities.broadcast_track_favorite_to_instance_timeline
+    consumer = activities.broadcast_track_favorite_to_instance_activity
     assert consumer in conf['consumers']
 
 
-def test_broadcast_track_favorite_to_instance_timeline(
+def test_broadcast_track_favorite_to_instance_activity(
         factories, mocker):
     p = mocker.patch('funkwhale_api.common.channels.group_send')
     favorite = factories['favorites.TrackFavorite']()
     data = serializers.TrackFavoriteActivitySerializer(favorite).data
-    consumer = activities.broadcast_track_favorite_to_instance_timeline
+    consumer = activities.broadcast_track_favorite_to_instance_activity
     message = {
         "type": 'event',
         "data": data
     }
     consumer(data=data, obj=favorite)
-    p.assert_called_once_with('instance_timeline', message)
+    p.assert_called_once_with('instance_activity', message)
 
 
-def test_broadcast_track_favorite_to_instance_timeline_private(
+def test_broadcast_track_favorite_to_instance_activity_private(
         factories, mocker):
     p = mocker.patch('funkwhale_api.common.channels.group_send')
     favorite = factories['favorites.TrackFavorite'](
         user__privacy_level='me'
     )
     data = serializers.TrackFavoriteActivitySerializer(favorite).data
-    consumer = activities.broadcast_track_favorite_to_instance_timeline
+    consumer = activities.broadcast_track_favorite_to_instance_activity
     message = {
         "type": 'event',
         "data": data