Skip to content

Let a deployment present its own product name and logo - #2350

Open
JustYannicc wants to merge 1 commit into
UsefulSoftwareCo:v2from
JustYannicc:feat/configurable-branding
Open

JustYannicc wants to merge 1 commit into
UsefulSoftwareCo:v2from
JustYannicc:feat/configurable-branding

Conversation

@JustYannicc

@JustYannicc JustYannicc commented Oct 23, 2026 •

Copy link
Copy Markdown

Hosted deployments can now present their own product name and logo. EXECUTOR_PRODUCT_NAME and EXECUTOR_PRODUCT_LOGO_URL replace Executor's in:

  • page titles and the favicon, and the dashboard mark;
  • sign-in and setup, MCP OAuth consent, and the device and authorize pages;
  • assistant setup guides and fallback pages;
  • Cloud emails, OAuth resource and client metadata;
  • the Better Auth app name, the passkey relying-party name, and the MCP server name clients list.

With neither set, every page, email and response is exactly as before. Copy that can't reach the configured brand keeps Executor's wording.

Under another name, setup guides leave out Executor's plugins and screenshots, which show Executor; Cursor gets a plain MCP settings guide instead. The dashboard drops Executor's Feedback and GitHub links, Cloud drops its support dialog, and Cloud sends no founder welcome email. The built-in app keeps the name Executor, because its slug is what agent instructions use, and shows the configured logo.

Whether you want white-label support at all is your call; I've asked in #2386.

Review guide

  • packages/utils/src/product-brand.ts is the contract: the schema, the settings, and CurrentProductBrand, a context reference that defaults to Executor.
  • Server code reads the reference.
    • Cloud binds the two settings into the API, MCP server and App UI Workers, and provides the reference at isolate start and on each request.
    • Self-host reads the settings where it builds auth, the executor and MCP sessions, and provides the reference around its route handler.
  • Browsers get the brand through the hosted document context into a serializable atom (productBrandAtom), the same path resourceOrigins takes.
    • The document shell renders the favicon from that atom.
    • The Cloud and self-host roots set the server-rendered <title> from a root loader that never reloads, so the browser keeps the name it was served with. Local keeps "Executor · Local".
    • DocumentTitleProvider now appends the product name itself; productTitle is gone.
  • connect.tsx keeps the guide object's indentation; most of that diff is Executor becoming {product} or {server}.

Validation

Ran locally on this head (be415bf, on v2 e015f3d). The default-brand and route scenarios last ran on 5e51315; this rebase only touched the MCP server construction, so the brand and PAT MCP scenarios were rerun here:

  • bun run check passed: format, lint, typecheck, protocols, API errors and the e2e boundary check.
  • On self-host, the new scenario passed, along with route loading, sign-in settings, self-host onboarding and app UI.
  • Default-brand scenarios also passed on self-host: shared authorization, PAT MCP, MCP connections and connected agents (16 tests).

Not verified: the Cloud wiring (Worker bindings, emails, passkey name) has no Cloud E2E run. Managed local Cloud serves every scenario from one Worker, so the scenario is self-host only. The upstream v2 branch has no public CI, and no CI run is attached to this head.

product-brand.spec.ts
route-loading.spec.ts
sign-in-settings.spec.ts
self-host-onboarding.spec.ts
app-ui.spec.ts
shared-authorization.spec.ts
pat-mcp.spec.ts
mcp-connections.spec.ts
connected-agents.spec.ts

🤖 Generated with Claude Code

EXECUTOR_PRODUCT_NAME and EXECUTOR_PRODUCT_LOGO_URL replace Executor's
name and logo in hosted pages, titles and favicon, sign-in and MCP
consent, setup guides, fallback pages, Cloud emails, OAuth resource and
client metadata, Better Auth and passkey names, and the MCP server name.
With neither set, every page, email and response is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JustYannicc
JustYannicc force-pushed the feat/configurable-branding branch from 5e51315 to be415bf Compare October 25, 2026 06:46

This branch has not been deployed

No deployments
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