Repository navigation
Build-time branding parameters for MSPs running their own branded service (Phase 1: MSI Manufacturer + service display names; Phase 2: OS-language i18n + Helper titles and windows) #7567
Replies: 5 comments 1 reply
|
Thanks @fabicarvano. The identifiers you chose to leave alone are the right ones, and I'd take Phase 1 as a spec, with a few corrections first. Verified: Corrections:
Constraints the spec should state:
With those folded in, a Phase 1 spec PR is welcome. |
|
Hi Todd — before continuing the Phase 2 implementation, I did a fresh review comparing the approved #8277 spec with the current state of Phase 1 (#7841 / #8061) still looks valid and I don't think it needs to change. Likewise, native icons/resources remain outside Phase 2 and can stay as a separate future piece of work, as already defined. The question is specifically about how we should continue Phase 2 — Agent localization + Helper runtime branding. The product decisions in #8277 still look valid, including OD1–OD5, but the technical baseline has changed substantially since the spec was approved. There is also an older uncommitted Phase 2 implementation, but it is currently 282 commits behind Before preparing the updated Phase 2 development plan, which approach would you prefer?
My preference would be option 1, because it preserves all of the previously approved decisions without changing Phase 1 or pulling the future native icons/resources work into scope, while making it explicit that some of the older implementation assumptions should no longer be dispatched directly. I would keep #6365 closed as completed and use the new document only to organize the continuation of Phase 2. |
|
Option 2, with one adjustment. #8277 stays the approved Phase 2 spec; OD1–OD5 are product decisions and nothing on main changes them. What moved is the implementation surface, and that belongs in a plan, not a second spec. Write one plan under To close the loop on §13 of the spec, so the plan can start from recorded decisions: Icons and native assets stay deferred, as you have it. |
|
Thanks Todd. I followed Option 2 and the adjustment you outlined. What was requested
What was done
The plan is committed as |
|
@fabicarvano Thanks, that's the shape I asked for. One step left: the plan is only on your fork branch, so there's nothing to review against yet. Next: open a PR from Status: waiting on the PR. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Category: Ideas
Context
Many MSPs want to operate a managed service under their own brand on top of Breeze, while maintaining their own operations, support, and customer relationship. Self-hosting together with
selfhost-signing-templatealready covers an important part of this: the MSP signs official builds with its own identity and distributes updates from its own release source. The documentation currently describes a full rebrand as a fork-based path.There is, however, a middle ground that does not require maintaining a fork. Some user-visible strings and visual elements are hardcoded in places where the repository already parameterizes similar values.
Today, showing the MSP's identity in package metadata, executable properties,
services.msc, and Helper/Viewer visual assets requires modifying source code or assets on every release, which most MSPs are not equipped to maintain.A second motivation is branding persistence across updates. If branding is expressed as build parameters and build assets rather than manual source patches, the same identity can be reproduced for every new upstream Breeze release.
An MSP could therefore build version N and version N+1 with the same branding profile and use the existing update mechanism between them, without having to re-apply local changes after every release.
The intent is not to introduce per-organization branding at runtime. Branding would belong to the self-hosted distribution/instance, so every organization managed by that instance would receive the same agent identity.
Prior art in the repository
build-msi.ps1 -Editionalready passesProductName,UpgradeCode, andOtherUpgradeCodeto WiX through-d.hostpolicy.allowedHostsis already injected throughldflags.go-winres simplyis already centralized inagent/Makefileandrelease.yml.Phase 1 — deliberately small
Add optional build parameters and assets whose defaults reproduce the current behavior exactly.
Manufacturerinbreeze.wxs, currently hardcoded as"Breeze RMM", and the packageDescription, exposed throughbuild-msi.ps1.DisplayNameandDescriptioninbreeze.wxs, for both the agent and watchdog.go-winresparameters so the.exefile properties remain consistent with the rest of the branding.These values and assets would become part of the generated artifact.
This would allow a self-hosted build/signing pipeline to apply the same visual identity whenever a new Breeze version is consumed, instead of modifying the installed agent or maintaining local patches.
The branding configuration could be supplied to the pipeline through build parameters, environment variables, or a configuration file, depending on the approach preferred by the maintainers.
Conceptually:
When no custom branding configuration is provided, the output should remain the current Breeze output.
Phase 2 — only if Phase 1 is welcome
OS-language i18n: adopt the project's internationalization pattern for user-facing Helper strings, detecting the operating system language and using English as the fallback.
This would allow end users to see the Helper in their own language without requiring MSPs to maintain translation patches in source code.
Helper titles and windows: make the display name used in Helper titles and windows configurable at build time. Today this includes literals such as
"Breeze Helper"and"Welcome to Breeze Helper"inApp.tsxandAppShell.tsx. The same build-time identity introduced in Phase 1 could be reused.Out of scope for the initial phases
Anything that the agent, API, or updater uses as an identifier would remain unchanged in the initial phases:
BreezeAgent;com.breeze.*labels;ProductName;productName.Some of these values cannot currently be changed independently without affecting other components.
For example,
ProductNameparticipates in agent self-inventory normalization throughisBreezeAgentProductName, and the agent locates the Helper usinghelperDisplayNameand its installation path.For this reason, the initial phases would change only visual identity, metadata, and user-facing text, without changing identifiers that participate in operational behavior.
There would be no API, route, or protocol changes, so existing fleets would remain unaffected.
These identifiers are deliberately excluded from the initial phases because some of them participate directly in upgrade behavior, inventory normalization, Helper discovery, or operating-system lifecycle behavior.
If there is interest later, a deeper distribution identity could be discussed separately.
Development and signing
Branding and platform signing are separate concerns.
Branding parameters and assets should be usable during development even before an MSP has Windows Code Signing or Apple Developer certificates.
This would make it possible to validate the generated identity and, most importantly, test an upgrade flow such as:
before production certificates are available.
For development and test environments, one possible approach would be an explicit opt-in such as:
This option would only allow unsigned platform artifacts during testing of branded builds.
It should not disable:
Ideally, this option would only be allowed in development/test environments and should fail closed in production.
For example:
While:
The release-manifest trust chain would remain enforced.
Once certificates are available, the same branding pipeline would produce the same artifacts, while the existing
selfhost-signing-templateflow would add the platform signatures for Windows and macOS.Conceptually:
And later:
This keeps the branding implementation independent from the immediate availability of production certificates.
Update invariant
For any branding value or asset supported by a phase, the expected invariant should be:
For example:
This is one of the main advantages over maintaining local patches.
New upstream releases could simply be rebuilt with the same branding configuration instead of restoring the default Breeze values and requiring manual rework.
Possible later phases
If the initial phases are well received, later phases could gradually expand the distribution identity.
These could include:
com.breeze.*labels;These changes should be handled separately because some of these values participate in runtime behavior, update behavior, or operating-system integration.
The longer-term goal could be to support a more complete cross-platform distribution identity across Windows, macOS, and Linux while preserving the existing API, enrollment, and updater protocols.
Offer
I'm happy to implement Phase 1 as a PR following the project's conventions, including tests that ensure that when no branding parameters or assets are provided, the default behavior and output remain unchanged.
Before I do:
ProductName, binary names, installation paths, and service/bundle identifiers?All reactions