diff --git a/.gitignore b/.gitignore
index 8f511221bc402041c5fdc42719786474e1bf5ddf..c93aef6b204843b53b8b7192dfee2410cd655b11 100644
--- a/.gitignore
+++ b/.gitignore
@@ -458,3 +458,4 @@ pyrightconfig.json
 .env.prod
 .env.prod.db
 .env.prod.search
+demo_media.tar.xz
\ No newline at end of file
diff --git a/DEMO.md b/DEMO.md
index 81c51d13f0ffc3a4c1851e46345398337da30306..80a58fceb23502a9854ccdc6eaa0e23e5e8d6d33 100644
--- a/DEMO.md
+++ b/DEMO.md
@@ -15,4 +15,35 @@ There is a `db.demo.sqlite3` file containing demo data. You can use it to test t
   - Username: `demo2`
   - Email: `demo2@example.com`
   - Password: `DemoUser`
-  - Card number: `2222`
\ No newline at end of file
+  - Card number: `2222`
+
+## Run Demo
+```bash
+git clone https://git.rb9.xyz/TheJoeCoder/heyheylibrary.git
+cd heyheylibrary
+cp db.demo.sqlite3 db.sqlite3
+tar -cJvf demo_media.tar.xz ./demo_media
+docker compose -f docker-compose.demo.yml up -d
+docker compose -f docker-compose.demo.yml exec web python manage.py migrate --noinput
+docker compose -f docker-compose.prod.yml exec web python manage.py collectstatic --no-input --clear
+docker compose -f docker-compose.demo.yml exec web python manage.py opensearch index --force create
+docker compose -f docker-compose.demo.yml exec web python manage.py opensearch document --force index
+```
+
+## Reset Demo
+```bash
+# Stop the web container
+docker compose -f docker-compose.demo.yml stop web
+# Reset the database
+rm db.sqlite3
+cp db.demo.sqlite3 db.sqlite3
+# Reset the media
+rm -rd demo_media/*
+tar -xJvf demo_media.tar.xz ./demo_media
+# Start the web container
+docker compose -f docker-compose.demo.yml up -d
+docker compose -f docker-compose.demo.yml exec web python manage.py migrate --noinput
+docker compose -f docker-compose.prod.yml exec web python manage.py collectstatic --no-input --clear
+docker compose -f docker-compose.demo.yml exec web python manage.py opensearch document --force delete
+docker compose -f docker-compose.demo.yml exec web python manage.py opensearch document --force index
+```
\ No newline at end of file
diff --git a/Dockerfile.cron.demo b/Dockerfile.cron.demo
deleted file mode 100644
index bbfaf646d2bea23d305e0e81c8bdc8fd803252cb..0000000000000000000000000000000000000000
--- a/Dockerfile.cron.demo
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM debian:bookworm-slim
-
-RUN apt-get update && apt-get install -y cron
-
-COPY demo_cronjob /etc/cron.d/cronjob
-
-RUN chmod 0644 /etc/cron.d/cronjob
-
-RUN touch /var/log/cron.log
-
-CMD cron && tail -f /var/log/cron.log
\ No newline at end of file
diff --git a/demo_cronjob b/demo_cronjob
deleted file mode 100644
index dcfde9fc835c69f2d09243d9eb41ceba2f2b99dc..0000000000000000000000000000000000000000
--- a/demo_cronjob
+++ /dev/null
@@ -1 +0,0 @@
-0 */3 * * * /usr/bin/cp /home/app/web/db.demo.sqlite3 /home/app/web/db.sqlite3 >> /var/log/cron.log 2>&1
diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml
index 046656542bf4f6118bbf5ab19251b540f7683358..4ddb4bb23979dfea8841cd77d3d91f812cebd9c6 100644
--- a/docker-compose.demo.yml
+++ b/docker-compose.demo.yml
@@ -52,14 +52,6 @@ services:
     networks:
       - librarydemo
 
-  cron:
-    build:
-      context: .
-      dockerfile: Dockerfile.cron.demo
-    volumes:
-      - ./db.sqlite3:/home/app/web/db.sqlite3
-      - ./db.demo.sqlite3:/home/app/web/db.demo.sqlite3
-
 volumes:
   demo_static:
   demo_opensearch: