"use client"; import { Gauge } from "lucide-react"; import { useRouter, useSearchParams } from "next/navigation"; import { Suspense, useState } from "react"; import { api, ApiError } from "@/lib/api"; import { Button, Field, Input } from "@/components/ui"; function LoginForm() { const router = useRouter(); const params = useSearchParams(); const [pw, setPw] = useState(""); const [err, setErr] = useState(null); const [busy, setBusy] = useState(false); async function submit(e: React.FormEvent) { e.preventDefault(); setBusy(true); setErr(null); try { await api("/api/auth/login", { method: "POST", json: { password: pw } }); const next = params.get("next"); router.replace(next && next.startsWith("/") ? next : "/"); } catch (e) { setErr(e instanceof ApiError ? e.message : "login failed"); } finally { setBusy(false); } } return (

ktrade

Kraken quantitative trading terminal — owner access

setPw(e.target.value)} required autoFocus /> {err &&

{err}

}

Sessions are HttpOnly cookies signed server-side. Live trading stays disabled regardless of login.

); } export default function LoginPage() { return (
); }