From 8a64a269f3f9ff35ee76d8a0ae5ff269c833f070 Mon Sep 17 00:00:00 2001 From: tcpsyn Date: Mon, 16 Mar 2026 03:28:18 -0600 Subject: [PATCH] Remove duplicate h1, fix avatar gender caching, blacklist Celeste voice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hide h1 (sr-only) on homepage — banner already shows show name - Promote tagline as visual lead after banner - Fix avatar gender: add .gender marker files, re-fetch on mismatch - Clear stale avatar cache so all re-fetch with correct gender - Blacklist Celeste voice from caller pool Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/main.py | 2 +- backend/services/avatars.py | 15 ++++++++++----- website/css/style.css | 7 +++++++ website/index.html | 4 ++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/backend/main.py b/backend/main.py index 923370c..8ae00e9 100644 --- a/backend/main.py +++ b/backend/main.py @@ -147,7 +147,7 @@ ELEVENLABS_MALE_VOICES.append("SAz9YHcvj6GT2YYXdXww") # River - Neutral ELEVENLABS_FEMALE_VOICES.append("SAz9YHcvj6GT2YYXdXww") # River - Neutral # Voices to never assign to callers (annoying, bad quality, etc.) -BLACKLISTED_VOICES = {"Evelyn", "Sebastian"} # Sebastian reserved for Silas +BLACKLISTED_VOICES = {"Evelyn", "Sebastian", "Celeste"} # Sebastian reserved for Silas def _get_voice_pools(): diff --git a/backend/services/avatars.py b/backend/services/avatars.py index f25a884..d285d20 100644 --- a/backend/services/avatars.py +++ b/backend/services/avatars.py @@ -25,14 +25,19 @@ class AvatarService: async def get_or_fetch(self, name: str, gender: str = "male") -> Path: """Get cached avatar or fetch from randomuser.me. Returns file path.""" + g = "female" if gender.lower().startswith("f") else "male" path = AVATAR_DIR / f"{name}.jpg" + # Check for gender mismatch marker — re-fetch if gender changed + marker = AVATAR_DIR / f"{name}.gender" if path.exists(): - return path + cached_gender = marker.read_text().strip() if marker.exists() else None + if cached_gender == g: + return path + # Gender mismatch or no marker — re-fetch + path.unlink(missing_ok=True) try: - # Seed includes gender so same name + different gender = different face - seed = f"{name.lower().replace(' ', '_')}_{gender.lower()}" - g = "female" if gender.lower().startswith("f") else "male" + seed = f"{name.lower().replace(' ', '_')}_{g}" resp = await self.client.get( "https://randomuser.me/api/", params={"gender": g, "seed": seed}, @@ -42,11 +47,11 @@ class AvatarService: data = resp.json() photo_url = data["results"][0]["picture"]["large"] - # Download the photo photo_resp = await self.client.get(photo_url, timeout=8.0) photo_resp.raise_for_status() path.write_bytes(photo_resp.content) + marker.write_text(g) print(f"[Avatar] Fetched avatar for {name} ({g})") return path except Exception as e: diff --git a/website/css/style.css b/website/css/style.css index fd1dd06..aa08e43 100644 --- a/website/css/style.css +++ b/website/css/style.css @@ -184,6 +184,13 @@ a:hover { line-height: 1.5; } +.tagline--hero { + font-size: 1.4rem; + color: var(--text); + font-weight: 600; + max-width: 600px; +} + .phone { display: flex; align-items: center; diff --git a/website/index.html b/website/index.html index 4d4aaad..e19012d 100644 --- a/website/index.html +++ b/website/index.html @@ -119,8 +119,8 @@
-

Luke at the Roost

-

The call-in talk show where Luke gives life advice to biologically questionable organisms.

+

Luke at the Roost

+

The call-in talk show where Luke gives life advice to biologically questionable organisms.