feat: add favicon (Purple P + gold highlight) (#312)

* feat: add favicon (option 2 — purple P with gold highlight)

Adds the "Purple P + Highlight" favicon across all three Plannotator
servers (plan, review, annotate). The icon is a rounded purple square
with a bold white "P" and a semi-transparent gold stripe through the
middle — typographic, on-brand, and legible at 16px.

Implementation:
- shared-handlers.ts: handleFavicon() serves the inline SVG with a
  1-day cache header, shared by all servers
- index.ts, review.ts, annotate.ts: /favicon.svg route added before
  the SPA catch-all
- apps/hook/index.html, apps/review/index.html: <link rel="icon">
  added pointing to /favicon.svg

SVG favicons are the modern standard and render crisply at all sizes
without a separate .ico file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add favicon to marketing site

Use the same purple P + gold highlight SVG favicon on plannotator.ai.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Michael Ramos <mdramos8@gmail.com>
This commit is contained in:
dgrissen2
2026-03-16 15:45:00 +01:00
committed by GitHub
parent 93c0f035b3
commit 01d807787b
8 changed files with 33 additions and 3 deletions
+4 -1
View File
@@ -12,7 +12,7 @@
import { isRemoteSession, getServerPort } from "./remote";
import { type DiffType, type GitContext, runGitDiff, getFileContentsForDiff, gitAddFile, gitResetFile, parseWorktreeDiffType, validateFilePath } from "./git";
import { getRepoInfo } from "./repo";
import { handleImage, handleUpload, handleAgents, handleServerReady, handleDraftSave, handleDraftLoad, handleDraftDelete, type OpencodeClient } from "./shared-handlers";
import { handleImage, handleUpload, handleAgents, handleServerReady, handleDraftSave, handleDraftLoad, handleDraftDelete, handleFavicon, type OpencodeClient } from "./shared-handlers";
import { contentHash, deleteDraft } from "./draft";
import { createEditorAnnotationHandler } from "./editor-annotations";
@@ -284,6 +284,9 @@ export async function startReviewServer(
}
}
// Favicon
if (url.pathname === "/favicon.svg") return handleFavicon();
// Serve embedded HTML for all other routes (SPA)
return new Response(htmlContent, {
headers: { "Content-Type": "text/html" },