GemX-v0.4.0
v0.4.0 Release Notes
The follow-up to v0.3.0 makes GemX feel at home on any Mac, no matter how you keep your desktop. The headline is a full Light mode that spans every surface of the app — chat, composer, sidebar, modals, code blocks, and the README hero — with a three-way Light / Dark / System toggle that follows your macOS Appearance setting live. Alongside it, the assistant's thinking avatar is reborn as the Quantum Binary mark, code blocks are rebuilt to match the clean Gemini-chat look, and the Settings panel is reorganised into a calmer, better-paired layout.
Light Mode — Across the Entire UI
- Three-way theme toggle in Settings. A new Theme control offers System (default), Light, and Dark. System watches your macOS Appearance and switches the whole app the instant you flip it in Control Center or System Settings — no restart, no reload.
- Built on CSS custom properties, not per-component branches. Every colour in the app now reads from a semantic token (
--surface-*,--fg-*,--border-*,--accent-*, syntax--syn-*, …). Dark is the default:rootpalette;[data-theme="light"]flips the values. This keeps both themes pixel-consistent and means future surfaces theme themselves for free. - No white flash on launch. An IIFE runs before React mounts, reads your saved theme from
localStorage, and appliesdata-themeto<html>immediately — so a Light-mode boot never flickers through a dark frame first. - Native chrome stays in sync. The renderer tells the main process the active mode over a new
theme:setIPC channel, which drivesnativeTheme.themeSourceso the titlebar tint and native scrollbars match the in-app theme instead of fighting it. - Theme-conditional artwork. The app ships
icon-light/icon-darkandhero-light/hero-darkassets; the in-app hero and the README hero both swap automatically with the active theme (<picture>+prefers-color-schemeon GitHub). 'system'is resolved, never stored as a literal. Picking System keepsthemeMode: 'system'in settings and resolves to a concrete'light' | 'dark'at runtime viamatchMedia('(prefers-color-scheme: light)'), with a live subscription so the app re-renders when the OS preference changes.
New Assistant Avatar — "Quantum Binary"
- A solid core dot + a hollow ring. The old 4-point sparkle is replaced by a strictly monochrome mark — one filled
qb-coreand one outlinedqb-ring. It reads as black in Light mode and white in Dark, so it never looks tinted or out of place. - Two states that tell you what the model is doing. While thinking, the core and ring orbit a shared invisible centre on opposite sides. When the model starts generating, they slide into a locked bullseye and pulse rhythmically (the ring scales slightly more than the core).
- Tuned motion. The slide-and-lock uses a
cubic-bezier(0.65, 0, 0.35, 1)for a "magnetic friction" feel, and the pulse is delayed0.65sso it only begins once the slide has fully settled. Pure SVG + CSS keyframes; respectsprefers-reduced-motion.
Redesigned Code Blocks
- Gemini-chat style. Code blocks are rebuilt as a single rounded
bg-codepanel — no heavy border separators. A compact header carries an uppercase language label and a Copy button; the code body sits inside with a transparent background so it reads as one clean surface. - Theme-aware syntax. Highlighting is driven by
--syn-*tokens (One Dark in dark, One Light in light), so snippets stay legible and on-palette in either theme.
Settings Panel — Reorganised & Paired
- A calmer top-to-bottom order: Theme → Web Search (+ Tavily key) → Thinking → Context Window → HuggingFace Token. Related controls now sit together instead of being scattered.
- Downloaded Models pinned. The Downloaded Models surface spans its own column (
lg:row-span-5) so built-ins and customs stay visible while you adjust the rest of the panel.
UX Polish
- Cleaner composer attach affordance. The attach control is back to a plain paperclip (the old inline count chip is gone). Attachments render as cards above the textarea — the same clear, low-noise pattern Claude and Gemini use.
- Consistent steppers. The custom-model modal's context-window inputs use the same power-of-two stepper as Settings → Context Window, so the two surfaces feel identical.
Under the Hood
- New
src/renderer/src/lib/theme.ts(resolveTheme,useEffectiveTheme,useAppliedTheme,THEME_OPTIONS) centralises all theme resolution and subscriptions. useAppliedTheme()lets components withoutsettingsin scope (Setup, the empty-state hero) react to theme via aMutationObserveron<html data-theme>.- The full contributor
docs/and from-scratchlearning/curriculum were audited and brought current with the theme system, the Quantum Binary avatar, and the custom-model registry.
Upgrading
Drop the new GemX.app in over the old one. Your downloaded models, custom models, settings, and HuggingFace / Tavily keys are preserved. On first launch GemX defaults to System theme — switch to a fixed Light or Dark any time from Settings.