SIMON Master Console Rebuild
True command center for SIMON + WEB360
This rebuild gives you a cleaner production spine: interactive tree, live viewer, guarded editor, dynamic graphics, architecture map, and note storage. It is designed to sit beside your existing
console.php
and become the stronger replacement path.
Dashboard
Tree
Viewer
System Map
File Registry
Notes
Files
15,338
Folders
408
Scanned Size
3.84 GB
PHP Files
890
Editable Text Files
12,599
File viewer
guarded to /htdocs
/live/index_engine_dashboard.php
<?php declare(strict_types=1); ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"> <title>SIMON Feed Engine v2</title> <style> :root{--bg:#05041a;--panel:rgba(16,14,48,.78);--line:rgba(122,92,255,.25);--text:#eaf2ff;--muted:#9aa3c4;--cyan:#4be3ff;--vio:#7a5cff;--pink:#ff5bd1;--green:#7cff9e;--red:#ff6b8f;--amber:#ffb347;--radius:22px} *{box-sizing:border-box}body{margin:0;min-height:100vh;background:radial-gradient(circle at 20% 0%,rgba(75,227,255,.12),transparent 28%),radial-gradient(circle at 80% 0%,rgba(122,92,255,.16),transparent 30%),linear-gradient(180deg,#05041a,#08072a);color:var(--text);font:14px/1.45 system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif}body:before{content:"";position:fixed;inset:0;pointer-events:none;background:linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px);background-size:44px 44px;opacity:.28}.wrap{position:relative;z-index:1;max-width:1500px;margin:auto;padding:18px}.top{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:18px}.brand h1{margin:0;font-size:clamp(28px,4vw,58px);letter-spacing:.05em}.brand p{margin:6px 0 0;color:var(--muted)}.actions{display:flex;gap:10px;flex-wrap:wrap}.btn,input,select{border:1px solid var(--line);background:rgba(255,255,255,.055);color:var(--text);border-radius:999px;padding:11px 14px;text-decoration:none;min-height:42px}.btn{font-weight:800;cursor:pointer}.btn:hover{border-color:rgba(75,227,255,.5);box-shadow:0 0 24px rgba(75,227,255,.1)}.stats{display:grid;grid-template-columns:repeat(5,minmax(140px,1fr));gap:12px;margin-bottom:16px}.stat,.panel{border:1px solid var(--line);background:linear-gradient(180deg,rgba(16,14,48,.78),rgba(8,7,32,.84));border-radius:var(--radius);box-shadow:0 20px 70px rgba(0,0,0,.28);backdrop-filter:blur(16px)}.stat{padding:16px}.k{color:var(--muted);font-size:11px;letter-spacing:.12em;text-transform:uppercase}.v{font-size:34px;font-weight:950;margin-top:4px}.toolbar{display:flex;gap:10px;flex-wrap:wrap;margin:14px 0}.grid{display:grid;grid-template-columns:1fr 360px;gap:16px}.items{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}.card{position:relative;overflow:hidden;border:1px solid rgba(255,255,255,.09);background:rgba(255,255,255,.045);border-radius:20px;padding:15px;min-height:180px}.card:before{content:"";position:absolute;inset:0 0 auto;height:4px;background:var(--c,var(--cyan))}.card h3{margin:12px 0 8px;font-size:18px}.card p{color:var(--muted);margin:0 0 14px}.meta{display:flex;justify-content:space-between;gap:10px;color:var(--muted);font-size:12px}.badge{display:inline-flex;padding:5px 9px;border:1px solid rgba(255,255,255,.12);border-radius:999px;color:var(--c,var(--cyan));font-weight:800;text-transform:uppercase;font-size:11px}.side{padding:16px}.health{display:grid;gap:10px;max-height:70vh;overflow:auto}.healthrow{display:grid;grid-template-columns:1fr auto;gap:8px;padding:10px;border-radius:14px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.06)}.ok{color:var(--green)}.bad{color:var(--red)}.muted{color:var(--muted)}@media(max-width:1000px){.grid{grid-template-columns:1fr}.stats{grid-template-columns:repeat(2,1fr)}}@media(max-width:560px){.stats{grid-template-columns:1fr}.wrap{padding:12px}.items{grid-template-columns:1fr}} </style> </head> <body> <div class="wrap"> <div class="top"> <div class="brand"><h1>SIMON Feed Engine v2</h1><p>Unified live feed router · News · Space · Weather · Social · Webhooks · SIMON events</p></div> <div class="actions"><a class="btn" href="feed_manager.php">Manage Feeds</a><a class="btn" href="webhook_inbox.php?stream=default">Webhook Inbox</a><button class="btn" id="refresh">Refresh</button></div> </div> <div class="stats"> <div class="stat"><div class="k">Items</div><div class="v" id="sItems">—</div></div> <div class="stat"><div class="k">Sources</div><div class="v" id="sSources">—</div></div> <div class="stat"><div class="k">Healthy</div><div class="v ok" id="sOk">—</div></div> <div class="stat"><div class="k">Errors</div><div class="v bad" id="sBad">—</div></div> <div class="stat"><div class="k">Latency</div><div class="v" id="sMs">—</div></div> </div> <div class="toolbar"> <input id="q" placeholder="Search live feed…" autocomplete="off"> <select id="cat"><option value="">All categories</option></select> <button class="btn" id="top100">Top 100</button> <button class="btn" id="force">Force refresh</button> </div> <div class="grid"> <main class="items" id="items"></main> <aside class="panel side"><h2>Provider Health</h2><div class="health" id="health"></div></aside> </div> </div> <script> const $=s=>document.querySelector(s);let DATA=null; function esc(s){return String(s??'').replace(/[&<>"']/g,m=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m]));} function rel(d){const t=new Date(d).getTime();if(!t)return '';const s=(Date.now()-t)/1000;if(s<60)return 'now';if(s<3600)return Math.round(s/60)+'m';if(s<86400)return Math.round(s/3600)+'h';return Math.round(s/86400)+'d';} async function load(force=false){ const p=new URLSearchParams({limit: $('#top100').dataset.on?'100':'100'}); if($('#q').value.trim())p.set('q',$('#q').value.trim()); if($('#cat').value)p.set('category',$('#cat').value); if(force)p.set('force','1'); const r=await fetch('feed_proxy.php?'+p,{cache:'no-store'}); DATA=await r.json(); render(); } function render(){ const items=DATA.items||[], health=DATA.health||[]; $('#sItems').textContent=items.length; $('#sSources').textContent=health.length; $('#sOk').textContent=health.filter(h=>h.ok).length; $('#sBad').textContent=health.filter(h=>!h.ok).length; $('#sMs').textContent=(DATA.elapsedMs||0)+'ms'; const cats=DATA.categories||{}; const cur=$('#cat').value; $('#cat').innerHTML='<option value="">All categories</option>'+Object.keys(cats).sort().map(c=>`<option value="${esc(c)}">${esc(c)} (${cats[c]})</option>`).join(''); $('#cat').value=cur; $('#items').innerHTML=items.map(it=>`<article class="card" style="--c:${esc(it.color||'#4be3ff')}"><span class="badge">${esc(it.category)}</span><h3>${esc(it.title)}</h3><p>${esc(it.summary||'')}</p><div class="meta"><span>${esc(it.source)} · ${rel(it.published)}</span><span>${Math.round(it.score||0)}</span></div>${it.url?`<p><a class="btn" target="_blank" rel="noopener" href="${esc(it.url)}">Open</a></p>`:''}</article>`).join('') || '<div class="panel side">No feed items yet. Check Provider Health or add feeds.</div>'; $('#health').innerHTML=health.map(h=>`<div class="healthrow"><div><b>${esc(h.name||h.id)}</b><div class="muted">${esc(h.engine||'')} · ${esc(h.category||'')} · ${h.ms||0}ms · ${h.count||0} items</div>${h.error?`<div class="bad">${esc(h.error)}</div>`:''}</div><div class="${h.ok?'ok':'bad'}">${h.ok?'OK':'FAIL'}</div></div>`).join(''); } $('#refresh').onclick=()=>load(false);$('#force').onclick=()=>load(true);$('#q').addEventListener('input',()=>{clearTimeout(window.t);window.t=setTimeout(()=>load(false),350)});$('#cat').onchange=()=>load(false);$('#top100').onclick=()=>load(false);load();setInterval(()=>load(false),60000); </script> </body> </html>
Save file
Quick jump
open a path
Open