diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 24b5dbc94ae6da078da49f7a1dda9ccb941c6597..88b23f71c44138e1dfb1212c0788b43bc84fd69b 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -26,7 +26,7 @@ unMock {
 }
 
 androidGitVersion {
-  codeFormat = "MMNNPPBBB"
+  codeFormat = "MMNNPPBBB" // Keep in sync with version_code() in dist/create_release.sh
   format = "%tag%%-count%%-commit%%-branch%"
 }
 
diff --git a/changes/changelog.d/97.misc b/changes/changelog.d/97.misc
new file mode 100644
index 0000000000000000000000000000000000000000..0b6f548a78476032d8704e27be55143639d57e76
--- /dev/null
+++ b/changes/changelog.d/97.misc
@@ -0,0 +1 @@
+Add hard coded version information for F-Droid deployment (#97)
\ No newline at end of file
diff --git a/dist/create-release.sh b/dist/create-release.sh
new file mode 100755
index 0000000000000000000000000000000000000000..43106b33d811c31438998dfeef573403314f03aa
--- /dev/null
+++ b/dist/create-release.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+# This script creates a new release of Funkwhale for Android.
+#
+# Usage: ./create-release.sh TAG
+
+# tokenize_tag() - tokenize tag parameter, splitting at dot
+#
+# Expects a string parameter with format MAJOR.MINOR.PATCH, e.g. 1.2.3
+# Returns an array containing elements for MAJOR, MINOR and PATCH
+function tokenize_tag() {
+  IFS="." read -ra TOKENS <<< "$1"
+}
+
+# version_code() - create a numeric version code from a tokenized tag parameter
+# that conforms to the version code format from the
+# gradle build script
+#
+# Expects an array parameter with entries for MAJOR, MINOR and PATCH version parts
+# Returns a formatted version code, leading zeroes are stripped
+function version_code() {
+
+  result=""
+
+  # Every version part is filled with leading zeros to a string of size 2
+  for token in "$@"
+  do
+    ((leadingZeros=2-${#token}))
+    for _ in $(seq 1 "$leadingZeros")
+    do
+      token="${token}0"
+    done
+    result="$result$token"
+  done
+
+  # strip leading zeroes, add three trailing zeroes and return
+  echo "${result#"${result%%[!0]*}"}000"
+}
+
+# Validate if script is used with correct number of params
+if [ $# -lt 1 ]; then
+  echo 'Usage: ./create-release.sh TAG' >&2
+  echo '  TAG format MAJOR.MINOR.PATH, e.g. 1.2.3' >&2
+  exit 1
+fi
+
+tokenize_tag "$1"
+
+# Validate tag parameter format
+if [ ${#TOKENS[@]} != 3 ]; then
+  echo 'ERROR: Invalid tag parameter format.' >&2
+  echo 'Use MAJOR.MINOR.PATCH scheme, e.g. 1.2.3' >&2
+  exit 1
+fi
+
+# Validate that git repository is not dirty
+if [ "$(git diff --stat)" != '' ]; then
+  echo 'ERROR: repository is dirty.' >&2
+  exit 1
+fi
+
+TAG="$1"
+MESSAGE="Creating release version $TAG"
+
+echo "Compiling the changelog..."
+towncrier build --version "$TAG" --date $(date +"%Y-%m-%d")
+
+git add CHANGELOG
+git comit --message "Update changelog for version $TAG"
+
+# Validate that git tag doesn't already exist
+git fetch --all --tags
+if [ "$(git tag -l | grep -e "^$TAG$")" != '' ]; then
+  echo "ERROR: tag $TAG already exists." >&2
+  exit 1
+fi
+
+# Write versionCode and versionName to a file that F-Droid can parse
+echo "versionCode = $(version_code "${TOKENS[@]}")
+versionName = $TAG" > fdroidversion.txt
+
+echo "Tagging the application..."
+
+# Create and push tag
+git tag -a -s -m "$MESSAGE" "$TAG"
+git push --tags
diff --git a/fdroidversion.txt b/fdroidversion.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3abbd1827bcd4e184c9d5ca69bf090bc545bfe46
--- /dev/null
+++ b/fdroidversion.txt
@@ -0,0 +1,2 @@
+versionCode = 1010000
+versionName = 0.1.1