diff --git a/README.md b/README.md
index 6e882bd1b67778927f26bf69a1c7af05b758fcc4..d686cfbeb6d1fdcaa7d77b762d9b4a64dd9ff2b7 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,11 @@ Aplikasi Kuchenk Guide adalah sebuah aplikasi web yang dibangun menggunakan PHP
 1. Install PHP dari file situs resmi https://www.php.net/downloads.php
 2. Download MySQL dan setup config yang tepat di config.php
 
+# Jika menggunakan docker
+1. Pastikan docker sudah terpasang pada perangkat anda
+2. Buka terminal dan arahkan pada direktori utama proyek ini
+3. Jalankan perintah `docker compose up -d`
+4. Buka browser dan arahkan ke address `localhost:8081`
 
 # Cara menjalankan server
 1. Ganti file config.php dengan konfigurasi tepat anda.
@@ -37,6 +42,8 @@ Cats: 13521123
 Sightings: 13521105
 Users: 13521123
 
+setup docker: 13521105
+
 # Bonus: Light house
 
 ## Page Home (/)
diff --git a/migrations/migrate.sql b/migrations/migrate.sql
index 1658a3baf073b22149c82ecc7e77f7726e0e0d14..f1820ecfb504d3d9f5b4f21fc4c9c822422dd7dc 100644
--- a/migrations/migrate.sql
+++ b/migrations/migrate.sql
@@ -5,12 +5,12 @@ CREATE TABLE users (
     nama VARCHAR(255),
     username VARCHAR(255) UNIQUE NOT NULL,
     password VARCHAR(255) NOT NULL,
-    email VARCHAR(255),
+    email VARCHAR(255) UNIQUE NOT NULL,
     isAdmin tinyint(1) NOT NULL DEFAULT '0',
     registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 );
 INSERT INTO users (user_id, nama, username, password, email, isAdmin) VALUES
-(1,'ujang','unjanx','p','p',1);
+(1,'ujang','unjanx','p','p@gmail.com',1);
 
 
 drop table if exists cats;
diff --git a/public/css/login.css b/public/css/login.css
index 6bf0a0c65c75ca226ae9004123b0437f787c2bd0..8fc86cc108f8e82a2fc629d183223bbddcc720b9 100644
--- a/public/css/login.css
+++ b/public/css/login.css
@@ -8,13 +8,14 @@
             margin: 0;
         }
 
-        .login-container {
+        .login-container, .register-container {
             background-color: #fff;
             box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
             border-radius: 5px;
             padding: 70px;
             margin: 20px;
             width: 350px;
+            text-align: center;
         }
 
         .login-logo {
@@ -26,23 +27,23 @@
             max-width: 150px;
         }
 
-        .login-title {
+        .login-title, .register-title {
             text-align: center;
             font-size: 24px;
             margin-bottom: 20px;
         }
 
-        .login-form {
+        .login-form, .register-form {
             text-align: center;
         }
 
-        .login-label {
+        .login-label, .register-label {
             font-size: 16px;
             display: block;
             margin-bottom: 5px;
         }
 
-        .login-input {
+        .login-input, .register-input {
             width: 100%;
             height: 40px;
             border: 1px solid #ccc;
@@ -50,7 +51,7 @@
             font-size: 16px;
         }
 
-        .login-button {
+        .login-button, .register-button {
             background-color: #007bff;
             color: #fff;
             padding: 10px 20px;
@@ -61,6 +62,6 @@
             transition: background-color 0.3s;
         }
 
-        .login-button:hover {
+        .login-button:hover, .register-button:hover {
             background-color: #0056b3;
-        }
+        }
\ No newline at end of file
diff --git a/public/js/register.js b/public/js/register.js
index b2f8ffa490883e3c016314dc44c9daca831702b8..c0cf69255fe4ac5e3b9249bdab096f40fff7582c 100644
--- a/public/js/register.js
+++ b/public/js/register.js
@@ -3,15 +3,54 @@ const register = async function (e) {
 
     try {
         const username = document.getElementById("username").value;
+        const name = document.getElementById("name").value;
         const email = document.getElementById("email").value;
         const password = document.getElementById("password").value;
-        const profilePicture = document.getElementById("profilePicture").files[0];
+        const confPW = document.getElementById("confirm-password").value;
+        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+
+        let isError = false;
+
+        if (username===""){
+            document.getElementById("usernameError").textContent= "Invalid username";
+            isError=true;
+        } else {
+            document.getElementById("usernameError").textContent= "";
+        }
+        if (name===""){
+            document.getElementById("nameError").textContent= "Invalid name";
+            isError=true;
+        } else {
+            document.getElementById("usernameError").textContent= "";
+        }
+        if (!emailRegex.test(email)){
+            document.getElementById("emailError").textContent= "Invalid email";
+            isError=true;
+        } else {
+            document.getElementById("usernameError").textContent= "";
+        }
+        if (password===""){
+            document.getElementById("passwordError").textContent= "Invalid password";
+            isError=true;
+        } else {
+            document.getElementById("usernameError").textContent= "";
+        }
+        if (password!==confPW){
+            document.getElementById("confPassError").textContent= "confirm your password";
+            isError=true;
+        } else {
+            document.getElementById("usernameError").textContent= "";
+        }
+        if (isError){
+            return;
+        }
 
         const formData = new FormData();
         formData.append("username", username);
+        formData.append("name", name);
         formData.append("email", email);
         formData.append("password", password);
-        formData.append("profilePicture", profilePicture);
+        formData.append("confirm-password", confPW);
 
         const response = await fetch("/register", {
             method: "POST",
@@ -24,11 +63,16 @@ const register = async function (e) {
 
             if (result.success === true) {
                 alert("Registration success");
-                window.location.href = "/login.html"; // Redirect to the login page
+                window.location.href = "/login"; // Redirect to the login page
             } else {
                 alert("Registration failed");
             }
         } else {
+            const result = await response.json();
+            if (result["message"]==="Email already taken!"){
+                console.log(result["message"]);
+            }
+            window.alert(result["message"])
             console.log("Request failed");
         }
     } catch (error) {
@@ -37,4 +81,4 @@ const register = async function (e) {
 };
 
 // Menggunakan event submit pada form untuk menjalankan fungsi register
-document.getElementById("registerForm").addEventListener("submit", register);
+// document.getElementById("registerForm").addEventListener("submit", register);
diff --git a/public/view/login.php b/public/view/login.php
index 734fa5d570296b33d8892f77ee45a65af296eb87..caafa53fa28924ef1fc0dc3ed77ab32446478c29 100644
--- a/public/view/login.php
+++ b/public/view/login.php
@@ -22,6 +22,8 @@
             <input type="password" id="password" class="login-input" required><br><br>
             <button type="submit" class="login-button">Login</button>
         </form>
+        <p>Don't have an account?</p>
+        <a href="/register" class="link">register</a>
     </div>
 </body>
 
diff --git a/public/view/register.php b/public/view/register.php
index 77364e9ee074f5f6a86dae5789aea20ffc504b10..850ff1d88d26586c870e5f800465ca551d1f9b35 100644
--- a/public/view/register.php
+++ b/public/view/register.php
@@ -6,27 +6,43 @@
     <title>Register</title>
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <link rel="stylesheet" href="public/css/styles.css">
+    <link rel="stylesheet" href="public/css/login.css">
+    <script src="./public/js/register.js"></script>
 </head>
 
 <body>
-    <?php require_once(PROJECT_ROOT_PATH . '/public/components/Navbar.php'); ?>
-    <h1 id="registerTitle">Register</h1>
-    <form id="registerForm" enctype="multipart/form-data" method="POST" action="register.php">
-        <label for="username" id="usernameLabel">Username:</label>
-        <input type="text" id="username" name="username" required /><br /><br />
+<!--    --><?php //require_once(PROJECT_ROOT_PATH . '/public/components/Navbar.php'); ?>
+    <div class="register-container">
+        <div class="login-logo">
+            <img src="public/images/logo.jpeg" alt="Your Logo">
+        </div>
+        <h1 id="registerTitle" class="register-title">Register</h1>
+        <form id="registerForm" class="register-form">
+            <label for="username" id="usernameLabel" class="register-label">Username:</label>
+            <input type="text" id="username" name="username" class="register-input" required /><br /><br />
+            <span id="usernameError" class="error-message"></span><br><br>
 
-        <label for="email" id="emailLabel">Email:</label>
-        <input type="email" id="email" name="email" required /><br /><br />
+            <label for="name" id="nameLabel" class="register-label">Name:</label>
+            <input type="text" id="name" name="name" class="register-input" required /><br /><br />
+            <span id="nameError" class="error-message"></span><br><br>
 
-        <label for="password" id="passwordLabel">Password:</label>
-        <input type="password" id="password" name="password" required /><br /><br />
+            <label for="email" id="emailLabel" class="register-label">Email:</label>
+            <input type="email" id="email" name="email" class="register-input" required /><br /><br />
+            <span id="emailError" class="error-message"></span><br><br>
 
-        <label for="profilePicture" id="profilePictureLabel">Profile Picture:</label>
-        <input type="file" id="profilePicture" name="profilePicture" accept="image/*" required /><br /><br />
+            <label for="password" id="passwordLabel" class="register-label">Password:</label>
+            <input type="password" id="password" name="password" class="register-input" required /><br /><br />
+            <span id="passwordError" class="error-message"></span><br><br>
 
-        <button type="submit" id="registerButton">Register</button>
-    </form>
+            <label for="confirm-password" id="confirm-passwordLabel" class="register-label">Confirm Password:</label>
+            <input type="password" id="confirm-password" name="confirm-password" class="register-input" required /><br /><br />
+            <span id="confPassError" class="error-message"></span><br><br>
+
+            <button type="submit" id="registerButton" class="register-button" onclick="register(event)">Register</button>
+        </form>
+        <p>Already have an account?</p>
+        <a href="/login" class="link">log in</a>
+    </div>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/src/controllers/auth/RegisterController.php b/src/controllers/auth/RegisterController.php
index 1929e7b022aab53e06efbc0de9cb09ea3809bbfd..c05211749292644cf07c99c6dbd690eca7d86c58 100644
--- a/src/controllers/auth/RegisterController.php
+++ b/src/controllers/auth/RegisterController.php
@@ -22,6 +22,17 @@ class RegisterController extends BaseController
     return self::$instance;
   }
 
+  public function  get($urParams){
+      $phpFile = PROJECT_ROOT_PATH . "/public/view/register.php";
+
+      if (file_exists($phpFile)){
+          require $phpFile;
+          exit();
+      } else{
+          require PROJECT_ROOT_PATH . "/public/view/404.php";
+      }
+  }
+
   public function post($urlParams)
   {
     $name = $_POST["name"];
diff --git a/src/services/UserSrv.php b/src/services/UserSrv.php
index 8df1f819f2db90fe4717265f082c8819053239e7..5055c73704bd4a2889571352af1f10a8631f8979 100644
--- a/src/services/UserSrv.php
+++ b/src/services/UserSrv.php
@@ -44,6 +44,13 @@ class UserSrv extends BaseSrv
     if ($password !== $confirm_password) {
       throw new Exception("Password and confirm password do not match");
     }
+//    echo ("<script>console.log(".$username.")</script>");
+    $u=$this->getByUsername($username);
+//    echo is_null($u);
+    if (!is_null($u->get('username'))){
+//        echo $username;
+        throw new Exception("Username already taken!");
+    }
 
     $user = (new UserModel())->set('nama', $nama)->set('username', $username)->set('email', $email)->set('password', password_hash($password, PASSWORD_DEFAULT));
 
@@ -123,6 +130,15 @@ class UserSrv extends BaseSrv
     return $user;
   }
 
+  public function getByUsername($username){
+      $user = new UserModel();
+      $sqlRes = $this->repository->getByUsername($username);
+      if ($sqlRes) {
+          $user->constructFromArray($sqlRes);
+      }
+      return $user;
+  }
+
   public function updateUser($userId, $userData)
   {
     $existingUser = $this->getUserById($userId);