<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Evolve Dashboard</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
margin: 0;
padding: 2rem;
background: #0a0a0a;
color: #e0e0e0;
}
h1 { color: #0A84FF; margin-bottom: 2rem; }
.card {
background: #151515;
border: 1px solid #2a2a2a;
border-radius: 8px;
padding: 1rem 1.5rem;
margin-bottom: 1rem;
}
.card-title { font-weight: 600; color: #0A84FF; margin-bottom: 0.25rem; }
.card-meta { color: #808080; font-size: 0.85rem; }
.empty { color: #808080; font-style: italic; }
button {
background: #0A84FF;
color: white;
border: none;
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
margin-top: 1rem;
}
button:hover { background: #3399ff; }
pre { overflow-x: auto; background: #0a0a0a; padding: 0.5rem; border-radius: 4px; }
</style>
</head>
<body>
<h1>Evolve</h1>
<div id="app">Loading...</div>
<script>
async function refresh() {
const app = document.getElementById("app");
try {
const res = await fetch("/api/projects");
const projects = await res.json();
if (!projects.length) {
app.innerHTML = '<p class="empty">No projects registered. Run <code>evolve init <adapter></code> in a repo to get started.</p>';
return;
}
app.innerHTML = projects.map(p => `
<div class="card">
<div class="card-title">${p.name}</div>
<div class="card-meta">${p.adapter_id} · ${p.root_path}</div>
<div class="card-meta">Created ${new Date(p.created_at).toLocaleString()}</div>
<div class="card-meta">Champion config: ${p.champion_config_id ?? '—'}</div>
</div>
`).join('');
} catch (e) {
app.innerHTML = `<p class="empty">Failed to load: ${e.message}</p>`;
}
}
refresh();
setInterval(refresh, 5000);
</script>
</body>
</html>