diff --git a/DESIGN.md b/DESIGN.md
index bb92604..58156f7 100644
--- a/DESIGN.md
+++ b/DESIGN.md
@@ -46,7 +46,7 @@ stage presence, and the streamer is the director. The visuals moved with the met
| 👻 | app identity / a ghost |
| 🧠 | brain / model / API |
| 📷 | stream & OBS |
- | 🎙 | voice / mic transcription |
+ | 🎙️ | voice / mic transcription |
| 💬 | chat behavior & cadence |
| 🎨 | look / theming |
| 🔧 | app plumbing |
diff --git a/README.md b/README.md
index 13b4ea1..89d8437 100644
--- a/README.md
+++ b/README.md
@@ -108,6 +108,7 @@ Quit Hype Ghost.
| `app.autoUpdate` | Check GitHub for new versions at launch and update automatically (default true). |
| `app.setupComplete` | Set by the setup wizard when you finish it (even via the brain step's "skip"). Once true, `/` opens the dashboard — without a brain that's **preview mode**: everything explorable, cast quiet, $0. |
| `app.costMeter` | Show the live session cost readout in the deck's top bar (default true). |
+| `app.fontScale` | UI text size for the deck/settings/wizard: `1` default, `1.1` large, `1.25` extra large (Settings → App, applies live). Never shrinks below default, and the on-stream overlay is unaffected. |
| `app.ttsOutputDevice` | Which speaker/headphone spoken cast messages play on (Settings → App → 🔊, with a test button). Picking a specific device keeps chat out of your stream mix and off the VOD; that path speaks with Windows (SAPI) voices. Blank = system default device with browser voices. |
| `bot.language` | Language the whole cast chats in (default English). |
| `stream.context` | Standing context about your stream (game, format, vibe) the cast always knows. It also sees your current OBS scene name automatically. |
diff --git a/config.example.json b/config.example.json
index bb2f76b..e187635 100644
--- a/config.example.json
+++ b/config.example.json
@@ -42,6 +42,7 @@
"ttsRate": 1,
"ttsOutputDevice": "",
"uiLanguage": "en",
+ "fontScale": 1,
"setupComplete": false
},
"stream": {
diff --git a/public/dashboard.html b/public/dashboard.html
index 8485c31..3a9d100 100644
--- a/public/dashboard.html
+++ b/public/dashboard.html
@@ -440,7 +440,7 @@
function setOrb(id, cls, text) { const el = $(id); el.className = 'orb ' + cls; el.querySelector('.lbl').textContent = text; }
- let appliedLang = null, appliedAccent = null;
+ let appliedLang = null, appliedAccent = null, appliedScale = null;
function renderState() {
// Language + accent apply only when they actually change — applyI18n
// sweeps the whole DOM and state broadcasts arrive constantly.
@@ -450,6 +450,10 @@
applyAccent(state.accent);
applyI18n();
}
+ if (state.fontScale !== appliedScale) {
+ appliedScale = state.fontScale;
+ document.documentElement.style.setProperty('--font-scale', Math.min(1.5, Math.max(1, Number(state.fontScale) || 1)));
+ }
if (JSON.stringify(cast) !== JSON.stringify(state.cast || [])) { cast = state.cast || []; renderStage(); }
const si = state.streamInfo, np = $('nowplaying');
diff --git a/public/settings.html b/public/settings.html
index be798f8..425951d 100644
--- a/public/settings.html
+++ b/public/settings.html
@@ -69,7 +69,7 @@
⚙ Settings
-
+
@@ -189,7 +189,7 @@
🎮 Stream info for the cast
-
🎙 Voice awareness
+
🎙️ Voice awareness
Local mic transcription via the LocalVocal OBS plugin, so answering out loud is replying. It's third-party — keep it updated to match your OBS version (an outdated build can crash OBS, e.g. when switching Scene Collections). Optional: leave this Off to reply by typing.