Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoPreview.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoPreview.java	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -1,4 +1,5 @@
 package com.shifterwebapp.shifter.course;
 
+import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
 import com.shifterwebapp.shifter.enums.Difficulty;
 import com.shifterwebapp.shifter.enums.Interests;
@@ -38,4 +39,6 @@
 
     private List<Interests> topicsCovered;
+
+    private Integer courseContentCount;
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperPreview.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperPreview.java	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -10,4 +10,5 @@
 public interface CourseMapperPreview {
 
+    @Mapping(target = "courseContentCount", expression = "java(course.getCourseContents() != null ? course.getCourseContents().size() : 0)")
     CourseDtoPreview toDto(Course course);
     List<CourseDtoPreview> toDto(List<Course> courses);
Index: frontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/App.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -6,5 +6,4 @@
 import Register from "./pages/Register.tsx";
 import Courses from "./pages/Courses.tsx";
-import {useGlobalContext} from "./context/GlobalContext.tsx";
 import {useEffect} from "react";
 import CourseDetails from "./pages/CourseDetails.tsx";
@@ -12,4 +11,5 @@
 import 'react-toastify/dist/ReactToastify.css';
 import AppLoader from "./AppLoader.tsx";
+import Profile from "./pages/Profile.tsx";
 
 function LayoutWrapper() {
@@ -25,4 +25,5 @@
 
                 <Route path="/" element={<Home />} />
+                <Route path="/profile" element={<Profile />} />
                 <Route path="/courses" element={<Courses />} />
                 <Route path="/courses/:courseId/:courseTitle" element={<CourseDetails />} />
@@ -44,13 +45,13 @@
 
 function App() {
-    const {loading} = useGlobalContext();
-
-    if (loading)
-        return (
-            <div className="absolute inset-0 bg-white/60 backdrop-blur-sm
-                        flex flex-col gap-2 items-center justify-start z-10 py-40">
-                <div className="w-20 loader"></div>
-            </div>
-        )
+    // const {loading} = useGlobalContext();
+    //
+    // if (loading)
+    //     return (
+    //         <div className="absolute inset-0 bg-white/60 backdrop-blur-sm
+    //                     flex flex-col gap-2 items-center justify-start z-10 py-40">
+    //             <div className="w-20 loader"></div>
+    //         </div>
+    //     )
 
     return (
Index: frontend/src/AppLoader.tsx
===================================================================
--- frontend/src/AppLoader.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/AppLoader.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -2,7 +2,4 @@
 import {useCourseStorage} from "./context/CourseStorage.ts";
 import {
-    fetchCoursesApi,
-    fetchCoursesSkillsApi,
-    fetchCoursesTopicsApi,
     fetchRecommendedCoursesApi
 } from "./api/courseApi.ts";
@@ -14,8 +11,5 @@
     const {
         setEnrollments,
-        setAllCourses,
         setRecommendedCourses,
-        setTopics,
-        setSkills
     } = useCourseStorage();
 
@@ -23,46 +17,4 @@
         const load = async () => {
             try {
-                // Topics
-                try {
-                    const topicsStored = sessionStorage.getItem("courseTopics");
-                    if (topicsStored) {
-                        setTopics(JSON.parse(topicsStored));
-                    } else {
-                        const topics = await fetchCoursesTopicsApi();
-                        setTopics(topics);
-                        sessionStorage.setItem("courseTopics", JSON.stringify(topics));
-                    }
-                } catch (err) {
-                    console.error("Failed to fetch topics:", err);
-                }
-
-                // Skills
-                try {
-                    const skillsStored = sessionStorage.getItem("courseSkills");
-                    if (skillsStored) {
-                        setSkills(JSON.parse(skillsStored));
-                    } else {
-                        const skills = await fetchCoursesSkillsApi();
-                        setSkills(skills);
-                        sessionStorage.setItem("courseSkills", JSON.stringify(skills));
-                    }
-                } catch (err) {
-                    console.error("Failed to fetch skills:", err);
-                }
-
-                // Courses
-                try {
-                    const allCoursesStored = sessionStorage.getItem("allCourses");
-                    if (allCoursesStored) {
-                        setAllCourses(JSON.parse(allCoursesStored));
-                    } else {
-                        const courses = await fetchCoursesApi(accessToken || "");
-                        setAllCourses(courses);
-                        sessionStorage.setItem("allCourses", JSON.stringify(courses));
-                    }
-                } catch (err) {
-                    console.error("Failed to fetch courses:", err);
-                }
-
                 // Enrollments
                 try {
Index: frontend/src/components/CourseCard.tsx
===================================================================
--- frontend/src/components/CourseCard.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/CourseCard.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -101,5 +101,5 @@
                 </div>
                 <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                    {0} modules
+                    {card.courseContentCount} modules
                 </div>
                 <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
Index: frontend/src/components/CourseDetailsInfo.tsx
===================================================================
--- frontend/src/components/CourseDetailsInfo.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/CourseDetailsInfo.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -67,5 +67,5 @@
                                         </div>
 
-                                        <div className="flex gap-2 items-start text-black/80">
+                                        <div className="flex gap-2 items-center text-black/80">
                                             <span>{content.courseLectures.length} lectures</span>
                                             <span>•</span>
Index: frontend/src/components/CoursesCarouselCourseDetails.tsx
===================================================================
--- frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -5,4 +5,5 @@
 import {useEffect} from "react";
 import {fetchRecommendedCoursesApi} from "../api/courseApi.ts";
+import CourseCardSkeleton from "./skeletons/CourseCardSkeleton.tsx";
 
 function CoursesCarouselCourseDetails() {
@@ -38,22 +39,18 @@
 
             <div className="relative mx-0 my-auto w-full p-0">
-                {
-                    recommendedCourses ?
-                        <Slider {...settings}>
-                            {
-                                recommendedCourses.map((course, index) => (
-                                    <CourseCard card={course} key={index}/>
-                                    // <div className="h-full flex flex-col justify-center bg-red-500" key={index}>
-                                    //     <CourseCard card={course}/>
-                                    // </div>
-                                ))
-                            }
-                        </Slider>
-                        :
-                        <div className="flex flex-col gap-12 justify-center items-center">
-                            <div className="w-20 loader"></div>
-                            <span className="text-xl font-semibold text-black/40">Loading...</span>
-                        </div>
-                }
+                <Slider {...settings}>
+                    {
+                        recommendedCourses ?
+                            recommendedCourses.map((course, index) => (
+                                <CourseCard card={course} key={index}/>
+                                // <div className="h-full flex flex-col justify-center bg-red-500" key={index}>
+                                //     <CourseCard card={course}/>
+                                // </div>
+                            )) :
+                            [...Array(4)].map((_, index) => (
+                                <CourseCardSkeleton key={index} />
+                            ))
+                    }
+                </Slider>
             </div>
         </section>
Index: frontend/src/components/CoursesCarouselHome.tsx
===================================================================
--- frontend/src/components/CoursesCarouselHome.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/CoursesCarouselHome.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -7,4 +7,5 @@
 import ShifterArrow from "../../public/Shifter-Arrow.png";
 import {useCourseStorage} from "../context/CourseStorage.ts";
+import CourseCardSkeleton from "./skeletons/CourseCardSkeleton.tsx";
 
 function CoursesCarouselHome() {
@@ -30,22 +31,18 @@
 
             <div className="relative max-w-[85%] mx-0 my-auto w-full p-0">
-                {
-                    recommendedCourses ?
-                        <Slider {...settings}>
-                            {
-                                recommendedCourses.map((course, index) => (
-                                    <CourseCard card={course} key={index}/>
-                                    // <div className="h-full flex flex-col justify-center bg-red-500" key={index}>
-                                    //     <CourseCard card={course}/>
-                                    // </div>
-                                ))
-                            }
-                        </Slider>
-                        :
-                        <div className="flex flex-col gap-12 justify-center items-center" >
-                            <div className="w-20 loader"></div>
-                            <span className="text-xl font-semibold text-black/40">Loading...</span>
-                        </div>
-                }
+                <Slider {...settings}>
+                    {
+                        recommendedCourses ?
+                            recommendedCourses.map((course, index) => (
+                                <CourseCard card={course} key={index}/>
+                                // <div className="h-full flex flex-col justify-center bg-red-500" key={index}>
+                                //     <CourseCard card={course}/>
+                                // </div>
+                            )) :
+                            [...Array(4)].map((_, index) => (
+                                <CourseCardSkeleton key={index} />
+                            ))
+                    }
+                </Slider>
             </div>
         </section>
Index: frontend/src/components/CoursesFilters.tsx
===================================================================
--- frontend/src/components/CoursesFilters.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/CoursesFilters.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -1,14 +1,12 @@
 import React from "react";
 import Checkbox from "@mui/material/Checkbox";
+import {durationToQueryMapper, priceToQueryMapper} from "../utils/mapper.ts";
 import type {FilterParams} from "../types/FilterParams.tsx";
-import {durationToQueryMapper, priceToQueryMapper} from "../utils/mapper.ts";
-
-function CoursesFilters({setFilters, filters, topics, skills, showOnlyFavoriteCourses, setShowOnlyFavorites}: {
+
+function CoursesFilters({filters, setFilters, topics, skills}: {
+    filters: FilterParams,
     setFilters: React.Dispatch<React.SetStateAction<FilterParams>>,
-    filters: FilterParams,
     topics: string[] | null,
     skills: string[] | null,
-    showOnlyFavoriteCourses: boolean
-    setShowOnlyFavorites: React.Dispatch<React.SetStateAction<boolean>>,
 }) {
     const duration = [
@@ -76,4 +74,11 @@
     }
 
+    const handleShowOnlyFavoritesChange = () => {
+        setFilters(prevFilters => ({
+            ...prevFilters,
+            showOnlyFavoriteCourses: !prevFilters.showOnlyFavoriteCourses
+        }));
+    }
+
     return (
         <aside
@@ -84,6 +89,6 @@
                     header={"Favorite Courses"}
                     options={["My favorites"]}
-                    handleFilter={() => {setShowOnlyFavorites(prev => !prev)}}
-                    selectedOptions={showOnlyFavoriteCourses ? ["My favorites"] : []}
+                    handleFilter={() => {handleShowOnlyFavoritesChange()}}
+                    selectedOptions={filters.showOnlyFavoriteCourses ? ["My favorites"] : []}
                 />
                 <FilterSelect
Index: frontend/src/components/CoursesGrid.tsx
===================================================================
--- frontend/src/components/CoursesGrid.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/CoursesGrid.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -7,16 +7,11 @@
 import {X} from 'lucide-react';
 import {queryToDurationMapper, queryToPriceMapper} from "../utils/mapper.ts";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
 
-
-function CoursesGrid({courses, loading, setFilters, filters, showOnlyFavoriteCourses}: {
+function CoursesGrid({courses, setFilters, filters}: {
     courses: CoursePreview[] | null,
-    loading: boolean,
     setFilters: React.Dispatch<React.SetStateAction<FilterParams>>,
     filters: FilterParams,
-    showOnlyFavoriteCourses: boolean
 }) {
-    const { user } = useGlobalContext()
-    const [searchText, setSearchText] = React.useState<string>(filters.search || "");
+    const [searchText, setSearchText] = React.useState<string>("");
     const filterPillClassName = "group hover:border-shifter hover:bg-shifter/10 hover:text-shifter " +
         "flex items-center gap-1 border-1 border-black/40 rounded-full px-4 py-1 text-black/80 font-medium cursor-pointer"
@@ -26,7 +21,9 @@
         e.preventDefault()
 
-        setFilters(prevParams => ({
-            ...prevParams,
-            search: searchText.trim()
+        setFilters(prevFilters => ({
+            ...prevFilters,
+            search: prevFilters.search?.includes(searchText) ?
+                prevFilters.search.filter((v: string) => v !== searchText) :
+                [...(prevFilters.search || []), searchText]
         }));
 
@@ -40,25 +37,21 @@
             {/*SEARCH AND SORT BY*/}
             <div className="flex justify-between items-center w-full px-12">
+                {/*Filters*/}
                 <div className="flex gap-2 flex-wrap items-center justify-start">
                     {
                         Object.entries(filters).map(([key, values]) => {
-                            if (key === "search") {
-                                const searchValue = values as string;
+                            // Favorite courses filter
+                            if (key === "showOnlyFavoriteCourses") {
+                                const boolValue = values as boolean;
+                                if (!boolValue) return null;
                                 return (
                                     <button
-                                        key={`${key}-${searchValue}`}
-                                        onClick={() => {
-                                            setFilters(prev => {
-                                                const typedKey = key as keyof FilterParams;
-                                                const updatedParams = {...prev};
-                                                delete updatedParams[typedKey];
-                                                return updatedParams;
-                                            });
-                                        }}
+                                        onClick={() => setFilters(prev => ({
+                                            ...prev,
+                                            showOnlyFavoriteCourses: false
+                                        }))}
                                         className={filterPillClassName}
                                     >
-                                        {searchValue
-                                            .toLowerCase()
-                                            .replace(/\b\w/g, c => c.toUpperCase())}
+                                        My Favorites
                                         <X size={20} className={filterXClassName}/>
                                     </button>
@@ -75,5 +68,5 @@
 
                                         setFilters(prev => {
-                                            const newParams = { ...prev };
+                                            const newParams = {...prev};
                                             if (updatedArray.length === 0) {
                                                 delete newParams[typedKey]; // remove key if empty array
@@ -109,4 +102,5 @@
                 </div>
 
+                {/*Search*/}
                 <form
                     onSubmit={handleSearchFilter}
@@ -153,23 +147,10 @@
             <div className="relative grid grid-cols-3 gap-x-4 gap-y-4 w-full h-fit px-12">
                 {
-                    (!courses || loading) && (
-                        <div className="absolute inset-0 bg-white/60 backdrop-blur-sm
-                        flex flex-col gap-2 items-center justify-start z-10 py-40 w-full">
-                            <div className="w-12 loader"></div>
-                            <span className="text-xl font-semibold text-black/40">Loading...</span>
-                        </div>
-                    )
-                }
-                {
                     courses && courses?.length > 0 ?
-                        (
-                            showOnlyFavoriteCourses ?
-                                courses.filter(course => user?.favoriteCourses.includes(course.id)) :
-                                courses
-                        )?.map((course, index) => {
-                        return (
-                            <CourseCard card={course} key={index}/>
-                        )
-                    }) :
+                        courses.map((course, index) => {
+                            return (
+                                <CourseCard card={course} key={index}/>
+                            )
+                        }) :
                         <span className="text-3xl font-normal text-black/60 pl-20 py-8 text-left col-span-full">No results found</span>
                 }
Index: frontend/src/components/HeroCourseDetails.tsx
===================================================================
--- frontend/src/components/HeroCourseDetails.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/HeroCourseDetails.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -1,7 +1,9 @@
 import type {CourseDetail} from "../types/CourseDetail.tsx";
 import React from "react";
+import {useCourseStorage} from "../context/CourseStorage.ts";
 
 function HeroCourseDetails({course, enrollUser}: { course: CourseDetail | null, enrollUser: () => Promise<void> }) {
     const [isLoading, setIsLoading] = React.useState<boolean>(false);
+    const {enrollments} = useCourseStorage();
     const tripleInfo = [
         {
@@ -31,32 +33,51 @@
                 <h1 className="text-5xl">{course?.title}</h1>
                 <p>{course?.description}</p>
-                <div
-                    className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
-                    <span className="font-semibold text-xl px-8">{
-                        course?.price && course.price > 0 ? `$${course?.price}` : 'Free'
-                    }</span>
-                    {
-                        isLoading ? (
-                            <div className="w-8 loader"></div>
-                        ) : (
-                            <button className={`
+                {
+                    enrollments && enrollments.some(enrollment => enrollment.courseId === course?.id) ?
+                        <div
+                            className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
+
+                            {
+                                isLoading ? (
+                                    <div className="w-8 loader"></div>
+                                ) : (
+                                    <button className={`
                                 ${bgColor}
                                 hover:shadow-lg hover:shadow-deep-green/50 transition-all duration-300 ease-in-out cursor-pointer
                                 shadow-md shadow-deep-green/30 text-white font-medium text-xl border-3 border-white/50 rounded-full px-14 py-2
                             `}
-                                    onClick={() => {
-                                        setIsLoading(true)
-                                        enrollUser()
-                                            .catch((error) => {
-                                                console.error("Error enrolling user in course:", error);
-                                            })
-                                            .finally(() => {
-                                                setIsLoading(false)
-                                            })
-                                    }}
-                            >Enroll Now</button>
-                        )
-                    }
-                </div>
+                                    >Start Learning Now</button>
+                                )
+                            }
+                        </div>
+                        :
+                        <div className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
+                    <span className="font-semibold text-xl px-8">{
+                        course?.price && course.price > 0 ? `$${course?.price}` : 'Free'
+                    }</span>
+                            {
+                                isLoading ? (
+                                    <div className="w-8 loader"></div>
+                                ) : (
+                                    <button className={`
+                                ${bgColor}
+                                hover:shadow-lg hover:shadow-deep-green/50 transition-all duration-300 ease-in-out cursor-pointer
+                                shadow-md shadow-deep-green/30 text-white font-medium text-xl border-3 border-white/50 rounded-full px-14 py-2
+                            `}
+                                            onClick={() => {
+                                                setIsLoading(true)
+                                                enrollUser()
+                                                    .catch((error) => {
+                                                        console.error("Error enrolling user in course:", error);
+                                                    })
+                                                    .finally(() => {
+                                                        setIsLoading(false)
+                                                    })
+                                            }}
+                                    >Enroll Now</button>
+                                )
+                            }
+                        </div>
+                }
             </section>
 
Index: frontend/src/components/HeroProfile.tsx
===================================================================
--- frontend/src/components/HeroProfile.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/components/HeroProfile.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,71 @@
+import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useCourseStorage} from "../context/CourseStorage.ts";
+
+function HeroProfile({selectedTab, setSelectedTab} : {
+    selectedTab: string;
+    setSelectedTab: (tab: string) => void;
+}) {
+    const {user} = useGlobalContext();
+    const {enrollments} = useCourseStorage();
+    console.log(user)
+    console.log(enrollments)
+
+    return (
+        <section className="flex flex-col gap-8 pt-40">
+            {/*USER INFO*/}
+            <div className="flex items-center justify-start gap-12 px-horizontal-lg">
+                <div className="w-40 h-60 bg-black/20 rounded-sm"/>
+                <div className="flex flex-col gap-2 items-start">
+                    <h1 className="text-4xl font-semibold">{user?.name}</h1>
+                    <span className="text-xl font-regular">{user?.workPosition} | {user?.companyType && (user.companyType.charAt(0) + user.companyType.toLowerCase().slice(1))}</span>
+                    <div className="flex gap-4">
+                        {
+                            user?.skills.map((skill, index) => (
+                                <span
+                                    key={index}
+                                    className="py-1 px-6 rounded-lg bg-black/40 text-white border-2 border-white/60"
+                                >
+                                    {
+                                        skill
+                                            .charAt(0).toUpperCase() + skill.slice(1).toLowerCase()
+                                    }
+                                </span>
+                            ))
+                        }
+                    </div>
+                </div>
+            </div>
+
+            {/*TAB NAVIGATION*/}
+            <ul className="flex gap-12 px-horizontal-lg">
+                <li
+                    onClick={() => setSelectedTab("myCourses")}
+                    className={`${selectedTab === "myCourses" && "border-b-2 border-shifter text-shifter"}
+                        text-lg font-semibold cursor-pointer py-1 px-4 text-black/40
+                    `}
+                >
+                    My Courses</li>
+                <li
+                    onClick={() => setSelectedTab("ratings")}
+                    className={`${selectedTab === "ratings" && "border-b-2 border-shifter text-shifter"}
+                        text-lg font-semibold cursor-pointer py-1 px-4 text-black/40
+                    `}
+                >Ratings</li>
+                <li
+                    onClick={() => setSelectedTab("profile")}
+                    className={`${selectedTab === "profile" && "border-b-2 border-shifter text-shifter"}
+                        text-lg font-semibold cursor-pointer py-1 px-4 text-black/40
+                    `}
+                >Profile</li>
+                <li
+                    onClick={() => setSelectedTab("settings")}
+                    className={`${selectedTab === "settings" && "border-b-2 border-shifter text-shifter"}
+                        text-lg font-semibold cursor-pointer py-1 px-4 text-black/40
+                    `}
+                >Settings</li>
+            </ul>
+        </section>
+    )
+}
+
+export default HeroProfile;
Index: frontend/src/components/inputs/RegisterSelect.tsx
===================================================================
--- frontend/src/components/inputs/RegisterSelect.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/components/inputs/RegisterSelect.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -2,11 +2,6 @@
 import type {SelectProps} from "../../types/SelectProps.tsx";
 import {toEnumFormat} from "../../utils/toEnumFormat.ts";
-import {useEffect} from "react";
 
 function RegisterSelect(selectProps: SelectProps) {
-
-    useEffect(() => {
-        console.log(selectProps.user)
-    }, [selectProps.user]);
 
     return (
Index: frontend/src/components/skeletons/CourseCardSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseCardSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/components/skeletons/CourseCardSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,43 @@
+
+function CourseCardSkeleton() {
+    return (
+        <article className="relative border-1 border-black/10 shadow-md shadow-black/10
+            flex flex-col w-full rounded-xl gap-4 py-4 px-4 bg-[#FFFFFF] animate-pulse">
+
+            {/*IMAGE SKELETON*/}
+            <div className="overflow-clip rounded-md rounded-br-4xl rounded-tl-4xl">
+                <div className="w-full h-[180px] bg-gray-300 rounded-md"></div>
+            </div>
+
+            {/*TITLE AND TOPICS SKELETON*/}
+            <div className="flex flex-col gap-2 items-start text-left h-full">
+                {/*Title skeleton*/}
+                <div className="h-6 bg-gray-300 rounded w-3/4"></div>
+
+                {/*Topics skeleton*/}
+                <div className="h-16 bg-gray-200 rounded w-full"></div>
+            </div>
+
+            {/*INFO SKELETON*/}
+            <div className="flex flex-wrap gap-2 whitespace-nowrap">
+                <div className="h-6 bg-gray-200 rounded w-12"></div>
+                <div className="h-6 bg-gray-200 rounded w-20"></div>
+                <div className="h-6 bg-gray-200 rounded w-20"></div>
+                <div className="h-6 bg-gray-200 rounded w-24"></div>
+                <div className="h-6 bg-gray-200 rounded w-16"></div>
+            </div>
+
+            {/*BUTTON AND PRICE SKELETON*/}
+            <div className="flex justify-between items-center mt-0">
+                <div className="h-6 bg-gray-300 rounded w-12"></div>
+
+                <div className="flex items-center gap-2">
+                    <div className="w-6 h-6 bg-gray-200 rounded"></div>
+                    <div className="h-8 bg-gray-300 rounded w-20"></div>
+                </div>
+            </div>
+        </article>
+    );
+}
+
+export default CourseCardSkeleton;
Index: frontend/src/components/skeletons/CourseDetailsInfoSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CourseDetailsInfoSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/components/skeletons/CourseDetailsInfoSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,67 @@
+import ShifterArrow from "../../../public/Shifter-Arrow.png";
+
+function CourseDetailsInfoSkeleton() {
+    return (
+        <>
+            {/*WHAT WILL BE LEARNED*/}
+            <section className="relative flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md overflow-clip">
+                <img src={ShifterArrow} alt="Shifter Arrow"
+                     className="absolute opacity-10 h-150 w-120 -rotate-130 -top-40 right-0"/>
+                <img src={ShifterArrow} alt="Shifter Arrow"
+                     className="absolute opacity-10 h-150 w-120 rotate-50 -bottom-40 left-0"/>
+
+                <h2 className="text-5xl">What you'll learn</h2>
+                <div className="grid grid-cols-2 gap-y-8 gap-x-20">
+                    {[...Array(10)].map((_, index) => (
+                        <div className="flex items-center gap-4" key={index}>
+                            <div className="h-10 w-10 bg-gray-300 rounded animate-pulse"></div>
+                            <div className="h-6 bg-gray-300 rounded flex-1 animate-pulse"></div>
+                        </div>
+                    ))}
+                </div>
+            </section>
+
+            {/*COURSE CONTENT*/}
+            <section className="relative flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md overflow-clip">
+                <h2 className="text-5xl">Course content</h2>
+                <div>
+                    {[...Array(5)].map((_, index) => (
+                        <div key={index} className={`border-1 border-black/20 ${index !== 4 ? "border-b-0" : ""}`}>
+                            <div className="overflow-clip flex justify-between items-center px-4 py-4 bg-black/5">
+                                <div className="flex gap-4 items-center">
+                                    <div className="h-8 w-8 bg-gray-300 rounded animate-pulse"></div>
+                                    <div className="h-6 bg-gray-300 rounded w-48 animate-pulse"></div>
+                                </div>
+                                <div className="flex gap-2 items-center text-black/40">
+                                    <div className="h-4 bg-gray-300 rounded w-16 animate-pulse"></div>
+                                    <span >•</span>
+                                    <div className="h-4 bg-gray-300 rounded w-12 animate-pulse"></div>
+                                </div>
+                            </div>
+                        </div>
+                    ))}
+                </div>
+            </section>
+
+            {/*DESCRIPTION*/}
+            <section className="flex flex-col gap-12 text-left px-horizontal-lg py-vertical-md">
+                <h2 className="text-5xl">Course description</h2>
+                <div>
+                    <div className="relative overflow-hidden">
+                        <div className="space-y-4">
+                            {[...Array(7)].map((_, index) => (
+                                <div key={index} className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
+                            ))}
+                            <div className="h-4 bg-gray-300 rounded w-2/3 animate-pulse"></div>
+                        </div>
+                        <div
+                            className="pointer-events-none absolute bottom-0 left-0 w-full h-24 bg-gradient-to-t from-white to-transparent"/>
+                    </div>
+                    <div className="mt-4 h-10 bg-gray-300 rounded w-24 animate-pulse"></div>
+                </div>
+            </section>
+        </>
+    );
+}
+
+export default CourseDetailsInfoSkeleton;
Index: frontend/src/components/skeletons/CoursesFiltersSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CoursesFiltersSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/components/skeletons/CoursesFiltersSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,53 @@
+
+function CoursesFiltersSkeleton() {
+    return (
+        <aside className="flex flex-col gap-8 pl-8 pt-12 text-left sticky top-0 h-screen border-r-2 border-black/10">
+            {/* Header */}
+            <div className="h-8 bg-gray-300 rounded w-32 animate-pulse shrink-0 "></div>
+
+            <div className="relative flex flex-col gap-12 pl-4 pr-2 pb-20 overflow-y-scroll scrollable">
+                {/* Filter Sections - matching the 6 sections in CoursesFilters */}
+                <FilterSelectSkeleton hasSearch={false} /> {/* Favorite Courses */}
+                <FilterSelectSkeleton hasSearch={false} /> {/* Level */}
+                <FilterSelectSkeleton hasSearch={true} />  {/* Topics */}
+                <FilterSelectSkeleton hasSearch={true} />  {/* Skills */}
+                <FilterSelectSkeleton hasSearch={false} /> {/* Duration */}
+                <FilterSelectSkeleton hasSearch={false} /> {/* Price */}
+            </div>
+
+            {/* Gradient overlay */}
+            <div className="pointer-events-none absolute bottom-0 left-0 w-full h-24 bg-gradient-to-t from-white to-transparent"/>
+        </aside>
+    );
+}
+
+function FilterSelectSkeleton({hasSearch}: {hasSearch: boolean}) {
+    return (
+        <section className="flex flex-col gap-1 text-md">
+            {/* Header */}
+            <div className="h-6 bg-gray-300 rounded w-24 mb-4 animate-pulse"></div>
+
+            <form className="flex flex-col gap-2">
+                {/* Search input skeleton (only for Topics and Skills) */}
+                {hasSearch && (
+                    <div className="h-10 bg-gray-300 rounded-sm mb-2 animate-pulse"></div>
+                )}
+
+                {/* Filter options - 4 items */}
+                {[...Array(4)].map((_, index) => (
+                    <label key={index} className="flex items-center text-black whitespace-nowrap cursor-pointer w-fit">
+                        <div className="h-7 w-7 bg-gray-300 rounded mr-2 animate-pulse"></div>
+                        <div className="h-4 bg-gray-300 rounded w-40 animate-pulse"></div>
+                    </label>
+                ))}
+            </form>
+
+            {/* Show more button skeleton (only for sections with search) */}
+            {hasSearch && (
+                <div className="h-4 bg-gray-300 rounded w-16 animate-pulse"></div>
+            )}
+        </section>
+    );
+}
+
+export default CoursesFiltersSkeleton;
Index: frontend/src/components/skeletons/CoursesGridSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/CoursesGridSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/components/skeletons/CoursesGridSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,27 @@
+import CourseCardSkeleton from "./CourseCardSkeleton.tsx";
+
+function CoursesGridSkeleton() {
+    return (
+        <main className="flex-1 p-6">
+            {/* Active Filters Pills Skeleton */}
+            <div className="flex justify-between mb-6">
+                <div className="flex flex-wrap gap-2">
+                    {[...Array(4)].map((_, index) => (
+                        <div key={index} className="h-8 bg-gray-300 rounded-full w-24 animate-pulse"></div>
+                    ))}
+                </div>
+                <div className="h-8 bg-gray-300 rounded w-60 animate-pulse"></div>
+            </div>
+
+
+            {/* Course Grid Skeleton */}
+            <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
+                {[...Array(9)].map((_, index) => (
+                    <CourseCardSkeleton key={index} />
+                ))}
+            </div>
+        </main>
+    );
+}
+
+export default CoursesGridSkeleton;
Index: frontend/src/components/skeletons/HeroCourseDetailsSkeleton.tsx
===================================================================
--- frontend/src/components/skeletons/HeroCourseDetailsSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/components/skeletons/HeroCourseDetailsSkeleton.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,41 @@
+
+function HeroCourseDetailsSkeleton() {
+    return (
+        <div className="bg-dark-blue py-4">
+            {/*HEADER AND DESCRIPTION*/}
+            <section className="flex flex-col items-center gap-8 bg-white mx-6 px-horizontal-lg pb-12 pt-40 rounded-xl shadow-lg shadow-black/20">
+                {/* Title */}
+                <div className="h-12 bg-gray-300 rounded w-120 animate-pulse"></div>
+
+                {/* Description */}
+                <div className="space-y-2 w-full max-w-5xl">
+                    <div className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
+                    <div className="h-4 bg-gray-300 rounded w-full animate-pulse"></div>
+                    <div className="h-4 bg-gray-300 rounded w-4/5 animate-pulse"></div>
+                </div>
+
+                {/* Button section */}
+                <div className="flex mt-12 gap-12 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
+                    <div className="h-6 bg-gray-300 rounded w-8 animate-pulse"></div>
+                    <div className="h-12 bg-gray-300 rounded-full w-60 animate-pulse"></div>
+                </div>
+            </section>
+
+            {/*TRIPLE INFO*/}
+            <section className="flex justify-center text-white px-12 py-4 ">
+                {[...Array(3)].map((_, index) => (
+                    <div key={index} className="flex flex-col gap-4 text-left px-20 py-8 border-r-2 border-white/40 last:border-r-0">
+                        <div className="h-8 bg-white/30 rounded w-80 animate-pulse"></div>
+                        <div className="space-y-2">
+                            <div className="h-4 bg-white/20 rounded w-full animate-pulse"></div>
+                            <div className="h-4 bg-white/20 rounded w-full animate-pulse"></div>
+                            <div className="h-4 bg-white/20 rounded w-2/3 animate-pulse"></div>
+                        </div>
+                    </div>
+                ))}
+            </section>
+        </div>
+    );
+}
+
+export default HeroCourseDetailsSkeleton;
Index: frontend/src/context/GlobalContext.tsx
===================================================================
--- frontend/src/context/GlobalContext.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/context/GlobalContext.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -62,12 +62,12 @@
     const logout = async () => {
         return logoutApi()
+            .then(() => {
+                setAccessToken(null);
+                setUser(null);
+            })
             .catch(err => {
                 console.warn("Logout failed:", err);
                 throw err;
-            })
-            .finally(() => {
-                setAccessToken(null);
-                setUser(null);
-            })
+            });
     };
 
Index: frontend/src/global.css
===================================================================
--- frontend/src/global.css	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/global.css	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -2,8 +2,9 @@
 
 @theme {
+    --spacing-horizontal-lg: 10rem;
+    --spacing-horizontal-md: 7rem;
     --spacing-horizontal-sm: 4rem;
-    --spacing-horizontal-md: 7rem;
     /*--spacing-horizontal: 7rem;*/
-    --spacing-horizontal-lg: 10rem;
+
     --spacing-vertical-lg: 3rem;
     --spacing-vertical-md: 2rem;
Index: frontend/src/layout/Navbar.tsx
===================================================================
--- frontend/src/layout/Navbar.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/layout/Navbar.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -57,16 +57,14 @@
                         <>
                             <div className="flex flex-col gap-0 overflow-clip p-1 group">
-                                <button onClick={logout} className=" transition-all
-                    duration-300 ease-in-out z-10 cursor-pointer">Profile</button>
-                                {/*<Link to="/profile" className=" transition-all*/}
-                    {/*duration-300 ease-in-out z-10">Profile</Link>*/}
+                                <Link to="/profile" className=" transition-all
+                    duration-300 ease-in-out z-10 cursor-pointer">Profile</Link>
                                 <hr className="relative -left-30 group-hover:-left-4 border-t-2
                      rounded-full transition-all duration-300 ease-in-out"/>
                             </div>
-                            <Link to="/schedule-consulation"
+                            <div onClick={logout}
                                   className="hover:-translate-x-4 transition-all duration-200 ease-in-out cursor-pointer
                       relative -mr-4 px-6 pr-9 py-2 bg-shifter rounded-l-lg font-medium
                       shadow-md shadow-shifter/30"
-                            >Free Consultation</Link>
+                            >Free Consultation</div>
                         </>
                     ) : (
Index: frontend/src/pages/CourseDetails.tsx
===================================================================
--- frontend/src/pages/CourseDetails.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/pages/CourseDetails.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -9,7 +9,11 @@
 import {useGlobalContext} from "../context/GlobalContext.tsx";
 import {showInfoToast} from "../utils/showInfoToast.ts";
+import {useCourseStorage} from "../context/CourseStorage.ts";
+import HeroCourseDetailsSkeleton from "../components/skeletons/HeroCourseDetailsSkeleton.tsx";
+import CourseDetailsInfoSkeleton from "../components/skeletons/CourseDetailsInfoSkeleton.tsx";
 
 function CourseDetails() {
-    const { user, accessToken } = useGlobalContext();
+    const { user, accessToken, loading: authLoading } = useGlobalContext();
+    const { enrollments, setEnrollments } = useCourseStorage();
     const [loading, setLoading] = useState<boolean>(true);
     const { courseId } = useParams<{ courseId: string; courseTitle: string }>();
@@ -24,4 +28,7 @@
         return enrollUserApi(Number(courseId), accessToken || "")
             .then(() => {
+                if (enrollments) {
+                    setEnrollments(enrollments.filter((enrollment) => enrollment.courseId !== Number(courseId)));
+                }
                 console.log("User enrolled in course successfully");
             })
@@ -50,9 +57,10 @@
         <main className="bg-white">
             {
-                loading ?
-                    <div className="flex flex-col gap-12 justify-center items-center h-screen">
-                        <div className="w-20 loader"></div>
-                        <span className="text-xl font-semibold text-black/40">Loading...</span>
-                    </div> :
+                (authLoading || loading) ?
+                    <>
+                        <HeroCourseDetailsSkeleton />
+                        <CourseDetailsInfoSkeleton />
+                        <CoursesCarouselCourseDetails />
+                    </> :
                     <>
                         <HeroCourseDetails course={course} enrollUser={handleBuyCourse}/>
Index: frontend/src/pages/Courses.tsx
===================================================================
--- frontend/src/pages/Courses.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/pages/Courses.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -1,7 +1,6 @@
-import React, {useEffect, useRef} from "react";
+import React, {useEffect, useMemo, useState} from "react";
 import CoursesFilters from "../components/CoursesFilters.tsx";
 import CoursesGrid from "../components/CoursesGrid.tsx";
 import type {FilterParams} from "../types/FilterParams.tsx";
-import {useLocation, useNavigate} from "react-router-dom";
 import {fetchCoursesApi} from "../api/courseApi.ts";
 import ShifterRocket from "../../public/Rocket-Blue-Fire.png"
@@ -9,11 +8,14 @@
 import type {CoursePreview} from "../types/CoursePreview.tsx";
 import {useGlobalContext} from "../context/GlobalContext.tsx";
-
-function getInitialFiltersFromSearch(): FilterParams {
-    const searchParams = new URLSearchParams(location.search);
+import {useLocation, useNavigate} from "react-router-dom";
+import CoursesFiltersSkeleton from "../components/skeletons/CoursesFiltersSkeleton.tsx";
+import CoursesGridSkeleton from "../components/skeletons/CoursesGridSkeleton.tsx";
+
+function getInitialFiltersFromSearch(locationSearch: string): FilterParams {
+    const searchParams = new URLSearchParams(locationSearch);
     const initialParams: FilterParams = {};
 
-    const search = searchParams.get("search");
-    if (search) initialParams.search = search;
+    const search = searchParams.getAll("search");
+    if (search.length > 0) initialParams.search = search;
 
     const skill = searchParams.getAll("skill");
@@ -38,82 +40,156 @@
     const navigate = useNavigate();
     const location = useLocation();
-    const { accessToken } = useGlobalContext();
-    const {allCourses, topics, skills} = useCourseStorage();
-
-    const [showOnlyFavorites, setShowOnlyFavorites] = React.useState<boolean>(false);
-    const [filteredCourses, setFilteredCourses] = React.useState<CoursePreview[] | null>(null);
-
-    const [filters, setFilters] = React.useState<FilterParams>(getInitialFiltersFromSearch());
-    const [loading, setLoading] = React.useState<boolean>(false);
-
-    const abortControllerRef = useRef<AbortController | null>(null);
-    const debounceTimeoutRef = useRef<number | null>(null);
-
-    // Effect to fetch filtered courses on filters change
+    const {accessToken, user, loading: authLoading} = useGlobalContext();
+    const {allCourses, setAllCourses} = useCourseStorage();
+
+    const [courses, setCourses] = React.useState<CoursePreview[] | null>(null);
+    const [loading, setLoading] = useState<boolean>(false);
+
+    const [filters, setFilters] = useState<FilterParams>(getInitialFiltersFromSearch(location.search));
+
+    const topics = useMemo(() =>
+            allCourses?.map(course => course.topicsCovered).flat() || [],
+        [allCourses]
+    );
+    const skills = useMemo(() =>
+            allCourses?.map(course => course.skillsGained).flat() || [],
+        [allCourses]
+    );
+
+    // Effect to initialize courses
     useEffect(() => {
-        if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);
-
+        const storedCourses = sessionStorage.getItem("allCourses");
+        if (storedCourses) {
+            setAllCourses(JSON.parse(storedCourses));
+            return;
+        }
+
+        setLoading(true);
+        fetchCoursesApi(accessToken || "")
+            .then(courses => {
+                setAllCourses(courses);
+                sessionStorage.setItem("allCourses", JSON.stringify(courses));
+            })
+            .catch(err => {
+                console.error("Failed to fetch courses:", err);
+            })
+            .finally(() => setLoading(false));
+    }, [authLoading])
+
+    // Effect to filter courses based on filters and favorites
+    useEffect(() => {
+        if (!allCourses) return;
+
+        let filteredCourses = [...allCourses];
+
+        // Apply search filter
+        if (filters.search) {
+            filteredCourses = filteredCourses.filter(course =>
+                filters.search!.some(search =>
+                    course.difficulty.toLowerCase().includes(search.toLowerCase()) ||
+                    course.title.toLowerCase().includes(search.toLowerCase()) ||
+                    course.topicsCovered.some(topic => topic.toLowerCase().includes(search.toLowerCase())) ||
+                    course.skillsGained.some(skill => skill.toLowerCase().includes(search.toLowerCase()))
+                )
+            );
+        }
+
+        // Apply skill filter
+        if (filters.skill && filters.skill.length > 0) {
+            filteredCourses = filteredCourses.filter(course =>
+                filters.skill!.some(skill => course.skillsGained.includes(skill))
+            );
+        }
+
+        // Apply topic filter
+        if (filters.topic && filters.topic.length > 0) {
+            filteredCourses = filteredCourses.filter(course =>
+                filters.topic!.some(topic => course.topicsCovered.includes(topic))
+            );
+        }
+
+        // Apply difficulty filter
+        if (filters.difficulty && filters.difficulty.length > 0) {
+            filteredCourses = filteredCourses.filter(course =>
+                filters.difficulty!.includes(course.difficulty)
+            );
+        }
+
+        // Apply price filter
+        if (filters.price && filters.price.length > 0) {
+            filteredCourses = filteredCourses.filter(course => {
+                return filters.price!.some(priceRange => {
+                    const price = course.price;
+
+                    switch (priceRange) {
+                        case "free":
+                            return price === 0;
+                        case "low": // < $20
+                            return price > 0 && price < 20;
+                        case "medium": // $20 - $50
+                            return price >= 20 && price <= 50;
+                        case "high": // $50+
+                            return price > 50;
+                        default:
+                            return false;
+                    }
+                });
+            });
+        }
+
+        // Apply duration filter
+        if (filters.duration && filters.duration.length > 0) {
+            filteredCourses = filteredCourses.filter(course => {
+                return filters.duration!.some(durationRange => {
+                    const minutes = course.durationMinutes;
+
+                    switch (durationRange) {
+                        case "extraShort": // < 3 hours
+                            return minutes < 60 * 3;
+                        case "short": // 3-6 hours
+                            return minutes >= 60 * 3 && minutes < 60 * 6;
+                        case "medium": // 6-10 hours
+                            return minutes >= 60 * 6 && minutes < 60 * 10;
+                        case "long": // 10+ hours
+                            return minutes >= 60 * 10;
+                        default:
+                            return false;
+                    }
+                });
+            });
+        }
+
+        // Apply favorites filter
+        if (filters.showOnlyFavoriteCourses) {
+            filteredCourses = filteredCourses.filter(course =>
+                user?.favoriteCourses.includes(course.id)
+            )
+        }
+
+        setCourses(filteredCourses);
+    }, [allCourses, filters, user?.favoriteCourses]);
+
+    // Effect to change url params based on filters
+    useEffect(() => {
         const noFiltersApplied = Object.keys(filters).length === 0;
 
+        // Clear URL query params
         if (noFiltersApplied) {
-
-            if (abortControllerRef.current) {
-                abortControllerRef.current.abort();
-                abortControllerRef.current = null;
+            navigate({pathname: location.pathname, search: ""}, {replace: true});
+            return;
+        }
+
+
+        // Add URL query params from filters
+        const paramsToUrl = new URLSearchParams();
+        Object.entries(filters).forEach(([key, value]) => {
+            if (Array.isArray(value)) {
+                value.forEach(v => paramsToUrl.append(key, v));
+            } else if (value) {
+                paramsToUrl.set(key, value.toString());
             }
-
-            setFilteredCourses(null);
-
-            // Clear URL query params
-            navigate({pathname: location.pathname, search: ""}, {replace: true});
-            setLoading(false);
-            return;
-        }
-
-        debounceTimeoutRef.current = window.setTimeout(() => {
-            if (abortControllerRef.current) {
-                abortControllerRef.current.abort();
-            }
-
-            abortControllerRef.current = new AbortController();
-
-            setLoading(true);
-
-            fetchCoursesApi(accessToken || "", filters, abortControllerRef.current?.signal)
-                .then(data => {
-                    setFilteredCourses(data);
-                })
-                .catch(error => {
-                    if (error.name === "CanceledError" || error.message === "canceled") {
-                        // request was aborted, do nothing
-                        console.log("Previous request aborted");
-                    } else {
-                        console.error(error);
-                    }
-                })
-                .finally(() => {
-                    setLoading(false);
-                    abortControllerRef.current = null;
-                });
-
-            // Update URL with filters
-            const paramsToUrl = new URLSearchParams();
-            Object.entries(filters).forEach(([key, value]) => {
-                if (Array.isArray(value)) {
-                    value.forEach(v => paramsToUrl.append(key, v));
-                } else if (value) {
-                    paramsToUrl.set(key, value.toString());
-                }
-            });
-            navigate({pathname: location.pathname, search: paramsToUrl.toString()}, {replace: true});
-        }, 500);
-
-        return () => {
-            if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);
-            if (abortControllerRef.current) {
-                abortControllerRef.current.abort();
-                abortControllerRef.current = null;
-            }
-        };
+        });
+        navigate({pathname: location.pathname, search: paramsToUrl.toString()}, {replace: true});
+
     }, [filters]);
 
@@ -138,20 +214,26 @@
                 </p>
             </section>
-            <section className="flex gap-0 w-full">
-                <CoursesFilters
-                    setFilters={setFilters}
-                    filters={filters}
-                    topics={topics}
-                    skills={skills}
-                    showOnlyFavoriteCourses={showOnlyFavorites}
-                    setShowOnlyFavorites={setShowOnlyFavorites}/>
-                <CoursesGrid
-                    setFilters={setFilters}
-                    filters={filters}
-                    courses={filteredCourses ?? allCourses}
-                    loading={loading}
-                    showOnlyFavoriteCourses={showOnlyFavorites}
-                />
-            </section>
+            {
+                (authLoading || loading) ? (
+                    <section className="flex gap-0 w-full">
+                        <CoursesFiltersSkeleton />
+                        <CoursesGridSkeleton />
+                    </section>
+                ) : (
+                    <section className="flex gap-0 w-full">
+                        <CoursesFilters
+                            filters={filters}
+                            setFilters={setFilters}
+                            topics={topics}
+                            skills={skills}
+                        />
+                        <CoursesGrid
+                            setFilters={setFilters}
+                            filters={filters}
+                            courses={courses}
+                        />
+                    </section>
+                )
+            }
         </main>
     );
Index: frontend/src/pages/Profile.tsx
===================================================================
--- frontend/src/pages/Profile.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
+++ frontend/src/pages/Profile.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -0,0 +1,14 @@
+import HeroProfile from "../components/HeroProfile.tsx";
+import {useState} from "react";
+
+function Profile() {
+    const [selectedTab, setSelectedTab] = useState("myCourses");
+
+    return (
+        <main>
+            <HeroProfile selectedTab={selectedTab} setSelectedTab={setSelectedTab}/>
+        </main>
+    )
+}
+
+export default Profile;
Index: frontend/src/types/CoursePreview.tsx
===================================================================
--- frontend/src/types/CoursePreview.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/types/CoursePreview.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -14,4 +14,5 @@
     skillsGained: string[];
     topicsCovered: string[];
+    courseContentCount: number;
 }
 
Index: frontend/src/types/Difficulty.tsx
===================================================================
--- frontend/src/types/Difficulty.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/types/Difficulty.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -1,1 +1,1 @@
-export type Difficulty = "Beginner" | "Intermediate" | "Advanced" | "Expert";
+export type Difficulty = "BEGINNER" | "INTERMEDIATE" | "ADVANCED" | "EXPERT";
Index: frontend/src/types/FilterParams.tsx
===================================================================
--- frontend/src/types/FilterParams.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/types/FilterParams.tsx	(revision 3b9a2ae4985b4a733b21f6ff291fc8f9b242deaa)
@@ -1,5 +1,6 @@
 
 export interface FilterParams {
-    search?: string;
+    showOnlyFavoriteCourses?: boolean;
+    search?: string[];
     difficulty?: string[];
     price?: string[];
