Make board explicitly deterministic

This commit is contained in:
matcha committed 2026-10-05 20:15:33 +00:00
1 parent 82c2035992
commit ded984e80c
1 file changed
+24 -48
+24 -48
View File
@@ -1,56 +1,32 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>notplanned</title>
<meta name="description" content="We build the features maintainers won't. A live scout board for rejected demand.">
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>notplanned radar</title>
<meta name="description" content="Deterministic radar for rejected demand in active open-source projects.">
<style>
:root{color-scheme:light dark;--bg:#f3f1eb;--fg:#111;--muted:#6d6a62;--line:#c9c5ba;--card:#faf8f2;--hot:#ff5a1f;--warm:#e29a16;--watch:#7c817a}
@media(prefers-color-scheme:dark){:root{--bg:#10100f;--fg:#f2efe7;--muted:#a7a299;--line:#393732;--card:#171715;--hot:#ff7540;--warm:#f0ad2f;--watch:#92988f}}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--fg);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono",monospace}a{color:inherit}.wrap{width:min(1180px,calc(100% - 36px));margin:0 auto}
header{min-height:76px;display:flex;align-items:center;justify-content:space-between;gap:20px;border-bottom:1px solid var(--line)}.brand{font-weight:850;letter-spacing:-.05em}.tiny{font-size:11px;color:var(--muted)}
.hero{padding:82px 0 58px;display:grid;grid-template-columns:1.4fr .6fr;gap:40px;align-items:end}h1{font-family:ui-sans-serif,system-ui,sans-serif;font-size:clamp(48px,8vw,96px);line-height:.88;letter-spacing:-.075em;margin:0}.dek{font-family:ui-sans-serif,system-ui,sans-serif;font-size:18px;line-height:1.45;color:var(--muted);max-width:470px;margin:0}
.stats{display:grid;grid-template-columns:repeat(3,1fr);border:1px solid var(--line);border-radius:16px;overflow:hidden;margin-bottom:58px}.stat{padding:18px 20px;border-right:1px solid var(--line)}.stat:last-child{border-right:0}.stat strong{display:block;font-family:ui-sans-serif,system-ui,sans-serif;font-size:25px;letter-spacing:-.04em}.stat span{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.section-head{display:flex;align-items:end;justify-content:space-between;gap:20px;margin:0 0 18px}.section-head h2{font-family:ui-sans-serif,system-ui,sans-serif;font-size:30px;letter-spacing:-.04em;margin:0}.section-head p{margin:0;color:var(--muted);font-size:12px;max-width:480px;text-align:right}
.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:70px}.card{display:flex;flex-direction:column;min-height:340px;background:var(--card);border:1px solid var(--line);border-radius:18px;padding:22px;text-decoration:none;transition:transform .12s ease,border-color .12s ease}.card:hover{transform:translateY(-2px);border-color:var(--fg)}
.topline{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:22px}.repo{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.heat{font-size:10px;text-transform:uppercase;letter-spacing:.11em;border:1px solid currentColor;border-radius:999px;padding:5px 8px}.heat.hot{color:var(--hot)}.heat.warm{color:var(--warm)}.heat.watch{color:var(--watch)}
.card h3{font-family:ui-sans-serif,system-ui,sans-serif;font-size:25px;line-height:1.03;letter-spacing:-.04em;margin:0 0 9px}.issue-title{font-size:12px;color:var(--muted);margin-bottom:22px}.thesis{font-family:ui-sans-serif,system-ui,sans-serif;font-size:15px;line-height:1.45;margin:0 0 22px}
.kv{margin-top:auto;border-top:1px solid var(--line)}.row{display:grid;grid-template-columns:70px 1fr;gap:12px;padding:9px 0;border-bottom:1px solid var(--line);font-size:11px;line-height:1.45}.row:last-child{border-bottom:0}.key{color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.go{font-weight:700}
.fresh{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:72px}.fresh-card{border:1px dashed var(--line);border-radius:16px;padding:18px;text-decoration:none;min-height:190px}.fresh-card:hover{border-style:solid}.fresh-card h4{font-family:ui-sans-serif,system-ui,sans-serif;font-size:17px;line-height:1.12;margin:10px 0}.fresh-meta{font-size:10px;color:var(--muted)}.fresh-move{font-size:12px;line-height:1.45;margin-top:15px}
.loop{display:flex;flex-wrap:wrap;gap:10px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:24px 0;margin-bottom:50px;font-size:12px}.loop span:not(:last-child)::after{content:"→";margin-left:10px;color:var(--muted)}
footer{display:flex;justify-content:space-between;gap:24px;color:var(--muted);font-size:11px;padding-bottom:36px}
@media(max-width:850px){.hero{grid-template-columns:1fr}.grid{grid-template-columns:1fr}.fresh{grid-template-columns:1fr 1fr}.section-head{align-items:start;flex-direction:column}.section-head p{text-align:left}.stats{grid-template-columns:1fr}.stat{border-right:0;border-bottom:1px solid var(--line)}.stat:last-child{border-bottom:0}}
@media(max-width:560px){.fresh{grid-template-columns:1fr}.hero{padding-top:58px}footer{flex-direction:column}}
:root{color-scheme:light dark;--bg:#f3f1eb;--fg:#111;--muted:#6c6961;--line:#cbc7bc;--card:#faf8f2;--accent:#ff5a1f}
@media(prefers-color-scheme:dark){:root{--bg:#10100f;--fg:#f2efe7;--muted:#a6a198;--line:#393732;--card:#171715;--accent:#ff7540}}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--fg);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono",monospace}a{color:inherit}.wrap{width:min(1180px,calc(100% - 36px));margin:auto}
header{height:76px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}.brand{font-weight:900;letter-spacing:-.05em}.tiny{font-size:11px;color:var(--muted)}
.hero{padding:80px 0 52px;display:grid;grid-template-columns:1.35fr .65fr;gap:42px;align-items:end}h1{font-family:ui-sans-serif,system-ui,sans-serif;font-size:clamp(50px,8vw,98px);line-height:.88;letter-spacing:-.075em;margin:0}.dek{font-family:ui-sans-serif,system-ui,sans-serif;color:var(--muted);font-size:18px;line-height:1.45;margin:0}
.stats{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line);border-radius:16px;overflow:hidden;margin-bottom:54px}.stat{padding:17px 18px;border-right:1px solid var(--line)}.stat:last-child{border:0}.stat strong{display:block;font-family:ui-sans-serif,system-ui,sans-serif;font-size:24px}.stat span{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.note{border-left:3px solid var(--accent);padding:0 0 0 16px;color:var(--muted);font-size:12px;line-height:1.55;margin-bottom:24px}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:64px}.card{display:flex;flex-direction:column;min-height:255px;background:var(--card);border:1px solid var(--line);border-radius:18px;padding:21px;text-decoration:none;transition:.12s ease}.card:hover{transform:translateY(-2px);border-color:var(--fg)}.topline{display:flex;justify-content:space-between;gap:12px;margin-bottom:20px}.repo,.meta,.why{font-size:11px;color:var(--muted)}.score{min-width:34px;height:34px;border:1px solid var(--accent);border-radius:50%;display:grid;place-items:center;color:var(--accent);font-weight:800}.card h3{font-family:ui-sans-serif,system-ui,sans-serif;font-size:22px;line-height:1.08;letter-spacing:-.035em;margin:0 0 8px}.move{font-family:ui-sans-serif,system-ui,sans-serif;font-size:15px;line-height:1.4;margin:20px 0 auto}.why{border-top:1px solid var(--line);padding-top:12px;margin-top:18px}.empty{border:1px dashed var(--line);padding:28px;border-radius:16px;color:var(--muted)}
footer{border-top:1px solid var(--line);padding:24px 0 36px;display:flex;justify-content:space-between;gap:20px;color:var(--muted);font-size:11px}
@media(max-width:820px){.hero{grid-template-columns:1fr}.grid{grid-template-columns:1fr}.stats{grid-template-columns:1fr 1fr}.stat:nth-child(2){border-right:0}.stat:nth-child(-n+2){border-bottom:1px solid var(--line)}}
@media(max-width:520px){.stats{grid-template-columns:1fr}.stat{border-right:0!important;border-bottom:1px solid var(--line)!important}.stat:last-child{border-bottom:0!important}}
</style>
</head>
<body>
<div class="wrap">
<header><div class="brand">notplanned</div><div class="tiny">scout board · a yolopreneur game</div></header>
<section class="hero">
<h1>build what fell off the roadmap.</h1>
<p class="dek">GitHub is full of real demand hiding in <strong>not planned</strong>, <strong>out of scope</strong>, <strong>stale</strong>, and <strong>won't fix</strong>. Scout the friction. Build the smallest external move. Let reality decide whether it gets another pull.</p>
</section>
<body><div class="wrap">
<header><div class="brand">notplanned</div><div class="tiny">deterministic opportunity radar</div></header>
<section class="hero"><h1>rejected demand,<br>ranked.</h1><p class="dek">No agent in the loop. GitHub issues go in; explicit rules score rejection, recency, engagement, repository activity, and externalizability; the highest-scoring candidates come out.</p></section>
<section class="stats">
<div class="stat"><strong>__CURATED_COUNT__</strong><span>scout-reviewed plays</span></div>
<div class="stat"><strong>__FRESH_COUNT__</strong><span>fresh machine finds</span></div>
<div class="stat"><strong>__UPDATED__</strong><span>last scout pass · UTC</span></div>
<div class="stat"><strong>__COUNT__</strong><span>candidates</span></div>
<div class="stat"><strong>__REPOS__</strong><span>watched repos</span></div>
<div class="stat"><strong>__THRESHOLD__</strong><span>minimum score</span></div>
<div class="stat"><strong>__UPDATED__</strong><span>last run · UTC</span></div>
</section>
<div class="section-head">
<h2>plays</h2>
<p>Human/agent scout-reviewed. Each card includes a thesis and the smallest move that could falsify it.</p>
</div>
<section class="grid">__CURATED_CARDS__</section>
<div class="section-head">
<h2>fresh finds</h2>
<p>Auto-surfaced from recently closed <code>not_planned</code> GitHub issues in watched repos. These are leads, not endorsements.</p>
</div>
<section class="fresh">__FRESH_CARDS__</section>
<div class="loop"><span>watch hot repos</span><span>find rejected demand</span><span>score friction + recency</span><span>scout judgment</span><span>smallest move</span><span>reality selects</span></div>
<footer><span>notplanned · we build the features maintainers won't</span><span>auto-scout refreshes every 6h</span></footer>
</div>
</body>
</html>
<div class="note">The score is intentionally mechanical, not “AI judgment.” It is a radar, not an oracle. Clicking a card goes to the source issue; the suggested product shape is selected by fixed keyword rules.</div>
<section class="grid">__CARDS__</section>
<footer><span>notplanned · deterministic radar</span><span>refreshes every 6h</span></footer>
</div></body></html>