Repository navigation
fix(config): let a plugin entry opt out of the extended app's ui - #637
Merged
Merged
Conversation
A plugin entry that extends another app (bos://acct/app#plugins.<id>) attaches that app's app.ui as the plugin ui, so the consumer loads the provider's whole UI on every page. Both core UI containers are named `ui`, so the second remoteEntry overwrites window.ui and the host hydrates with the provider's Hydrate. `ui: false` on the plugin entry now drops the attached ui: accepted by the descriptor and config schemas, kept through the authored <-> config round-trip, and resolution returns no associated ui for the entry.
This was referenced Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Lets a plugin entry set
ui: falseto drop the ui attached from the app it extends.Implements the opt-out proposed in #636. The general fix there, giving each app's core UI container a unique name, is not part of this PR, so #636 stays open.
Why
A plugin entry that extends another app, such as
bos://acct/app#plugins.<id>, gets that app'sapp.uiattached as the plugin ui. The consumer then loads the provider's whole UI on every page. Both core UI containers are namedui, so the secondremoteEntry.jsoverwriteswindow.uiand the host hydrates with the provider'sHydrate.On nearbuilders.org, which uses nostr.nearbuilders.org's plugin, this shows up as
[Hydrate] Failed: Minified React error #527.Changes
ui: falseis accepted on plugin entries in both the descriptor schema (bos.app.ts) and the config schema.toConfigInput/configInputToDescriptor).getEntryAssociatedUiignores the nestedapp.uifallback whenuiisfalse.ui: false, the provider's ui is still attached, and folder-form plugin uis are unaffected.extends-configskill documents the opt-out; patch changeset added.Testing
New tests:
ui: false.ui: falsesurvives the descriptor round-trip.The first two fail without the fix.
everything-devpackage suite: 1633 passed.TMPDIRis on a different filesystem (EXDEVon rename). They fail the same way onmainand pass with a same-deviceTMPDIR.tsc --noEmit, biome and oxlint (type-aware) are clean on the changed files.End to end: a local nearbuilders.org v2 linked to this build, with
ui: falseonplugins.nostr.BOS_MAP_ALLOW_UNRESOLVED.uicontainer and the auth ui./,/projects,/builders,/eventsand/activity, with no dev:ssr SSR session resolution returns null — authed routes 307 to /login despite a valid session #527.