Your workspace layout no longer disappears
If a plugin wasn’t loaded when Geode started, any pane belonging to it was silently thrown away — and the next time Geode saved your layout, that loss became permanent. Five situations triggered it:
- Updating a plugin. An update is a disable followed by an enable, and the disable half destroyed that plugin’s open panes. A routine update quietly wiped them.
- Disabling and re-enabling a plugin. Same cause; the panes did not come back.
- A slow plugin. If a plugin registered its view a moment after startup, its panes were already gone.
- Recovering from a crash. Recovery starts with no plugins loaded, so restore found nothing to match — and the recovery session then saved that stripped-down layout over your real one, before you ever clicked “Restart with plugins”.
- Graph and Bases tabs. These didn’t survive a restart at all.
Now a pane whose provider isn’t available survives as a labelled placeholder that keeps its position and state, and turns back into the real view the moment the plugin loads. Same tab, same spot, nothing duplicated.
For plugin authors: WorkspaceLeaf.isDeferred and loadIfDeferred() are now available. Note that a placeholder deliberately reports the persisted view type, so getLeavesOfType('your-view')[0].view can return a placeholder rather than your view class — use an instanceof check instead of casting. See docs/spec/03-plugin-api.md.
Full technical rationale in docs/adr/0005-deferred-view-restore.md.
Known limits
- A plugin that calls
detachLeavesOfType in its own onunload still closes its own panes. The guarantee is that Geode won’t destroy them.
- Layout changes made during a crash-recovery session aren’t saved.
- A pane belonging to a plugin you’ve uninstalled stays as a placeholder; there’s no sweep UI yet.
Verification
136 end-to-end tests and 1042 unit tests passing.
Install: builds are unsigned, so macOS Gatekeeper will warn on first launch — see the README’s Install section for the workaround.
Full Changelog: https://github.com/rbcodelabs/geode/compare/v0.7.19...v0.7.20