diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f25caf3a5fc1d37ced68af62586a59fd16c19088
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/tugas-besar-1.iml" filepath="$PROJECT_DIR$/.idea/tugas-besar-1.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/php.xml b/.idea/php.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8e445c25a80737997e0eef9176899c8fc0f7a132
--- /dev/null
+++ b/.idea/php.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MessDetectorOptionsConfiguration">
+    <option name="transferred" value="true" />
+  </component>
+  <component name="PHPCSFixerOptionsConfiguration">
+    <option name="transferred" value="true" />
+  </component>
+  <component name="PHPCodeSnifferOptionsConfiguration">
+    <option name="highlightLevel" value="WARNING" />
+    <option name="transferred" value="true" />
+  </component>
+  <component name="PhpProjectSharedConfiguration" php_language_level="7.0">
+    <option name="suggestChangeDefaultLanguageLevel" value="false" />
+  </component>
+  <component name="PhpStanOptionsConfiguration">
+    <option name="transferred" value="true" />
+  </component>
+  <component name="PsalmOptionsConfiguration">
+    <option name="transferred" value="true" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/tugas-besar-1.iml b/.idea/tugas-besar-1.iml
new file mode 100644
index 0000000000000000000000000000000000000000..c956989b29ad0767edc6cf3a202545927c3d1e76
--- /dev/null
+++ b/.idea/tugas-besar-1.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/src/app/components/app/app_page.php b/src/app/components/app/app_page.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9e26b3dbcca9d3e9b438b3644fb02736d825d5a
--- /dev/null
+++ b/src/app/components/app/app_page.php
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <!-- Global CSS -->
+    <link rel="stylesheet" type="text/css" href="<?= BASE_URL ?>/styles/globals.css">
+    <link rel="stylesheet" type="text/css" href="<?= BASE_URL ?>/styles/search/search.css">
+    <!-- JavaScript Library -->
+    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/player.js" defer></script>
+    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/dashboard/layout.js" defer></script>
+    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/util/debounce.js" defer></script>
+    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/search/search.js" defer></script>
+    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/app/app.js" defer></script>
+    <!-- Google Fonts -->
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,700;1,9..40,400;1,9..40,700&display=swap" rel="stylesheet">
+    <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
+    <title>Spotify</title>
+</head>
+<body>
+    <?php include(dirname(__DIR__) . "/common/sidebar.php")?>
+    <?php include(dirname(__DIR__) . "/common/profile.php")?>
+    <main>
+        <!-- Called by app.js -->
+    </main>
+    <?php include(dirname(__DIR__) . "/common/player.php")?>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/app/components/common/sidebar.php b/src/app/components/common/sidebar.php
index 268ac6e1e61c9118e534c8c41b991ef24cfb3e31..114c2dc8fab2e09bd79c8e3b14dd8a1c851cf8e9 100644
--- a/src/app/components/common/sidebar.php
+++ b/src/app/components/common/sidebar.php
@@ -1,33 +1,26 @@
-<div class="sidebar">
-    <div class="sidebar-container">
-        <a href="<?= BASE_URL ?>/home">
-            <div class="sidebar-item">
-                <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/home_icon.svg" alt="home">
-                <div class="sh5">Home</div>
-            </div>
-        </a>
-        <a href="<?= BASE_URL ?>/search">
-            <div class="sidebar-item">
-                <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/search_icon.svg" alt="home">
-                <div class="sh5">Search</div>
-            </div>
-        </a>
-        <a href="<?= BASE_URL ?>/library">
-            <div class="sidebar-item">
-                <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/library_icon.svg" alt="home">
-                <div class="sh5">Library</div>
-            </div>
-        </a>
+<aside>
+    <div class="sidebar-container">            
+        <div class="sidebar-item" onclick="getPage('home')">
+            <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/home_icon.svg" alt="home">
+            <div class="sh5">Home</div>
+        </div>
+        <div class="sidebar-item" onclick="getPage('search')">
+            <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/search_icon.svg" alt="search">
+            <div class="sh5">Search</div>
+        </div>
+        <div class="sidebar-item" onclick="getPage('library')">
+            <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/library_icon.svg" alt="library">
+            <div class="sh5">Library</div>
+        </div>
+
         <?php if (isset($_SESSION["role_id"] )) :?>
         <?php if ($_SESSION["role_id"] == 1) :?>
-        <a href="<?= BASE_URL ?>/dashboard">
-            <div class="sidebar-item">
-                <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/fire_icon.svg" alt="home">
+            <div class="sidebar-item" onclick="getPage('dashboard')">
+                <img width="32" height="32" src="<?= BASE_URL ?>/images/assets/fire_icon.svg" alt="dashboard">
                 <div class="sh5">Dashboard</div>
             </div>
-        </a>
         <?php endif;?>
         <?php endif;?>
 
     </div>
-</div>
\ No newline at end of file
+</aside>
\ No newline at end of file
diff --git a/src/app/components/dashboard/layout.php b/src/app/components/dashboard/layout.php
index e7d0eaddf61857dc77156d58a603dc89636119a5..52c7fb2c9a81fd41b415b247f02471b928448bac 100644
--- a/src/app/components/dashboard/layout.php
+++ b/src/app/components/dashboard/layout.php
@@ -17,7 +17,6 @@
 </head>
 
 <body>
-  <?php include(dirname(__DIR__) . "/common/sidebar.php") ?>
   <?php include(dirname(__DIR__) . "/common/toast.php") ?>
 
   <div id="overlay-layout" class="overlay hidden"></div>
@@ -55,8 +54,6 @@
 
     <section id="dashboard-section"></section>
   </main>
-
-  <?php include(dirname(__DIR__) . "/common/player.php") ?>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/src/app/components/home/home_page.php b/src/app/components/home/home_page.php
index 65be2a3bde47723b410571a9cd97833c15bbfe47..d482164b20887594e1d52b75c0a3c5fb827d4422 100644
--- a/src/app/components/home/home_page.php
+++ b/src/app/components/home/home_page.php
@@ -15,11 +15,9 @@
     <title>Homepage</title>
 </head>
 <body>
-    <?php include(dirname(__DIR__) . "/common/sidebar.php")?>
-    <?php include(dirname(__DIR__) . "/common/profile.php")?>
     <main>
-        <div class="main-content">
-            <h4>TECHONOLOGY</h4>
+        <div class="comedy-content">
+            <h4>COMEDY</h4>
             <div class="podcast-list">
             <?php if (isset($this->data["tech_podcasts"])): ?>
                 <div class="podcast-list">
@@ -41,6 +39,5 @@
             </div>
         </div>
     </main>
-    <?php include(dirname(__DIR__) . "/common/player.php")?>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/app/components/library/library.php b/src/app/components/library/library.php
index 401460ea4aa629a8df64ca1ba0d4399e19930183..db770cb01a7dcef5fc05b3059ac3b0fe11ca0dbc 100644
--- a/src/app/components/library/library.php
+++ b/src/app/components/library/library.php
@@ -10,15 +10,10 @@
     <title>Library</title>
 </head>
 <body>
-    <?php include(dirname(__DIR__) . "/common/sidebar.php")?>
-    <?php include(dirname(__DIR__) . "/common/profile.php")?>
-
-    
     <main>
         <div class="playlist-container">
             <?php include(dirname(__DIR__) . "/library/playlist.php")?>
         </div>
     </main>
-    <?php include(dirname(__DIR__) . "/common/player.php")?>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/app/components/search/search_page.php b/src/app/components/search/search_page.php
index 54f93665eb66882dd3fe0e0aea26235bc7945657..a3a3a5feab73908a161429df11357ca3461e9285 100644
--- a/src/app/components/search/search_page.php
+++ b/src/app/components/search/search_page.php
@@ -1,86 +1,60 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <!-- Global CSS -->
-    <link rel="stylesheet" type="text/css" href="<?= BASE_URL ?>/styles/globals.css">
-    <!-- Page-specific CSS -->
-    <link rel="stylesheet" type="text/css" href="<?= BASE_URL ?>/styles/search/search.css">
-    <!-- JavaScript Library -->
-    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/util/debounce.js" defer></script>
-    <script type="text/javascript" src="<?= BASE_URL ?>/javascript/search/search.js" defer></script>
+<navbar>
+    <!-- SEARCH BAR -->
+    <div class="search-bar">
+            <img src="<?= BASE_URL ?>/images/assets/search_icon.svg" alt="home" width="24px" height="24px">
+        <input id="search-input" type="text">
+    </div>
 
-    <link rel="preconnect" href="https://fonts.googleapis.com">
-    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-    <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,700;1,9..40,400;1,9..40,700&display=swap" rel="stylesheet">
-    <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
-    <title>Search Page</title>
-</head> 
-<body>
-    <?php include(dirname(__DIR__) . "/common/sidebar.php")?>
-    <?php include(dirname(__DIR__) . "/common/profile.php")?>
-    <navbar>
-        <!-- SEARCH BAR -->
-        <div class="search-bar">
-                <img src="<?= BASE_URL ?>/images/assets/search_icon.svg" alt="home" width="24px" height="24px">
-            <input id="search-input" type="text">
-        </div>
-
-        <!-- FILTER -->
-        <div class="filter">
-            <!-- GENRE FILTER -->
-            <div class="dropdown genre">
-                <button class="dropbtn genre-button">
-                    <div class="genre-display">
-                        All genre
-                    </div>
-                    <img src="<?= BASE_URL ?>/images/assets/arrow_down.svg" alt="home" width="12px" height="12px">
-                </button>
-                <div class="dropdown-content genre-content">
-                    <div class="item genre-option" data-value="comedy">Comedy</div>
-                    <div class="item genre-option" data-value="sports">Sports</div>
-                    <div class="item genre-option" data-value="technology">Technology</div>
-                </div>
-            </div>
-    
-            <!-- Number of Episode FILTER -->
-            <div class="dropdown eps">
-                <button class="dropbtn eps-button">
-                    <div class="eps-display">
-                        All episodes
-                    </div>
-                    <img src="<?= BASE_URL ?>/images/assets/arrow_down.svg" alt="home" width="12px" height="12px">
-                </button>
-                <div class="dropdown-content eps-content">
-                    <div class="item eps-option" data-value="eps-cat-1">Less than 20 episodes</div>
-                    <div class="item eps-option" data-value="eps-cat-2">20-50 episodes</div>
-                    <div class="item eps-option" data-value="eps-cat-3">50-100 episodes</div>
-                    <div class="item eps-option" data-value="eps-cat-4">More than 100 episodes</div>
+    <!-- FILTER -->
+    <div class="filter">
+        <!-- GENRE FILTER -->
+        <div class="dropdown genre">
+            <button class="dropbtn genre-button">
+                <div class="genre-display">
+                    All genre
                 </div>
+                <img src="<?= BASE_URL ?>/images/assets/arrow_down.svg" alt="home" width="12px" height="12px">
+            </button>
+            <div class="dropdown-content genre-content">
+                <div class="item genre-option" data-value="">All genre</div>
+                <div class="item genre-option" data-value="comedy">Comedy</div>
+                <div class="item genre-option" data-value="sports">Sports</div>
+                <div class="item genre-option" data-value="technology">Technology</div>
             </div>
         </div>
-        
-        <!-- SORTING -->
-        <div class="dropdown date" id="sort">
-            <button class="dropbtn sort-button">
-                <div class="sort-display">
-                    Sort by
+
+        <!-- Number of Episode FILTER -->
+        <div class="dropdown eps">
+            <button class="dropbtn eps-button">
+                <div class="eps-display">
+                    All episodes
                 </div>
                 <img src="<?= BASE_URL ?>/images/assets/arrow_down.svg" alt="home" width="12px" height="12px">
             </button>
-            <div class="dropdown-content sort-content">
-                <div class="item sort-option" data-value="alphabet">alphabetical</div>
-                <div class="item sort-option" data-value="sort">date joined</div>
+            <div class="dropdown-content eps-content">
+                <div class="item eps-option" >All episodes</div>
+                <div class="item eps-option" >Less than 20 episodes</div>
+                <div class="item eps-option" >20-50 episodes</div>
+                <div class="item eps-option" >50-100 episodes</div>
+                <div class="item eps-option" >More than 100 episodes</div>
             </div>
         </div>
-
-    </navbar>
-    <main>
-        <div class="result-container">
-            <?php include(dirname(__DIR__) . "/search/result.php")?>
+    </div>
+    
+    <!-- SORTING -->
+    <div class="dropdown date" id="sort">
+        <button class="dropbtn sort-button">
+            <div class="sort-display">
+                Sort by
+            </div>
+            <img src="<?= BASE_URL ?>/images/assets/arrow_down.svg" alt="home" width="12px" height="12px">
+        </button>
+        <div class="dropdown-content sort-content">
+            <div class="item sort-option" data-value="alphabet">alphabetical</div>
+            <div class="item sort-option" data-value="sort">date joined</div>
         </div>
-    </main>
-    <?php include(dirname(__DIR__) . "/common/player.php")?>
-</body>
-</html>           
\ No newline at end of file
+    </div>
+</navbar>
+<div class="result-container">
+    <?php include(dirname(__DIR__) . "/search/result.php")?>
+</div>
diff --git a/src/app/controllers/app/app_controller.php b/src/app/controllers/app/app_controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..88d69f645e873eee1089ef7578eee6c99a6c5933
--- /dev/null
+++ b/src/app/controllers/app/app_controller.php
@@ -0,0 +1,54 @@
+<?php
+
+class AppController
+{
+    public function call()
+    {
+        // Session validation
+        session_start();
+        if (!isset($_SESSION["user_id"])) {
+            http_response_code(403);
+            header("Location: " . BASE_URL . "/login");
+            return;
+        }
+
+        // Get id_episode from session
+        $epsId = "";
+        if (isset($_SESSION["eps_id"])) {
+            $epsId = $_SESSION["eps_id"];
+        }
+
+        // Get id_user from session
+        $userId = "";
+        if (isset($_SESSION["user_id"])) {
+          $userId = $_SESSION["user_id"];
+        }
+
+        $data = [];
+        
+        // Data Player
+        $podcastModel = new PodcastModel();
+        $podcastInfo = $podcastModel->getPodcastInfo($epsId);
+        if ($podcastInfo){
+          $data["title"] = $podcastInfo->title;
+          $data["url_thumbnail"] = $podcastInfo->url_thumbnail;
+          $data["podcast"] = $podcastInfo->name;
+          $data["url_audio"] = $podcastInfo->url_audio;
+        }
+
+        // Data Profile
+        $userModel = new UserModel();
+        $userInfo = $userModel->getUserInfo($userId);
+        if ($userInfo) {
+            $data["name"] = $userInfo->name;
+            $data["username"] = $userInfo->username;
+            $data["url_profpic"] = $userInfo->url_profpic ?? "/images/default-profpic.jpeg";
+            $data["is_admin"] = $userInfo->is_admin;
+          }
+
+        // App View
+        require_once __DIR__ . "/../../views/app/app_view.php";
+        $appView = new AppView($data);
+        $appView->render();
+    }
+}
\ No newline at end of file
diff --git a/src/app/controllers/home/get_home.php b/src/app/controllers/home/get_home.php
index 81b6c709b02b2fc97e8e333c893952073b323aba..5344363de2f3605c0ad767b2cfe3b3ab5e426720 100644
--- a/src/app/controllers/home/get_home.php
+++ b/src/app/controllers/home/get_home.php
@@ -6,46 +6,17 @@ class GetHomeController
   {
     session_start();
     
-    require_once __DIR__ . "/../../views/home/home_view.php";
     $data = [];
-
+    
     // podcast Info
     $podcastModel = new PodcastModel();
-    $epsId = "";
-    if (isset($_SESSION["eps_id"])) {
-      $epsId = $_SESSION["eps_id"];
-    }
-    $podcastInfo = $podcastModel->getPodcastInfo($epsId);
-    
-    if ($podcastInfo){
-      $data["title"] = $podcastInfo->title;
-      $data["url_thumbnail"] = $podcastInfo->url_thumbnail;
-      $data["podcast"] = $podcastInfo->name;
-      $data["url_audio"] = $podcastInfo->url_audio;
-    }
-
-    $podcastTech = $podcastModel->getPodcastByGenre("technology");
+    $podcastTech = $podcastModel->getPodcastByGenre("comedy");
     if ($podcastTech){
-      var_dump($podcastTech);
       $data["tech_podcasts"] = $podcastTech;
     }
-
-    // user info
-    $userModel = new UserModel();
-    $userId = "";
-    if (isset($_SESSION["user_id"])) {
-      $userId = $_SESSION["user_id"];
-    }
-    $userInfo = $userModel->getUserInfo($userId);
-
-    if ($userInfo) {
-      $data["name"] = $userInfo->name;
-      $data["username"] = $userInfo->username;
-      $data["url_profpic"] = $userInfo->url_profpic ?? "/images/default-profpic.jpeg";
-      $data["is_admin"] = $userInfo->is_admin;
-    }
     
-
+    // Home View
+    require_once __DIR__ . "/../../views/home/home_view.php";
     $view = new HomeView($data);
     $view->render();
   }
diff --git a/src/app/controllers/search/get_search.php b/src/app/controllers/search/get_search.php
index f7a0f541c14d497bb76c8d52aa1858aad26f9cea..92cda4bf8a8d0a5654da388a55c987fd55adb377 100644
--- a/src/app/controllers/search/get_search.php
+++ b/src/app/controllers/search/get_search.php
@@ -13,24 +13,6 @@ class GetSearchController
       return;
     }
 
-    require_once __DIR__ . "/../../views/search/search_view.php";
-    $data = [];
-
-    // podcast Info
-    $podcastModel = new PodcastModel();
-    $epsId = "";
-    if (isset($_GET["eps_id"])) {
-      $epsId = $_GET["eps_id"];
-  }
-    $podcastInfo = $podcastModel->getPodcastInfo($epsId);
-    
-    if ($podcastInfo){
-      $data["title"] = $podcastInfo->title;
-      $data["url_thumbnail"] = $podcastInfo->url_thumbnail;
-      $data["podcast"] = $podcastInfo->name;
-      $data["url_audio"] = $podcastInfo->url_audio;
-    }
-
     // List of all podcasts
     // search bar
     $keyword = "";
@@ -43,7 +25,7 @@ class GetSearchController
     if (isset($_GET["genre"])) {
       $genre = $_GET["genre"];
     }
-
+    
     // eps
     $eps = "";
     if (isset($_GET["eps"])) {
@@ -55,35 +37,23 @@ class GetSearchController
     if (isset($_GET["sort"])) {
       $sort = $_GET["sort"];
     }
-
+    
     // isAsc
     $isAsc = "";
     if (isset($_GET["isAsc"])) {
       $isAsc = $_GET["isAsc"];
     }
-
+    
+    $podcastModel = new PodcastModel();
     $podcasts = $podcastModel->getAllPodcast($keyword, $genre, $eps, $sort, $isAsc);
-    // print_r($podcasts);
-
+    
+    $data = [];
     if ($podcasts){
       $data["podcasts"] = $podcasts;
     }
     
-    // user info
-    $userModel = new UserModel();
-    $userId = "";
-    if (isset($_GET["user_id"])) {
-      $userId = $_GET["user_id"];
-    }
-    $userInfo = $userModel->getUserInfo($userId);
-
-    if ($userInfo) {
-      $data["name"] = $userInfo->name;
-      $data["username"] = $userInfo->username;
-      $data["url_profpic"] = $userInfo->url_profpic ?? "/images/default-profpic.jpeg";
-      $data["is_admin"] = $userInfo->is_admin;
-    }
-    
+    // Search View
+    require_once __DIR__ . "/../../views/search/search_view.php";
     $view = new SearchView($data);
     if (isset($_GET["keyword"]) && $_GET["keyword"]="1"){
       $view->render_match();
diff --git a/src/app/core/app.php b/src/app/core/app.php
index 84324758f190492eb357f91e9147ebab99974514..326ce639ff35217d7aa4eb3a33480ecf00dbf142 100644
--- a/src/app/core/app.php
+++ b/src/app/core/app.php
@@ -7,8 +7,20 @@ class App
     $url = $this->parseURL();
     $router = new Router();
 
+    $router->get("public", new AppController());
+    $router->get("public/home", new AppController());
+    $router->get("public/search", new AppController());
+    $router->get("public/library", new AppController());
+    $router->get("public/playlist", new AppController());
+    $router->get("public/dashboard", new AppController());
+    
+    $router->get("public/components/home", new GetHomeController());
+    $router->get("public/components/search", new GetSearchController());
+    $router->get("public/components/library", new GetLibraryController());
+    $router->get("public/components/playlist", new GetPlaylistController());
+
     // Dashboard page routes
-    $router->get("public/dashboard", new GetDashboardLayoutController());
+    $router->get("public/components/dashboard", new GetDashboardLayoutController());
     $router->get("public/dashboard/main", new GetDashboardLayoutController());
     $router->get("public/dashboard/episode", new GetDashboardLayoutController());
     $router->get("public/dashboard/add-episode", new GetAddEpisodeController());
@@ -28,17 +40,12 @@ class App
     $router->delete("public/dashboard/podcast", new DeletePodcastController());
 
     $router->get("public/podcast", new GetPodcastPageController());
-
-    $router->post("public/logout", new LogoutController());
-
-    $router->get("public/home", new GetHomeController());
-    $router->get("public/search", new GetSearchController());
+    
     $router->get("public/login", new GetLoginController());
     $router->post("public/login", new PostLoginController());
     $router->get("public/signup", new GetSignupController());
     $router->post("public/signup", new PostSignupController());
-    $router->get("public/library", new GetLibraryController());
-    $router->get("public/playlist", new GetPlaylistController());
+    $router->post("public/logout", new LogoutController());
 
     $router->directRequest($url);
   }
diff --git a/src/app/init.php b/src/app/init.php
index a984ef3b9c391d1bf4ebff7fd6a1e7c0ae97011d..f936aa1b16d90ab1a10cd76a44456e9d6ad83485 100644
--- a/src/app/init.php
+++ b/src/app/init.php
@@ -36,6 +36,8 @@ require_once __DIR__ . "/controllers/signup/get_signup.php";
 require_once __DIR__ . "/controllers/signup/post_signup.php";
 require_once __DIR__ . "/controllers/search/get_search.php";
 
+require_once __DIR__ . "/controllers/app/app_controller.php";
+
 require_once __DIR__ . "/models/podcast.php";
 require_once __DIR__ . "/models/episode.php";
 require_once __DIR__ . "/models/user.php";
diff --git a/src/app/models/podcast.php b/src/app/models/podcast.php
index e77bc641d91dcaee11fa3cd5aa89de56660cac2a..f0c3eabfc0359b25d03e5042d7ebc2470f8e6f81 100644
--- a/src/app/models/podcast.php
+++ b/src/app/models/podcast.php
@@ -95,7 +95,7 @@ class PodcastModel
 
   public function getPodcastByGenre($genre)
   {
-    $queryByGenre =
+    $query =
       "SELECT title, category, url_thumbnail, description, name 
     FROM podcast 
     NATURAL JOIN user
@@ -103,6 +103,7 @@ class PodcastModel
     LIMIT 7
     ";
 
+    $this->db->query($query);
     $this->db->bind("genre", $genre);
     $podcasts = $this->db->fetchAll();
 
diff --git a/src/app/views/app/app_view.php b/src/app/views/app/app_view.php
new file mode 100644
index 0000000000000000000000000000000000000000..40abe6675d613733260a5d73fbc09102c0bdf9f9
--- /dev/null
+++ b/src/app/views/app/app_view.php
@@ -0,0 +1,16 @@
+<?php
+
+class AppView
+{
+    public $data;
+    
+    public function __construct($data = [])
+    {
+        $this->data = $data;
+    }
+    
+    public function render()
+    {
+        require_once __DIR__ . "/../../components/app/app_page.php";
+    }
+}
\ No newline at end of file
diff --git a/src/app/views/search/search_view.php b/src/app/views/search/search_view.php
index fd29538a4f5bbeef9e8c3208529eee56dbdc01c2..3d76394e83518f6d3c43c3c002c9567c9ab1a691 100644
--- a/src/app/views/search/search_view.php
+++ b/src/app/views/search/search_view.php
@@ -17,4 +17,4 @@ class SearchView
   {
     require_once __DIR__ . "/../../components/search/result.php";
   }
-}
+}
\ No newline at end of file
diff --git a/src/public/javascript/app/app.js b/src/public/javascript/app/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..68eb6c49afbb79fd42d94cb4c46da18ea2909320
--- /dev/null
+++ b/src/public/javascript/app/app.js
@@ -0,0 +1,29 @@
+const mainSection = document.querySelector('main');
+const sidebar = document.querySelector('.sidebar');
+
+const urls = window.location.href.split("?")[0].split("/");
+let lastURL = urls[urls.length - 1];
+
+window.onload = () => {
+    getPage(lastURL);
+}
+
+getPage = (page) => {
+    const xhr = new XMLHttpRequest();
+    xhr.open('GET', `/public/components/${page}`, true);
+
+    xhr.onreadystatechange = () => {
+        if(xhr.readyState == 4 && xhr.status == 200) {
+            mainSection.innerHTML = xhr.responseText;
+            handleSearch();
+            handleDashboard();
+        }
+    }
+
+    xhr.send();
+    history.pushState(
+        {},
+        "",
+        `http://localhost:8080/public/${page}`
+    );
+}   
diff --git a/src/public/javascript/app/route.js b/src/public/javascript/app/route.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/public/javascript/dashboard/layout.js b/src/public/javascript/dashboard/layout.js
index e0941aa6605eebd45fefb675c2dedc1adabeb13e..bc717f2dbe0a0d70d86a89f24ec43d108ffbd588 100644
--- a/src/public/javascript/dashboard/layout.js
+++ b/src/public/javascript/dashboard/layout.js
@@ -1,64 +1,131 @@
-"use strict";
-
 import { showSuccessToast } from "../toast.mjs";
+const handleDashboard = () => {
+  "use strict";
 
-// Get DOM elements
-const dashboardLink = document.getElementById("dashboard-link");
-const episodeLink = document.getElementById("episode-link");
-const dashboardSection = document.getElementById("dashboard-section");
 
-const overlayEl = document.getElementById("overlay-layout");
-const choosePodcastButtonEl = document.getElementById("choose-podcast-btn");
-const podcastChoicesEl = document.getElementById("podcast-choices");
+  // Get DOM elements
+  const dashboardLink = document.getElementById("dashboard-link");
+  const episodeLink = document.getElementById("episode-link");
+  const dashboardSection = document.getElementById("dashboard-section");
 
-const urls = window.location.href.split("?")[0].split("/");
-let lastURL = urls[urls.length - 1];
+  const overlayEl = document.getElementById("overlay-layout");
+  const choosePodcastButtonEl = document.getElementById("choose-podcast-btn");
+  const podcastChoicesEl = document.getElementById("podcast-choices");
 
-let idPodcast = new URLSearchParams(window.location.search).get("id_podcast");
-let page = new URLSearchParams(window.location.search).get("page");
-let podcasts = [];
+  const urls = window.location.href.split("?")[0].split("/");
+  let lastURL = urls[urls.length - 1];
 
-// Initial request to fetch user podcasts
-const xhr = new XMLHttpRequest();
-xhr.open("GET", "/public/dashboard/user-podcast");
-xhr.send(null);
+  let idPodcast = new URLSearchParams(window.location.search).get("id_podcast");
+  let page = new URLSearchParams(window.location.search).get("page");
+  let podcasts = [];
 
-xhr.onreadystatechange = () => {
-  if (xhr.readyState === 4 && xhr.status === 200) {
-    const resJson = JSON.parse(xhr.response);
+  // Initial request to fetch user podcasts
+  const xhr = new XMLHttpRequest();
+  xhr.open("GET", "/public/dashboard/user-podcast");
+  xhr.send(null);
 
-    podcasts = resJson?.podcasts;
-    // Redirect if the user doesnt have any podcast
-    if (podcasts.length === 0) {
-      window.location.replace("/public/dashboard/add-podcast");
-      return;
-    }
+  xhr.onreadystatechange = () => {
+    if (xhr.readyState === 4 && xhr.status === 200) {
+      const resJson = JSON.parse(xhr.response);
 
-    if (!idPodcast) {
-      idPodcast = podcasts[0].id_podcast;
-    }
+      podcasts = resJson?.podcasts;
+      // Redirect if the user doesnt have any podcast
+      if (podcasts.length === 0) {
+        window.location.replace("/public/dashboard/add-podcast");
+        return;
+      }
 
-    if (lastURL === "dashboard") {
-      lastURL = "main";
-    }
+      if (!idPodcast) {
+        idPodcast = podcasts[0].id_podcast;
+      }
+
+      if (lastURL === "dashboard") {
+        lastURL = "main";
+      }
+
+      if (lastURL === "main") {
+        dashboardLink.classList.add("nav-active");
+      } else {
+        episodeLink.classList.add("nav-active");
+      }
 
-    if (lastURL === "main") {
-      dashboardLink.classList.add("nav-active");
-    } else {
-      episodeLink.classList.add("nav-active");
+      // Get main content
+      const xhr2 = new XMLHttpRequest();
+      xhr2.open(
+        "GET",
+        `/public/dashboard/internal/${lastURL}?id_podcast=${idPodcast}${
+          lastURL === "episode" ? `&page=${page || 1}` : ""
+        }`
+      );
+      xhr2.send(null);
+
+      xhr2.onreadystatechange = function () {
+        if (this.readyState === XMLHttpRequest.DONE) {
+          dashboardSection.innerHTML = this.response;
+
+          const deleteEpisodeButtonEl = document.querySelectorAll(
+            ".delete-episode-btn"
+          );
+          Array.from(deleteEpisodeButtonEl).forEach((el) => {
+            el.addEventListener("click", (e) => {
+              e.preventDefault();
+
+              handleDeleteEpisode(el.dataset.id);
+            });
+          });
+
+          const allEpisodeButtonEl = document.getElementById("all-episode-btn");
+          allEpisodeButtonEl &&
+            allEpisodeButtonEl.addEventListener("click", changeToEpisode);
+        }
+      };
+
+      history.pushState(
+        {},
+        "",
+        `/public/dashboard/${lastURL}?id_podcast=${idPodcast}${
+          lastURL === "episode" ? `&page=${page || 1}` : ""
+        }`
+      );
     }
+  };
 
-    // Get main content
-    const xhr2 = new XMLHttpRequest();
-    xhr2.open(
+  // Add event listeners to dashboard nav
+  episodeLink.addEventListener("click", changeToEpisode);
+  dashboardLink.addEventListener("click", changeToMain);
+
+  overlayEl.addEventListener("click", (e) => {
+    e.preventDefault();
+
+    podcastChoicesEl.classList.toggle("hidden");
+    overlayEl.classList.toggle("hidden");
+  });
+  choosePodcastButtonEl.addEventListener("click", (e) => {
+    e.preventDefault();
+
+    podcastChoicesEl.classList.toggle("hidden");
+    overlayEl.classList.toggle("hidden");
+  });
+
+  // Handles change to episode page
+  function changeToEpisode() {
+    history.pushState(
+      {},
+      "",
+      `http://localhost:8080/public/dashboard/episode?id_podcast=${idPodcast}&page=1`
+    );
+
+    dashboardLink.classList.toggle("nav-active");
+    episodeLink.classList.toggle("nav-active");
+
+    const xhr = new XMLHttpRequest();
+    xhr.open(
       "GET",
-      `/public/dashboard/internal/${lastURL}?id_podcast=${idPodcast}${
-        lastURL === "episode" ? `&page=${page || 1}` : ""
-      }`
+      `/public/dashboard/internal/episode?id_podcast=${idPodcast}&page=1`
     );
-    xhr2.send(null);
+    xhr.send(null);
 
-    xhr2.onreadystatechange = function () {
+    xhr.onreadystatechange = function () {
       if (this.readyState === XMLHttpRequest.DONE) {
         dashboardSection.innerHTML = this.response;
 
@@ -72,139 +139,74 @@ xhr.onreadystatechange = () => {
             handleDeleteEpisode(el.dataset.id);
           });
         });
-
-        const allEpisodeButtonEl = document.getElementById("all-episode-btn");
-        allEpisodeButtonEl &&
-          allEpisodeButtonEl.addEventListener("click", changeToEpisode);
       }
     };
+  }
 
+  // Handles change to main page
+  function changeToMain() {
     history.pushState(
       {},
       "",
-      `/public/dashboard/${lastURL}?id_podcast=${idPodcast}${
-        lastURL === "episode" ? `&page=${page || 1}` : ""
-      }`
+      `http://localhost:8080/public/dashboard/main?id_podcast=${idPodcast}`
     );
-  }
-};
-
-// Add event listeners to dashboard nav
-episodeLink.addEventListener("click", changeToEpisode);
-dashboardLink.addEventListener("click", changeToMain);
-
-overlayEl.addEventListener("click", (e) => {
-  e.preventDefault();
-
-  podcastChoicesEl.classList.toggle("hidden");
-  overlayEl.classList.toggle("hidden");
-});
-choosePodcastButtonEl.addEventListener("click", (e) => {
-  e.preventDefault();
 
-  podcastChoicesEl.classList.toggle("hidden");
-  overlayEl.classList.toggle("hidden");
-});
+    dashboardLink.classList.toggle("nav-active");
+    episodeLink.classList.toggle("nav-active");
 
-// Handles change to episode page
-function changeToEpisode() {
-  history.pushState(
-    {},
-    "",
-    `http://localhost:8080/public/dashboard/episode?id_podcast=${idPodcast}&page=1`
-  );
+    const xhr1 = new XMLHttpRequest();
+    xhr1.open("GET", `/public/dashboard/internal/main?id_podcast=${idPodcast}`);
+    xhr1.send(null);
 
-  dashboardLink.classList.toggle("nav-active");
-  episodeLink.classList.toggle("nav-active");
-
-  const xhr = new XMLHttpRequest();
-  xhr.open(
-    "GET",
-    `/public/dashboard/internal/episode?id_podcast=${idPodcast}&page=1`
-  );
-  xhr.send(null);
-
-  xhr.onreadystatechange = function () {
-    if (this.readyState === XMLHttpRequest.DONE) {
-      dashboardSection.innerHTML = this.response;
+    xhr1.onreadystatechange = function () {
+      if (this.readyState === XMLHttpRequest.DONE) {
+        dashboardSection.innerHTML = this.response;
 
-      const deleteEpisodeButtonEl = document.querySelectorAll(
-        ".delete-episode-btn"
-      );
-      Array.from(deleteEpisodeButtonEl).forEach((el) => {
-        el.addEventListener("click", (e) => {
-          e.preventDefault();
+        const allEpisodeButtonEl = document.getElementById("all-episode-btn");
+        allEpisodeButtonEl &&
+          allEpisodeButtonEl.addEventListener("click", changeToEpisode);
+      }
+    };
+  }
 
-          handleDeleteEpisode(el.dataset.id);
-        });
-      });
-    }
-  };
-}
-
-// Handles change to main page
-function changeToMain() {
-  history.pushState(
-    {},
-    "",
-    `http://localhost:8080/public/dashboard/main?id_podcast=${idPodcast}`
-  );
-
-  dashboardLink.classList.toggle("nav-active");
-  episodeLink.classList.toggle("nav-active");
-
-  const xhr1 = new XMLHttpRequest();
-  xhr1.open("GET", `/public/dashboard/internal/main?id_podcast=${idPodcast}`);
-  xhr1.send(null);
-
-  xhr1.onreadystatechange = function () {
-    if (this.readyState === XMLHttpRequest.DONE) {
-      dashboardSection.innerHTML = this.response;
-
-      const allEpisodeButtonEl = document.getElementById("all-episode-btn");
-      allEpisodeButtonEl &&
-        allEpisodeButtonEl.addEventListener("click", changeToEpisode);
+  // Handle delete episode
+  function handleDeleteEpisode(idEpisode) {
+    if (confirm("Are you sure?") === false) {
+      return;
     }
-  };
-}
 
-// Handle delete episode
-function handleDeleteEpisode(idEpisode) {
-  if (confirm("Are you sure?") === false) {
-    return;
-  }
+    const xhr1 = new XMLHttpRequest();
+    xhr1.open("DELETE", `/public/dashboard/episode?id_episode=${idEpisode}`);
+    xhr1.send(null);
 
-  const xhr1 = new XMLHttpRequest();
-  xhr1.open("DELETE", `/public/dashboard/episode?id_episode=${idEpisode}`);
-  xhr1.send(null);
+    xhr1.onreadystatechange = function () {
+      if (xhr1.readyState === 4 && xhr1.status === 200) {
+        showSuccessToast("Episode deleted successfully!");
 
-  xhr1.onreadystatechange = function () {
-    if (xhr1.readyState === 4 && xhr1.status === 200) {
-      showSuccessToast("Episode deleted successfully!");
+        const xhr2 = new XMLHttpRequest();
+        xhr2.open(
+          "GET",
+          `/public/dashboard/internal/episode?id_podcast=${idPodcast}&page=1`
+        );
+        xhr2.send(null);
 
-      const xhr2 = new XMLHttpRequest();
-      xhr2.open(
-        "GET",
-        `/public/dashboard/internal/episode?id_podcast=${idPodcast}&page=1`
-      );
-      xhr2.send(null);
+        xhr2.onreadystatechange = function () {
+          if (this.readyState === XMLHttpRequest.DONE) {
+            dashboardSection.innerHTML = this.response;
 
-      xhr2.onreadystatechange = function () {
-        if (this.readyState === XMLHttpRequest.DONE) {
-          dashboardSection.innerHTML = this.response;
+            const deleteEpisodeButtonEl = document.querySelectorAll(
+              ".delete-episode-btn"
+            );
+            Array.from(deleteEpisodeButtonEl).forEach((el) => {
+              el.addEventListener("click", (e) => {
+                e.preventDefault();
 
-          const deleteEpisodeButtonEl = document.querySelectorAll(
-            ".delete-episode-btn"
-          );
-          Array.from(deleteEpisodeButtonEl).forEach((el) => {
-            el.addEventListener("click", (e) => {
-              e.preventDefault();
-
-              handleDeleteEpisode(el.dataset.id);
+                handleDeleteEpisode(el.dataset.id);
+              });
             });
-          });
-        }
-      };
-    }
-  };
-}
+          }
+        };
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/src/public/javascript/search/search.js b/src/public/javascript/search/search.js
index c55e6c97d00dfcf3d37720bc6ca936a57ae04fc7..a4859bf6688b11d89716bef56aff4568185848ed 100644
--- a/src/public/javascript/search/search.js
+++ b/src/public/javascript/search/search.js
@@ -1,153 +1,165 @@
-const searchInput = document.getElementById('search-input');
-const resultContainer = document.querySelector('.result-container');
-
-const genreDisplay = document.querySelector('.genre-display');
-const genreOptions = document.querySelectorAll('.genre-option');
-const genreButton = document.querySelector('.genre-button');
-const genreContent = document.querySelector('.genre-content');
-
-const epsDisplay = document.querySelector('.eps-display');
-const epsOptions = document.querySelectorAll('.eps-option');
-const epsButton = document.querySelector('.eps-button');
-const epsContent = document.querySelector('.eps-content');
-
-const sortDisplay = document.querySelector('.sort-display');
-const sortOptions = document.querySelectorAll('.sort-option');
-const sortButton = document.querySelector('.sort-button');
-const sortContent = document.querySelector('.sort-content');
-
-
-console.log(epsDisplay);
-
-var keyword = "";
-var genre = "";
-var sort = "";
-var eps = "";
-var isAsc = "true";
-
-searchInput && 
-    searchInput.addEventListener(
-        "keyup",
-        debounce(()=> {
-            keyword = searchInput.value;
+const handleSearch = () => {
+
+    const searchInput = document.getElementById('search-input');
+    const resultContainer = document.querySelector('.result-container');
+
+    const genreDisplay = document.querySelector('.genre-display');
+    const genreOptions = document.querySelectorAll('.genre-option');
+    const genreButton = document.querySelector('.genre-button');
+    const genreContent = document.querySelector('.genre-content');
+
+    const epsDisplay = document.querySelector('.eps-display');
+    const epsOptions = document.querySelectorAll('.eps-option');
+    const epsButton = document.querySelector('.eps-button');
+    const epsContent = document.querySelector('.eps-content');
+
+    const sortDisplay = document.querySelector('.sort-display');
+    const sortOptions = document.querySelectorAll('.sort-option');
+    const sortButton = document.querySelector('.sort-button');
+    const sortContent = document.querySelector('.sort-content');
+
+
+    const defaultGenre = "";
+    const defaultEps = "";
+    const defaultSort = "";
+    const defaultIsAsc = "true";
+    
+    var keyword = "";
+    var genre = defaultGenre;
+    var sort = defaultSort;
+    var eps = defaultEps;
+    var isAsc = defaultIsAsc;
+
+    searchInput && 
+        searchInput.addEventListener(
+            "keyup",
+            debounce(()=> {
+                keyword = searchInput.value;
+                const ajax = new XMLHttpRequest();
+
+                ajax.onreadystatechange = () => {
+                    if(ajax.readyState == 4 && ajax.status == 200) {
+                        resultContainer.innerHTML = ajax.responseText;
+                        console.log("ajax amsterdam");
+                    }
+                }
+
+                ajax.open('GET', 
+                `/public/components/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
+                ajax.send();
+                
+            }, DEBOUNCE_TIMEOUT)
+            );
+            
+            // FILTER BY GENRE
+            genreButton.addEventListener('click', function() {
+                genreContent.style.display = "block";
+            })
+
+            genreOptions.forEach(option => {
+                option.addEventListener('click', function() {
+                // Get the selected genre value
+                const selectedGenre = option.innerHTML;
+                
+                // Update the button text with the selected genre
+                genreDisplay.textContent = selectedGenre;
+                if (selectedGenre === "All genre") {
+                    genre = "";
+                } else {
+                    genre = selectedGenre;
+                }
+                const ajax = new XMLHttpRequest();
+
+                ajax.onreadystatechange = () => {
+                    if(ajax.readyState == 4 && ajax.status == 200) {
+                        resultContainer.innerHTML = ajax.responseText;
+                    }
+                }
+                
+                ajax.open('GET', 
+                `/public/components/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
+                ajax.send();
+
+                genreContent.style.display = "none";
+            });
+    });
+
+
+
+    // FILTER BY EPS
+    epsOptions.forEach(option => {
+        option.addEventListener('click', function() {
+            // Get the selected eps value
+            const selectedEps = option.innerHTML;
+            
+            // Update the button text with the selected eps
+            epsDisplay.textContent = selectedEps;
+            
+            if (selectedEps === "All eps") {
+                eps = "";
+            } else {
+                eps = selectedEps;
+            }
             const ajax = new XMLHttpRequest();
 
             ajax.onreadystatechange = () => {
                 if(ajax.readyState == 4 && ajax.status == 200) {
                     resultContainer.innerHTML = ajax.responseText;
-                    console.log("ajax amsterdam");
                 }
             }
-
+            
             ajax.open('GET', 
-            `/public/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
+            `/public/components/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
             ajax.send();
 
-        }, DEBOUNCE_TIMEOUT)
-);
-
-
-genreOptions.forEach(option => {
-    option.addEventListener('click', function() {
-        // Get the selected genre value
-        const selectedGenre = option.innerHTML;
-        
-        // Update the button text with the selected genre
-        genreDisplay.textContent = selectedGenre;
-        
-        
-        genre = selectedGenre;
-        const ajax = new XMLHttpRequest();
-
-        ajax.onreadystatechange = () => {
-            if(ajax.readyState == 4 && ajax.status == 200) {
-                resultContainer.innerHTML = ajax.responseText;
-            }
-        }
-        
-        ajax.open('GET', 
-        `/public/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
-        ajax.send();
-
-        genreContent.style.display = "none";
+            epsContent.style.display = "none";
+        });
     });
-});
-
-genreButton.addEventListener('click', function() {
-    genreContent.style.display = "block";
-})
-
-
-// FILTER BY EPS
-epsOptions.forEach(option => {
-    option.addEventListener('click', function() {
-        // Get the selected eps value
-        const selectedEps = option.innerHTML;
-        
-        // Update the button text with the selected eps
-        epsDisplay.textContent = selectedEps;
-        
-        
-        eps = selectedEps;
-        const ajax = new XMLHttpRequest();
-
-        ajax.onreadystatechange = () => {
-            if(ajax.readyState == 4 && ajax.status == 200) {
-                resultContainer.innerHTML = ajax.responseText;
+
+    epsButton.addEventListener('click', function() {
+        epsContent.style.display = "block";
+    })
+
+    // FILTER BY EPS
+    sortOptions.forEach(option => {
+        option.addEventListener('click', function() {
+            // Get the selected sort value
+            const selectedSort = option.innerHTML;
+            
+            // Update the button text with the selected sort
+            sortDisplay.textContent = selectedSort;
+            
+            
+            sort = selectedSort;
+            const ajax = new XMLHttpRequest();
+
+            ajax.onreadystatechange = () => {
+                if(ajax.readyState == 4 && ajax.status == 200) {
+                    resultContainer.innerHTML = ajax.responseText;
+                }
             }
-        }
-        
-        ajax.open('GET', 
-        `/public/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
-        ajax.send();
+            
+            ajax.open('GET', 
+            `/public/components/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
+            ajax.send();
 
-        epsContent.style.display = "none";
+            sortContent.style.display = "none";
+        });
     });
-});
-
-epsButton.addEventListener('click', function() {
-    epsContent.style.display = "block";
-})
-
-// FILTER BY EPS
-sortOptions.forEach(option => {
-    option.addEventListener('click', function() {
-        // Get the selected sort value
-        const selectedSort = option.innerHTML;
-        
-        // Update the button text with the selected sort
-        sortDisplay.textContent = selectedSort;
-        
-        
-        sort = selectedSort;
-        const ajax = new XMLHttpRequest();
-
-        ajax.onreadystatechange = () => {
-            if(ajax.readyState == 4 && ajax.status == 200) {
-                resultContainer.innerHTML = ajax.responseText;
-            }
-        }
-        
-        ajax.open('GET', 
-        `/public/search?keyword=${keyword}&genre=${genre}&eps=${eps}&sort=${sort}&isAsc=${isAsc}`, true);
-        ajax.send();
 
-        sortContent.style.display = "none";
+    sortButton.addEventListener('click', function() {
+        sortContent.style.display = "block";
+    })
+
+    window.addEventListener('click', function(e) { 
+        if (!genreButton.contains(e.target)){
+            genreContent.style.display = "none";
+        }
+        if (!epsButton.contains(e.target)){
+            epsContent.style.display = "none";
+        }
+        if (!sortButton.contains(e.target)){
+            sortContent.style.display = "none";
+        }
     });
-});
-
-sortButton.addEventListener('click', function() {
-    sortContent.style.display = "block";
-})
-
-window.addEventListener('click', function(e) { 
-    if (!genreButton.contains(e.target)){
-        genreContent.style.display = "none";
-    }
-    if (!epsButton.contains(e.target)){
-        epsContent.style.display = "none";
-    }
-    if (!sortButton.contains(e.target)){
-        sortContent.style.display = "none";
-    }
-});
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/public/styles/globals.css b/src/public/styles/globals.css
index d14cfb890ec8fcdc7851c4ca4bca9fef0989974b..303883faeba1392aa20ca485f3b5775cd9e9026e 100644
--- a/src/public/styles/globals.css
+++ b/src/public/styles/globals.css
@@ -37,17 +37,19 @@ body {
   color: white;
   padding: 0;
   margin: 0;
-  display: flex;
   font-family: "DM Sans", sans-serif;
+  height: 100vh;
+  overflow-y: hidden;
 }
+
 main {
   min-width: 0;
-  flex: auto;
-  overflow-y: scroll;
-  width: 100%;
+  width: fit-content;
   background-color: var(--BLACK);
-  padding: 0 auto;
+  width: 100%;
+  overflow-y: auto;
 }
+
 button {
   all: unset;
 }
@@ -167,8 +169,7 @@ h6 {
 }
 
 /* Navigation Bar */
-.sidebar {
-  overflow-y: hidden;
+aside {
   display: flex;
   flex-direction: column;
   align-items: center;
@@ -181,14 +182,14 @@ h6 {
   flex-grow: 1;
 }
 
-.sidebar-container {
+aside .sidebar-container {
   display: flex;
   flex-direction: column;
   max-width: 194px;
   gap: 16px;
 }
 
-.sidebar-item {
+aside .sidebar-item {
   display: flex;
   align-items: center;
   gap: 8px;
@@ -197,6 +198,7 @@ h6 {
   padding-top: 4px;
   padding-bottom: 4px;
   border-radius: 20px;
+  cursor:pointer;
 }
 
 /* Bottom Bar and Audio Player */
diff --git a/src/public/styles/home/Home.css b/src/public/styles/home/Home.css
index 502c146c6461832bc0e894f2a1ea3dc5cb621d2f..5fdd9122f2b95b2d781af0e6b9b093dbddecf466 100644
--- a/src/public/styles/home/Home.css
+++ b/src/public/styles/home/Home.css
@@ -1,4 +1,12 @@
-.main-content {
+.comedy-content {
     display: flex;
+    flex-direction: column;
     padding: 100px 100px;
+}
+
+.podcast-list {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+    justify-content: space-between;
 }
\ No newline at end of file
diff --git a/src/public/styles/search/search.css b/src/public/styles/search/search.css
index 6a99a0eee5e6100860f2dbf86c93a84e6736a7f8..fb307e6fa2b9b13d7ebb4896aaeb909d610d8699 100644
--- a/src/public/styles/search/search.css
+++ b/src/public/styles/search/search.css
@@ -2,13 +2,13 @@
 navbar {
     position: fixed;
     display: flex;
+    flex-direction: row;
     gap: 24px;
-    margin-left: 256px;
     background-color: var(--BLACK);
     top: 0;
-    width: 100%; 
     height: 78px;
     align-items: center;
+    width: 100%;
 }
 
 /* Search Bar */
@@ -84,7 +84,6 @@ navbar .dropbtn {
 
 /* result */
 .result-container {
-    width: 100%;
     display: flex;
     margin-top: 150px;
     justify-content: center;