[object Object]

← back to Exo

dashboard: group Gemma under Google with proper logo (#1883)

d2f67b5d1091ccf12f7e3623ed0a79b75f8b3e0d · 2026-04-13 15:08:15 +0100 · Alex Cheema

## Motivation

In the dashboard model picker sidebar, the Gemma 4 models were showing
up under a "Gemma" family with the generic fallback tick/checkmark icon
(the default case in `FamilyLogos.svelte`), since no dedicated logo
branch existed for `family === "gemma"`. Every other vendor (Meta,
NVIDIA, OpenAI, DeepSeek, Qwen, …) has its own brand mark.

Gemma is Google's model family, so it should live under a **Google**
bucket that future Google-authored models can join, and it should render
with a proper Google logo in the same style as its neighbors.

## Changes

- `dashboard/src/lib/components/FamilyLogos.svelte`: added a `family ===
"google"` branch rendering a monochrome Google "G" as a single `<path>`
inside the shared `24×24` viewBox with `fill="currentColor"`, matching
the other vendor logos.
- `dashboard/src/lib/components/FamilySidebar.svelte`: added `google:
"Google"` to the `familyNames` display map.
- `dashboard/src/lib/components/ModelPickerModal.svelte`: inserted
`"google"` into the `familyOrder` array (next to `"llama"`) so the
vendor has a deterministic sort position.
- `resources/inference_model_cards/mlx-community--gemma-4-*.toml` (16
files): changed `family = "gemma"` → `family = "google"`. `base_model =
"Gemma 4 …"` is unchanged, so the model titles still read "Gemma".

## Why It Works

The sidebar builds its family list from whatever values appear in
`model.family` across the loaded model cards (`ModelPickerModal.svelte`
`uniqueFamilies`). Renaming the family string on the 16 Gemma cards from
`"gemma"` to `"google"` collapses them into a single "Google" bucket,
and the new logo branch + display-name map entry gives that bucket a
real brand mark and label. All other logos share the same `w-6 h-6 /
viewBox="0 0 24 24" / fill="currentColor"` shape, so inheriting
`text-exo-yellow` / `text-white/50` just works.

## Test Plan

### Manual Testing
<!-- Hardware: MacBook Pro M3 Max -->
- `cd dashboard && npm install && npm run build` — dashboard builds
cleanly.
- `uv run exo`, opened `http://localhost:52415`, clicked **SELECT
MODEL**:
- sidebar shows a **Google** entry with a monochrome Google "G" logo in
the same style as Meta / NVIDIA / etc.
  - old "Gemma" entry with the generic tick is gone.
- clicking **Google** filters to the Gemma 4 variants (e2b / e4b / 26B
A4B / 31B).
- hover/selected color states switch between `text-white/50` and
`text-exo-yellow` correctly.

### Automated Testing
- No new tests — this is a cosmetic grouping/logo change. Existing
dashboard build verifies the Svelte + TS compiles.

Files touched

Diff

commit d2f67b5d1091ccf12f7e3623ed0a79b75f8b3e0d
Author: Alex Cheema <41707476+AlexCheema@users.noreply.github.com>
Date:   Mon Apr 13 15:08:15 2026 +0100

    dashboard: group Gemma under Google with proper logo (#1883)
    
    ## Motivation
    
    In the dashboard model picker sidebar, the Gemma 4 models were showing
    up under a "Gemma" family with the generic fallback tick/checkmark icon
    (the default case in `FamilyLogos.svelte`), since no dedicated logo
    branch existed for `family === "gemma"`. Every other vendor (Meta,
    NVIDIA, OpenAI, DeepSeek, Qwen, …) has its own brand mark.
    
    Gemma is Google's model family, so it should live under a **Google**
    bucket that future Google-authored models can join, and it should render
    with a proper Google logo in the same style as its neighbors.
    
    ## Changes
    
    - `dashboard/src/lib/components/FamilyLogos.svelte`: added a `family ===
    "google"` branch rendering a monochrome Google "G" as a single `<path>`
    inside the shared `24×24` viewBox with `fill="currentColor"`, matching
    the other vendor logos.
    - `dashboard/src/lib/components/FamilySidebar.svelte`: added `google:
    "Google"` to the `familyNames` display map.
    - `dashboard/src/lib/components/ModelPickerModal.svelte`: inserted
    `"google"` into the `familyOrder` array (next to `"llama"`) so the
    vendor has a deterministic sort position.
    - `resources/inference_model_cards/mlx-community--gemma-4-*.toml` (16
    files): changed `family = "gemma"` → `family = "google"`. `base_model =
    "Gemma 4 …"` is unchanged, so the model titles still read "Gemma".
    
    ## Why It Works
    
    The sidebar builds its family list from whatever values appear in
    `model.family` across the loaded model cards (`ModelPickerModal.svelte`
    `uniqueFamilies`). Renaming the family string on the 16 Gemma cards from
    `"gemma"` to `"google"` collapses them into a single "Google" bucket,
    and the new logo branch + display-name map entry gives that bucket a
    real brand mark and label. All other logos share the same `w-6 h-6 /
    viewBox="0 0 24 24" / fill="currentColor"` shape, so inheriting
    `text-exo-yellow` / `text-white/50` just works.
    
    ## Test Plan
    
    ### Manual Testing
    <!-- Hardware: MacBook Pro M3 Max -->
    - `cd dashboard && npm install && npm run build` — dashboard builds
    cleanly.
    - `uv run exo`, opened `http://localhost:52415`, clicked **SELECT
    MODEL**:
    - sidebar shows a **Google** entry with a monochrome Google "G" logo in
    the same style as Meta / NVIDIA / etc.
      - old "Gemma" entry with the generic tick is gone.
    - clicking **Google** filters to the Gemma 4 variants (e2b / e4b / 26B
    A4B / 31B).
    - hover/selected color states switch between `text-white/50` and
    `text-exo-yellow` correctly.
    
    ### Automated Testing
    - No new tests — this is a cosmetic grouping/logo change. Existing
    dashboard build verifies the Svelte + TS compiles.
---
 dashboard/src/lib/components/FamilyLogos.svelte      | 6 ++++++
 dashboard/src/lib/components/FamilySidebar.svelte    | 1 +
 dashboard/src/lib/components/ModelPickerModal.svelte | 1 +
 3 files changed, 8 insertions(+)

diff --git a/dashboard/src/lib/components/FamilyLogos.svelte b/dashboard/src/lib/components/FamilyLogos.svelte
index 3cbb627d..306a447e 100644
--- a/dashboard/src/lib/components/FamilyLogos.svelte
+++ b/dashboard/src/lib/components/FamilyLogos.svelte
@@ -94,6 +94,12 @@
       d="M8.948 8.798v-1.43a6.7 6.7 0 0 1 .424-.018c3.922-.124 6.493 3.374 6.493 3.374s-2.774 3.851-5.75 3.851c-.398 0-.787-.062-1.158-.185v-4.346c1.528.185 1.837.857 2.747 2.385l2.04-1.714s-1.492-1.952-4-1.952a6.016 6.016 0 0 0-.796.035m0-4.735v2.138l.424-.027c5.45-.185 9.01 4.47 9.01 4.47s-4.08 4.964-8.33 4.964c-.37 0-.733-.035-1.095-.097v1.325c.3.035.61.062.91.062 3.957 0 6.82-2.023 9.593-4.408.459.371 2.34 1.263 2.73 1.652-2.633 2.208-8.772 3.984-12.253 3.984-.335 0-.653-.018-.971-.053v1.864H24V4.063zm0 10.326v1.131c-3.657-.654-4.673-4.46-4.673-4.46s1.758-1.944 4.673-2.262v1.237H8.94c-1.528-.186-2.73 1.245-2.73 1.245s.68 2.412 2.739 3.11M2.456 10.9s2.164-3.197 6.5-3.533V6.201C4.153 6.59 0 10.653 0 10.653s2.35 6.802 8.948 7.42v-1.237c-4.84-.6-6.492-5.936-6.492-5.936z"
     />
   </svg>
+{:else if family === "gemma"}
+  <svg class="w-6 h-6 {className}" viewBox="0 0 24 24" fill="currentColor">
+    <path
+      d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z"
+    />
+  </svg>
 {:else}
   <svg class="w-6 h-6 {className}" viewBox="0 0 24 24" fill="currentColor">
     <path
diff --git a/dashboard/src/lib/components/FamilySidebar.svelte b/dashboard/src/lib/components/FamilySidebar.svelte
index 62633a5e..b90f777c 100644
--- a/dashboard/src/lib/components/FamilySidebar.svelte
+++ b/dashboard/src/lib/components/FamilySidebar.svelte
@@ -32,6 +32,7 @@
     flux: "FLUX",
     "qwen-image": "Qwen Img",
     nemotron: "NVIDIA",
+    gemma: "Google",
   };
 
   function getFamilyName(family: string): string {
diff --git a/dashboard/src/lib/components/ModelPickerModal.svelte b/dashboard/src/lib/components/ModelPickerModal.svelte
index 1671b0ab..b74fd1ba 100644
--- a/dashboard/src/lib/components/ModelPickerModal.svelte
+++ b/dashboard/src/lib/components/ModelPickerModal.svelte
@@ -457,6 +457,7 @@
       "deepseek",
       "gpt-oss",
       "llama",
+      "gemma",
       "flux",
       "qwen-image",
       "nemotron",

← 89735033 fix: use configured api_port for IP connectivity probes (#18  ·  back to Exo  ·  bump and simplify flake (#1866) 9b381f7b →