+
+
+
{account.displayName ?? account.jid}
+ {account.displayName && (
+
{account.jid}
+ )}
+
+
+ {account.status === 'ACTIVE' ? 'Connected' : 'Awaiting scan'}
+
+
+
+ {isDisconnected && qrDataUrl && (
+
+
+ Open WhatsApp → Linked Devices → Link a Device → scan below
+
+

+
+ )}
+
+ {isDisconnected && !qrDataUrl && (
+
Waiting for QR code from worker...
+ )}
+
+ );
+}
diff --git a/apps/web/app/accounts/page.tsx b/apps/web/app/accounts/page.tsx
new file mode 100644
index 0000000..61c375d
--- /dev/null
+++ b/apps/web/app/accounts/page.tsx
@@ -0,0 +1,33 @@
+import { AccountCard } from './AccountCard';
+
+interface Account {
+ id: string;
+ jid: string;
+ displayName: string | null;
+ status: string;
+ platform: string;
+}
+
+export default async function AccountsPage() {
+ const apiUrl = process.env.API_URL ?? 'http://localhost:3001';
+ let accounts: Account[] = [];
+ try {
+ const res = await fetch(`${apiUrl}/accounts`, { cache: 'no-store' });
+ if (res.ok) accounts = await res.json();
+ } catch {}
+
+ return (
+