fix(branding): real @hanzo blocky-H logo+favicon, dev-only devtools, working OIDC button icon

- App.jsx: gate ReactQueryDevtools behind import.meta.env.DEV via lazy dynamic
  import so the devtools floating button (red flower) never ships in prod.
- librechat.yaml + compose.prod.yml: OIDC/model iconURL & OPENID_IMAGE_URL
  hanzo.ai/logo/icon.svg (404) -> hanzo.chat/assets/logo.svg (served, canonical).
- index.html: add scalable SVG favicon (canonical blocky-H) as primary icon.
- post-build.cjs: copy favicon.ico into dist root so /favicon.ico serves.
- add real multi-size favicon.ico generated from @hanzo/brand favicon (blocky-H).

logo.svg/favicons already match @hanzo/brand canonical blocky-H byte-for-byte;
prod was serving a stale dist (title 'Chat', no assets) -> fresh build fixes.
This commit is contained in:
hanzo
2026-06-23 14:29:53 -07:00
committed by Antje Worring
parent 05396959ae
commit c2aff88ca6
6 changed files with 18 additions and 6 deletions
+1
View File
@@ -9,6 +9,7 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="description" content="Hanzo Chat - AI chat platform with support for multiple AI models" />
<title>Hanzo Chat</title>
<link rel="icon" type="image/svg+xml" href="assets/logo.svg" />
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicon-16x16.png" />
<link rel="apple-touch-icon" href="assets/apple-touch-icon-180x180.png" />
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+2 -1
View File
@@ -4,7 +4,8 @@ async function postBuild() {
try {
await fs.copy('public/assets', 'dist/assets');
await fs.copy('public/robots.txt', 'dist/robots.txt');
console.log('✅ PWA icons and robots.txt copied successfully. Glob pattern warnings resolved.');
await fs.copy('public/favicon.ico', 'dist/favicon.ico');
console.log('✅ PWA icons, favicon.ico, and robots.txt copied successfully. Glob pattern warnings resolved.');
} catch (err) {
console.error('❌ Error copying files:', err);
process.exit(1);
+13 -3
View File
@@ -1,10 +1,9 @@
import { useEffect } from 'react';
import { lazy, Suspense, useEffect } from 'react';
import { RecoilRoot } from 'recoil';
import { DndProvider } from 'react-dnd';
import { RouterProvider } from 'react-router-dom';
import * as RadixToast from '@radix-ui/react-toast';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { Toast, ThemeProvider, ToastProvider } from '@librechat/client';
import { QueryClient, QueryClientProvider, QueryCache } from '@tanstack/react-query';
import { ScreenshotProvider, useApiErrorBoundary } from './hooks';
@@ -14,6 +13,13 @@ import { initializeFontSize } from '~/store/fontSize';
import { LiveAnnouncer } from '~/a11y';
import { router } from './routes';
// Dev-only: lazily loaded so the devtools bundle never ships in production builds.
const ReactQueryDevtools = import.meta.env.DEV
? lazy(() =>
import('@tanstack/react-query-devtools').then((m) => ({ default: m.ReactQueryDevtools })),
)
: null;
const App = () => {
const { setError } = useApiErrorBoundary();
@@ -63,7 +69,11 @@ const App = () => {
<DndProvider backend={HTML5Backend}>
<RouterProvider router={router} />
<WakeLockManager />
<ReactQueryDevtools initialIsOpen={false} position="top-right" />
{import.meta.env.DEV && ReactQueryDevtools && (
<Suspense fallback={null}>
<ReactQueryDevtools initialIsOpen={false} position="top-right" />
</Suspense>
)}
<Toast />
<RadixToast.Viewport className="pointer-events-none fixed inset-0 z-[1000] mx-auto my-2 flex max-w-[560px] flex-col items-stretch justify-start md:pb-5" />
</DndProvider>
+1 -1
View File
@@ -32,7 +32,7 @@ services:
OPENID_SCOPE: openid profile email
OPENID_CALLBACK_URL: /oauth/openid/callback
OPENID_BUTTON_LABEL: Log in with Hanzo
OPENID_IMAGE_URL: https://hanzo.ai/logo/icon.svg
OPENID_IMAGE_URL: https://hanzo.chat/assets/logo.svg
OPENID_USERNAME_CLAIM: name
OPENID_NAME_CLAIM: name
OPENID_USE_PKCE: "true"
+1 -1
View File
@@ -94,7 +94,7 @@ endpoints:
# Authenticated users override with their own key via IAM (hanzo.id).
apiKey: '${HANZO_API_KEY}'
baseURL: 'https://api.hanzo.ai/v1'
iconURL: 'https://hanzo.ai/logo/icon.svg'
iconURL: 'https://hanzo.chat/assets/logo.svg'
models:
default:
# Zen model family (Hanzo AI)