diff --git a/.tmp/dashboard-real.png b/.tmp/dashboard-real.png
new file mode 100644
index 0000000..ff3c0cb
Binary files /dev/null and b/.tmp/dashboard-real.png differ
diff --git a/.tmp/dashboard.png b/.tmp/dashboard.png
new file mode 100644
index 0000000..96a37ca
Binary files /dev/null and b/.tmp/dashboard.png differ
diff --git a/.tmp/job3-nocss.png b/.tmp/job3-nocss.png
new file mode 100644
index 0000000..e60f638
Binary files /dev/null and b/.tmp/job3-nocss.png differ
diff --git a/.tmp/jobs.png b/.tmp/jobs.png
new file mode 100644
index 0000000..f14523d
Binary files /dev/null and b/.tmp/jobs.png differ
diff --git a/.tmp/machines.png b/.tmp/machines.png
new file mode 100644
index 0000000..3c8cc50
Binary files /dev/null and b/.tmp/machines.png differ
diff --git a/.tmp/settings.png b/.tmp/settings.png
new file mode 100644
index 0000000..872e900
Binary files /dev/null and b/.tmp/settings.png differ
diff --git a/.tmp/sshkeys.png b/.tmp/sshkeys.png
new file mode 100644
index 0000000..ec614a1
Binary files /dev/null and b/.tmp/sshkeys.png differ
diff --git a/.tmp/syncpairs.png b/.tmp/syncpairs.png
new file mode 100644
index 0000000..cbfd3b1
Binary files /dev/null and b/.tmp/syncpairs.png differ
diff --git a/web/index.html b/web/index.html
index f7e9539..dec7385 100644
--- a/web/index.html
+++ b/web/index.html
@@ -3,6 +3,7 @@
+
SyncServer
diff --git a/web/src/pages/Dashboard.tsx b/web/src/pages/Dashboard.tsx
index 152214b..71476f4 100644
--- a/web/src/pages/Dashboard.tsx
+++ b/web/src/pages/Dashboard.tsx
@@ -1,7 +1,7 @@
import { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { Server, Activity, HardDrive, Clock, Plus } from 'lucide-react';
-import { api, Machine, Job } from '../api/client';
+import { api, Machine, Job, SyncPair } from '../api/client';
import { Badge } from '@/components/ui/Badge';
import { Button } from '@/components/ui/Button';
import { Card, CardBody } from '@/components/ui/Card';
@@ -15,21 +15,26 @@ import { formatRelativeTime } from '@/lib/utils';
export default function Dashboard() {
const [machines, setMachines] = useState([]);
const [jobs, setJobs] = useState([]);
+ const [pairs, setPairs] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
Promise.all([
api('/api/machines'),
api('/api/jobs?limit=5'),
+ api('/api/sync-pairs'),
])
- .then(([m, j]) => {
+ .then(([m, j, p]) => {
setMachines(m);
setJobs(j);
+ setPairs(p);
})
.catch(() => {})
.finally(() => setLoading(false));
}, []);
+ const pairName = (id: number) => pairs.find(p => p.id === id)?.name ?? `Pair ${id}`;
+
const online = machines.filter(m => m.status.startsWith('online')).length;
const todayJobs = jobs.filter(j => {
if (!j.started_at) return false;
@@ -152,7 +157,7 @@ export default function Dashboard() {
- Pair {j.sync_pair_id}
+ {pairName(j.sync_pair_id)}
diff --git a/web/src/pages/SyncPairs.tsx b/web/src/pages/SyncPairs.tsx
index c52601e..d21f398 100644
--- a/web/src/pages/SyncPairs.tsx
+++ b/web/src/pages/SyncPairs.tsx
@@ -26,7 +26,7 @@ import {
import { EmptyState } from '@/components/ui/EmptyState';
import { Badge } from '@/components/ui/Badge';
import { Card } from '@/components/ui/Card';
-import { Play, Trash2, Plus, GitCompare, ArrowRight, ArrowLeft } from 'lucide-react';
+import { Play, Trash2, Plus, GitCompare, ArrowRight, ArrowLeft, Pencil } from 'lucide-react';
import { toast } from 'sonner';
import { cn } from '@/lib/utils';
@@ -242,6 +242,15 @@ export default function SyncPairs() {
+