Skip to content

feat: first-class app icon and manifest files, placeholder scaffold icon - #1588

Merged
vivek7405 merged 1 commit into
mainfrom
feat/app-icon-convention
Oct 7, 2026
Merged

vivek7405 merged 1 commit into
mainfrom
feat/app-icon-convention

Conversation

@vivek7405

Copy link
Copy Markdown
Collaborator

Every app made with webjs create served the WebJs brand mark as its favicon (public/favicon.svg via metadata.icons), so apps built on WebJs looked like WebJs demos in every tab.

  • Static app-root files: app/icon.svg|png|ico, app/apple-icon.png, app/favicon.ico, app/manifest.webmanifest|json are served at their own names and auto-linked into <head> with type and real pixel sizes (PNG IHDR; any for SVG). Raster before SVG; a static icon wins the link over an icon.ts route; metadata.icons still suppresses all.
  • The manifest (file or manifest.ts route) is auto-linked; metadata.manifest wins, manifest: null opts out.
  • /favicon.ico falls back to app/favicon.ico, then the app icon (raster first, then the route).
  • Scaffold: a neutral, marked placeholder app/icon.svg (grey tile, dashed frame, data-webjs-placeholder) and app/manifest.webmanifest with the app's name; the WebJs-branded public/favicon.svg and the layout's metadata.icons are gone.
  • webjs doctor APP_ICON warns while the placeholder (or the old brand mark) is still the favicon.
  • Skill, AGENTS.md, README, docs site (metadata routes, configuration) tell agents to replace the placeholder with an app-specific icon.

Tests: ssr head unit tests, the cross-runtime metadata-icon proof (node + bun), doctor, scaffold integration. Pre-existing failures on main (differential-elision, three bun listener tests) are unrelated.

https://claude.ai/code/session_01SZ72LSPAo4NvYvBDSD6RLo

Every app scaffolded by webjs create served the WebJs brand mark as its
favicon (public/favicon.svg declared through metadata.icons), so apps
built on it looked like WebJs demos in every tab. Static app-root files
now carry the icon: app/icon.svg|png|ico, app/apple-icon.png,
app/favicon.ico and app/manifest.webmanifest|json are served at their
own names, auto-linked into <head> with type and real pixel sizes, and
/favicon.ico falls back to the app icon. The manifest route or file is
linked too. The scaffold ships a neutral, marked placeholder icon plus a
manifest with the app's name, and webjs doctor (APP_ICON) warns until
the placeholder or the old brand mark is replaced.

Claude-Session: https://claude.ai/code/session_01SZ72LSPAo4NvYvBDSD6RLo
@pilots-run

pilots-run Bot commented Oct 7, 2026

Copy link
Copy Markdown

Preview for 4da97ab was not built: compose file has unsupported keys

Next: fix the listed keys in the compose file

@vivek7405
vivek7405 merged commit a605709 into main Oct 7, 2026
8 of 11 checks passed
@vivek7405
vivek7405 deleted the feat/app-icon-convention branch October 7, 2026 12:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant