# Logo Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Add the faceted gem logo as the default brand mark across the web app, docs site, and all meta assets (favicon, PWA icons, social preview).
**Architecture:** Create SVG logo assets in `apps/web/public/`, wire them into `index.html` as favicon/meta, display the gem icon in the app header/sidebar as the default (before any custom logo is uploaded), and add logo + favicon config to the VitePress docs site.
**Tech Stack:** SVG (hand-authored), Vite static assets, HTML meta tags, VitePress config
---
### Task 1: Create the SVG logo assets
**Files:**
- Create: `apps/web/public/logo-icon.svg`
- Create: `apps/web/public/favicon.svg`
- Create: `apps/web/public/logo.svg`
- [ ] **Step 1: Create `apps/web/public/` directory**
```bash
mkdir -p apps/web/public
```
- [ ] **Step 2: Create `apps/web/public/logo-icon.svg` — full-detail gem icon**
```svg
```
- [ ] **Step 3: Create `apps/web/public/favicon.svg` — simplified gem for small sizes (no outline, no girdle)**
```svg
```
- [ ] **Step 4: Create `apps/web/public/logo.svg` — full combination mark (icon + wordmark)**
```svg
```
- [ ] **Step 5: Commit**
```bash
git add apps/web/public/logo-icon.svg apps/web/public/favicon.svg apps/web/public/logo.svg
git commit -m "feat(branding): add faceted gem SVG logo assets"
```
---
### Task 2: Wire favicon and meta tags into index.html
**Files:**
- Modify: `apps/web/index.html`
- [ ] **Step 1: Add favicon and Open Graph meta tags to `apps/web/index.html`**
Replace the current `
` content with:
```html
Stirling Image
```
- [ ] **Step 2: Verify favicon loads in dev**
```bash
pnpm dev
```
Open http://localhost:1349 in a browser. The browser tab should show the blue gem favicon.
- [ ] **Step 3: Commit**
```bash
git add apps/web/index.html
git commit -m "feat(branding): add favicon and meta tags to index.html"
```
---
### Task 3: Display gem icon as default logo in app header
**Files:**
- Modify: `apps/web/src/components/layout/app-layout.tsx`
The current code shows the text "Stirling Image" when no custom logo is uploaded. Replace it with the gem SVG icon + text.
- [ ] **Step 1: Create an inline GemLogo component at the top of `app-layout.tsx`**
Add this after the existing imports (before the `AppLayoutProps` interface):
```tsx
function GemLogo({ className = "h-6 w-6" }: { className?: string }) {
return (
);
}
```
Note: Uses `currentColor` so it inherits the text-primary blue color from Tailwind.
- [ ] **Step 2: Replace the text-only fallback in the mobile sidebar header (around line 59-62)**
Replace:
```tsx
Stirling Image
```
With:
```tsx
Stirling Image
```
- [ ] **Step 3: Replace the text-only fallback in the mobile top bar (around line 104-107)**
Replace the same text-only span with the same icon + text pattern:
```tsx
Stirling Image
```
- [ ] **Step 4: Verify in dev**
```bash
pnpm dev
```
Open http://localhost:1349. The gem icon should appear next to "Stirling Image" in both mobile and desktop views. Test both light and dark mode — the icon should inherit the blue primary color.
- [ ] **Step 5: Commit**
```bash
git add apps/web/src/components/layout/app-layout.tsx
git commit -m "feat(branding): show gem icon in app header as default logo"
```
---
### Task 4: Add logo and favicon to VitePress docs site
**Files:**
- Create: `apps/docs/public/favicon.svg`
- Modify: `apps/docs/.vitepress/config.mts`
- [ ] **Step 1: Create `apps/docs/public/` directory and copy the favicon**
```bash
mkdir -p apps/docs/public
cp apps/web/public/favicon.svg apps/docs/public/favicon.svg
```
- [ ] **Step 2: Add favicon `head` entry and logo to `apps/docs/.vitepress/config.mts`**
Replace the existing `head` array:
```ts
head: [
["meta", { name: "theme-color", content: "#3b82f6" }],
["link", { rel: "icon", type: "image/svg+xml", href: "/Stirling-Image/favicon.svg" }],
],
```
Note: The `href` includes the base path `/Stirling-Image/` because VitePress is deployed to GitHub Pages with that base.
- [ ] **Step 3: Verify docs site in dev**
```bash
cd apps/docs && npx vitepress dev
```
Open the docs site in a browser. The tab should show the gem favicon.
- [ ] **Step 4: Commit**
```bash
git add apps/docs/public/favicon.svg apps/docs/.vitepress/config.mts
git commit -m "feat(docs): add gem favicon to VitePress site"
```
---
### Task 5: Generate PNG assets for PWA and social preview
**Files:**
- Create: `apps/web/public/logo-192.png`
- Create: `apps/web/public/logo-512.png`
- Modify: `apps/web/index.html` (add PWA manifest link)
- Create: `apps/web/public/manifest.json`
- [ ] **Step 1: Generate PNG icons from the SVG using Sharp**
Create a one-off script and run it:
```bash
cd /Users/sidd/Desktop/Personal/Projects/Stirling-Image
node -e "
const sharp = require('sharp');
const fs = require('fs');
const svg = fs.readFileSync('apps/web/public/logo-icon.svg');
Promise.all([
sharp(svg).resize(192, 192).png().toFile('apps/web/public/logo-192.png'),
sharp(svg).resize(512, 512).png().toFile('apps/web/public/logo-512.png'),
]).then(() => console.log('PNGs generated'));
"
```
If `require` doesn't work (ESM), use:
```bash
node --input-type=module -e "
import sharp from 'sharp';
import { readFileSync } from 'fs';
const svg = readFileSync('apps/web/public/logo-icon.svg');
await sharp(svg).resize(192, 192).png().toFile('apps/web/public/logo-192.png');
await sharp(svg).resize(512, 512).png().toFile('apps/web/public/logo-512.png');
console.log('PNGs generated');
"
```
- [ ] **Step 2: Create `apps/web/public/manifest.json`**
```json
{
"name": "Stirling Image",
"short_name": "Stirling Image",
"icons": [
{ "src": "/logo-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/logo-512.png", "sizes": "512x512", "type": "image/png" }
],
"theme_color": "#3b82f6",
"background_color": "#ffffff",
"display": "standalone"
}
```
- [ ] **Step 3: Add manifest link to `apps/web/index.html`**
Add after the favicon link in ``:
```html
```
- [ ] **Step 4: Verify PNGs were generated correctly**
```bash
file apps/web/public/logo-192.png apps/web/public/logo-512.png
```
Expected: both should report as PNG image data with correct dimensions.
- [ ] **Step 5: Commit**
```bash
git add apps/web/public/logo-192.png apps/web/public/logo-512.png apps/web/public/manifest.json apps/web/index.html
git commit -m "feat(branding): add PWA manifest and PNG logo assets"
```