diff --git a/.gitignore b/.gitignore
index dfdf588..f8d205a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ rexserver
 *.tar.gz
 *.zip
 /rexforge_*
+VERSION.txt
diff --git a/Makefile b/Makefile
index 417f50a..f252255 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,32 @@
-rev := $(shell git rev-parse --short HEAD)
-release_name := rexforge_$(rev)
+VERSION_FILE := VERSION.txt
 
-release: $(release_name)
+ifeq ($(wildcard $(VERSION_FILE)),)
+  $(shell bash ./generate_version.sh $VERSION_FILE)
+endif
+
+REX_VERSION := $(shell cat $(VERSION_FILE))
+RELEASE_NAME := rexforge_$(REX_VERSION)
+export REX_VERSION
+
+version:
+	@echo $(RELEASE_NAME)
+
+release: $(RELEASE_NAME)
 	make -C ./rex_client
 	make -C ./rex_server
-	mv ./rex_client/rexclient $(release_name)
-	mv ./rex_server/rexserver $(release_name)
-	cp ./LICENSE.txt $(release_name)
-	cp ./README.md $(release_name)
-	mkdir -p $(release_name)/source
-	git ls-files | xargs -I{} cp --parents {} $(release_name)/source
-	date -I > $(release_name)/VERSION.txt
-	echo $(rev) >> $(release_name)/VERSION.txt
-	go version >> $(release_name)/VERSION.txt
-	tar cvzf $(release_name).tar.gz $(release_name)
+	mv ./rex_client/rexclient $(RELEASE_NAME)
+	mv ./rex_server/rexserver $(RELEASE_NAME)
+	cp ./LICENSE.txt $(RELEASE_NAME)
+	cp ./VERSION.txt $(RELEASE_NAME)
+	cp ./README.md $(RELEASE_NAME)
+	mkdir -p $(RELEASE_NAME)/source
+	git ls-files | xargs -I{} cp --parents {} $(RELEASE_NAME)/source
+	date -I > $(RELEASE_NAME)/VERSION.txt
+	echo $(rev) >> $(RELEASE_NAME)/VERSION.txt
+	go version >> $(RELEASE_NAME)/VERSION.txt
+	tar cvzf $(RELEASE_NAME).tar.gz $(RELEASE_NAME)
 
-$(release_name):
+$(RELEASE_NAME):
 	mkdir -p $@
 
 container:
diff --git a/generate_version.sh b/generate_version.sh
new file mode 100644
index 0000000..2832dc8
--- /dev/null
+++ b/generate_version.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+if [ -z "$1" ]; then
+    echo "ERROR: No version file name provided. Usage: $0 <version_file>"
+    exit 1
+fi
+
+VERSION_FILE="$1"
+
+if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
+    VERSION=$(git describe 2>/dev/null || git rev-parse --short HEAD || echo "v0.0.0-unknown")
+    DIRTY=$(git diff-index --quiet HEAD -- || echo "-dirty")
+    FULL_VERSION="${VERSION}${DIRTY}"
+    echo "$FULL_VERSION" >"$VERSION_FILE"
+else
+    if [ -f "$VERSION_FILE" ]; then
+        echo "INFO: $VERSION_FILE already exists. Please update it manually if needed."
+    else
+        echo "ERROR: Not in a Git repository, and $VERSION_FILE does not exist. Unable to generate version!"
+        exit 1
+    fi
+fi