Index: backend/controllers/forumController.js
===================================================================
--- backend/controllers/forumController.js	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ backend/controllers/forumController.js	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -37,5 +37,5 @@
           error: 'Content contains inappropriate language',
         });
-      } else if (post.content.length > 100) {
+      } else if (post.content.length > 200) {
         createReviewPost(req, res);
         return res.status(401).json({
Index: backend/filters/macedonianProfanity.js
===================================================================
--- backend/filters/macedonianProfanity.js	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ backend/filters/macedonianProfanity.js	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -1,8 +1,18 @@
 
 module.exports = [
-    "кур", "пичка", "ебам", "мрш", "глуп", "идиот", "гомно", "курва", 
-    "срање",
-    // English alphabet variants
-    "kur", "picka", "pichka", "ebam", "mrsh", "glup", "idiot", "gomno", "kurva",
-    "srane", "sranje"
+    // Macedonian Cyrillic with definite forms
+    "кур", "курот", "куров", "курон", "пичка", "пичката", "пичкава", "пичкана", 
+    "ебам", "мрш", "глуп", "глупиот", "глупиов", "глупион", 
+    "идиот", "идиотот", "идиотов", "идиотон", "гомно", "гомното", "гомново", "гомнono",
+    "курва", "курвата", "курвава", "курвана", "срање", "срањето", "срањево", "срањено",
+    "цицка", "цицката", "цицкава", "цицкана", "газ", "газот", "газов", "газон",
+    "педер", "педерот", "педеров", "педерон", "аутист", "аутистот", "аутистов", "аутистон",
+    
+    // English alphabet variants with definite forms
+    "kur", "kurot", "kurov", "kuron", "picka", "pichka", "pickata", "pichkava", "pichkana",
+    "ebam", "mrsh", "glup", "glupiot", "glupiov", "glupion", 
+    "idiot", "idiotot", "idiotov", "idioton", "gomno", "gomnoto", "gomnovo", "gomnono",
+    "kurva", "kurvata", "kurvava", "kurvana", "srane", "sranje", "sranjeto", "sranjevo", "sranjeno",
+    "cicka", "cickata", "cickava", "cickana", "gaz", "gazot", "gazov", "gazon",
+    "peder", "pederot", "pederov", "pederon", "autist", "autistot", "autistov", "autiston"
   ];
Index: backend/filters/safeWords.js
===================================================================
--- backend/filters/safeWords.js	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ backend/filters/safeWords.js	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -1,31 +1,200 @@
 module.exports = [
     // Macedonian Cyrillic
-    "код", "функција", "променлива", "класа", "јамка", "ако", "инаку", "низа",
-    "објект", "стринг", "цел број", "булијан", "точно", "неточно", "увези", "извези",
-    "конзола", "логирај", "компајлирај", "стартувај", "изврши", "врати", "циклус",
-    "испечати", "тест", "алгоритам", "влез", "излез", "програма", "девелопер",
-    "софтвер", "хардвер", "логика", "бубачка", "поправи", "грешка", "предај",
-    "предизвик", "ИДЕ", "уредувач", "терминал", "тастатура", "грешка при компајлирање",
-    "синтакса", "фрејмворк", "база на податоци", "сервер", "клиент", "јазик", "платформа",
-    "апликација", "интерфејс", "библиотека", "структура", "метод", "конструктор", "база",
-    "податоци", "запис", "изјава", "прашање", "решение", "корисник", "форма", "задаток",
-    "веб", "страница", "линк", "барање", "одговор", "алатка", "список", "јсон", "клуч",
-    "вредност", "влезни податоци", "излезни податоци", "гит", "гитхаб", "функционалност",
-    "коментар", "објаснување", "решавање", "дефинирање", "дебагирање",
-  
+    "код", "кодот", "кодов", "кодон", "функција", "функцијата", "функцијава", "функцијана", 
+    "променлива", "променливата", "променливава", "променливана", "класа", "класата", "класава", "класана",
+    "јамка", "јамката", "јамкава", "јамкана", "ако", "инаку", "низа", "низата", "низава", "низана",
+    "објект", "објектот", "објектов", "објектон", "стринг", "стрингот", "стрингов", "стрингон",
+    "цел број", "булијан", "точно", "неточно", "увези", "извези",
+    "конзола", "конзолата", "конзолава", "конзолана", "логирај", "компајлирај", "стартувај", "изврши", "врати",
+    "циклус", "циклусот", "циклусов", "циклусон", "испечати", "тест", "тестот", "тестов", "тестон",
+    "алгоритам", "алгоритмот", "алгоритмов", "алгоритмон", "влез", "влезот", "влезов", "влезон",
+    "излез", "излезот", "излезов", "излезон", "програма", "програмата", "програмава", "програмана",
+    "девелопер", "девелоперот", "девелоперов", "девелоперон", "софтвер", "софтверот", "софтверов", "софтверон",
+    "хардвер", "хардверот", "хардверов", "хардверон", "логика", "логиката", "логикава", "логикана",
+    "бубачка", "бубачката", "бубачкава", "бубачкана", "поправи", "грешка", "грешката", "грешкава", "грешкана",
+    "предај", "предизвик", "предизвикот", "предизвиков", "предизвикон", "ИДЕ", "уредувач", "уредувачот", "уредувачов", "уредувачон",
+    "терминал", "терминалот", "терминалов", "терминалон", "тастатура", "тастатурата", "тастатурава", "тастатурана",
+    "грешка при компајлирање", "синтакса", "синтаксата", "синтаксава", "синтаксана",
+    "фрејмворк", "фрејмворкот", "фрејмворков", "фрејмворкон", "база на податоци", "сервер", "серверот", "серверов", "серверон",
+    "клиент", "клиентот", "клиентов", "клиентон", "јазик", "јазикот", "јазиков", "јазикон",
+    "платформа", "платформата", "платформава", "платформана", "апликација", "апликацијата", "апликацијава", "апликацијана",
+    "интерфејс", "интерфејсот", "интерфејсов", "интерфејсон", "библиотека", "библиотеката", "библиотекава", "библиотекана",
+    "структура", "структурата", "структурава", "структурана", "метод", "методот", "методов", "методон",
+    "конструктор", "конструкторот", "конструкторов", "конструкторон", "база", "базата", "базава", "базана",
+    "податоци", "запис", "записот", "записов", "записон", "изјава", "изјавата", "изјавава", "изјавана",
+    "прашање", "прашањето", "прашањево", "прашањено", "решение", "решението", "решениево", "решениено",
+    "корисник", "корисникот", "корисников", "корисникон", "форма", "формата", "формава", "формана",
+    "задаток", "задатокот", "задатоков", "задатокон", "веб", "страница", "страницата", "страницава", "страницана",
+    "линк", "линкот", "линков", "линкон", "барање", "барањето", "барањево", "барањено",
+    "одговор", "одговорот", "одговоров", "одговорон", "алатка", "алатката", "алаткава", "алаткана",
+    "список", "списокот", "списоков", "списокон", "јсон", "клуч", "клучот", "клучов", "клучон",
+    "вредност", "вредноста", "вредностава", "вредностана", "влезни податоци", "излезни податоци",
+    "гит", "гитхаб", "функционалност", "функционалноста", "функционалностава", "функционалностана",
+    "коментар", "коментарот", "коментаров", "коментарон", "објаснување", "објаснувањето", "објаснувањево", "објаснувањено",
+    "решавање", "решавањето", "решавањево", "решавањено", "дефинирање", "дефинирањето", "дефинирањево", "дефинирањено",
+    "дебагирање", "дебагирањето", "дебагирањево", "дебагирањено",
+    // Додадени нови зборови
+    "сортирање", "сортирањето", "сортирањево", "сортирањено", "пребарување", "пребарувањето", "пребарувањево", "пребарувањено",
+    "филтрирање", "филтрирањето", "филтрирањево", "филтрирањено", "мапирање", "мапирањето", "мапирањево", "мапирањено",
+    "итерација", "итерацијата", "итерацијава", "итерацијана", "рекурзија", "рекурзијата", "рекурзијава", "рекурзијана",
+    "матрица", "матрицата", "матрицава", "матрицана", "табела", "табелата", "табелава", "табелана",
+    "ред", "редот", "редов", "редон", "колона", "колоната", "колонава", "колонана",
+    "индекс", "индексот", "индексов", "индексон", "должина", "должината", "должинава", "должинана",
+    "големина", "големината", "големинава", "големинана", "размер", "размерот", "размеров", "размерон",
+    "парола", "паролата", "паролава", "паролана", "корисничко име", "најава", "најавата", "најавава", "најавана",
+    "одјава", "одјавата", "одјавава", "одјавана", "сесија", "сесијата", "сесијава", "сесијана",
+    "токен", "токенот", "токенов", "токенон", "криптирање", "криптирањето", "криптирањево", "криптирањено",
+    "валидација", "валидацијата", "валидацијава", "валидацијана", "провера", "проверата", "проверава", "проверана",
+    "условие", "условието", "условиево", "условиено", "критериум", "критериумот", "критериумов", "критериумон",
+    "параметар", "параметарот", "параметаров", "параметарон", "аргумент", "аргументот", "аргументов", "аргументон",
+    "повратна вредност", "исклучок", "исклучокот", "исклучоков", "исклучокон", "фрлање грешка", "справување со грешки",
+    "оптимизација", "оптимизацијата", "оптимизацијава", "оптимизацијана", "перформанси", "брзина", "брзината", "брзинава", "брзинана",
+    "меморија", "меморијата", "меморијава", "меморијана", "простор", "просторот", "просторов", "просторон",
+    "време", "времето", "времево", "времено", "бинарно", "хексадецимално", "децимално",
+    "бит", "битот", "битов", "битон", "бајт", "бајтот", "бајтов", "бајтон",
+    "мегабајт", "мегабајтот", "мегабајтов", "мегабајтон", "гигабајт", "гигабајтот", "гигабајтов", "гигабајтон",
+    "компресија", "компресијата", "компресијава", "компресијана", "декомпресија", "декомпресијата", "декомпресијава", "декомпресијана",
+    "енкодирање", "енкодирањето", "енкодирањево", "енкодирањено", "декодирање", "декодирањето", "декодирањево", "декодирањено",
+    "хеш", "хешот", "хешов", "хешон", "шифрирање", "шифрирањето", "шифрирањево", "шифрирањено",
+    "примерок", "примерокот", "примероков", "примерокон", "инстанца", "инстанцата", "инстанцава", "инстанцана",
+    "наследување", "наследувањето", "наследувањево", "наследувањено", "енкапсулација", "енкапсулацијата", "енкапсулацијава", "енкапсулацијана",
+    "полиморфизам", "полиморфизмот", "полиморфизмов", "полиморфизмон", "абстракција", "абстракцијата", "абстракцијава", "абстракцијана",
+    "модул", "модулот", "модулов", "модулон", "пакет", "пакетот", "пакетов", "пакетон",
+    "именски простор", "скоп", "скопот", "скопов", "скопон", "видливост", "видливоста", "видливостава", "видливостана",
+    "статично", "динамично", "јавно", "приватно", "заштитено", "константа", "константата", "константава", "константана",
+    "статистика", "статистиката", "статистикава", "статистикана", "анализа", "анализата", "анализава", "анализана",
+    "извештај", "извештајот", "извештајов", "извештајон", "графикон", "графиконот", "графиконов", "графиконон",
+    "дијаграм", "дијаграмот", "дијаграмов", "дијаграмон", "визуелизација", "визуелизацијата", "визуелизацијава", "визуелизацијана",
+    "тестирање", "тестирањето", "тестирањево", "тестирањено", "единечен тест", "интеграциски тест", "функционален тест",
+    "автоматизација", "автоматизацијата", "автоматизацијава", "автоматизацијана", "скрипта", "скриптата", "скриптава", "скриптана",
+    "макро", "макрото", "макрово", "макроно", "команда", "командата", "командава", "командана", "аргументи од командна линија",
+    "конфигурација", "конфигурацијата", "конфигурацијава", "конфигурацијана", "поставувања", "опции", "флаг", "флагот", "флагов", "флагон",
+    "прекинувач", "прекинувачот", "прекинувачов", "прекинувачон", "режим", "режимот", "режимов", "режимон",
+    "развој", "развојот", "развојов", "развојон", "производство", "производството", "производствово", "производствено",
+    "верзија", "верзијата", "верзијава", "верзијана", "ревизија", "ревизијата", "ревизијава", "ревизијана",
+    "комит", "комитот", "комитов", "комитон", "гранка", "гранката", "гранкава", "гранкана",
+    "спојување", "спојувањето", "спојувањево", "спојувањено", "конфликт", "конфликтот", "конфликтов", "конфликтон",
+    "резолуција", "резолуцијата", "резолуцијава", "резолуцијана", "репозиториум", "репозиториумот", "репозиториумов", "репозиториумон",
+    "документација", "документацијата", "документацијава", "документацијана", "упатство", "упатството", "упатствово", "упатствено",
+    "помош", "поможта", "поможава", "поможана", "водич", "водичот", "водичов", "водичон",
+    "туторијал", "туторијалот", "туторијалов", "туторијалон", "пример", "примерот", "примеров", "примерон",
+    "демо", "демото", "демово", "демоно", "макета", "макетата", "макетава", "макетана",
+    "прототип", "прототипот", "прототипов", "прототипон", "шема", "шемата", "шемава", "шемана",
+    "модел", "моделот", "моделов", "моделон", "архитектура", "архитектурата", "архитектурава", "архитектурана",
+    "дизајн", "дизајнот", "дизајнов", "дизајнон", "образец", "образецот", "образецов", "образецон",
+    "шаблон", "шаблонот", "шаблонов", "шаблонон", "темплејт", "темплејтот", "темплејтов", "темплејтон",
+    "стил", "стилот", "стилов", "стилон", "тема", "темата", "темава", "темана",
+    "изглед", "изгледот", "изгледов", "изгледон", "копче", "копчето", "копчево", "копчено",
+    "поле", "полето", "полево", "полено", "мени", "менито", "менево", "менено",
+    "навигација", "навигацијата", "навигацијава", "навигацијана", "рути", "страни",
+    "компонента", "компонентата", "компонентава", "компонентана", "виџет", "виџетот", "виџетов", "виџетон",
+    "елемент", "елементот", "елементов", "елементон", "атрибут", "атрибутот", "атрибутов", "атрибутон",
+    "својство", "својството", "својствово", "својствено", "событие", "событието", "wydarzениево", "събитиено",
+    "ракувач", "ракувачот", "ракувачов", "ракувачон", "колбек", "колбекот", "колбеков", "колбекон",
+    "промисе", "промисето", "промисево", "промисено", "асинхроно", "синхроно",
+    "мрежа", "мрежата", "мрежава", "мрежана", "протокол", "протоколот", "протоколов", "протоколон",
+    "порта", "портата", "портава", "портана", "хост", "хостот", "хостов", "хостон",
+    "домен", "доменот", "доменов", "доменон", "УРЛ", "патека", "патеката", "патекава", "патекана",
+    "праметри", "заглавја", "телото на барањето", "статус код", "успех", "успехот", "успехов", "успехон",
+
     // Macedonian Latin
-    "kod", "funkcija", "promenliva", "klasa", "jamka", "ako", "inaku", "niza",
-    "objekt", "string", "cel broj", "bulijan", "tochno", "netochno", "uvezi", "izvezi",
-    "konzola", "logiraj", "kompajliraj", "startuvaj", "izvrshi", "vrati", "ciklus",
-    "ispečati", "test", "algoritam", "vlez", "izlez", "programa", "developer",
-    "softver", "hardver", "logika", "bubačka", "popravi", "greška", "predaj",
-    "predizvik", "IDE", "ureduvač", "terminal", "tastatura", "greška pri kompajliranje",
-    "sintaksa", "frejmvork", "baza na podatoci", "server", "klient", "jazik", "platforma",
-    "aplikacija", "interfejs", "biblioteka", "struktura", "metod", "konstruktor", "baza",
-    "podatoci", "zapis", "izjava", "prašenje", "rešenje", "korisnik", "forma", "zadatok",
-    "web", "stranica", "link", "baranje", "odgovor", "alatka", "spisok", "json", "ključ",
-    "vrednost", "vlezni podatoci", "izlezni podatoci", "git", "github", "funkcionalnost",
-    "komentar", "objasnuvanje", "rešavanje", "definiranje", "debugiranje",
-  
+    "kod", "kodot", "kodov", "kodon", "funkcija", "funkcijata", "funkcijava", "funkcijana", 
+    "promenliva", "promenlivata", "promenlivava", "promenlivana", "klasa", "klasata", "klasava", "klasana",
+    "jamka", "jamkata", "jamkava", "jamkana", "ako", "inaku", "niza", "nizata", "nizava", "nizana",
+    "objekt", "objektot", "objektov", "objekton", "string", "stringot", "stringov", "stringon",
+    "cel broj", "bulijan", "tochno", "netochno", "uvezi", "izvezi",
+    "konzola", "konzolata", "konzolava", "konzolana", "logiraj", "kompajliraj", "startuvaj", "izvrshi", "vrati",
+    "ciklus", "ciklusot", "ciklusov", "cikluson", "ispečati", "test", "testot", "testov", "teston",
+    "algoritam", "algoritmot", "algoritmov", "algoritmon", "vlez", "vlezot", "vlezov", "vlezon",
+    "izlez", "izlezot", "izlezov", "izlezon", "programa", "programata", "programava", "programana",
+    "developer", "developerot", "developerov", "developeron", "softver", "softverot", "softverov", "softveron",
+    "hardver", "hardverot", "hardverov", "hardveron", "logika", "logikata", "logikava", "logikana",
+    "bubačka", "bubačkata", "bubačkava", "bubačkana", "popravi", "greška", "greškata", "greškava", "greškana",
+    "predaj", "predizvik", "predizvikot", "predizvikov", "predizvikonn", "IDE", "ureduvač", "ureduvačot", "ureduvačov", "ureduvačon",
+    "terminal", "terminalot", "terminalov", "terminalon", "tastatura", "tastaturata", "tastaturava", "tastaturana",
+    "greška pri kompajliranje", "sintaksa", "sintaksata", "sintaksava", "sintaksana",
+    "frejmvork", "frejmvorkot", "frejmvorkov", "frejmvorkon", "baza na podatoci", "server", "serverot", "serverov", "serveron",
+    "klient", "klientot", "klientov", "klienton", "jazik", "jazikot", "jazikov", "jazikon",
+    "platforma", "platformata", "platformava", "platformana", "aplikacija", "aplikacijata", "aplikacijava", "aplikacijana",
+    "interfejs", "interfejsot", "interfejsov", "interfejson", "biblioteka", "bibliotekata", "bibliotekava", "bibliotekana",
+    "struktura", "strukturata", "strukturava", "strukturana", "metod", "metodot", "metodov", "metodon",
+    "konstruktor", "konstruktorot", "konstruktorov", "konstruktoron", "baza", "bazata", "bazava", "bazana",
+    "podatoci", "zapis", "zapisot", "zapisov", "zapison", "izjava", "izjavata", "izjavava", "izjavana",
+    "prašenje", "prašenjeto", "prašenjevo", "prašenjeno", "rešenje", "rešenjeto", "rešenjevo", "rešenjeno",
+    "korisnik", "korisnikot", "korisnikov", "korisnikon", "forma", "formata", "formava", "formana",
+    "zadatok", "zadatokot", "zadatokov", "zadatokon", "web", "stranica", "stranicata", "stranicava", "stranicana",
+    "link", "linkot", "linkov", "linkon", "baranje", "baranjeto", "baranjevo", "baranjeno",
+    "odgovor", "odgovorot", "odgovorov", "odgovoron", "alatka", "alatkata", "alatkava", "alatkana",
+    "spisok", "spiskot", "spiskov", "spiskon", "json", "ključ", "ključot", "ključov", "ključon",
+    "vrednost", "vrednoста", "vrednostava", "vrednostana", "vlezni podatoci", "izlezni podatoci",
+    "git", "github", "funkcionalnost", "funkcionalnoста", "funkcionalnostava", "funkcionalnostana",
+    "komentar", "komentarot", "komentarov", "komentaron", "objasnuvanje", "objasnuvanjeto", "objasnuvanjevo", "objasnuvanjeno",
+    "rešavanje", "rešavanjeto", "rešavanjevo", "rešavanjeno", "definiranje", "definirajeto", "definirajevo", "definirajeno",
+    "debugiranje", "debugiranjeto", "debugiranjevo", "debugiranjeno",
+    // Dodadeni novi zborovi
+    "sortiranje", "sortiranjeto", "sortiranjevo", "sortiranjeno", "prebaruvanje", "prebaruvanjeto", "prebaruvanjevo", "prebaruvanjeno",
+    "filtriranje", "filtriranjeto", "filtriranjevo", "filtriranjeno", "mapiranje", "mapiranjeto", "mapiranjevo", "mapiranjeno",
+    "iteracija", "iteracijata", "iteracijava", "iteracijana", "rekurzija", "rekurzijata", "rekurzijava", "rekurzijana",
+    "matrica", "matricata", "matricava", "matricana", "tabela", "tabelata", "tabelava", "tabelana",
+    "red", "redot", "redov", "redon", "kolona", "kolonata", "kolonava", "kolonana",
+    "indeks", "indeksot", "indeksov", "indekson", "dolžina", "dolžinata", "dolžinava", "dolžinana",
+    "golemina", "goleminata", "goleminava", "goleminana", "razmer", "razmerot", "razmerov", "razmeron",
+    "parola", "parolata", "parolava", "parolana", "korisničko ime", "najava", "najavata", "najavava", "najavana",
+    "odjava", "odjavata", "odjavava", "odjavana", "sesija", "sesijata", "sesijava", "sesijana",
+    "token", "tokenot", "tokenov", "tokenon", "kriptiranje", "kriptiranjeto", "kriptiranjevo", "kriptiranjeno",
+    "validacija", "validacijata", "validacijava", "validacijana", "provera", "proverata", "proverava", "proverana",
+    "uslovie", "uslovieto", "uslovievo", "uslovieno", "kriterium", "kriteriumot", "kriteriumov", "kriteriumon",
+    "parametar", "parametarot", "parametarov", "parametaron", "argument", "argumentot", "argumentov", "argumenton",
+    "povratna vrednost", "isklučok", "isklučokot", "isklučokov", "isklučokon", "frlanje greška", "spravuvanje so greški",
+    "optimizacija", "optimizacijata", "optimizacijava", "optimizacijana", "performansi", "brzina", "brzinata", "brzinava", "brzinana",
+    "memorija", "memorijata", "memorijava", "memorijana", "prostor", "prostorot", "prostorov", "prostoron",
+    "vreme", "vremeto", "vremevo", "vremeno", "binarno", "heksadecimalno", "decimalno",
+    "bit", "bitot", "bitov", "biton", "bajt", "bajtot", "bajtov", "bajton",
+    "megabajt", "megabajtot", "megabajtov", "megabajton", "gigabajt", "gigabajtot", "gigabajtov", "gigabajton",
+    "kompresija", "kompresijata", "kompresijava", "kompresijana", "dekompresija", "dekompresijata", "dekompresijava", "dekompresijana",
+    "enkodiranje", "enkodiranjeto", "enkodiranjevo", "enkodiranjeno", "dekodiranje", "dekodiranjeto", "dekodiranjevo", "dekodiranjeno",
+    "heš", "hešot", "hešov", "hešon", "šifriranje", "šifriranjeto", "šifriranjevo", "šifriranjeno",
+    "primerok", "primerokot", "primerokov", "primerokon", "instanca", "instancata", "instancava", "instancana",
+    "nasleduvanje", "nasleduvanjeto", "nasleduvanjevo", "nasleduvanjeno", "enkapsulacija", "enkapsulacijata", "enkapsulacijava", "enkapsulacijana",
+    "polimorfizam", "polimorfizmot", "polimorfizmov", "polimorfizmon", "apstrakcija", "apstrakcijata", "apstrakcijava", "apstrakcijana",
+    "modul", "modulot", "modulov", "modulon", "paket", "paketot", "paketov", "paketon",
+    "imenski prostor", "skop", "skopot", "skopov", "skopon", "vidlivost", "vidlivosta", "vidlivostava", "vidlivostana",
+    "statično", "dinamično", "javno", "privatno", "zaštiteno", "konstanta", "konstantata", "konstantava", "konstantana",
+    "statistika", "statistikata", "statistikava", "statistikana", "analiza", "analizata", "analizava", "analizana",
+    "izveštaj", "izveštajot", "izveštajov", "izveštajon", "grafikon", "grafikonot", "grafikonov", "grafikonon",
+    "dijagram", "dijagramot", "dijagramov", "dijagramon", "vizuelizacija", "vizuelizacijata", "vizuelizacijava", "vizuelizacijana",
+    "testiranje", "testiranjeto", "testiranjevo", "testiranjeno", "edinečen test", "integraciski test", "funkcionalen test",
+    "avtomatizacija", "avtomatizacijata", "avtomatizacijava", "avtomatizacijana", "skripta", "skriptata", "skriptava", "skriptana",
+    "makro", "makroto", "makrovo", "makrono", "komanda", "komandata", "komandava", "komandana", "argumenti od komandna linija",
+    "konfiguracija", "konfiguracijata", "konfiguracijava", "konfiguracijana", "postavuvanja", "opcii", "flag", "flagot", "flagov", "flagon",
+    "prekinuvač", "prekinuvačot", "prekinuvačov", "prekinuvačon", "režim", "režimot", "režimov", "režimon",
+    "razvoj", "razvojot", "razvojov", "razvojon", "proizvodstvo", "proizvodstvoto", "proizvodstvovo", "proizvodstvono",
+    "verzija", "verzijata", "verzijava", "verzijana", "revizija", "revizijata", "revizijava", "revizijana",
+    "komit", "komitot", "komitov", "komiton", "granka", "grankata", "grankava", "grankana",
+    "spojuvanje", "spojuvanjeto", "spojuvanjevo", "spojuvanjeno", "konflikt", "konfliktot", "konfliktov", "konflikton",
+    "rezolucija", "rezolucijata", "rezolucijava", "rezolucijana", "repozitorium", "repozitoriumot", "repozitoriumov", "repozitoriumon",
+    "dokumentacija", "dokumentacijata", "dokumentacijava", "dokumentacijana", "upatstvo", "upatstvoto", "upatstvovo", "upatstvono",
+    "pomoš", "pomošta", "pomošava", "pomošana", "vodič", "vodičot", "vodičov", "vodičon",
+    "tutorial", "tutorialot", "tutorialov", "tutorialon", "primer", "primerot", "primerov", "primeron",
+    "demo", "demoto", "demovo", "demono", "maketa", "maketata", "maketava", "maketana",
+    "prototip", "prototipot", "prototipov", "prototipon", "šema", "šemata", "šemava", "šemana",
+    "model", "modelot", "modelov", "modelon", "arhitektura", "arhitekturata", "arhitekturава", "arhitekturana",
+    "dizajn", "dizajnot", "dizajnov", "dizajnon", "obrazec", "obrazecot", "obrazecov", "obrazecon",
+    "šablon", "šablonot", "šablonov", "šablonon", "templejt", "templejtot", "templejtov", "templejton",
+    "stil", "stilot", "stilov", "silon", "tema", "temata", "temava", "temana",
+    "izgled", "izgledot", "izgledov", "izgledon", "kopče", "kopčeto", "kopčevo", "kopčeno",
+    "forma", "formata", "formava", "formana", "pole", "poleto", "polevo", "poleno", "lista", "listata", "listava", "listana", 
+    "meni", "menito", "menevo", "meneno", "navigacija", "navigacijata", "navigacijava", "navigacijana", "ruti", "strani",
+    "komponenta", "komponentata", "komponentava", "komponentana", "vidžet", "vidžetot", "vidžetov", "vidžeton",
+    "element", "elementot", "elementov", "elementon", "atribut", "atributot", "atributov", "atributon",
+    "svojstvo", "svojstvoto", "svojstvovo", "svojstvono", "vrednost", "vrednoста", "vrednostava", "vrednostana",
+    "sobytie", "sobytajeto", "sobytiјevo", "sobytiјeno", "rakuvač", "rakuvačot", "rakuvačov", "rakuvačon", 
+    "kolbek", "kolbekot", "kolbekov", "kolbekon", "promise", "promiseto", "promisevo", "promiseno", "asinhroно", "sinhroно",
+    "mreža", "mrežata", "mrežava", "mrežana", "protokol", "protokolot", "protokolov", "protokolon",
+    "porta", "portata", "portava", "portana", "host", "hostot", "hostov", "hoston",
+    "domen", "domenot", "domenov", "domenon", "URL", "pateka", "patekata", "patekava", "patekana",
+    "parametri", "zaglavja", "teloto na baranjeto", "status kod", "greška", "greškata", "greškava", "greškana", 
+    "uspeh", "uspehot", "uspehov", "uspehon",
+
     // English
     "code", "function", "variable", "class", "loop", "if", "else", "array",
@@ -40,9 +209,34 @@
     "list", "json", "key", "value", "input data", "output data", "git", "github",
     "feature", "comment", "explanation", "debug", "define", "solve",
-  
+    // Added new words
+    "sorting", "searching", "filtering", "mapping", "iteration", "recursion",
+    "matrix", "table", "row", "column", "index", "length", "size", "dimension",
+    "password", "username", "login", "logout", "session", "token", "encryption",
+    "validation", "check", "condition", "criteria", "parameter", "argument",
+    "return value", "exception", "throw error", "error handling",
+    "optimization", "performance", "speed", "memory", "space", "time",
+    "binary", "hexadecimal", "decimal", "bit", "byte", "megabyte", "gigabyte",
+    "compression", "decompression", "encoding", "decoding", "hash", "cipher",
+    "instance", "inheritance", "encapsulation", "polymorphism",
+    "abstraction", "module", "package", "namespace", "scope", "visibility",
+    "static", "dynamic", "public", "private", "protected", "constant",
+    "statistics", "analysis", "report", "chart", "diagram", "visualization",
+    "testing", "unit test", "integration test", "functional test",
+    "automation", "script", "macro", "command", "command line arguments",
+    "configuration", "settings", "options", "flag", "switch", "mode",
+    "development", "production", "testing", "version", "revision", "commit",
+    "branch", "merge", "conflict", "resolution", "repository",
+    "documentation", "manual", "help", "guide", "tutorial", "example",
+    "demo", "mockup", "prototype", "schema", "model", "architecture", "design",
+    "pattern", "template", "style", "theme", "appearance", "interface",
+    "button", "form", "field", "list", "menu", "navigation", "routes", "pages",
+    "component", "widget", "element", "attribute", "property", "value",
+    "event", "handler", "callback", "promise", "asynchronous", "synchronous",
+    "network", "protocol", "port", "host", "domain", "URL", "path", "parameters",
+    "headers", "request body", "status code", "error", "success",
+
     // Programming languages
     "javascript", "python", "java", "csharp", "c#", "c++", "cpp", "html", "css", "php",
     "sql", "typescript", "react", "vue", "angular", "dotnet", "aspnet", "django",
     "flask", "nodejs", "express", "tailwind", "bootstrap", "webflow"
-  ];
-  
+];
Index: backend/node_modules/.package-lock.json
===================================================================
--- backend/node_modules/.package-lock.json	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ backend/node_modules/.package-lock.json	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -5,8 +5,102 @@
   "requires": true,
   "packages": {
+    "node_modules/@isaacs/fs-minipass": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^7.0.4"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@prisma/client": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.9.0.tgz",
+      "integrity": "sha512-Gg7j1hwy3SgF1KHrh0PZsYvAaykeR0PaxusnLXydehS96voYCGt1U5zVR31NIouYc63hWzidcrir1a7AIyCsNQ==",
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "peerDependencies": {
+        "prisma": "*",
+        "typescript": ">=5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "prisma": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@prisma/config": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.9.0.tgz",
+      "integrity": "sha512-Wcfk8/lN3WRJd5w4jmNQkUwhUw0eksaU/+BlAJwPQKW10k0h0LC9PD/6TQFmqKVbHQL0vG2z266r0S1MPzzhbA==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "jiti": "2.4.2"
+      }
+    },
+    "node_modules/@prisma/debug": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.9.0.tgz",
+      "integrity": "sha512-bFeur/qi/Q+Mqk4JdQ3R38upSYPebv5aOyD1RKywVD+rAMLtRkmTFn28ZuTtVOnZHEdtxnNOCH+bPIeSGz1+Fg==",
+      "devOptional": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@prisma/engines": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.9.0.tgz",
+      "integrity": "sha512-im0X0bwDLA0244CDf8fuvnLuCQcBBdAGgr+ByvGfQY9wWl6EA+kRGwVk8ZIpG65rnlOwtaWIr/ZcEU5pNVvq9g==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.9.0",
+        "@prisma/engines-version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e",
+        "@prisma/fetch-engine": "6.9.0",
+        "@prisma/get-platform": "6.9.0"
+      }
+    },
+    "node_modules/@prisma/engines-version": {
+      "version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e",
+      "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e.tgz",
+      "integrity": "sha512-Qp9gMoBHgqhKlrvumZWujmuD7q4DV/gooEyPCLtbkc13EZdSz2RsGUJ5mHb3RJgAbk+dm6XenqG7obJEhXcJ6Q==",
+      "devOptional": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@prisma/fetch-engine": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.9.0.tgz",
+      "integrity": "sha512-PMKhJdl4fOdeE3J3NkcWZ+tf3W6rx3ht/rLU8w4SXFRcLhd5+3VcqY4Kslpdm8osca4ej3gTfB3+cSk5pGxgFg==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.9.0",
+        "@prisma/engines-version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e",
+        "@prisma/get-platform": "6.9.0"
+      }
+    },
+    "node_modules/@prisma/get-platform": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.9.0.tgz",
+      "integrity": "sha512-/B4n+5V1LI/1JQcHp+sUpyRT1bBgZVPHbsC4lt4/19Xp4jvNIVcq5KYNtQDk5e/ukTSjo9PZVAxxy9ieFtlpTQ==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.9.0"
+      }
+    },
     "node_modules/@supabase/auth-js": {
-      "version": "2.69.1",
-      "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.69.1.tgz",
-      "integrity": "sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ==",
+      "version": "2.70.0",
+      "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.70.0.tgz",
+      "integrity": "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg==",
       "license": "MIT",
       "dependencies": {
@@ -66,10 +160,10 @@
     },
     "node_modules/@supabase/supabase-js": {
-      "version": "2.49.10",
-      "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.49.10.tgz",
-      "integrity": "sha512-IRPcIdncuhD2m1eZ2Fkg0S1fq9SXlHfmAetBxPN66kVFtTucR8b01xKuVmKqcIJokB17umMf1bmqyS8yboXGsw==",
-      "license": "MIT",
-      "dependencies": {
-        "@supabase/auth-js": "2.69.1",
+      "version": "2.50.0",
+      "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.50.0.tgz",
+      "integrity": "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg==",
+      "license": "MIT",
+      "dependencies": {
+        "@supabase/auth-js": "2.70.0",
         "@supabase/functions-js": "2.4.4",
         "@supabase/node-fetch": "2.6.15",
@@ -116,4 +210,13 @@
       }
     },
+    "node_modules/agent-base": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+      "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/anymatch": {
       "version": "3.1.3",
@@ -166,4 +269,20 @@
       "engines": {
         "node": ">= 18"
+      }
+    },
+    "node_modules/bin-links": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz",
+      "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==",
+      "license": "ISC",
+      "dependencies": {
+        "cmd-shim": "^7.0.0",
+        "npm-normalize-package-bin": "^4.0.0",
+        "proc-log": "^5.0.0",
+        "read-cmd-shim": "^5.0.0",
+        "write-file-atomic": "^6.0.0"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
       }
     },
@@ -570,4 +689,22 @@
       }
     },
+    "node_modules/chownr": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/cmd-shim": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz",
+      "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
     "node_modules/combined-stream": {
       "version": "1.0.8",
@@ -647,4 +784,13 @@
       "engines": {
         "node": "*"
+      }
+    },
+    "node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
       }
     },
@@ -880,4 +1026,27 @@
       }
     },
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
+      }
+    },
     "node_modules/fill-range": {
       "version": "7.1.1",
@@ -967,4 +1136,16 @@
       }
     },
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "license": "MIT",
+      "dependencies": {
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
@@ -1157,4 +1338,17 @@
       }
     },
+    "node_modules/https-proxy-agent": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "^7.1.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/iconv-lite": {
       "version": "0.6.3",
@@ -1175,4 +1369,13 @@
       "dev": true,
       "license": "ISC"
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
     },
     "node_modules/inherits": {
@@ -1243,4 +1446,14 @@
       "license": "MIT"
     },
+    "node_modules/jiti": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+      "devOptional": true,
+      "license": "MIT",
+      "bin": {
+        "jiti": "lib/jiti-cli.mjs"
+      }
+    },
     "node_modules/leo-profanity": {
       "version": "1.7.0",
@@ -1323,4 +1536,40 @@
       }
     },
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
+      "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/ms": {
       "version": "2.1.3",
@@ -1345,4 +1594,42 @@
       "engines": {
         "node": "^18 || ^20 || >= 21"
+      }
+    },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "deprecated": "Use your platform's native DOMException instead",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.5.0"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "license": "MIT",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
       }
     },
@@ -1395,4 +1682,13 @@
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-normalize-package-bin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
+      "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
       }
     },
@@ -1600,4 +1896,39 @@
       }
     },
+    "node_modules/prisma": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.9.0.tgz",
+      "integrity": "sha512-resJAwMyZREC/I40LF6FZ6rZTnlrlrYrb63oW37Gq+U+9xHwbyMSPJjKtM7VZf3gTO86t/Oyz+YeSXr3CmAY1Q==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/config": "6.9.0",
+        "@prisma/engines": "6.9.0"
+      },
+      "bin": {
+        "prisma": "build/index.js"
+      },
+      "engines": {
+        "node": ">=18.18"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/proc-log": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
+      "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
@@ -1663,4 +1994,13 @@
       "engines": {
         "node": ">= 0.8"
+      }
+    },
+    "node_modules/read-cmd-shim": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz",
+      "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
       }
     },
@@ -1872,4 +2212,16 @@
       }
     },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/simple-update-notifier": {
       "version": "2.0.0",
@@ -1903,4 +2255,23 @@
       }
     },
+    "node_modules/supabase": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmjs.org/supabase/-/supabase-2.24.3.tgz",
+      "integrity": "sha512-mh9pi4C5pM159GyYE+Rv9qL8kg1kqzimQ4FBr6UH/WhzB/VcDaA+vpn/VeRC3CGVKr+d89Ra5MjDWg+/UoPpXg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "dependencies": {
+        "bin-links": "^5.0.0",
+        "https-proxy-agent": "^7.0.2",
+        "node-fetch": "^3.3.2",
+        "tar": "7.4.3"
+      },
+      "bin": {
+        "supabase": "bin/supabase"
+      },
+      "engines": {
+        "npm": ">=8"
+      }
+    },
     "node_modules/supports-color": {
       "version": "5.5.0",
@@ -1914,4 +2285,21 @@
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/tar": {
+      "version": "7.4.3",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+      "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+      "license": "ISC",
+      "dependencies": {
+        "@isaacs/fs-minipass": "^4.0.0",
+        "chownr": "^3.0.0",
+        "minipass": "^7.1.2",
+        "minizlib": "^3.0.1",
+        "mkdirp": "^3.0.1",
+        "yallist": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
       }
     },
@@ -2014,4 +2402,13 @@
       }
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
@@ -2056,4 +2453,17 @@
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "license": "ISC"
+    },
+    "node_modules/write-file-atomic": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz",
+      "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==",
+      "license": "ISC",
+      "dependencies": {
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
     },
     "node_modules/ws": {
@@ -2077,4 +2487,13 @@
         }
       }
+    },
+    "node_modules/yallist": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
     }
   }
Index: backend/package-lock.json
===================================================================
--- backend/package-lock.json	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ backend/package-lock.json	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -10,5 +10,6 @@
       "license": "ISC",
       "dependencies": {
-        "@supabase/supabase-js": "^2.39.7",
+        "@prisma/client": "^6.9.0",
+        "@supabase/supabase-js": "^2.50.0",
         "axios": "^1.9.0",
         "bcrypt": "^6.0.0",
@@ -18,15 +19,111 @@
         "express": "^5.1.0",
         "leo-profanity": "^1.7.0",
-        "openai": "^5.1.1"
+        "openai": "^5.1.1",
+        "supabase": "^2.24.3"
       },
       "devDependencies": {
         "@types/node": "^22.15.30",
-        "nodemon": "^3.1.9"
+        "nodemon": "^3.1.9",
+        "prisma": "^6.9.0"
+      }
+    },
+    "node_modules/@isaacs/fs-minipass": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^7.0.4"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@prisma/client": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.9.0.tgz",
+      "integrity": "sha512-Gg7j1hwy3SgF1KHrh0PZsYvAaykeR0PaxusnLXydehS96voYCGt1U5zVR31NIouYc63hWzidcrir1a7AIyCsNQ==",
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "peerDependencies": {
+        "prisma": "*",
+        "typescript": ">=5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "prisma": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@prisma/config": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.9.0.tgz",
+      "integrity": "sha512-Wcfk8/lN3WRJd5w4jmNQkUwhUw0eksaU/+BlAJwPQKW10k0h0LC9PD/6TQFmqKVbHQL0vG2z266r0S1MPzzhbA==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "jiti": "2.4.2"
+      }
+    },
+    "node_modules/@prisma/debug": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.9.0.tgz",
+      "integrity": "sha512-bFeur/qi/Q+Mqk4JdQ3R38upSYPebv5aOyD1RKywVD+rAMLtRkmTFn28ZuTtVOnZHEdtxnNOCH+bPIeSGz1+Fg==",
+      "devOptional": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@prisma/engines": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.9.0.tgz",
+      "integrity": "sha512-im0X0bwDLA0244CDf8fuvnLuCQcBBdAGgr+ByvGfQY9wWl6EA+kRGwVk8ZIpG65rnlOwtaWIr/ZcEU5pNVvq9g==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.9.0",
+        "@prisma/engines-version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e",
+        "@prisma/fetch-engine": "6.9.0",
+        "@prisma/get-platform": "6.9.0"
+      }
+    },
+    "node_modules/@prisma/engines-version": {
+      "version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e",
+      "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e.tgz",
+      "integrity": "sha512-Qp9gMoBHgqhKlrvumZWujmuD7q4DV/gooEyPCLtbkc13EZdSz2RsGUJ5mHb3RJgAbk+dm6XenqG7obJEhXcJ6Q==",
+      "devOptional": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/@prisma/fetch-engine": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.9.0.tgz",
+      "integrity": "sha512-PMKhJdl4fOdeE3J3NkcWZ+tf3W6rx3ht/rLU8w4SXFRcLhd5+3VcqY4Kslpdm8osca4ej3gTfB3+cSk5pGxgFg==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.9.0",
+        "@prisma/engines-version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e",
+        "@prisma/get-platform": "6.9.0"
+      }
+    },
+    "node_modules/@prisma/get-platform": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.9.0.tgz",
+      "integrity": "sha512-/B4n+5V1LI/1JQcHp+sUpyRT1bBgZVPHbsC4lt4/19Xp4jvNIVcq5KYNtQDk5e/ukTSjo9PZVAxxy9ieFtlpTQ==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/debug": "6.9.0"
       }
     },
     "node_modules/@supabase/auth-js": {
-      "version": "2.69.1",
-      "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.69.1.tgz",
-      "integrity": "sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ==",
+      "version": "2.70.0",
+      "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.70.0.tgz",
+      "integrity": "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg==",
       "license": "MIT",
       "dependencies": {
@@ -86,10 +183,10 @@
     },
     "node_modules/@supabase/supabase-js": {
-      "version": "2.49.10",
-      "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.49.10.tgz",
-      "integrity": "sha512-IRPcIdncuhD2m1eZ2Fkg0S1fq9SXlHfmAetBxPN66kVFtTucR8b01xKuVmKqcIJokB17umMf1bmqyS8yboXGsw==",
-      "license": "MIT",
-      "dependencies": {
-        "@supabase/auth-js": "2.69.1",
+      "version": "2.50.0",
+      "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.50.0.tgz",
+      "integrity": "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg==",
+      "license": "MIT",
+      "dependencies": {
+        "@supabase/auth-js": "2.70.0",
         "@supabase/functions-js": "2.4.4",
         "@supabase/node-fetch": "2.6.15",
@@ -136,4 +233,13 @@
       }
     },
+    "node_modules/agent-base": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+      "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/anymatch": {
       "version": "3.1.3",
@@ -186,4 +292,20 @@
       "engines": {
         "node": ">= 18"
+      }
+    },
+    "node_modules/bin-links": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz",
+      "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==",
+      "license": "ISC",
+      "dependencies": {
+        "cmd-shim": "^7.0.0",
+        "npm-normalize-package-bin": "^4.0.0",
+        "proc-log": "^5.0.0",
+        "read-cmd-shim": "^5.0.0",
+        "write-file-atomic": "^6.0.0"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
       }
     },
@@ -590,4 +712,22 @@
       }
     },
+    "node_modules/chownr": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/cmd-shim": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz",
+      "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
     "node_modules/combined-stream": {
       "version": "1.0.8",
@@ -667,4 +807,13 @@
       "engines": {
         "node": "*"
+      }
+    },
+    "node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
       }
     },
@@ -900,4 +1049,27 @@
       }
     },
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
+      }
+    },
     "node_modules/fill-range": {
       "version": "7.1.1",
@@ -987,4 +1159,16 @@
       }
     },
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "license": "MIT",
+      "dependencies": {
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
@@ -1177,4 +1361,17 @@
       }
     },
+    "node_modules/https-proxy-agent": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "^7.1.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/iconv-lite": {
       "version": "0.6.3",
@@ -1195,4 +1392,13 @@
       "dev": true,
       "license": "ISC"
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
     },
     "node_modules/inherits": {
@@ -1263,4 +1469,14 @@
       "license": "MIT"
     },
+    "node_modules/jiti": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+      "devOptional": true,
+      "license": "MIT",
+      "bin": {
+        "jiti": "lib/jiti-cli.mjs"
+      }
+    },
     "node_modules/leo-profanity": {
       "version": "1.7.0",
@@ -1343,4 +1559,40 @@
       }
     },
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
+      "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/ms": {
       "version": "2.1.3",
@@ -1365,4 +1617,42 @@
       "engines": {
         "node": "^18 || ^20 || >= 21"
+      }
+    },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "deprecated": "Use your platform's native DOMException instead",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.5.0"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "license": "MIT",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
       }
     },
@@ -1415,4 +1705,13 @@
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/npm-normalize-package-bin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
+      "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
       }
     },
@@ -1620,4 +1919,39 @@
       }
     },
+    "node_modules/prisma": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.9.0.tgz",
+      "integrity": "sha512-resJAwMyZREC/I40LF6FZ6rZTnlrlrYrb63oW37Gq+U+9xHwbyMSPJjKtM7VZf3gTO86t/Oyz+YeSXr3CmAY1Q==",
+      "devOptional": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@prisma/config": "6.9.0",
+        "@prisma/engines": "6.9.0"
+      },
+      "bin": {
+        "prisma": "build/index.js"
+      },
+      "engines": {
+        "node": ">=18.18"
+      },
+      "peerDependencies": {
+        "typescript": ">=5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/proc-log": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
+      "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
+    },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
@@ -1683,4 +2017,13 @@
       "engines": {
         "node": ">= 0.8"
+      }
+    },
+    "node_modules/read-cmd-shim": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz",
+      "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==",
+      "license": "ISC",
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
       }
     },
@@ -1892,4 +2235,16 @@
       }
     },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/simple-update-notifier": {
       "version": "2.0.0",
@@ -1923,4 +2278,23 @@
       }
     },
+    "node_modules/supabase": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmjs.org/supabase/-/supabase-2.24.3.tgz",
+      "integrity": "sha512-mh9pi4C5pM159GyYE+Rv9qL8kg1kqzimQ4FBr6UH/WhzB/VcDaA+vpn/VeRC3CGVKr+d89Ra5MjDWg+/UoPpXg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "dependencies": {
+        "bin-links": "^5.0.0",
+        "https-proxy-agent": "^7.0.2",
+        "node-fetch": "^3.3.2",
+        "tar": "7.4.3"
+      },
+      "bin": {
+        "supabase": "bin/supabase"
+      },
+      "engines": {
+        "npm": ">=8"
+      }
+    },
     "node_modules/supports-color": {
       "version": "5.5.0",
@@ -1934,4 +2308,21 @@
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/tar": {
+      "version": "7.4.3",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+      "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+      "license": "ISC",
+      "dependencies": {
+        "@isaacs/fs-minipass": "^4.0.0",
+        "chownr": "^3.0.0",
+        "minipass": "^7.1.2",
+        "minizlib": "^3.0.1",
+        "mkdirp": "^3.0.1",
+        "yallist": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
       }
     },
@@ -2034,4 +2425,13 @@
       }
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
@@ -2076,4 +2476,17 @@
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "license": "ISC"
+    },
+    "node_modules/write-file-atomic": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz",
+      "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==",
+      "license": "ISC",
+      "dependencies": {
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": "^18.17.0 || >=20.5.0"
+      }
     },
     "node_modules/ws": {
@@ -2097,4 +2510,13 @@
         }
       }
+    },
+    "node_modules/yallist": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
     }
   }
Index: backend/package.json
===================================================================
--- backend/package.json	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ backend/package.json	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -13,5 +13,6 @@
   "license": "ISC",
   "dependencies": {
-    "@supabase/supabase-js": "^2.39.7",
+    "@prisma/client": "^6.9.0",
+    "@supabase/supabase-js": "^2.50.0",
     "axios": "^1.9.0",
     "bcrypt": "^6.0.0",
@@ -21,9 +22,11 @@
     "express": "^5.1.0",
     "leo-profanity": "^1.7.0",
-    "openai": "^5.1.1"
+    "openai": "^5.1.1",
+    "supabase": "^2.24.3"
   },
   "devDependencies": {
     "@types/node": "^22.15.30",
-    "nodemon": "^3.1.9"
+    "nodemon": "^3.1.9",
+    "prisma": "^6.9.0"
   }
 }
Index: client/src/CreatePost/CreatePost.jsx
===================================================================
--- client/src/CreatePost/CreatePost.jsx	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ client/src/CreatePost/CreatePost.jsx	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -1,32 +1,45 @@
-import React, { useState } from 'react';
-import { useNavigate } from 'react-router-dom';
-import { useEffect } from 'react';
+import React, { useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { useEffect } from "react";
 
 const CreatePost = () => {
-  const [title, setTitle] = useState('');
-  const [content, setContent] = useState('');
-  const [error, setError] = useState('');
+  const [title, setTitle] = useState("");
+  const [content, setContent] = useState("");
+  const [error, setError] = useState("");
   const [isSubmitting, setIsSubmitting] = useState(false);
   const [redirectNeeded, setRedirectNeeded] = useState(false);
+  const [modal, setModal] = useState({ isOpen: false, message: "", type: "" });
   const navigate = useNavigate();
+
+  const showModal = (message, type = "info") => {
+    setModal({ isOpen: true, message, type });
+  };
+
+  const closeModal = () => {
+    setModal({ isOpen: false, message: "", type: "" });
+    if (modal.type === "success" || modal.type === "pending") {
+      navigate("/dashboard/forum");
+    } else if (modal.type === "auth") {
+      navigate("/login");
+    }
+  };
 
   const handleSubmit = async (e) => {
     e.preventDefault();
-    setError('');
+    setError("");
     setIsSubmitting(true);
-    const user = JSON.parse(localStorage.getItem('user'));
+    const user = JSON.parse(localStorage.getItem("user"));
 
     if (!user || !user.id || !user.name) {
-      alert('You must be logged in to create a post.');
+      showModal("You must be logged in to create a post.", "auth");
       setIsSubmitting(false);
-      navigate('/login');
       return;
     }
 
     try {
-      const response = await fetch('/forum/posts', {
-        method: 'POST',
+      const response = await fetch("/forum/posts", {
+        method: "POST",
         headers: {
-          'Content-Type': 'application/json',
+          "Content-Type": "application/json",
         },
         body: JSON.stringify({
@@ -39,10 +52,12 @@
 
       if (response.status === 204) {
-        navigate('/dashboard/forum');
+        showModal("Post created successfully!", "success");
         return;
       }
       if (response.status === 401) {
-        alert('Content is too long. Wait for moderator approval');
-        navigate('/dashboard/forum');
+        showModal(
+          "Content is too long. Your post has been submitted for moderator approval.",
+          "pending"
+        );
         return;
       }
@@ -53,7 +68,7 @@
       }
 
-      navigate('/dashboard/forum');
+      showModal("Post created successfully!", "success");
     } catch (error) {
-      console.error('Error creating post:', error);
+      console.error("Error creating post:", error);
       setError(error.message);
     } finally {
@@ -73,5 +88,5 @@
           </h2>
           <button
-            onClick={() => navigate('/dashboard/forum')}
+            onClick={() => navigate("/dashboard/forum")}
             className="btn btn-outline gap-2"
           >
@@ -92,6 +107,77 @@
         <form
           onSubmit={handleSubmit}
-          className="card bg-base-200 shadow-xl w-full"
+          className="card bg-base-200 shadow-xl w-full relative"
         >
+          {/* Info icon positioned at top-right of form */}
+          <div className="absolute top-6 right-6 z-10">
+            <div className="dropdown dropdown-hover dropdown-end">
+              <div
+                tabIndex={0}
+                role="button"
+                className="btn btn-ghost btn-circle btn-sm"
+              >
+                <svg
+                  xmlns="http://www.w3.org/2000/svg"
+                  className="w-5 h-5"
+                  fill="none"
+                  viewBox="0 0 24 24"
+                  stroke="currentColor"
+                >
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
+                  />
+                </svg>
+              </div>
+              <div
+                tabIndex={0}
+                className="dropdown-content z-[1] card card-compact w-80 p-2 shadow bg-base-200 text-base-content border border-base-300"
+              >
+                <div className="card-body">
+                  <h3 className="font-bold text-lg mb-3">Posting Guidelines</h3>
+                  <div className="space-y-2 text-sm">
+                    <div className="flex items-start gap-2">
+                      <span className="text-success">✓</span>
+                      <span>Keep discussions respectful and constructive</span>
+                    </div>
+                    <div className="flex items-start gap-2">
+                      <span className="text-success">✓</span>
+                      <span>Use clear, descriptive titles</span>
+                    </div>
+                    <div className="flex items-start gap-2">
+                      <span className="text-success">✓</span>
+                      <span>Share academic resources and study tips</span>
+                    </div>
+                    <div className="flex items-start gap-2">
+                      <span className="text-success">✓</span>
+                      <span>Ask questions about courses and assignments</span>
+                    </div>
+                    <div className="flex items-start gap-2">
+                      <span className="text-error">✗</span>
+                      <span>No spam, offensive, or inappropriate content</span>
+                    </div>
+                    <div className="flex items-start gap-2">
+                      <span className="text-error">✗</span>
+                      <span>No sharing of exam answers or cheating</span>
+                    </div>
+                    <div className="flex items-start gap-2">
+                      <span className="text-error">✗</span>
+                      <span>No personal attacks or harassment</span>
+                    </div>
+                  </div>
+                  <div className="mt-4 p-3 bg-warning/20 rounded-lg">
+                    <p className="text-xs">
+                      <strong>Note:</strong> Posts exceeding character limits or
+                      containing sensitive content will be reviewed by
+                      moderators before publication.
+                    </p>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+
           <div className="card-body p-6 sm:p-8">
             <div className="space-y-8">
@@ -135,5 +221,5 @@
               <button
                 type="button"
-                onClick={() => navigate('/dashboard/forum')}
+                onClick={() => navigate("/dashboard/forum")}
                 className="btn btn-ghost btn-lg"
                 disabled={isSubmitting}
@@ -146,5 +232,5 @@
                 disabled={isSubmitting}
               >
-                {isSubmitting ? 'Publishing...' : 'Publish Post'}
+                {isSubmitting ? "Publishing..." : "Publish Post"}
               </button>
             </div>
@@ -152,4 +238,74 @@
         </form>
       </div>
+
+      {/* Modal */}
+      <div className={`modal ${modal.isOpen ? "modal-open" : ""}`}>
+        <div className="modal-box">
+          <div className="flex items-center gap-3 mb-4">
+            {modal.type === "success" && (
+              <div className="w-8 h-8 rounded-full bg-success flex items-center justify-center">
+                <svg
+                  className="w-5 h-5 text-success-content"
+                  fill="none"
+                  stroke="currentColor"
+                  viewBox="0 0 24 24"
+                >
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M5 13l4 4L19 7"
+                  ></path>
+                </svg>
+              </div>
+            )}
+            {modal.type === "pending" && (
+              <div className="w-8 h-8 rounded-full bg-warning flex items-center justify-center">
+                <svg
+                  className="w-5 h-5 text-warning-content"
+                  fill="none"
+                  stroke="currentColor"
+                  viewBox="0 0 24 24"
+                >
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.464 0L3.34 16.5c-.77.833.192 2.5 1.732 2.5z"
+                  ></path>
+                </svg>
+              </div>
+            )}
+            {modal.type === "auth" && (
+              <div className="w-8 h-8 rounded-full bg-error flex items-center justify-center">
+                <svg
+                  className="w-5 h-5 text-error-content"
+                  fill="none"
+                  stroke="currentColor"
+                  viewBox="0 0 24 24"
+                >
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
+                  ></path>
+                </svg>
+              </div>
+            )}
+            <h3 className="font-bold text-lg">
+              {modal.type === "success" && "Success!"}
+              {modal.type === "pending" && "Pending Approval"}
+              {modal.type === "auth" && "Authentication Required"}
+            </h3>
+          </div>
+          <p className="py-4">{modal.message}</p>
+          <div className="modal-action">
+            <button className="btn btn-primary" onClick={closeModal}>
+              OK
+            </button>
+          </div>
+        </div>
+      </div>
     </div>
   );
Index: client/src/Dashboard/components/Forum.jsx
===================================================================
--- client/src/Dashboard/components/Forum.jsx	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ client/src/Dashboard/components/Forum.jsx	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -9,4 +9,6 @@
   const [page, setPage] = useState(0);
   const [hasMore, setHasMore] = useState(true);
+  const [loading, setLoading] = useState(true);
+  const [loadingMore, setLoadingMore] = useState(false);
   const postsPerPage = 5;
   const user = JSON.parse(localStorage.getItem('user'));
@@ -18,4 +20,10 @@
   const fetchPosts = async () => {
     try {
+      if (page === 0) {
+        setLoading(true);
+      } else {
+        setLoadingMore(true);
+      }
+      
       const response = await fetch(
         `/forum/posts?page=${page}&limit=${postsPerPage}`
@@ -36,4 +44,7 @@
     } catch (error) {
       console.error('Error fetching forum posts:', error);
+    } finally {
+      setLoading(false);
+      setLoadingMore(false);
     }
   };
@@ -70,78 +81,98 @@
         <div className="flex-1 ml-8 mb-6">
           <h1 className="text-4xl font-bold mb-10">Forum Posts</h1>
-          <div className="space-y-4 pb-8">
-            {posts.map((post) => (
-              <div
-                key={post.id}
-                className="p-4 border rounded-lg shadow-sm hover:shadow-md transition  relative"
-              >
-                {(post.authorName === user.name ||
-                  post.authorName === user.username ||
-                  user.isModerator) && (
-                  <button
-                    className=" absolute top-2 right-2 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      if (
-                        window.confirm(
-                          'Are you sure you want to delete this post?'
-                        )
-                      ) {
-                        handleDeletePost(post.id);
-                      }
-                    }}
+          
+          {loading ? (
+            <div className="flex justify-center items-center h-64">
+              <span className="loading loading-spinner loading-lg"></span>
+            </div>
+          ) : (
+            <>
+              <div className="space-y-4 pb-8">
+                {posts.map((post) => (
+                  <div
+                    key={post.id}
+                    className="p-4 border rounded-lg shadow-sm hover:shadow-md transition  relative"
                   >
-                    <img src={trashIcon} alt="Delete" className="w-6 h-6" />
+                    {(post.authorName === user.name ||
+                      post.authorName === user.username ||
+                      user.isModerator) && (
+                      <button
+                        className=" absolute top-2 right-2 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
+                        onClick={(e) => {
+                          e.stopPropagation();
+                          if (
+                            window.confirm(
+                              'Are you sure you want to delete this post?'
+                            )
+                          ) {
+                            handleDeletePost(post.id);
+                          }
+                        }}
+                      >
+                        <img src={trashIcon} alt="Delete" className="w-6 h-6" />
+                      </button>
+                    )}
+
+                    <div className="flex items-center gap-4 mt-2">
+                      <h2
+                        className="text-3xl font-semibold mb-2 cursor-pointer hover:underline"
+                        onClick={() => {
+                          console.log('Post clicked:', post);
+                          navigate(`/dashboard/forum-detail/${post.id}`, {
+                            state: { post },
+                          });
+                        }}
+                      >
+                        {post.title}
+                      </h2>
+                    </div>
+
+                    <p className="text-m text-gray-500">
+                      By {post.authorName},{' '}
+                      <span>{post.dateCreated.split('T')[0]}</span>
+                    </p>
+                    <p className="mt-2 text-gray-400 text-xl">
+                      {post.content && post.content.length > 300
+                        ? post.content.slice(0, 300) + '...'
+                        : post.content}
+                    </p>
+                    <div
+                      className="mt-4 flex justify-end"
+                      onClick={(e) => {
+                        // Prevent clicking the post if the delete button was clicked
+                        navigate(`/dashboard/forum-detail/${post.id}`, {
+                          state: { post },
+                        });
+                      }}
+                    >
+                      <p className="mr-4">{post.comment_count}</p>
+                      <img
+                        src={commentIcon}
+                        alt="Comment"
+                        className="w-6 h-6 cursor-pointer hover:opacity-80"
+                      />
+                    </div>
+                  </div>
+                ))}
+              </div>
+              {hasMore && (
+                <div className="flex justify-center mt-6">
+                  <button 
+                    onClick={handleLoadMore} 
+                    className={`btn btn-outline mb-6 ${loadingMore ? 'btn-disabled' : ''}`}
+                    disabled={loadingMore}
+                  >
+                    {loadingMore ? (
+                      <>
+                        <span className="loading loading-spinner loading-sm mr-2"></span>
+                        Loading...
+                      </>
+                    ) : (
+                      'Load More'
+                    )}
                   </button>
-                )}
-
-                <div className="flex items-center gap-4 mt-2">
-                  <h2
-                    className="text-3xl font-semibold mb-2 cursor-pointer hover:underline"
-                    onClick={() => {
-                      console.log('Post clicked:', post);
-                      navigate(`/dashboard/forum-detail/${post.id}`, {
-                        state: { post },
-                      });
-                    }}
-                  >
-                    {post.title}
-                  </h2>
                 </div>
-
-                <p className="text-m text-gray-500">
-                  By {post.authorName},{' '}
-                  <span>{post.dateCreated.split('T')[0]}</span>
-                </p>
-                <p className="mt-2 text-gray-400 text-xl">
-                  {post.content && post.content.length > 300
-                    ? post.content.slice(0, 300) + '...'
-                    : post.content}
-                </p>
-                <div
-                  className="mt-4 flex justify-end"
-                  onClick={(e) => {
-                    // Prevent clicking the post if the delete button was clicked
-                    navigate(`/dashboard/forum-detail/${post.id}`, {
-                      state: { post },
-                    });
-                  }}
-                >
-                  <p className="mr-4">{post.comment_count}</p>
-                  <img
-                    src={commentIcon}
-                    alt="Comment"
-                    className="w-6 h-6 cursor-pointer hover:opacity-80"
-                  />
-                </div>
-              </div>
-            ))}
-          </div>
-          {hasMore && (
-            <div className="flex justify-center mt-6">
-              <button onClick={handleLoadMore} className="btn btn-outline mb-6">
-                Load More
-              </button>
-            </div>
+              )}
+            </>
           )}
         </div>
Index: client/src/Dashboard/components/ManagePosts.jsx
===================================================================
--- client/src/Dashboard/components/ManagePosts.jsx	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ client/src/Dashboard/components/ManagePosts.jsx	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -10,6 +10,38 @@
   const [page, setPage] = useState(0);
   const [hasMore, setHasMore] = useState(true);
+  const [loading, setLoading] = useState(true);
+  const [loadingMore, setLoadingMore] = useState(false);
+  const [modal, setModal] = useState({
+    isOpen: false,
+    message: "",
+    type: "",
+    postId: null,
+    post: null,
+  });
   const postsPerPage = 5;
   const user = JSON.parse(localStorage.getItem("user"));
+
+  const showModal = (message, type, postId = null, post = null) => {
+    setModal({ isOpen: true, message, type, postId, post });
+  };
+
+  const closeModal = () => {
+    setModal({
+      isOpen: false,
+      message: "",
+      type: "",
+      postId: null,
+      post: null,
+    });
+  };
+
+  const confirmAction = async () => {
+    if (modal.type === "delete") {
+      await handleDeletePost(modal.postId);
+    } else if (modal.type === "approve") {
+      await handleApprovePost(modal.post);
+    }
+    closeModal();
+  };
 
   useEffect(() => {
@@ -19,4 +51,10 @@
   const fetchPosts = async () => {
     try {
+      if (page === 0) {
+        setLoading(true);
+      } else {
+        setLoadingMore(true);
+      }
+
       const response = await fetch(
         `/review/posts?page=${page}&limit=${postsPerPage}`
@@ -42,6 +80,10 @@
     } catch (error) {
       console.error("Error fetching forum posts:", error);
+    } finally {
+      setLoading(false);
+      setLoadingMore(false);
     }
   };
+
   const handleDeletePost = async (postId) => {
     try {
@@ -101,75 +143,153 @@
         <div className="flex-1 ml-8">
           <h1 className="text-4xl font-bold mb-10">Posts that need approval</h1>
-          <div className="space-y-4" w-300>
-            {posts.map((post) => (
-              <div
-                key={post.id}
-                className="p-4 border rounded-lg shadow-sm hover:shadow-md transition  relative"
-              >
-                <button
-                  className=" absolute top-2 right-20 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
-                  onClick={(e) => {
-                    e.stopPropagation();
-
-                    if (
-                      window.confirm(
-                        "Are you sure you want to approve this post?"
-                      )
-                    ) {
-                      handleApprovePost(post);
-                    }
-                  }}
+
+          {loading ? (
+            <div className="flex justify-center items-center h-64">
+              <span className="loading loading-spinner loading-lg"></span>
+            </div>
+          ) : (
+            <>
+              <div className="space-y-4" w-300>
+                {posts.map((post) => (
+                  <div
+                    key={post.id}
+                    className="p-4 border rounded-lg shadow-sm hover:shadow-md transition  relative"
+                  >
+                    <button
+                      className=" absolute top-2 right-20 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        showModal(
+                          "Are you sure you want to approve this post?",
+                          "approve",
+                          post.id,
+                          post
+                        );
+                      }}
+                    >
+                      <img src={doneAll} alt="Approve" className="w-10 h-10" />
+                    </button>
+                    <button
+                      className=" absolute top-2 right-8 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        showModal(
+                          "Are you sure you want to delete this post?",
+                          "delete",
+                          post.id
+                        );
+                      }}
+                    >
+                      <img src={trashIcon} alt="Delete" className="w-10 h-10" />
+                    </button>
+
+                    <div className="flex items-center gap-4 mt-2">
+                      <h2
+                        className="text-3xl font-semibold mb-2 cursor-pointer hover:underline"
+                        onClick={() => {
+                          console.log("Post clicked:", post);
+                          navigate(`/dashboard/forum-detail/${post.id}`, {
+                            state: { post },
+                          });
+                        }}
+                      >
+                        {post.title}
+                      </h2>
+                    </div>
+
+                    <p className="text-m text-gray-500">
+                      By {post.authorName},{" "}
+                      <span>{post.dateCreated.split("T")[0]}</span>
+                    </p>
+                    <p className="mt-2 text-gray-400 text-xl">
+                      {post.content && post.content.length > 300
+                        ? post.content.slice(0, 300) + "..."
+                        : post.content}
+                    </p>
+                  </div>
+                ))}
+              </div>
+              {hasMore && (
+                <div className="flex justify-center mt-6">
+                  <button
+                    onClick={handleLoadMore}
+                    className={`btn btn-outline ${
+                      loadingMore ? "btn-disabled" : ""
+                    }`}
+                    disabled={loadingMore}
+                  >
+                    {loadingMore ? (
+                      <>
+                        <span className="loading loading-spinner loading-sm mr-2"></span>
+                        Loading...
+                      </>
+                    ) : (
+                      "Load More"
+                    )}
+                  </button>
+                </div>
+              )}
+            </>
+          )}
+        </div>
+      </div>
+
+      {/* Modal */}
+      <div className={`modal ${modal.isOpen ? "modal-open" : ""}`}>
+        <div className="modal-box">
+          <div className="flex items-center gap-3 mb-4">
+            {modal.type === "approve" && (
+              <div className="w-8 h-8 rounded-full bg-success flex items-center justify-center">
+                <svg
+                  className="w-5 h-5 text-success-content"
+                  fill="none"
+                  stroke="currentColor"
+                  viewBox="0 0 24 24"
                 >
-                  <img src={doneAll} alt="Approve" className="w-10 h-10" />
-                </button>
-                <button
-                  className=" absolute top-2 right-8 p-1.5 cursor-pointer rounded-full hover:bg-gray-600 transition-colors"
-                  onClick={(e) => {
-                    e.stopPropagation();
-                    if (
-                      window.confirm(
-                        "Are you sure you want to delete this post?"
-                      )
-                    ) {
-                      handleDeletePost(post.id);
-                    }
-                  }}
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M5 13l4 4L19 7"
+                  ></path>
+                </svg>
+              </div>
+            )}
+            {modal.type === "delete" && (
+              <div className="w-8 h-8 rounded-full bg-error flex items-center justify-center">
+                <svg
+                  className="w-5 h-5 text-error-content"
+                  fill="none"
+                  stroke="currentColor"
+                  viewBox="0 0 24 24"
                 >
-                  <img src={trashIcon} alt="Delete" className="w-10 h-10" />
-                </button>
-
-                <div className="flex items-center gap-4 mt-2">
-                  <h2
-                    className="text-3xl font-semibold mb-2 cursor-pointer hover:underline"
-                    onClick={() => {
-                      console.log("Post clicked:", post);
-                      navigate(`/dashboard/forum-detail/${post.id}`, {
-                        state: { post },
-                      });
-                    }}
-                  >
-                    {post.title}
-                  </h2>
-                </div>
-
-                <p className="text-m text-gray-500">
-                  By {post.authorName},{" "}
-                  <span>{post.dateCreated.split("T")[0]}</span>
-                </p>
-                <p className="mt-2 text-gray-400 text-xl">
-                  {post.content && post.content.length > 300
-                    ? post.content.slice(0, 300) + "..."
-                    : post.content}
-                </p>
+                  <path
+                    strokeLinecap="round"
+                    strokeLinejoin="round"
+                    strokeWidth="2"
+                    d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
+                  ></path>
+                </svg>
               </div>
-            ))}
+            )}
+            <h3 className="font-bold text-lg">
+              {modal.type === "approve" && "Approve Post"}
+              {modal.type === "delete" && "Delete Post"}
+            </h3>
           </div>
-          {hasMore && (
-            <div className="flex justify-center mt-6">
-              <button onClick={handleLoadMore} className="btn btn-outline">
-                Load More
-              </button>
-            </div>
-          )}
+          <p className="py-4">{modal.message}</p>
+          <div className="modal-action">
+            <button className="btn btn-ghost" onClick={closeModal}>
+              Cancel
+            </button>
+            <button
+              className={`btn ${
+                modal.type === "approve" ? "btn-success" : "btn-error"
+              }`}
+              onClick={confirmAction}
+            >
+              {modal.type === "approve" ? "Approve" : "Delete"}
+            </button>
+          </div>
         </div>
       </div>
Index: client/src/Dashboard/components/Navbar.jsx
===================================================================
--- client/src/Dashboard/components/Navbar.jsx	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ client/src/Dashboard/components/Navbar.jsx	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -1,10 +1,11 @@
-import React from 'react';
-import { useNavigate } from 'react-router-dom';
-import logoIcon from '../../assets/images/logoIcon.png';
-import logoText from '../../assets/images/logoText.png';
-import pp from '../../assets/images/pp.svg';
+import React from "react";
+import { useNavigate } from "react-router-dom";
+import logoIcon from "../../assets/images/logoIcon.png";
+import logoText from "../../assets/images/logoText.png";
+import pp from "../../assets/images/pp.svg";
+import RankBadge from "@/utils/RankBadge";
 
 export default function Navbar() {
-  const user = JSON.parse(localStorage.getItem('user'));
+  const user = JSON.parse(localStorage.getItem("user"));
 
   const navigate = useNavigate();
@@ -13,6 +14,6 @@
       <div className="p-4 border-b border-base-content/10">
         <a href="/" className="flex items-center gap-2">
-          <img src={logoIcon} alt="Logo" className="w-10 h-10" />
-          <img src={logoText} alt="Logo Text" className="w-32" />
+          <img src={logoIcon} alt="Logo" className="w-14 h-auto" />
+          <img src={logoText} alt="Logo Text" className="w-32 h-auto" />
         </a>
       </div>
@@ -23,5 +24,5 @@
             <button
               className={`flex items-center gap-4 px-4 py-3 hover:bg-[#FFB800] hover:text-black rounded-lg transition-colors `}
-              onClick={() => navigate('/dashboard')}
+              onClick={() => navigate("/dashboard")}
             >
               <svg
@@ -41,5 +42,5 @@
             <button
               className={`flex items-center gap-4 px-4 py-3 hover:bg-[#FFB800] hover:text-black rounded-lg transition-colors`}
-              onClick={() => navigate('/dashboard/leaderboard')}
+              onClick={() => navigate("/dashboard/leaderboard")}
             >
               <svg
@@ -59,5 +60,5 @@
             <button
               className={`flex items-center gap-4 px-4 py-3 hover:bg-[#FFB800] hover:text-black rounded-lg transition-colors`}
-              onClick={() => navigate('/dashboard/forum')}
+              onClick={() => navigate("/dashboard/forum")}
             >
               <svg
@@ -81,5 +82,5 @@
               <button
                 className={`flex items-center gap-4 px-4 py-3 hover:bg-[#FFB800] hover:text-black rounded-lg transition-colors`}
-                onClick={() => navigate('/dashboard/manage-posts')}
+                onClick={() => navigate("/dashboard/manage-posts")}
               >
                 <svg
@@ -107,4 +108,5 @@
         <button
           className={`flex items-center gap-3  px-4 py-3 hover:bg-[#FFB800] hover:text-black rounded-lg transition-colors `}
+          onClick={() => navigate("/dashboard/profile")}
         >
           <img
@@ -113,13 +115,10 @@
             className="w-10 h-10 rounded-full border-2 border-base-content/10"
           />
-          <div
-            className="flex flex-col items-start cursor-pointer"
-            onClick={() => navigate('/dashboard/profile')}
-          >
+          <div className="flex flex-col items-start cursor-pointer">
             <span className="font-medium text-left">
               {user && user.username}
             </span>
-            <span className="text-sm text-base-content/70">
-              {user && user.rank}
+            <span className="text-sm text-base-content/70 mt-2">
+              {user && <RankBadge rankName={user.rank} size="sm" />}
             </span>
           </div>
Index: client/src/LandingPage/components/LeaderBoardEx.jsx
===================================================================
--- client/src/LandingPage/components/LeaderBoardEx.jsx	(revision 3c1fd8b587fc6d63f4fce19d2a6f6a089f6fceb4)
+++ client/src/LandingPage/components/LeaderBoardEx.jsx	(revision 803a3ed07cdf0e9c6c726e7585266e75424f2de1)
@@ -95,5 +95,5 @@
       <div
         data-theme="luxury"
-        className="dashboard h-screen flex bg-base-100 overflow-none"
+        className="min-h-screen flex bg-base-100"
       >
         {!landing ? <Navbar /> : null}
@@ -110,5 +110,5 @@
       <div
         data-theme="luxury"
-        className="dashboard h-screen flex bg-base-100 overflow-none"
+        className="min-h-screen flex bg-base-100"
       >
         {!landing ? <Navbar /> : null}
@@ -132,9 +132,9 @@
     <div
       data-theme="luxury"
-      className="dashboard h-screen flex bg-base-100 overflow-none"
+      className="min-h-screen flex bg-base-100"
     >
       {!landing ? <Navbar /> : null}
 
-      <div className="flex w-full flex-col justify-center items-center p-20 gap-10">
+      <div className="flex w-full flex-col items-center p-20 gap-10">
         <h1 className="text-4xl font-bold">Leaderboard</h1>
         <p>Note: The leaderboard updates every 5 minutes</p>
@@ -155,27 +155,29 @@
         )}
 
-        <div className="overflow-x-auto rounded-box border border-base-content/5 bg-base-100 w-full max-w-4xl">
-          <table className="table">
-            <thead>
-              <tr>
-                <th>Rank</th>
-                <th>Username</th>
-                <th>Rank Tier</th>
-                <th>Points</th>
-              </tr>
-            </thead>
-            <tbody>
-              {leaderboard.map((user, index) => (
-                <tr key={user.id} className="hover">
-                  <th>{getPosition(index)}</th>
-                  <td className="font-medium">{user.username}</td>
-                  <td>
-                    <RankBadge rankName={user.rank} size="md" />
-                  </td>
-                  <td className="font-mono font-bold">{user.points}</td>
+        <div className="w-full max-w-4xl">
+          <div className="rounded-box border border-base-content/5 bg-base-100">
+            <table className="table w-full">
+              <thead>
+                <tr>
+                  <th>Rank</th>
+                  <th>Username</th>
+                  <th>Rank Tier</th>
+                  <th>Points</th>
                 </tr>
-              ))}
-            </tbody>
-          </table>
+              </thead>
+              <tbody>
+                {leaderboard.map((user, index) => (
+                  <tr key={user.id} className="hover">
+                    <th>{getPosition(index)}</th>
+                    <td className="font-medium">{user.username}</td>
+                    <td>
+                      <RankBadge rankName={user.rank} size="md" />
+                    </td>
+                    <td className="font-mono font-bold">{user.points}</td>
+                  </tr>
+                ))}
+              </tbody>
+            </table>
+          </div>
         </div>
 
