diff --git a/api/Dockerfile b/api/Dockerfile
index a9aa33e3ce22f9eb36b5c094949df0583768ee68..9296785eef25d9b5a14cd9e140b8461ba188eeff 100644
--- a/api/Dockerfile
+++ b/api/Dockerfile
@@ -24,3 +24,4 @@ RUN pip install --upgrade youtube-dl
 WORKDIR /app
 
 ENTRYPOINT ["./compose/django/entrypoint.sh"]
+CMD ["./compose/django/daphne.sh"]
diff --git a/changes/changelog.d/23.feature b/changes/changelog.d/23.feature
new file mode 100644
index 0000000000000000000000000000000000000000..fbfac0d919543d2bd0bfa05ce4c66f1038bc6509
--- /dev/null
+++ b/changes/changelog.d/23.feature
@@ -0,0 +1,16 @@
+Basic activity stream for listening and favorites (#23)
+
+A new "Activity" page is now available from the sidebar, where you can
+browse your instance activity. At the moment, this includes other users
+favorites and listening, but more activity types will be implemented in the
+future.
+
+Internally, we implemented those events by following the Activity Stream
+specification, which will help us to be compatible with other networks
+in the long-term.
+
+A new settings page has been added to control the visibility of your activity.
+By default, your activity will be browsable by anyone on your instance,
+but you can switch to a full private mode where nothing is shared.
+
+The setting form is available in your profile.
diff --git a/changes/changelog.d/34.feature b/changes/changelog.d/34.feature
new file mode 100644
index 0000000000000000000000000000000000000000..1403f3dc149cc3e71abba871f6207ab765f3b2d0
--- /dev/null
+++ b/changes/changelog.d/34.feature
@@ -0,0 +1,59 @@
+Switched to django-channels and daphne for serving HTTP and websocket (#34)
+
+Upgrade notes
+^^^^^^^^^^^^^
+
+This release include an important change in the way we serve the HTTP API.
+To prepare for new realtime features and enable websocket support in Funkwhale,
+we are now using django-channels and daphne to serve HTTP and websocket traffic.
+
+This replaces gunicorn and the switch should be easy assuming you
+follow the upgrade process described bellow.
+
+If you are using docker, please remove the command instruction inside the
+api service, as the up-to-date command is now included directly in the image
+as the default entry point:
+
+.. code-block:: yaml
+
+    api:
+      restart: unless-stopped
+      image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
+      command: ./compose/django/gunicorn.sh  # You can remove this line
+
+On non docker setups, you'll have to update the [Service] block of your
+funkwhale-server systemd unit file to launch the application server using daphne instead of gunicorn.
+
+The new configuration should be similar to this:
+
+.. code-block:: ini
+
+    [Service]
+    User=funkwhale
+    # adapt this depending on the path of your funkwhale installation
+    WorkingDirectory=/srv/funkwhale/api
+    EnvironmentFile=/srv/funkwhale/config/.env
+    ExecStart=/usr/local/bin/daphne -b ${FUNKWHALE_API_IP} -p ${FUNKWHALE_API_PORT} config.asgi:application
+
+Ensure you update funkwhale's dependencies as usual to install the required
+packages.
+
+On both docker and non-docker setup, you'll also have to update your nginx
+configuration for websocket support. Ensure you have the following blocks
+included in your virtualhost file:
+
+.. code-block:: txt
+
+    map $http_upgrade $connection_upgrade {
+        default upgrade;
+        ''      close;
+    }
+
+    server {
+        ...
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection $connection_upgrade;
+    }
+
+Remember to reload your nginx server after the edit.
diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml
index 0c3b565474355632257694bfe84d729a376301da..e6292812e0470156da0f131e735e9ab64c2a9c17 100644
--- a/deploy/docker-compose.yml
+++ b/deploy/docker-compose.yml
@@ -43,7 +43,6 @@ services:
     restart: unless-stopped
     image: funkwhale/funkwhale:${FUNKWHALE_VERSION:-latest}
     env_file: .env
-    command: ./compose/django/gunicorn.sh
     volumes:
       - ./data/music:/music:ro
       - ./data/media:/app/funkwhale_api/media
diff --git a/deploy/funkwhale-server.service b/deploy/funkwhale-server.service
index 7ef6e389748bac6c972fbd0644412ceb375cb8e5..0027a80ab8e73802f9efa3e2b4febf792052b1bc 100644
--- a/deploy/funkwhale-server.service
+++ b/deploy/funkwhale-server.service
@@ -8,7 +8,7 @@ User=funkwhale
 # adapt this depending on the path of your funkwhale installation
 WorkingDirectory=/srv/funkwhale/api
 EnvironmentFile=/srv/funkwhale/config/.env
-ExecStart=/srv/funkwhale/virtualenv/bin/gunicorn config.wsgi:application -b ${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}
+ExecStart=/usr/local/bin/daphne -b ${FUNKWHALE_API_IP} -p ${FUNKWHALE_API_PORT} config.asgi:application
 
 [Install]
 WantedBy=multi-user.target
diff --git a/deploy/nginx.conf b/deploy/nginx.conf
index cf3b34056bc463e56ff9f306c333a908fdca6f60..125fbc6d4190b98e35032b98b0e7ad0c07644892 100644
--- a/deploy/nginx.conf
+++ b/deploy/nginx.conf
@@ -19,6 +19,12 @@ server {
     location / { return 301 https://$host$request_uri; }
 }
 
+# required for websocket support
+map $http_upgrade $connection_upgrade {
+    default upgrade;
+    ''      close;
+}
+
 server {
     listen      443 ssl http2;
     listen [::]:443 ssl http2;
@@ -51,6 +57,11 @@ server {
     proxy_set_header X-Forwarded-Port   $server_port;
     proxy_redirect off;
 
+    # websocket support
+    proxy_http_version 1.1;
+    proxy_set_header Upgrade $http_upgrade;
+    proxy_set_header Connection $connection_upgrade;
+
     location / {
         try_files $uri $uri/ @rewrites;
     }