registerSpellcheck()'s invoke-handler registration guard checked
ipcMain.eventNames(), which only reflects .on()/.once() listeners --
handlers registered via ipcMain.handle() never show up there, so the
guard was a no-op. With closeToTray disabled (or any other path that
lets the main window actually close instead of hide), a second
createWindow() call would hit "Attempted to register a second handler
for 'spellcheck-get-state'", aborting window setup partway through and
leaving a blank window. Use a real module-level flag instead, matching
the pattern already used for this file's .on() listeners.
This fork has no update feed of its own, so never check fluxer.app
for updates on any platform (Velopack/electron autoUpdater/manual
check flows all pointed at the official API). Forces the fully inert
IPC-only updater path unconditionally; the "Check for Updates" UI
still works, it just reports unsupported instead of hitting the
network.
Trimmed monorepo checkout (fluxer_desktop + packages/voice_engine_v2 +
tools/ci) with a "Connect to a Different Server" menu item and popout
that lets the desktop app switch to any self-hosted Fluxer instance,
plus fixes for well-known discovery on single-domain self-hosted
deployments and a false-positive ERR_ABORTED on same-origin client
redirects during the switch. Defaults to chat.fluxr.chat and uses an
isolated userData directory from the official build.