diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6398d7e0afdb6f10efd30cd214ffeaa0c67468c4..c426a4bd35a11604715474dfa19a62af95a19231 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -28,23 +28,27 @@ stages:
   stage: build
   variables:
     apk_file: 'app/build/outputs/apk/debug/app-debug.apk'
-    metadata_file: 'metadata/audio.funkwhale.android.yml'
+    metadata_file: 'metadata/audio.funkwhale.android.dev.yml'
+    metadata_template: 'metadata/preview.template.yml'
+    output_metadata: 'app/build/outputs/apk/debug/output-metadata.json'
   before_script: 
     - git fetch --unshallow --tags
   after_script:
     - export versionCode=`$ANDROID_HOME/build-tools/30.0.2/aapt dump badging $apk_file | grep versionCode | awk '{print $3}' | sed s/versionCode=//g | sed s/\'//g`
     - apt update && apt install gettext-base
-    - cat metadata/template.yml | envsubst > $metadata_file
+    - cat $metadata_template | envsubst > $metadata_file
   extends: .gradle-default
   artifacts:
     paths:
       - $apk_file
       - $metadata_file
-      - app/build/outputs/apk/debug/output-metadata.json
+      - $output_metadata
 
 test:
   extends: .gradle-default
   stage: test
+  except:
+    - tags
   script:
     - ./gradlew test jacocoTestReport
     - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' $JACOCO_CSV_LOCATION
@@ -63,6 +67,8 @@ coverage:
   needs: [ "test" ]
   dependencies:
     - test
+  except:
+    - tags
   artifacts:
     reports:
       cobertura: $COBERTURA_REPORT
@@ -70,11 +76,24 @@ coverage:
 build-develop:
   extends: .build
   script:
-    - echo -n $SIGNING_KEY_STORE | base64 -d > app/android.keystore
-    - ./gradlew assembleDebug -Psigning.store=android.keystore -Psigning.store_passphrase=$SIGNING_KEY_PASS -Psigning.key_passphrase=$SIGNING_KEY_PASS
+    - echo -n $PREVIEW_SIGNING_KEY_STORE | base64 -d > app/android.keystore
+    - ./gradlew assembleDebug -Psigning.store=android.keystore -Psigning.store_passphrase=$PREVIEW_SIGNING_KEY_PASS -Psigning.key_passphrase=$PREVIEW_SIGNING_KEY_PASS
   only:
     - develop
 
+build-release:
+  variables:
+    apk_file: 'app/build/outputs/apk/release/app-release.apk'
+    output_metadata: 'app/build/outputs/apk/release/output-metadata.json'
+    metadata_template: 'metadata/release.template.yml'
+    metadata_file: 'metadata/audio.funkwhale.android.yml'
+  extends: .build
+  script:
+    - echo -n $SIGNING_KEY_STORE | base64 -d > app/android.keystore
+    - ./gradlew assembleRelease -Psigning.store=android.keystore -Psigning.store_passphrase=$SIGNING_KEY_PASS -Psigning.key_passphrase=$SIGNING_KEY_PASS
+  only:
+    - tags
+
 build-bleeding-edge:
   extends: .build
   script:
@@ -91,7 +110,22 @@ deploy-develop:
     - ssh-add <(echo "$SSH_PRIVATE_KEY")
     - scp -o StrictHostKeyChecking=no app/build/outputs/apk/debug/app-debug.apk fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/repo/audio.funkwhale.ffa.dev-$CI_COMMIT_SHORT_SHA.apk
     - scp -o StrictHostKeyChecking=no app/build/outputs/apk/debug/output-metadata.json fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/output-metadata.json
-    - scp -o StrictHostKeyChecking=no metadata/audio.funkwhale.android.yml fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/metadata/audio.funkwhale.ffa.dev.yml      
+    - scp -o StrictHostKeyChecking=no metadata/audio.funkwhale.android.dev.yml fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/metadata/audio.funkwhale.ffa.dev.yml      
+    - ssh -o StrictHostKeyChecking=no fdroid@apps.funkwhale.audio 'docker run --rm -u $(id -u):$(id -g) -v /srv/fdroid/fdroid/develop:/repo registry.gitlab.com/fdroid/docker-executable-fdroidserver:master update'
+  tags:
+    - shell
+
+deploy-release:
+  stage: deploy
+  only:
+    - tags
+  script:
+    - eval `ssh-agent -s`
+    - ssh-add <(echo "$SSH_PRIVATE_KEY")
+      #- scp -o StrictHostKeyChecking=no app/build/outputs/apk/release/app-release.apk fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/repo/audio.funkwhale.ffa.-$CI_COMMIT_TAG.apk
+    - scp -o StrictHostKeyChecking=no app/build/outputs/apk/release/app-release.apk fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/repo/audio.funkwhale.ffa.-0.0.1.apk
+    - scp -o StrictHostKeyChecking=no app/build/outputs/apk/release/output-metadata.json fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/output-metadata.json
+    - scp -o StrictHostKeyChecking=no metadata/audio.funkwhale.android.yml fdroid@apps.funkwhale.audio:/srv/fdroid/fdroid/develop/metadata/audio.funkwhale.ffa.yml      
     - ssh -o StrictHostKeyChecking=no fdroid@apps.funkwhale.audio 'docker run --rm -u $(id -u):$(id -g) -v /srv/fdroid/fdroid/develop:/repo registry.gitlab.com/fdroid/docker-executable-fdroidserver:master update'
   tags:
     - shell
diff --git a/metadata/preview.template.yml b/metadata/preview.template.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7b836122710c9cdfad0e0aa1fad325ff6280b91a
--- /dev/null
+++ b/metadata/preview.template.yml
@@ -0,0 +1,18 @@
+Categories:
+  - Multimedia
+  - Funkwhale
+License: MIT
+AuthorName: Funkwhale Collective
+WebSite: https://funkwhale.audio
+SourceCode: https://dev.funkwhale.audio/funkwhale/funkwhale-android/
+IssueTracker: https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/issues
+Translation: https://translate.funkwhale.audio/projects/funkwhale/ffa/
+
+Name: Funkwhale (preview)
+Summary: This is the development version of the official Funkwhale App for Android.
+
+AutoUpdateMode: None
+UpdateCheckMode: Tags
+UpdateCheckData: output-metadata.json|"version_code":.*"(.*)"|output-metadata.json|"versionName":.*\"(.*)\",
+CurrentVersion: $versionCode
+
diff --git a/metadata/template.yml b/metadata/release.template.yml
similarity index 93%
rename from metadata/template.yml
rename to metadata/release.template.yml
index b3076561337f19a77d52dd11f01aff666ee955ac..41d8482f385275aeda87afda20f381422c5a199a 100644
--- a/metadata/template.yml
+++ b/metadata/release.template.yml
@@ -2,13 +2,13 @@ Categories:
   - Multimedia
   - Funkwhale
 License: MIT
-AuthorName: Funkwhale
+AuthorName: Funkwhale Collective
 WebSite: https://funkwhale.audio
 SourceCode: https://dev.funkwhale.audio/funkwhale/funkwhale-android/
 IssueTracker: https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/issues
 Translation: https://translate.funkwhale.audio/projects/funkwhale/ffa/
 
-Name: Funkwhale (preview)
+Name: Funkwhale
 Summary: This is the official and native Android music player for Funkwhale, native
     to both Android (developed in Kotlin) and to Funkwhale (uses its native API instead
     of Subsonic).