diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4450c01a894a1f0f4f582edb67019753499d9332..c6a49b66d582222647faf3ed7a66cae71769b893 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,20 +1,28 @@
+image: node:alpine # Much smaller than other variants, faster and more resource effective
+
 stages:
-  - install
-  - build
+  - install_dependencies
+  - lint
+  - build_project
 
 cache:
+  key: "${CI_COMMIT_REF_SLUG}" # Branch-specific cache keys to have separate caches across branches.
   paths:
     - node_modules/
-  key: "$CI_BUILD_REF_NAME" # Separate cache for each branch
 
 install_dependencies:
-  stage: install
-  image: node:latest
+  stage: install_dependencies
   script:
     - npm install
 
+lint:
+  stage: lint
+  script:
+    - npm run lint
+  allow_failure: true  
+
 build_project:
-  stage: build
-  image: node:latest
+  stage: build_project
   script:
-    - npm run build
\ No newline at end of file
+    - npm run build
+
diff --git a/src/api/core/OpenAPI.ts b/src/api/core/OpenAPI.ts
index bae5eb773e38a6fa187a68f3ac9f3dbecc88eaf5..213c15d4a7b840e8d13a35f74c2618c13b7c9398 100644
--- a/src/api/core/OpenAPI.ts
+++ b/src/api/core/OpenAPI.ts
@@ -21,7 +21,7 @@ export type OpenAPIConfig = {
 
 export const OpenAPI: OpenAPIConfig = {
     BASE: 'http://localhost:8080',
-    VERSION: '0',
+    VERSION: '3.0',
     WITH_CREDENTIALS: false,
     CREDENTIALS: 'include',
     TOKEN: undefined,
diff --git a/src/api/index.ts b/src/api/index.ts
index 7bfbd7a82dcdde4a855e2ee242508c2268633a83..2a974f1dd456ed118f2caf5c190038eb3cfa7c3f 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -6,3 +6,10 @@ export { ApiError } from './core/ApiError';
 export { CancelablePromise, CancelError } from './core/CancelablePromise';
 export { OpenAPI } from './core/OpenAPI';
 export type { OpenAPIConfig } from './core/OpenAPI';
+
+export type { AuthenticationResponse } from './models/AuthenticationResponse';
+export type { ExceptionResponse } from './models/ExceptionResponse';
+export type { LoginRequest } from './models/LoginRequest';
+export type { SignUpRequest } from './models/SignUpRequest';
+
+export { AuthenticationService } from './services/AuthenticationService';
diff --git a/src/api/models/AuthenticationResponse.ts b/src/api/models/AuthenticationResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47169ae37b90b20523c9be17ff5da7c2b15bcd4a
--- /dev/null
+++ b/src/api/models/AuthenticationResponse.ts
@@ -0,0 +1,11 @@
+/* generated using openapi-typescript-codegen -- do not edit */
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+export type AuthenticationResponse = {
+    firstName?: string;
+    lastName?: string;
+    role?: string;
+    token?: string;
+};
+
diff --git a/src/api/models/ExceptionResponse.ts b/src/api/models/ExceptionResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..12c0a7873d7d38f6782e970737603521971c9c81
--- /dev/null
+++ b/src/api/models/ExceptionResponse.ts
@@ -0,0 +1,9 @@
+/* generated using openapi-typescript-codegen -- do not edit */
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+export type ExceptionResponse = {
+    status?: number;
+    message?: string;
+};
+
diff --git a/src/api/models/LoginRequest.ts b/src/api/models/LoginRequest.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9c5def4f1a6a028911a9b4ca8a147fcc14f8015e
--- /dev/null
+++ b/src/api/models/LoginRequest.ts
@@ -0,0 +1,9 @@
+/* generated using openapi-typescript-codegen -- do not edit */
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+export type LoginRequest = {
+    email?: string;
+    password?: string;
+};
+
diff --git a/src/api/models/SignUpRequest.ts b/src/api/models/SignUpRequest.ts
new file mode 100644
index 0000000000000000000000000000000000000000..28a2e78a3a39e8ceb5f28567ebdf02d912017210
--- /dev/null
+++ b/src/api/models/SignUpRequest.ts
@@ -0,0 +1,14 @@
+/* generated using openapi-typescript-codegen -- do not edit */
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+export type SignUpRequest = {
+    firstName?: string;
+    lastName?: string;
+    email?: string;
+    password?: string;
+    changeWilling?: string;
+    experience?: string;
+    challenges?: Array<string>;
+};
+
diff --git a/src/api/services/AuthenticationService.ts b/src/api/services/AuthenticationService.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eae8fd5c8b2f6ef8d5cfaf6ed6976edcf0a386d4
--- /dev/null
+++ b/src/api/services/AuthenticationService.ts
@@ -0,0 +1,55 @@
+/* generated using openapi-typescript-codegen -- do not edit */
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+import type { AuthenticationResponse } from '../models/AuthenticationResponse';
+import type { LoginRequest } from '../models/LoginRequest';
+import type { SignUpRequest } from '../models/SignUpRequest';
+import type { CancelablePromise } from '../core/CancelablePromise';
+import { OpenAPI } from '../core/OpenAPI';
+import { request as __request } from '../core/request';
+export class AuthenticationService {
+    /**
+     * User Signup
+     * Sign up a new user
+     * @returns AuthenticationResponse Successfully signed up
+     * @throws ApiError
+     */
+    public static signup({
+        requestBody,
+    }: {
+        requestBody: SignUpRequest,
+    }): CancelablePromise<AuthenticationResponse> {
+        return __request(OpenAPI, {
+            method: 'POST',
+            url: '/api/auth/signup',
+            body: requestBody,
+            mediaType: 'application/json',
+            errors: {
+                409: `Email already exists`,
+            },
+        });
+    }
+    /**
+     * User Login
+     * Log in with an existing user
+     * @returns AuthenticationResponse Successfully logged in
+     * @throws ApiError
+     */
+    public static login({
+        requestBody,
+    }: {
+        requestBody: LoginRequest,
+    }): CancelablePromise<AuthenticationResponse> {
+        return __request(OpenAPI, {
+            method: 'POST',
+            url: '/api/auth/login',
+            body: requestBody,
+            mediaType: 'application/json',
+            errors: {
+                401: `Invalid credentials`,
+                404: `User not found`,
+            },
+        });
+    }
+}
diff --git a/src/assets/icons/dollar.png b/src/assets/icons/dollar.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed7c58b29cd15ec18e850a5b7c463e883d5f3972
Binary files /dev/null and b/src/assets/icons/dollar.png differ
diff --git a/src/assets/icons/fire.png b/src/assets/icons/fire.png
new file mode 100644
index 0000000000000000000000000000000000000000..248d2434e1b7712b097ed38ef585596704e455e6
Binary files /dev/null and b/src/assets/icons/fire.png differ
diff --git a/src/components/BaseComponents/Menu.vue b/src/components/BaseComponents/Menu.vue
index bdb9038ed5a584844ac0698ae5599c81ae6b1c23..1edc325513c43ee7c2373874f229f42bfd07033c 100644
--- a/src/components/BaseComponents/Menu.vue
+++ b/src/components/BaseComponents/Menu.vue
@@ -45,7 +45,6 @@
                         </ul>
                     </li>
                 </ul>
-
             </div>
         </div>
     </nav>
@@ -83,8 +82,9 @@ function toFeedback() {
     router.push('/feedback')
 }
 
-function toUserProfile() {
-    router.push('/news')
+
+function toUserProfile(){
+  router.push('/profile')
 }
 
 
diff --git a/src/components/UserProfile/UserProfileLayout.vue b/src/components/UserProfile/UserProfileLayout.vue
new file mode 100644
index 0000000000000000000000000000000000000000..494e5aea08ee567575c8e4a430612dfbc64e4246
--- /dev/null
+++ b/src/components/UserProfile/UserProfileLayout.vue
@@ -0,0 +1,57 @@
+<script setup lang="ts">
+
+import Menu from "@/components/BaseComponents/Menu.vue";
+import Footer from "@/components/BaseComponents/Footer.vue";
+
+let points = 0;
+let streak = 0;
+</script>
+
+<template>
+  <Menu></Menu>
+    <div class="container text-center">
+    <div class="row">
+      <div class="col">
+        <img src="/src/assets/userprofile.png" class="img-fluid">
+        <p class="h2">Username</p>
+        <p><a class="link-dark" href="#">Edit profile</a></p>
+      </div>
+    </div>
+      <div class="row">
+        <div class="col">
+          <img src="/src/assets/icons/fire.png" class="img-fluid" style="width: 30px; height: 30px" alt="dollar">
+          <p>Streak: 10</p>
+        </div>
+      </div>
+      <div class="row">
+      <div class="col-12">
+        <img src="/src/assets/icons/dollar.png" class="img-fluid" style="width: 30px; height: 30px" alt="dollar">
+        <p class="">Points: 2000 </p>
+      </div>
+      </div>
+
+    <div class="row">
+      <div class="col">
+        total points earned
+      </div>
+      <div class="col">
+        total badges earned
+      </div>
+    </div>
+    <div class="row">
+      <div class="col">
+        History
+      </div>
+    </div>
+    <div class="row">
+      <div class="col">
+        Your Badges
+      </div>
+    </div>
+  </div>
+  <Footer></Footer>
+</template>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/router/index.ts b/src/router/index.ts
index bb108c321747b1b696a2d530d0fb618fd3d020d8..9cefc38dae5ff578c87d750d62a137fa88122e5f 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -2,8 +2,10 @@
 import { createRouter, createWebHistory } from 'vue-router';
 import LoginView from '../views/Authentication/LoginView.vue';
 import { useUserInfoStore } from '@/stores/UserStore';
+import UserProfileView from "@/views/User/UserProfileView.vue";
 import SignUp from '@/components/SignUp/SignUp.vue'
 
+
 const routes = [
   {
     path: '/',
@@ -69,6 +71,11 @@ const routes = [
     name: 'login',
     component: LoginView,
   },
+  {
+    path: '/profile',
+    name: 'profile',
+    component: UserProfileView
+  },
   {
     path: '/sign-up',
     name: 'sign up',
diff --git a/src/views/User/UserProfileView.vue b/src/views/User/UserProfileView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..85e9882866797433edfa76cc3fbf4368796432cf
--- /dev/null
+++ b/src/views/User/UserProfileView.vue
@@ -0,0 +1,12 @@
+<script setup lang="ts">
+
+import UserProfileLayout from "@/components/UserProfile/UserProfileLayout.vue";
+</script>
+
+<template>
+<UserProfileLayout></UserProfileLayout>
+</template>
+
+<style scoped>
+
+</style>
\ No newline at end of file