diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..9b3332e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,20 @@
+VENV := .venv
+PYTHON := python
+
+ifeq ($(OS),Windows_NT)
+PY := $(VENV)\Scripts\python.exe
+PIP := $(VENV)\Scripts\pip.exe
+else
+PY := $(VENV)/bin/python
+PIP := $(VENV)/bin/pip
+endif
+
+.PHONY: run venv install
+
+venv:
+ $(PYTHON) -m venv $(VENV)
+ $(PIP) install --upgrade pip
+ $(PIP) install -r requirements.txt
+
+run: venv
+ $(PY) manage.py runserver 0.0.0.0:8000
diff --git a/README.md b/README.md
index 30082b5..2fa3066 100644
--- a/README.md
+++ b/README.md
@@ -84,3 +84,28 @@ pip install -r requirements.txt
```bash
python manage.py runserver
```
+
+## ⚙️ Run with Make
+
+- **Run locally:**
+
+```bash
+make run
+```
+
+- **Notes:**
+ - On first run the `Makefile` creates a virtual environment in `.venv` and installs `requirements.txt`.
+ - If you don't have `make` (common on Windows), run these commands instead:
+
+```bash
+python -m venv .venv
+.venv\Scripts\pip install -r requirements.txt # Windows
+.venv\Scripts\python manage.py runserver 0.0.0.0:8000
+```
+
+Or on Unix/macOS:
+
+```bash
+.venv/bin/pip install -r requirements.txt
+.venv/bin/python manage.py runserver 0.0.0.0:8000
+```
diff --git a/static/js/script.js b/static/js/script.js
index c523d8c..5d51447 100644
--- a/static/js/script.js
+++ b/static/js/script.js
@@ -67,3 +67,56 @@ if (photoInput)
// Scroll to Bottom
const conversationThread = document.querySelector(".room__box");
if (conversationThread) conversationThread.scrollTop = conversationThread.scrollHeight;
+
+// Theme toggle: persist preference in localStorage and apply on load
+const themeToggle = document.getElementById('theme-toggle');
+const themeKey = 'studybuddy_theme';
+
+function applyTheme(theme) {
+ if (theme === 'light') {
+ document.body.classList.add('light');
+ } else {
+ document.body.classList.remove('light');
+ }
+ updateThemeIcon(theme);
+}
+
+function updateThemeIcon(theme) {
+ if (!themeToggle) return;
+ const icon = document.getElementById('theme-icon');
+ if (!icon) return;
+ if (theme === 'light') {
+ // show moon (switch to dark)
+ icon.innerHTML = '