Skip to content

Refactor: rebrand user-visible strings from Liquid Web to Nexcess#175

Open
glaubersilva wants to merge 19 commits into
mainfrom
refctor/SMTNC-1494-rebranding
Open

Refactor: rebrand user-visible strings from Liquid Web to Nexcess#175
glaubersilva wants to merge 19 commits into
mainfrom
refctor/SMTNC-1494-rebranding

Conversation

@glaubersilva

@glaubersilva glaubersilva commented Jun 19, 2026

Copy link
Copy Markdown

Summary

Rebrand Harbor user-visible branding
from Liquid Web to Nexcess (SMTNC-1494).

This is the strings-and-UX pass only. Portal URLs (software.liquidweb.comsoftware.nexcess.com) are intentionally deferred until backend redirect/go-live is confirmed with Product/Comms.

Branding & UI

  • Rename admin menu and page titles: Liquid Web ProductsNexcess Products, Liquid Web Software ManagerNexcess Software Manager
  • Update React UI copy (welcome shell, filter bar, license sidebar, error messages)
  • Replace Liquid Web logo with Nexcess logo (nexcess-logo-light.svg) in the Software Manager header
  • Update legacy license page notices and partner submenu titles to Nexcess wording

Admin page slug (dual registration)

  • Canonical slug: nexcess-software-manager (Settings → Nexcess Products)
  • Legacy alias: lw-software-manager — permanently registered as a hidden page (no menu entry) so bookmarks and Leader mid-session transitions keep working when an older Harbor instance becomes Leader

Related PHP updates: asset enqueue, portal redirect refresh, and license notice suppression now accept both slugs.

Documentation & contributor workflow

  • Add CONTRIBUTING.md — primary local workflow via harbor-dev-tools (composer harbor:watch + npm run build/start)
  • Extract advanced partner-plugin path-repo setup into docs/guides/partner-plugin-testing.md
  • Update docs/guides/testing.md — harbor-dev-tools layout, fixture key guidance (lwsw-unified-basic-2026 for UI), canonical + legacy admin URLs
  • Update docs/guides/integration.md and README.md cross-links

Tests

  • E2E: Nexcess menu label, canonical slug, new legacy-slug smoke test
  • JS unit: WelcomeShell / AppLoader subtitle, activation-url redirect param, license error messages
  • PHP unit: dual slug registration, legacy hidden page, portal refresh on legacy slug, legacy notice copy

Built assets

  • Rebuilt build/ and build-dev/ frontend bundles to reflect logo and string changes

Out of scope (follow-up / separate branch)

Item Notes
Config::DEFAULT_PORTAL_BASE_URL Still https://software.liquidweb.com
Hardcoded support URL in ErrorModal.tsx Still points at software.liquidweb.com/support/
Technical identifiers Namespaces, hooks (lw_harbor/*), REST namespace, LWSW- license prefix, DOM/CSS lw-harbor-* — unchanged

Do not merge until coordinated with customer comms (Emily Negroni).


Test plan

  • Local setup with harbor-dev-tools + Harbor clone at wp-content/plugins/harbor
  • Run composer harbor:watch (harbor-dev-tools) and npm run build (harbor)
  • Welcome gate (no license): subtitle shows Nexcess; Nexcess logo visible
  • Software Manager at ?page=nexcess-software-manager: menu Settings → Nexcess Products, Nexcess logo in filter bar, “Manage license in Nexcess” link label
  • Legacy slug ?page=lw-software-manager: page loads with same UI (no Settings menu entry for legacy slug)
  • Legacy license notice (lw_harbor_display_legacy_license_page_notice) shows Nexcess copy
  • Automated tests: npm run test:unit, PHP unit suite, E2E specs
  • Confirm portal/subscription links still resolve to software.liquidweb.com (expected until URL follow-up)

Screenshots

image image image

Linear

https://linear.app/nexcess/issue/SMTNC-1494/update-plugin-branding-from-liquid-web-to-nexcess

glaubersilva and others added 2 commits June 19, 2026 15:02
…TNC-1494)

Update all user-facing text, page slugs, and menu labels to Nexcess
branding.

PHP
- Feature_Manager_Page: change PAGE_SLUG to 'nexcess-software-manager'
  and permanently register 'lw-software-manager' as a hidden alias so
  bookmarks and Leader mid-session transitions remain functional after
  the rebrand. Add $page_hook_legacy so assets are enqueued on both
  slugs (fixes blank page when visiting the legacy URL).
- Feature_Manager_Page: update page title to "Nexcess Software Manager"
  and Settings menu label to "Nexcess Products".
- Display_Legacy_License_Page_Notice: update notice body text to
  "Nexcess's software offerings" / "Nexcess Software Manager".
- global-functions.php: update docblock for
  lw_harbor_display_legacy_license_page_notice().

React
- FilterBar: update logo alt text and heading.
- WelcomeShell: update brand subtitle.
- LicenseSection: update portal link label to "Manage license in Nexcess".
- harbor-data-context, use-resolvable-select-with-error: update fallback
  error messages.
- store/actions, store/resolvers: update all error strings to
  "Nexcess Software Manager failed to…".

Docs
- Add CONTRIBUTING.md: prerequisites, scripts reference, and a
  step-by-step local-testing workflow for validating Harbor changes
  against a partner plugin via Composer path repository without
  publishing a release.
- Link CONTRIBUTING.md from README.md.
@glaubersilva glaubersilva self-assigned this Jun 19, 2026
@linear

linear Bot commented Jun 19, 2026

Copy link
Copy Markdown

SMTNC-1494

@glaubersilva glaubersilva changed the title refactor: rebrand user-visible strings from Liquid Web to Nexcess (… refactor: rebrand user-visible strings from Liquid Web to Nexcess Jun 19, 2026
@glaubersilva glaubersilva changed the title refactor: rebrand user-visible strings from Liquid Web to Nexcess Refactor: rebrand user-visible strings from Liquid Web to Nexcess Jun 19, 2026
glaubersilva and others added 12 commits June 19, 2026 15:36
Center local development on harbor-dev-tools instead of duplicating its
README, and move the advanced Composer path-repo workflow out of
CONTRIBUTING into docs/guides/partner-plugin-testing.md.
Align JS, PHP, and E2E tests with the new admin page slug, menu label,
user-facing copy, and activation redirect URL after the Liquid Web → Nexcess rebrand.
Rebuild frontend assets after resolving build/ conflicts from main.

Co-authored-by: Cursor <cursoragent@cursor.com>
Use empty parent slug for hidden legacy admin page (PHPStan), align
CONTRIBUTING prerequisites table, and add doc tooling terms to cspell.
Center day-to-day setup on harbor-dev-tools (PHP and UI), clarify the
plugins directory layout, and drop duplicated sections in favor of the
documentation index.
Replace the outdated sample-plugin fixture guide with harbor-dev-tools setup,
update integration guide Nexcess copy, rebrand the partner submenu label, and
add PHP/E2E tests for the lw-software-manager alias.
@glaubersilva glaubersilva marked this pull request as ready for review June 30, 2026 17:12
Comment on lines +6 to +7
(see [CONTRIBUTING.md](../../CONTRIBUTING.md) or the [harbor-dev-tools README](https://github.com/stellarwp/harbor-dev-tools/blob/main/README.md)). Use the path repository workflow below only
when you must test **local changes** inside a real partner plugin.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we should include an example case of when you'd need to test them inside a real partner plugin. Because I've yet to come across the need for this personally 😅 The way the "Leader" system works using Harbor Dev Tools has always been enough for me. But I think maybe @jonwaldstein has had a need to do something similar to this.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I created it is that I spent some time doing this setup before discovering harbor-dev-tools, so I kept this guide just in case other developers need to do something similar in the future for some reason. Since I alredy spent some Claude Code tokens on it, others do not need to spend more if we keep it here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey guys, most of the time harbor-dev-tools does the job but there have been cases where I needed to bundle harbor in our real plugins locally to test specific scenarios like the last leader notice that happens in the UI because of their relationship with other add-ons. It's really tedius when Strauss is involved and is not recommended unless you have to lol 😄

Comment thread docs/guides/partner-plugin-testing.md Outdated
Comment on lines +109 to +112
### Docker / Lando

The Composer command runs inside a container that only mounts the partner plugin's site
directory. The Harbor checkout is not visible inside the container by default.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems hyper-specific to a certain workflow. When would you need to do this in favor of a less complex solution? Is this specific to a certain brand's suggested local environment configuration?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this Docker / Lando section is specific to those who are using Lando to work on a specific brand, and it can be basically any brand if you are using Lando to create local sites for all of them, like I'm doing these days.

@d4mation d4mation Jun 30, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, but when would you need to run these commands, specifically? I use Lando and haven't needed to do this. I mount Harbor Dev Tools+the Partner Plugin I'm working on as volumes and then Harbor just exists on my machine.

When running Harbor Dev Tools' Watch command (or any other composer command) on my machine, it would naturally just sync into the Lando container via its volume mount.

It looks like you're wanting to run everything within Lando's container (which is definitely good to ensure that we're all using identical tooling/versions/etc.) but then maybe we should ship Harbor with a dedicated Lando environment for that instead. Then when testing with a Partner Plugin, it becomes a wholly Harbor concern with Harbor's local environment. Then when developing for things that are not Harbor-related, a developer could choose whatever environment they would like.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, now I get it. The doc was confusing on that point.

These steps are only necessary when testing with Harbor outside the site root, like the path I was using when setting this up: ~/Dev/libs/harbor.

I've updated the doc to make that clearer: df3682c

Thanks for questioning that, and let me know if there is something else.

@d4mation d4mation left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One small thing, but then I think we should be good to merge this :)

Thanks for the improved docs!

Comment on lines +30 to +36
/**
* Legacy admin page slug kept permanently registered so bookmarks and
* Leader mid-session transitions remain functional after the rebrand.
*
* @since TBD
*/
public const PAGE_SLUG_LEGACY = 'lw-software-manager';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this to be public? Is there a case when any third party code would reasonably want to reference the legacy page slug manually?

We only have this fallback for edge cases when options-general.php?page=lw-software-manager may have been hardcoded somewhere instead of lw_harbor_get_license_page_url() or lw_harbor_register_submenu() being used as-expected.

Feature_Manager_Page::PAGE_SLUG is used by lw_harbor_get_license_page_url() directly so any callers will automatically see this change, and lw_harbor_register_submenu() uses it in the background when registering itself as a submenu for something like Kadence, Give, etc.

\_lw_harbor_global_function_registry(
'lw_harbor_get_license_page_url',
$version,
static function (): string {
return admin_url( 'options-general.php?page=' . Feature_Manager_Page::PAGE_SLUG );
}
);

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it makes sense! Resolved in 6658689

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also in 725511a and 85bf45c

Add `is_known_page_slug()` static helper to Feature_Manager_Page that
tests both canonical and legacy slugs in one place. Update
License_Notice_Handler to call the new method instead of duplicating
the slug comparison logic.
@glaubersilva

Copy link
Copy Markdown
Author

@d4mation Thanks for the comments. This is ready for a new review!

@glaubersilva glaubersilva requested a review from d4mation July 7, 2026 23:24
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.

3 participants