Initial commit: Claude Live Dashboard

Always-on-Top Electron-Widget für die Claude-Plan-Auslastung unter Windows.
Liest Transkripte lokal, fragt optional den /usage-Endpunkt ab, bietet einen
Einstellungsdialog und lässt sich als NSIS-Installer oder portable Fassung
bauen.
This commit is contained in:
Winkler, Stefan
2026-07-22 12:59:54 +02:00
commit 868f31fa9a
28 changed files with 8971 additions and 0 deletions
+157
View File
@@ -0,0 +1,157 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'self'; script-src 'self';" />
<title>Einstellungen</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<header class="titlebar">
<span class="title">Einstellungen</span>
<span class="spacer"></span>
<button class="icon-btn" id="btn-close" title="Schließen" aria-label="Schließen"></button>
</header>
<main class="content">
<p class="path" id="config-path"></p>
<section class="group">
<h2>Anzeige</h2>
<div class="row">
<label for="opacity">Deckkraft</label>
<div class="control">
<input type="range" id="opacity" min="30" max="100" step="5" />
<output id="opacity-out">100 %</output>
</div>
</div>
<div class="row">
<label for="clickThrough">Klicks durchlassen</label>
<div class="control">
<input type="checkbox" id="clickThrough" />
<span class="hint">Das Widget fängt keine Mausklicks mehr ab.</span>
</div>
</div>
<div class="row">
<label for="autostart">Mit Windows starten</label>
<div class="control">
<input type="checkbox" id="autostart" />
<span class="hint">Wird sofort übernommen, unabhängig vom Speichern.</span>
</div>
</div>
</section>
<section class="group">
<h2>Datenquelle</h2>
<div class="row">
<label for="oauthEnabled">Serverabfrage</label>
<div class="control">
<input type="checkbox" id="oauthEnabled" />
<span class="hint">
Liefert exakte Prozentwerte und Reset-Zeiten. Abgeschaltet rechnet
das Dashboard nur lokal — dann sind alle Werte Näherungen.
</span>
</div>
</div>
<div class="row">
<label for="oauthEndpoint">Endpunkt</label>
<div class="control">
<input type="text" id="oauthEndpoint" placeholder="Standard verwenden" spellcheck="false" />
<span class="hint">Nur ausfüllen, um den Standard zu überschreiben.</span>
</div>
</div>
</section>
<section class="group">
<h2>Bezugsgrößen <span class="tag">Rückfallebene</span></h2>
<p class="note">
Werden nur benutzt, wenn die Serverabfrage ausfällt. Ermitteln mit
<code>npm run calibrate</code>. Leer lassen für Auto-Kalibrierung.
</p>
<div class="row">
<label for="limitWeek">Woche</label>
<div class="control">
<input type="number" id="limitWeek" min="0" step="1000000" placeholder="automatisch" />
<span class="hint">gewichtete Tokens für 100 %</span>
</div>
</div>
<div class="row">
<label for="limitBlock">5-Stunden-Fenster</label>
<div class="control">
<input type="number" id="limitBlock" min="0" step="1000000" placeholder="automatisch" />
<span class="hint">gewichtete Tokens für 100 %</span>
</div>
</div>
</section>
<section class="group">
<h2>Gewichtung</h2>
<p class="note">
Wie stark Token-Arten und Modelle ins Kontingent zählen. Beeinflusst
die lokale Rechnung und die Hochrechnung „reicht noch …“, nicht die
Serverwerte.
</p>
<div class="grid" id="weights">
<label for="wInput">Eingabe</label><input type="number" id="wInput" min="0" step="0.05" />
<label for="wOutput">Ausgabe</label><input type="number" id="wOutput" min="0" step="0.05" />
<label for="wCacheCreate">Cache anlegen</label><input type="number" id="wCacheCreate" min="0" step="0.05" />
<label for="wCacheRead">Cache lesen</label><input type="number" id="wCacheRead" min="0" step="0.05" />
<label for="mOpus">Opus</label><input type="number" id="mOpus" min="0" step="0.1" />
<label for="mSonnet">Sonnet</label><input type="number" id="mSonnet" min="0" step="0.1" />
<label for="mHaiku">Haiku</label><input type="number" id="mHaiku" min="0" step="0.1" />
</div>
</section>
<section class="group">
<h2>Wochenfenster <span class="tag">Rückfallebene</span></h2>
<p class="note">
Bei aktiver Serverabfrage wird der echte Reset-Zeitpunkt verwendet und
diese Angaben bleiben ungenutzt.
</p>
<div class="row">
<label for="weekday">Reset-Tag</label>
<div class="control">
<select id="weekday">
<option value="">rollierende 7 Tage</option>
<option value="0">Sonntag</option>
<option value="1">Montag</option>
<option value="2">Dienstag</option>
<option value="3">Mittwoch</option>
<option value="4">Donnerstag</option>
<option value="5">Freitag</option>
<option value="6">Samstag</option>
</select>
</div>
</div>
<div class="row">
<label for="resetHour">Uhrzeit</label>
<div class="control inline">
<input type="number" id="resetHour" min="0" max="23" step="1" />
<span class="colon">:</span>
<input type="number" id="resetMinute" min="0" max="59" step="1" />
</div>
</div>
</section>
</main>
<footer class="actions">
<button class="btn ghost" id="btn-open-file">Datei öffnen</button>
<span class="spacer"></span>
<span class="feedback" id="feedback" hidden></span>
<button class="btn ghost" id="btn-revert">Verwerfen</button>
<button class="btn primary" id="btn-save">Speichern</button>
</footer>
<script src="app.js"></script>
</body>
</html>