diff --git a/make-metainfo-changelog.sh b/make-metainfo-changelog.sh
new file mode 100755
index 000000000..de1506943
--- /dev/null
+++ b/make-metainfo-changelog.sh
@@ -0,0 +1,144 @@
+#!/usr/bin/env bash
+
+# SPDX-License-Identifier: GPL-3.0-or-later OR ISC OR MIT
+# Copyright Stefan "Newbyte" Hansson
+
+# Script to automatically update the Appstream metainfo release section based on CHANGELOG.md.
+# Dependencies: Bash, GNU Awk 4.1.0 or later, and seq.
+
+set -refu
+
+CHANGELOG_ENTRY_PATTERN='^-\ *'
+CHANGELOG_TYPE_PATTERN='^###\ *'
+CHANGELOG_FILENAME='CHANGELOG.md'
+METAINFO_FILENAME='resources/com.jpexs.decompiler.flash.metainfo.xml'
+RELEASE_DATE_PATTERN='[[:digit:]]+-[[:digit:]]+-[[:digit:]]+'
+RELEASE_VERSION_PATTERN='[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+'
+RELEASE_PATTERN_CHANGELOG="^##\ \[$RELEASE_VERSION_PATTERN\]"
+RELEASE_PATTERN_METAINFO=""
+
+find_metainfo_entry_line() {
+ local line
+
+ while read -r line; do
+ echo "$line"
+ done < "$METAINFO_FILENAME"
+}
+
+get_date_from_line() {
+ echo "$1" | grep -Eo "$RELEASE_DATE_PATTERN"
+}
+
+get_release_from_line() {
+ echo "$1" | grep -Eo "$RELEASE_VERSION_PATTERN"
+}
+
+get_latest_metainfo_release() {
+ local line_number=0
+ local line
+
+ while read -r line; do
+ let 'line_number++'
+ if [[ $line =~ $RELEASE_PATTERN_METAINFO ]]; then
+ echo $(get_release_from_line "$line") "$line_number"
+ break
+ fi
+ done < "$METAINFO_FILENAME"
+}
+
+process_line() {
+ # Remove [] from the line to convert [#1234] to #1234
+ echo "$1" | sed 's/[][]//g'
+}
+
+get_changelog_until_version() {
+ print_with_indent() {
+ local indents="$1"
+ local message="$2"
+
+ printf '\t%.0s' $(seq "$indents")
+ echo "$message"
+ }
+
+ local version_limit="$1"
+ local previous_type='undefined'
+ local start_parsing='false'
+ local changelog_text
+ local current_type
+ local line
+ local release_date
+ local release_version
+
+ while read -r line; do
+ if [[ $line =~ $RELEASE_PATTERN_CHANGELOG ]]; then
+ release_version=$(get_release_from_line "$line")
+ release_date=$(get_date_from_line "$line")
+
+ [ "$release_version" == "$version_limit" ] && break
+
+ start_parsing='true'
+ fi
+
+ # We don't want to parse the changelog's preamble
+ if [ "$start_parsing" == 'true' ]; then
+ if [[ $line =~ $RELEASE_PATTERN_CHANGELOG ]]; then
+ current_type='release'
+ elif [[ $line =~ $CHANGELOG_TYPE_PATTERN ]]; then
+ current_type='type'
+ elif [[ $line =~ $CHANGELOG_ENTRY_PATTERN ]]; then
+ current_type='entry'
+ else
+ current_type='none'
+ fi
+
+ line=$(process_line "$line")
+
+ if [ "$current_type" == 'entry' ] && [ "$previous_type" != 'entry' ]; then
+ print_with_indent 4 ''
+ fi
+
+ if [ "$current_type" != 'entry' ] && [ "$previous_type" == 'entry' ]; then
+ print_with_indent 4 '
'
+ fi
+
+ if [ "$current_type" == 'release' ] && [ "$previous_type" == 'none' ]; then
+ print_with_indent 3 ''
+ print_with_indent 2 ''
+ fi
+
+ case "$current_type" in
+ release)
+ print_with_indent 2 ""
+ print_with_indent 3 ''
+ ;;
+ type)
+ print_with_indent 4 "${line:4}
"
+ ;;
+ entry)
+ print_with_indent 5 "${line:2}"
+ ;;
+ esac
+
+ previous_type="$current_type"
+ fi
+ done < "$CHANGELOG_FILENAME"
+
+ if [ "$start_parsing" == 'true' ]; then
+ if [ "$previous_type" == 'entry' ]; then
+ print_with_indent 4 ''
+ fi
+
+ print_with_indent 3 ''
+ print_with_indent 2 ''
+ fi
+}
+
+read -ra args <<< $(get_latest_metainfo_release)
+
+latest_release="${args[0]}"
+insert_at_line="${args[1]}"
+changelog=$(get_changelog_until_version "$latest_release")
+
+[ -z "$changelog" ] && exit
+
+awk -i inplace -v changelog="$changelog" -v insert_at_line="$insert_at_line" 'NR==insert_at_line {print changelog} 1' resources/com.jpexs.decompiler.flash.metainfo.xml