Refactor: rebrand user-visible strings from Liquid Web to Nexcess#175
Refactor: rebrand user-visible strings from Liquid Web to Nexcess#175glaubersilva wants to merge 19 commits into
Conversation
…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.
…nto refctor/SMTNC-1494-rebranding
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.
| (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. |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 😄
| ### 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. |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
One small thing, but then I think we should be good to merge this :)
Thanks for the improved docs!
| /** | ||
| * 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'; |
There was a problem hiding this comment.
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.
harbor/src/Harbor/API/Functions/Global_Function_Registry.php
Lines 126 to 132 in 567d537
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.
|
@d4mation Thanks for the comments. This is ready for a new review! |
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.com→software.nexcess.com) are intentionally deferred until backend redirect/go-live is confirmed with Product/Comms.Branding & UI
nexcess-logo-light.svg) in the Software Manager headerAdmin page slug (dual registration)
nexcess-software-manager(Settings → Nexcess Products)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 LeaderRelated PHP updates: asset enqueue, portal redirect refresh, and license notice suppression now accept both slugs.
Documentation & contributor workflow
CONTRIBUTING.md— primary local workflow via harbor-dev-tools (composer harbor:watch+npm run build/start)docs/guides/partner-plugin-testing.mddocs/guides/testing.md— harbor-dev-tools layout, fixture key guidance (lwsw-unified-basic-2026for UI), canonical + legacy admin URLsdocs/guides/integration.mdandREADME.mdcross-linksTests
Built assets
build/andbuild-dev/frontend bundles to reflect logo and string changesOut of scope (follow-up / separate branch)
Config::DEFAULT_PORTAL_BASE_URLhttps://software.liquidweb.comErrorModal.tsxsoftware.liquidweb.com/support/lw_harbor/*), REST namespace,LWSW-license prefix, DOM/CSSlw-harbor-*— unchangedDo not merge until coordinated with customer comms (Emily Negroni).
Test plan
wp-content/plugins/harborcomposer harbor:watch(harbor-dev-tools) andnpm run build(harbor)?page=nexcess-software-manager: menu Settings → Nexcess Products, Nexcess logo in filter bar, “Manage license in Nexcess” link label?page=lw-software-manager: page loads with same UI (no Settings menu entry for legacy slug)lw_harbor_display_legacy_license_page_notice) shows Nexcess copynpm run test:unit, PHP unit suite, E2E specssoftware.liquidweb.com(expected until URL follow-up)Screenshots
Linear
https://linear.app/nexcess/issue/SMTNC-1494/update-plugin-branding-from-liquid-web-to-nexcess