diff --git a/web/app.py b/web/app.py
new file mode 100644
index 0000000..68f9bae
--- /dev/null
+++ b/web/app.py
@@ -0,0 +1,246 @@
+#!/usr/bin/env python3
+
+import subprocess
+import json
+import time
+import threading
+from datetime import datetime
+from pathlib import Path
+
+from flask import Flask, jsonify, render_template_string
+
+DB_DATA = Path("page_counts.json")
+INTERVAL = 15 * 60 # 15 Minuten
+
+app = Flask(__name__)
+
+HTML = """
+
+
+
+
+
+ JonasSearch – Pages
+
+
+
+
+
+
+
+
+
JonasSearch
+
Indexed Pages
+
+
+ – Pages
+
+
+
+
+
+
+
+
+
+
+
+"""
+
+
+def load_data():
+ if not DB_DATA.exists():
+ return []
+
+ try:
+ with DB_DATA.open("r", encoding="utf-8") as f:
+ return json.load(f)
+ except Exception:
+ return []
+
+
+def save_data(data):
+ tmp = DB_DATA.with_suffix(".tmp")
+
+ with tmp.open("w", encoding="utf-8") as f:
+ json.dump(data, f, indent=2)
+
+ tmp.replace(DB_DATA)
+
+
+def get_page_count():
+ command = [
+ "sudo",
+ "-u",
+ "postgres",
+ "psql",
+ "-p",
+ "25432",
+ "-d",
+ "jonassearch",
+ "-t",
+ "-A",
+ "-c",
+ "SELECT COUNT(*) FROM pages;"
+ ]
+
+ result = subprocess.run(
+ command,
+ capture_output=True,
+ text=True,
+ check=True
+ )
+
+ return int(result.stdout.strip())
+
+
+def collect():
+ while True:
+ try:
+ count = get_page_count()
+
+ entry = {
+ "timestamp": datetime.now().isoformat(),
+ "count": count
+ }
+
+ data = load_data()
+ data.append(entry)
+
+ save_data(data)
+
+ print(
+ f"[{entry['timestamp']}] "
+ f"Pages: {count}"
+ )
+
+ except Exception as e:
+ print(f"Fehler beim Abrufen der Seitenzahl: {e}")
+
+ time.sleep(INTERVAL)
+
+
+@app.route("/")
+def index():
+ return render_template_string(HTML)
+
+
+@app.route("/api/data")
+def api_data():
+ return jsonify({
+ "values": load_data()
+ })
+
+
+if __name__ == "__main__":
+ # Collector im Hintergrund starten
+ thread = threading.Thread(target=collect, daemon=True)
+ thread.start()
+
+ # Webserver
+ app.run(
+ host="0.0.0.0",
+ port=8081,
+ threaded=True
+ )