From 518c042cacbc1df03a981ed70ebd1e90047fcd40 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 16 Oct 2026 13:39:22 -0700 Subject: [PATCH] Put the PNG favicon on an opaque dark tile --- docs/operations.md | 2 +- web/favicon-tile.svg | 18 ++++++++++++++++++ web/favicon.png | Bin 6994 -> 6287 bytes 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 web/favicon-tile.svg diff --git a/docs/operations.md b/docs/operations.md index 5c5a156..7ac4aa1 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -12,7 +12,7 @@ - `internal/codex`: the `codex app-server` JSON-RPC client, with types generated from the CLI's schema by `go generate ./internal/codex` (see `docs/codex-protocol.md`). - `internal/tailscale`: `tailscale serve` for task previews (see "Previews"). - `internal/workflow`: validating workflow definitions and reading and writing their YAML files (see "Workflows"). -- `web/`: the SPA, frameworkless TypeScript compiled file-by-file to ES modules (no bundler). `web/src/*.ts` is the source; `web/src/api.gen.ts` holds types generated from `api/openapi.yaml`, and `web/src/api.ts` is the typed client over them. `go generate ./web` runs `npm ci`, regenerates the types and compiles `web/dist/`, which is committed so `go install` needs no Node. The binary embeds `index.html`, `style.css`, `favicon.svg` (a lead dot in the accent colour with spokes to five task-coloured dots; its colours are copies of the `web/style.css` palette, switching with the light/dark scheme), `favicon.png` (the same icon in its light colours at 180×180, linked as a second icon and as the `apple-touch-icon`, which Orion prefers over the SVG for its tab icon; Orion's icon store (`~/Library/Application Support/Orion/Defaults/website_icons`, kept apart from its cache) keys icons by hostname without the port, so another server on the same hostname can supply byre's tab icon; regenerate it after changing the SVG with `rsvg-convert --width 180 --height 180 --output web/favicon.png web/favicon.svg`), `dist/`, `src/` (for source maps), `fonts/` and `vendor/` (Mermaid, see "Inbox"; xterm.js, see "Terminals"). `byre serve --dev` serves `./web` from disk instead (run from the repo root); pair it with `npm --prefix web exec tsc -- --watch`. +- `web/`: the SPA, frameworkless TypeScript compiled file-by-file to ES modules (no bundler). `web/src/*.ts` is the source; `web/src/api.gen.ts` holds types generated from `api/openapi.yaml`, and `web/src/api.ts` is the typed client over them. `go generate ./web` runs `npm ci`, regenerates the types and compiles `web/dist/`, which is committed so `go install` needs no Node. The binary embeds `index.html`, `style.css`, `favicon.svg` (a lead dot in the accent colour with spokes to five task-coloured dots; its colours are copies of the `web/style.css` palette, switching with the light/dark scheme), `favicon.png` (the same icon in its dark colours on an opaque dark `--surface` square at 180×180, rendered from `web/favicon-tile.svg`, which is not embedded; opaque because Orion puts a transparent icon on a white tile; linked as a second icon and as the `apple-touch-icon`, which Orion prefers over the SVG for its tab icon; Orion's icon store (`~/Library/Application Support/Orion/Defaults/website_icons`, kept apart from its cache) keys icons by hostname without the port, so another server on the same hostname can supply byre's tab icon; `favicon-tile.svg` repeats the shapes and dark colours of `favicon.svg`, so change both together, then regenerate the PNG with `rsvg-convert --width 180 --height 180 --output web/favicon.png web/favicon-tile.svg`), `dist/`, `src/` (for source maps), `fonts/` and `vendor/` (Mermaid, see "Inbox"; xterm.js, see "Terminals"). `byre serve --dev` serves `./web` from disk instead (run from the repo root); pair it with `npm --prefix web exec tsc -- --watch`. ## Data diff --git a/web/favicon-tile.svg b/web/favicon-tile.svg new file mode 100644 index 0000000..74de132 --- /dev/null +++ b/web/favicon-tile.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/web/favicon.png b/web/favicon.png index 272984745bc4bd4ba0307013796a1adf6b9680f9..92f1c966bec66c034f3c907295414c8430472210 100644 GIT binary patch literal 6287 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