appId: com.beacon.app productName: Beacon artifactName: ${productName}-${version}-${os}-${arch}.${ext} files: - 'out/**/*' - 'package.json' # Files the main process loads by path (`import ... from '...?asset'`, # see src/main/index.ts's taskbar icons). Unpacked, so they are real # files on disk rather than entries inside app.asar. - 'resources/**/*' asarUnpack: - 'resources/**/*' npmRebuild: false # Bundled connect backend (see src/main/index.ts's startConnectServer()) — # built by `npm run package:connect` (connect/packaging/build-binary.py), # which must run before electron-builder does. Like any PyInstaller output, # this is platform/arch-specific — it has to be built *on* whatever # platform/arch you're packaging for, no cross-compiling. extraResources: - from: connect/dist/connect-server to: connect-server filter: - '**/*' # The audio-only ffmpeg the backend runs, built by # scripts/build-ffmpeg.sh (see build/ffmpeg/README.md). Same # platform/arch rule as the backend binary above. Optional on purpose: # a checkout that hasn't built one packages without it, and the backend # falls back to PATH exactly as it did before this existed. - from: build/ffmpeg to: ffmpeg filter: - 'ffmpeg' - 'ffmpeg.exe' # build/icon.png (1024x1024, the mdi-lighthouse-on glyph rendered straight # from @mdi/font's own TTF in the app's primary theme color — same source # as the DefaultLayout.vue/MobileLayout.vue app-bar icon and the web # favicon, just at full resolution instead of downscaled) is the source # every icon here is generated from: build/icons/icon.ico is a real # multi-resolution ICO (16 through 256px), and build/icons/NxN.png are the # freedesktop sizes Linux needs. # # Linux points at the *directory*, not at icon.png, and that distinction is # the whole reason a packaged Linux build shows an icon at all. Handed a # single .png, electron-builder ships exactly that one file at exactly its # own resolution (see app-builder-lib's iconConverter: "source is already a # .png — return as-is with its dimensions"), which put the only copy in # hicolor/1024x1024/. No spec-conforming icon lookup ever finds it: the # freedesktop hicolor theme declares sizes up to 512x512 and nothing # beyond, so a directory it doesn't know about is skipped entirely, and # every launcher fell back to a generic icon. Handed a directory, the same # converter collects every NxN.png in it — icon.ico is ignored, its name # doesn't match — and each one lands in the hicolor size it belongs to. win: icon: build/icons/icon.ico target: - target: nsis arch: - x64 - arm64 nsis: allowToChangeInstallationDirectory: true oneClick: false shortcutName: ${productName} uninstallDisplayName: ${productName} createDesktopShortcut: always mac: icon: build/icon.png target: # arm64 only: the bundled Connect backend binary is built by PyInstaller # on the (Apple Silicon) CI runner and cannot cross-compile to x64. - target: dmg arch: - arm64 - target: zip arch: - arm64 category: public.app-category.music # Ad-hoc signed ('-'), since there is no Apple Developer ID. `null` (no # signature at all) is not an option: electron-builder rewrites the # bundle after Electron signed it, and on Apple Silicon a downloaded app # with a broken signature is reported as "damaged" with no way to open # it but the terminal (#46). Ad-hoc signed, Gatekeeper still warns, but # System Settings > Privacy & Security offers "Open Anyway". identity: '-' hardenedRuntime: false # Required on macOS 14+ (Sonoma) for the local-network-access permission # prompt to work at all — without it, macOS can't show a proper prompt # for what this app actually needs local network for, and discovery can # silently fail. Beacon genuinely needs this for both casting (mDNS/SSDP # discovery of Sonos/Chromecast/DLNA/AirPlay targets) and Remote Control # (LAN-pairing a phone against this desktop instance). extendInfo: NSLocalNetworkUsageDescription: 'Local network access is required to discover casting devices (Sonos, Chromecast, DLNA, AirPlay) and to pair Remote Control with your phone.' linux: # A directory, deliberately — see the icon comment above. icon: build/icons target: - AppImage - deb - tar.xz category: AudioVideo;Audio;Player artifactName: ${productName}-${os}-${arch}.${ext} # Without this, desktop environments can't reliably associate a running # window with this .desktop entry (taskbar grouping/icon pinning) — the # runtime WM_CLASS wouldn't match the shipped .desktop file's name # (package.json's own top-level `desktopName`, not a linux.* option — # see https://www.electron.build/linux#window-association-desktopname--syncdesktopname). # This makes Electron itself report that exact name at runtime instead # of falling back to a generic/mismatched one. syncDesktopName: true # Auto-updates (see src/main/index.ts's checkForUpdates()) target this # repo's own GitHub releases — electron-updater reads this at runtime via # the app-update.yml electron-builder bakes into the packaged app. publish: provider: github owner: mihaitom repo: beacon channel: latest