Skip to content

v0.7.20

Choose a tag to compare

@github-actions github-actions released this 28 Aug 12:25
· 353 commits to main since this release

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: v0.7.19...v0.7.20