Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ backend/pom.xml	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -117,4 +117,9 @@
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
 
     </dependencies>
Index: backend/src/main/java/com/tradingmk/backend/BackendApplication.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/BackendApplication.java	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ backend/src/main/java/com/tradingmk/backend/BackendApplication.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -7,8 +7,10 @@
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 
 @SpringBootApplication
+@EnableScheduling
 public class BackendApplication {
 
Index: backend/src/main/java/com/tradingmk/backend/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/config/SecurityConfig.java	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ backend/src/main/java/com/tradingmk/backend/config/SecurityConfig.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -33,5 +33,5 @@
                         "/topic/**",
                         "/api/history/upload",
-                        "/api/history/{symbol}","/api/trades/**","/api/auth/link/confirm")
+                        "/api/history/{symbol}","/api/trades/**","/api/auth/link/confirm","/api/watchlist/**")
                 .permitAll()
                 .anyRequest()
Index: backend/src/main/java/com/tradingmk/backend/controller/WatchlistController.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/controller/WatchlistController.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/controller/WatchlistController.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,41 @@
+package com.tradingmk.backend.controller;
+
+
+import com.tradingmk.backend.dto.WatchlistRequest;
+import com.tradingmk.backend.model.Stock;
+import com.tradingmk.backend.model.User;
+import com.tradingmk.backend.model.WatchlistEntry;
+import com.tradingmk.backend.service.StockService;
+import com.tradingmk.backend.service.UserService;
+import com.tradingmk.backend.service.WatchlistService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/watchlist")
+@RequiredArgsConstructor
+public class WatchlistController {
+
+    private final WatchlistService watchlistService;
+    private final StockService stockService;
+
+    @GetMapping
+    public List<WatchlistEntry> getWatchlist(@AuthenticationPrincipal User user) {
+        return watchlistService.getUserWatchlist(user);
+    }
+
+    @PostMapping
+    public WatchlistEntry addToWatchlist(@RequestBody WatchlistRequest request,
+                                         @AuthenticationPrincipal User user) {
+        Stock stock = stockService.getBySymbol(request.getSymbol());
+        return watchlistService.addToWatchlist(user, stock, request.getPriceAbove(), request.getPriceBelow());
+    }
+
+    @DeleteMapping("/{id}")
+    public void removeFromWatchlist(@PathVariable Long id) {
+        watchlistService.removeFromWatchlist(id);
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/demo/TestEmailController.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/demo/TestEmailController.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/demo/TestEmailController.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,36 @@
+package com.tradingmk.backend.demo;
+import com.tradingmk.backend.model.Stock;
+import com.tradingmk.backend.model.User;
+import com.tradingmk.backend.model.WatchlistEntry;
+import com.tradingmk.backend.service.WatchlistAlertService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequiredArgsConstructor
+public class TestEmailController {
+
+    private final WatchlistAlertService alertService;
+
+    @GetMapping("/send-test-alert")
+    public String sendTestAlert() {
+
+        User user = new User();
+        user.setEmail("");
+
+        Stock stock = new Stock();
+        stock.setSymbol("MPT");
+        stock.setCurrentPrice(120.5);
+
+
+        WatchlistEntry entry = new WatchlistEntry();
+        entry.setUser(user);
+        entry.setStock(stock);
+        entry.setPriceBelow(150.0);
+
+        alertService.sendEmail(entry, "TEST ALERT: Stock " + stock.getSymbol() + " is now " + stock.getCurrentPrice());
+
+        return "Test alert sent to " + user.getEmail();
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/dto/WatchlistRequest.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/dto/WatchlistRequest.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/dto/WatchlistRequest.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,36 @@
+package com.tradingmk.backend.dto;
+
+import lombok.Data;
+
+@Data
+public class WatchlistRequest {
+    private String symbol;
+    private Double priceAbove;
+    private Double priceBelow;
+
+
+
+    public String getSymbol() {
+        return symbol;
+    }
+
+    public void setSymbol(String symbol) {
+        this.symbol = symbol;
+    }
+
+    public Double getPriceAbove() {
+        return priceAbove;
+    }
+
+    public void setPriceAbove(Double priceAbove) {
+        this.priceAbove = priceAbove;
+    }
+
+    public Double getPriceBelow() {
+        return priceBelow;
+    }
+
+    public void setPriceBelow(Double priceBelow) {
+        this.priceBelow = priceBelow;
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/model/WatchlistEntry.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/model/WatchlistEntry.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/model/WatchlistEntry.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,37 @@
+package com.tradingmk.backend.model;
+
+
+import com.tradingmk.backend.service.UserService;
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Entity
+@Table(name = "watchlist")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class WatchlistEntry {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne
+    @JoinColumn(name = "user_id")
+    private User user;
+
+    @ManyToOne
+    @JoinColumn(name = "stock_id")
+    private Stock stock;
+
+    private Double priceAbove;
+    private Double priceBelow;
+
+
+
+
+}
Index: backend/src/main/java/com/tradingmk/backend/repository/WatchlistRepository.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/repository/WatchlistRepository.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/repository/WatchlistRepository.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,11 @@
+package com.tradingmk.backend.repository;
+
+import com.tradingmk.backend.model.User;
+import com.tradingmk.backend.model.WatchlistEntry;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface WatchlistRepository extends JpaRepository<WatchlistEntry,Long> {
+    List<WatchlistEntry> findByUser(User user);
+}
Index: backend/src/main/java/com/tradingmk/backend/service/StockService.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/service/StockService.java	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ backend/src/main/java/com/tradingmk/backend/service/StockService.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -45,3 +45,10 @@
         }
     }
+
+    public Stock getBySymbol(String symbol) {
+        return stockRepository.findBySymbol(symbol)
+                .orElseThrow(() -> new RuntimeException("Stock not found with symbol: " + symbol));
+    }
+
+
 }
Index: backend/src/main/java/com/tradingmk/backend/service/WatchlistAlertService.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/service/WatchlistAlertService.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/service/WatchlistAlertService.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,45 @@
+package com.tradingmk.backend.service;
+
+import com.tradingmk.backend.model.WatchlistEntry;
+import com.tradingmk.backend.repository.WatchlistRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class WatchlistAlertService {
+
+    private final WatchlistRepository repository;
+    private final JavaMailSender mailSender;
+
+    @Scheduled(fixedRate = 60000) // 60s
+    public void checkWatchlist() {
+        List<WatchlistEntry> entries = repository.findAll();
+
+        for (WatchlistEntry entry : entries) {
+            double currentPrice = entry.getStock().getCurrentPrice();
+
+            if (entry.getPriceBelow() != null && currentPrice < entry.getPriceBelow()) {
+                sendEmail(entry, "Price below alert! Current price: " + currentPrice);
+            }
+
+            if (entry.getPriceAbove() != null && currentPrice > entry.getPriceAbove()) {
+                sendEmail(entry, "Price above alert! Current price: " + currentPrice);
+            }
+        }
+    }
+
+    public void sendEmail(WatchlistEntry entry, String message) {
+        SimpleMailMessage mail = new SimpleMailMessage();
+        mail.setFrom("tradingmkalerts@gmail.com");
+        mail.setTo(entry.getUser().getEmail());
+        mail.setSubject("Stock Alert: " + entry.getStock().getSymbol());
+        mail.setText(message);
+        mailSender.send(mail);
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/service/WatchlistService.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/service/WatchlistService.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
+++ backend/src/main/java/com/tradingmk/backend/service/WatchlistService.java	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -0,0 +1,35 @@
+package com.tradingmk.backend.service;
+
+import com.tradingmk.backend.model.Stock;
+import com.tradingmk.backend.model.User;
+import com.tradingmk.backend.model.WatchlistEntry;
+import com.tradingmk.backend.repository.StockRepository;
+import com.tradingmk.backend.repository.UserRepository;
+import com.tradingmk.backend.repository.WatchlistRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class WatchlistService {
+    private final WatchlistRepository watchlistRepository;
+
+    public List<WatchlistEntry> getUserWatchlist(User user){
+        return watchlistRepository.findByUser(user);
+    }
+
+    public WatchlistEntry addToWatchlist(User user, Stock stock, Double priceAbove, Double priceBelow) {
+        WatchlistEntry w = new WatchlistEntry();
+        w.setUser(user);
+        w.setStock(stock);
+        w.setPriceAbove(priceAbove);
+        w.setPriceBelow(priceBelow);
+        return watchlistRepository.save(w);
+    }
+
+    public void removeFromWatchlist(Long id){
+        watchlistRepository.deleteById(id);
+    }
+}
Index: frontend/package-lock.json
===================================================================
--- frontend/package-lock.json	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ frontend/package-lock.json	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -12,4 +12,5 @@
         "@stomp/stompjs": "^7.1.1",
         "@tailwindcss/vite": "^4.1.10",
+        "axios": "^1.12.2",
         "jwt-decode": "^4.0.0",
         "lucide-react": "^0.516.0",
@@ -1805,4 +1806,10 @@
       "license": "Python-2.0"
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "license": "MIT"
+    },
     "node_modules/autoprefixer": {
       "version": "10.4.21",
@@ -1843,4 +1850,15 @@
       }
     },
+    "node_modules/axios": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz",
+      "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.4",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
@@ -1908,4 +1926,17 @@
       }
     },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/callsites": {
       "version": "3.1.0",
@@ -1994,4 +2025,16 @@
       "license": "MIT"
     },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
@@ -2204,4 +2247,13 @@
       "license": "MIT"
     },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/detect-libc": {
       "version": "2.0.4",
@@ -2223,4 +2275,18 @@
       }
     },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/electron-to-chromium": {
       "version": "1.5.169",
@@ -2241,4 +2307,49 @@
       "engines": {
         "node": ">=10.13.0"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
@@ -2686,4 +2797,40 @@
       "license": "ISC"
     },
+    "node_modules/follow-redirects": {
+      "version": "1.15.11",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+      "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+      "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
+        "hasown": "^2.0.2",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/fraction.js": {
       "version": "4.3.7",
@@ -2714,4 +2861,13 @@
       }
     },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/gensync": {
       "version": "1.0.0-beta.2",
@@ -2724,4 +2880,41 @@
       }
     },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/glob-parent": {
       "version": "6.0.2",
@@ -2748,4 +2941,16 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
@@ -2764,4 +2969,43 @@
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
@@ -3264,4 +3508,34 @@
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
       }
     },
@@ -3552,4 +3826,10 @@
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
       "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "license": "MIT"
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
       "license": "MIT"
     },
Index: frontend/package.json
===================================================================
--- frontend/package.json	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ frontend/package.json	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -14,4 +14,5 @@
     "@stomp/stompjs": "^7.1.1",
     "@tailwindcss/vite": "^4.1.10",
+    "axios": "^1.12.2",
     "jwt-decode": "^4.0.0",
     "lucide-react": "^0.516.0",
Index: frontend/src/main.jsx
===================================================================
--- frontend/src/main.jsx	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ frontend/src/main.jsx	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -17,4 +17,5 @@
 import AdminTrades from "./pages/AdminTrades/AdminTrades.jsx";
 import {GoogleOAuthProvider} from "@react-oauth/google";
+import Watchlist from "./pages/Watchlist/Watchlist.jsx";
 
 
@@ -34,4 +35,5 @@
                     <Route path="/settings" element={<Settings />} />
                     <Route path="/admin" element={<AdminTrades />} />
+                    <Route path="/watchlist" element={<Watchlist />} />
                 </Routes>
             </BrowserRouter>
Index: frontend/src/pages/DetailedStockView/DetailedStockView.jsx
===================================================================
--- frontend/src/pages/DetailedStockView/DetailedStockView.jsx	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ frontend/src/pages/DetailedStockView/DetailedStockView.jsx	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -17,4 +17,9 @@
 
     const [portfolio, setPortfolio] = useState(null);
+
+    const [showWatchlistPopup, setShowWatchlistPopup] = useState(false);
+    const [priceAbove, setPriceAbove] = useState("");
+    const [priceBelow, setPriceBelow] = useState("");
+    const [selectedStockId, setSelectedStockId] = useState(null);
 
 
@@ -180,4 +185,38 @@
     }}, []);
 
+    const handleAddToWatchlist = async () => {
+        const token = localStorage.getItem("accessToken");
+        console.log("Token:", token);
+        if (!token) {
+            alert("loggin to use watchlist");
+            return;
+        }
+
+        try {
+            await fetch("http://localhost:8080/api/watchlist", {
+                method: "POST",
+                headers: {
+                    "Content-Type": "application/json",
+                    "Authorization": `Bearer ${token}`
+                },
+                body: JSON.stringify({
+                    symbol: symbol,
+                    priceAbove: priceAbove ? parseFloat(priceAbove) : null,
+                    priceBelow: priceBelow ? parseFloat(priceBelow) : null
+                })
+            });
+
+            alert(`Stock ${symbol} added to watchlist!`);
+            setShowWatchlistPopup(false);
+            setPriceAbove("");
+            setPriceBelow("");
+        } catch (err) {
+            console.error(err);
+            alert("failed to add ");
+        }
+    };
+
+
+
     return (
         <div className="min-h-screen bg-white text-gray-900  mb-4">
@@ -324,4 +363,49 @@
                         </div>
                     </div>
+
+
+                    <button
+                        onClick={() => setShowWatchlistPopup(true)}
+                        className="w-full bg-yellow-400 text-white py-3 rounded-lg font-medium mb-4 mt-4"
+                    >
+                        Add to Watchlist
+                    </button>
+
+                    {showWatchlistPopup && (
+                        <div className="fixed inset-0 bg-black/30 flex items-center justify-center z-50">
+                            <div className="bg-white p-6 rounded-lg w-80">
+                                <h3 className="text-lg font-semibold mb-4">{symbol} - Set Alert Prices</h3>
+                                <input
+                                    type="number"
+                                    placeholder="Price Above"
+                                    className="w-full mb-2 p-2 border rounded"
+                                    value={priceAbove}
+                                    onChange={(e) => setPriceAbove(e.target.value)}
+                                />
+                                <input
+                                    type="number"
+                                    placeholder="Price Below"
+                                    className="w-full mb-4 p-2 border rounded"
+                                    value={priceBelow}
+                                    onChange={(e) => setPriceBelow(e.target.value)}
+                                />
+                                <div className="flex justify-end space-x-2">
+                                    <button
+                                        onClick={handleAddToWatchlist}
+                                        className="bg-green-500 text-white px-4 py-2 rounded"
+                                    >
+                                        Save
+                                    </button>
+                                    <button
+                                        onClick={() => setShowWatchlistPopup(false)}
+                                        className="bg-gray-300 text-gray-700 px-4 py-2 rounded"
+                                    >
+                                        Cancel
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    )}
+
                 </div>
             </div>
Index: frontend/src/pages/Signup-Login/LoginPage.jsx
===================================================================
--- frontend/src/pages/Signup-Login/LoginPage.jsx	(revision 81e3c796855e92b468fc28f1faa1eb27f86de864)
+++ frontend/src/pages/Signup-Login/LoginPage.jsx	(revision 87f89742277a011296be8f5e3396c25b20440259)
@@ -178,5 +178,5 @@
 
                 <div className="max-w-md mx-auto mt-10 p-6 bg-white rounded shadow text-center">
-                    <h2 className="text-2xl mb-4 font-semibold">Login with Google</h2>
+                    <h2 className="text-2xl mb-4 font-semibold">Log in / Sign in with Google</h2>
                     <GoogleLogin
                         onSuccess={handleGoogleLogin}
@@ -193,9 +193,9 @@
                     <div className="bg-white rounded-2xl shadow-xl p-8 w-full max-w-md animate-fadeIn">
                         <h3 className="text-xl font-semibold text-gray-800 mb-4">
-                            Поврзување со постоечки акаунт
+                            Linking with an existing account
                         </h3>
                         <p className="text-gray-600 mb-6">
-                            Внесете го вашето <span className="font-medium">корисничко име</span> и
-                            <span className="font-medium"> лозинка</span> за да ги поврзете Google податоците.
+                          Enter your <span className="font-medium">username</span> and
+                          <span className="font-medium"> password</span> to link your Google account.
                         </p>
 
@@ -238,5 +238,5 @@
                     </div>
                 </div>
-            )}
+                )}
 
 
