From 0c14c99b5a7299449d752712c06dfce1180f49c6 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 16 Oct 2026 13:33:34 -0700 Subject: [PATCH] favicon --- docs/operations.md | 2 +- web/embed.go | 2 +- web/favicon.png | Bin 0 -> 6994 bytes web/index.html | 2 ++ 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 web/favicon.png diff --git a/docs/operations.md b/docs/operations.md index b4e53d5..0073983 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), `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 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`. ## Data diff --git a/web/embed.go b/web/embed.go index 71b44f2..8e704d5 100644 --- a/web/embed.go +++ b/web/embed.go @@ -5,5 +5,5 @@ import "embed" //go:generate npm ci --silent //go:generate npm run --silent generate -//go:embed index.html style.css favicon.svg dist src fonts vendor +//go:embed index.html style.css favicon.svg favicon.png dist src fonts vendor var FS embed.FS diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..272984745bc4bd4ba0307013796a1adf6b9680f9 GIT binary patch literal 6994 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 byre + +