diff --git a/update-version.sh b/update-version.sh
new file mode 100755
index 0000000..7e89ad3
--- /dev/null
+++ b/update-version.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+# Bumps the app version everywhere it's tracked and stubs a CHANGELOG.md entry.
+set -euo pipefail
+
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+APP_CSPROJ="src/App/PalladiumWallet.App.csproj"
+ANDROID_CSPROJ="src/App.Android/PalladiumWallet.App.Android.csproj"
+CHANGELOG="CHANGELOG.md"
+
+current_version=$(grep -oP '(?<=)[^<]+(?=)' "$APP_CSPROJ")
+echo "Current version: $current_version"
+
+read -rp "New version (e.g. 1.0.0): " new_version
+
+if [[ -z "$new_version" ]]; then
+ echo "No version entered, aborting." >&2
+ exit 1
+fi
+
+if ! [[ "$new_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+ echo "Invalid version format: '$new_version' (expected X.Y.Z)." >&2
+ exit 1
+fi
+
+if [[ "$new_version" == "$current_version" ]]; then
+ echo "New version is the same as the current one ($current_version), aborting." >&2
+ exit 1
+fi
+
+# 1. Single source of truth: App csproj
+sed -i "s|$current_version|$new_version|" "$APP_CSPROJ"
+
+# 2. Android head: ApplicationDisplayVersion (versionName) must mirror it,
+# and ApplicationVersion (versionCode) must strictly increase on every
+# release or users can't update in place.
+current_code=$(grep -oP '(?<=)[^<]+(?=)' "$ANDROID_CSPROJ")
+new_code=$((current_code + 1))
+
+sed -i "s|$current_version|$new_version|" "$ANDROID_CSPROJ"
+sed -i "s|$current_code|$new_code|" "$ANDROID_CSPROJ"
+
+# 3. CHANGELOG.md: stub a new entry above the previous top-most one.
+today=$(date +%F)
+if grep -q "^## \[$new_version\]" "$CHANGELOG"; then
+ echo "CHANGELOG.md already has an entry for $new_version, leaving it untouched."
+else
+ awk -v ver="$new_version" -v date="$today" '
+ !done && /^## \[/ {
+ print "## [" ver "] — " date
+ print ""
+ print "TODO: describe the changes in this release."
+ print ""
+ done = 1
+ }
+ { print }
+ ' "$CHANGELOG" > "$CHANGELOG.tmp"
+ mv "$CHANGELOG.tmp" "$CHANGELOG"
+fi
+
+echo
+echo "Updated:"
+echo " - $APP_CSPROJ: Version $current_version -> $new_version"
+echo " - $ANDROID_CSPROJ: ApplicationDisplayVersion $current_version -> $new_version, ApplicationVersion (versionCode) $current_code -> $new_code"
+echo " - $CHANGELOG: stubbed entry for $new_version (fill in the details manually)"
+echo
+echo "Review the diff, fill in the CHANGELOG entry, then commit and tag manually."