Index: .idea/.gitignore
===================================================================
--- .idea/.gitignore	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/.gitignore	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
Index: .idea/compiler.xml
===================================================================
--- .idea/compiler.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/compiler.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
+      <profile name="Annotation profile for backend" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <processorPath useClasspath="false">
+          <entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.42/lombok-1.18.42.jar" />
+        </processorPath>
+        <module name="backend" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="backend" options="-parameters" />
+    </option>
+  </component>
+</project>
Index: .idea/copilot.data.migration.ask2agent.xml
===================================================================
--- .idea/copilot.data.migration.ask2agent.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/copilot.data.migration.ask2agent.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Ask2AgentMigrationStateService">
+    <option name="migrationStatus" value="COMPLETED" />
+  </component>
+</project>
Index: .idea/encodings.xml
===================================================================
--- .idea/encodings.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/encodings.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/backend/src/main/java" charset="UTF-8" />
+  </component>
+</project>
Index: .idea/inspectionProfiles/Project_Default.xml
===================================================================
--- .idea/inspectionProfiles/Project_Default.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/inspectionProfiles/Project_Default.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,7 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
+  </profile>
+</component>
Index: .idea/jarRepositories.xml
===================================================================
--- .idea/jarRepositories.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/jarRepositories.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>
Index: .idea/misc.xml
===================================================================
--- .idea/misc.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/misc.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/backend/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_22" default="true" project-jdk-name="22" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>
Index: .idea/modules.xml
===================================================================
--- .idea/modules.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/modules.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/trekr.iml" filepath="$PROJECT_DIR$/.idea/trekr.iml" />
+    </modules>
+  </component>
+</project>
Index: .idea/trekr.iml
===================================================================
--- .idea/trekr.iml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/trekr.iml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
Index: .idea/vcs.xml
===================================================================
--- .idea/vcs.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
+++ .idea/vcs.xml	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
Index: backend/src/main/java/com/trekr/backend/BackendApplication.java
===================================================================
--- backend/src/main/java/com/trekr/backend/BackendApplication.java	(revision c4c43f36be9f46e4a3e8aaf7198b6db598eb6d5d)
+++ backend/src/main/java/com/trekr/backend/BackendApplication.java	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -4,4 +4,8 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 @SpringBootApplication
@@ -60,10 +64,15 @@
         for (String[] candidate : candidates) {
             try {
+                Path envPath = Paths.get(candidate[0], candidate[1]).normalize();
+                if (!Files.isRegularFile(envPath)) {
+                    continue;
+                }
+
                 Dotenv loaded = Dotenv.configure()
-                        .directory(candidate[0])
-                        .filename(candidate[1])
+                        .directory(envPath.getParent().toString())
+                        .filename(envPath.getFileName().toString())
                         .ignoreIfMissing()
                         .load();
-                if (loaded != null && !loaded.entries().isEmpty()) {
+                if (loaded != null) {
                     dotenv = loaded;
                     break;
Index: db-scripts/ddl.sql
===================================================================
--- db-scripts/ddl.sql	(revision c4c43f36be9f46e4a3e8aaf7198b6db598eb6d5d)
+++ db-scripts/ddl.sql	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -21,6 +21,6 @@
 CREATE TABLE USERS (
     user_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
-    email TEXT NOT NULL,
-    username TEXT NOT NULL,
+    email TEXT NOT NULL UNIQUE,
+    username TEXT NOT NULL UNIQUE,
     password TEXT NOT NULL
 );
Index: db-scripts/dml.sql
===================================================================
--- db-scripts/dml.sql	(revision c4c43f36be9f46e4a3e8aaf7198b6db598eb6d5d)
+++ db-scripts/dml.sql	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -2,14 +2,14 @@
 
 INSERT INTO USERS (user_id, email, username, password) VALUES
-(1, 'dimitar@example.com', 'dimitar_arsov', '$2a$10$examplehash1'),
-(2, 'filip@example.com', 'filip_gavrilovski', '$2a$10$examplehash2'),
-(3, 'marko@example.com', 'marko_markovski', '$2a$10$examplehash3'),
+(1, 'dimitar@example.com', 'dimitar_arsov', '1234'),
+(2, 'filip@example.com', 'filip_gavrilovski', '1234'),
+(3, 'marko@example.com', 'marko_markovski', '1234'),
 (4, 'andrej.shumanovski@gmail.com', 'andrej_shumanovski', '1234'),
 (5, 'angelovski.mario222@gmail.com', 'angelovski_mario', '1234'),
-(6, 'ana@example.com', 'ana_ilievska', '$2a$10$examplehash6'),
-(7, 'petar@example.com', 'petar_stojanov', '$2a$10$examplehash7'),
-(8, 'elena@example.com', 'elena_ristova', '$2a$10$examplehash8'),
-(9, 'stefan@example.com', 'stefan_nikolov', '$2a$10$examplehash9'),
-(10, 'ivana@example.com', 'ivana_karapandzova', '$2a$10$examplehash10'),
+(6, 'ana@example.com', 'ana_ilievska', '1234'),
+(7, 'petar@example.com', 'petar_stojanov', '1234'),
+(8, 'elena@example.com', 'elena_ristova', '1234'),
+(9, 'stefan@example.com', 'stefan_nikolov', '1234'),
+(10, 'ivana@example.com', 'ivana_karapandzova', '1234'),
 (11, 'nikola@example.com', 'nikola_ivanov', '1234'),
 (12, 'marija@example.com', 'marija_petrova', '1234'),
@@ -193,28 +193,28 @@
 
 INSERT INTO TRAINING_SESSIONS (training_id, training_user_id, duration, calories, date, type) VALUES
-(1, 1, 60, 500, '2026-02-01', 'Running'),
-(2, 2, 45, 400, '2026-02-01', 'Cycling'),
-(3, 3, 30, 300, '2026-02-01', 'Swimming'),
-(4, 4, 50, 420, '2026-02-02', 'HIIT'),
-(5, 5, 40, 350, '2026-02-02', 'Strength'),
-(6, 6, 35, 280, '2026-02-02', 'Yoga'),
-(7, 7, 55, 520, '2026-02-03', 'Running'),
-(8, 8, 45, 390, '2026-02-03', 'Cycling'),
-(9, 9, 30, 260, '2026-02-03', 'Rowing'),
-(10, 10, 60, 480, '2026-02-04', 'Swimming'),
-(11, 11, 50, 430, '2026-02-05', 'Strength'),
-(12, 12, 40, 310, '2026-02-05', 'Yoga'),
-(13, 13, 60, 540, '2026-02-06', 'Running'),
-(14, 14, 35, 260, '2026-02-06', 'Pilates'),
-(15, 15, 45, 390, '2026-02-07', 'Cycling'),
-(16, 16, 55, 460, '2026-02-07', 'HIIT'),
-(17, 17, 30, 240, '2026-02-08', 'Rowing'),
-(18, 18, 65, 520, '2026-02-08', 'Swimming'),
-(19, 19, 50, 440, '2026-02-09', 'Running'),
-(20, 20, 45, 370, '2026-02-09', 'Strength'),
-(21, 11, 35, 300, '2026-02-12', 'Cycling'),
-(22, 13, 30, 260, '2026-02-12', 'Core'),
-(23, 15, 70, 600, '2026-02-13', 'Long Run'),
-(24, 17, 40, 320, '2026-02-13', 'Strength');
+(1, 1, 60, 500, '2026-02-01', 'running'),
+(2, 2, 45, 400, '2026-02-01', 'cycling'),
+(3, 3, 30, 300, '2026-02-01', 'swimming'),
+(4, 4, 50, 420, '2026-02-02', 'hiit'),
+(5, 5, 40, 350, '2026-02-02', 'strength'),
+(6, 6, 35, 280, '2026-02-02', 'yoga'),
+(7, 7, 55, 520, '2026-02-03', 'running'),
+(8, 8, 45, 390, '2026-02-03', 'cycling'),
+(9, 9, 30, 260, '2026-02-03', 'rowing'),
+(10, 10, 60, 480, '2026-02-04', 'swimming'),
+(11, 11, 50, 430, '2026-02-05', 'strength'),
+(12, 12, 40, 310, '2026-02-05', 'yoga'),
+(13, 13, 60, 540, '2026-02-06', 'running'),
+(14, 14, 35, 260, '2026-02-06', 'pilates'),
+(15, 15, 45, 390, '2026-02-07', 'cycling'),
+(16, 16, 55, 460, '2026-02-07', 'hiit'),
+(17, 17, 30, 240, '2026-02-08', 'rowing'),
+(18, 18, 65, 520, '2026-02-08', 'swimming'),
+(19, 19, 50, 440, '2026-02-09', 'running'),
+(20, 20, 45, 370, '2026-02-09', 'strength'),
+(21, 11, 35, 300, '2026-02-12', 'cycling'),
+(22, 13, 30, 260, '2026-02-12', 'strength'),
+(23, 15, 70, 600, '2026-02-13', 'running'),
+(24, 17, 40, 320, '2026-02-13', 'strength');
 
 SELECT setval(
Index: frontend/src/pages/Register/Register.jsx
===================================================================
--- frontend/src/pages/Register/Register.jsx	(revision c4c43f36be9f46e4a3e8aaf7198b6db598eb6d5d)
+++ frontend/src/pages/Register/Register.jsx	(revision 37307aadda57d1e5b86180b9b2b8a6318ec36095)
@@ -21,9 +21,26 @@
     setError("");
     setIsSubmitting(true);
+
+    const normalizedEmail = email.trim().toLowerCase();
+    const normalizedUsername = username.trim();
+    const normalizedPassword = password;
+
+    if (normalizedUsername.length < 3 || normalizedUsername.length > 50) {
+      setError("Username must be between 3 and 50 characters");
+      setIsSubmitting(false);
+      return;
+    }
+
+    if (normalizedPassword.length < 6) {
+      setError("Password must be at least 6 characters");
+      setIsSubmitting(false);
+      return;
+    }
+
     try {
       const res = await api.post("/auth/register", {
-        email,
-        username,
-        password,
+        email: normalizedEmail,
+        username: normalizedUsername,
+        password: normalizedPassword,
       });
       localStorage.setItem("authToken", res.data.token);
@@ -38,7 +55,9 @@
       navigate("/dashboard");
     } catch (err) {
+      const fieldErrors = err?.response?.data?.errors ?? {};
+      const firstFieldError = Object.values(fieldErrors)[0];
       const message =
+        firstFieldError ||
         err?.response?.data?.message ||
-        Object.values(err?.response?.data?.errors ?? {})[0] ||
         "Registration failed";
       setError(message);
@@ -75,4 +94,6 @@
           onChange={(e) => setUsername(e.target.value)}
           autoComplete="username"
+          minLength={3}
+          maxLength={50}
           required
         />
@@ -86,4 +107,5 @@
           onChange={(e) => setPassword(e.target.value)}
           autoComplete="new-password"
+          minLength={6}
           required
         />
