diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 82681a4db79c25fa5dafebe8687052d18238774b..4d90e25cfd7d9cc4d39b5a709afa9b31c1a36537 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -40,3 +40,10 @@ deploy:
     - rsync -r -e "ssh -p 2281" $CI_PROJECT_DIR/public/ ui@ui.funkwhale.audio:/htdocs/
   only:
     - main@funkwhale/vui
+
+publish:
+  stage: deploy
+  script:
+    - yarn publish --access public
+  only:
+    - tags
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000000000000000000000000000000000000..ae643592e765c8030666aade78574d9f2bb15227
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+//registry.npmjs.org/:_authToken=${NPM_TOKEN}
diff --git a/README.md b/README.md
index 4180f567b6949eaf63d868ecb5258aba697e59e6..f6c02ce8d3df9f320f39179735cbbe7f7741a1c4 100644
--- a/README.md
+++ b/README.md
@@ -31,3 +31,10 @@ yarn docs:dev
 yarn docs:build
 yarn docs:serve
 ```
+
+### Release a new version
+
+```
+yarn version
+git push --tags && git push
+```