--- name: desktop-electron-expert description: "Expert guide for Electron 33+ desktop application development — Electron Forge, context isolation, IPC security, native menus, auto-updates, and multi-window management / Panduan ahli pengembangan desktop Electron 33+." author: "Roedy Rustam" version: "4.4.2" --- # Desktop Electron Application Expert (Electron 33+ Security Standard) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Description Production guide for engineering secure, high-performance cross-platform desktop applications using Electron 33+. Covers strictly isolated IPC communication via `contextBridge`, mandatory Context Isolation and Sandbox execution modes, native OS shell integrations (system tray, desktop notifications, global shortcuts), automated delta updates with `electron-updater`, multi-platform packaging via Electron Forge or electron-builder, and zero-trust renderer security policies (CSP, `nodeIntegration: false`). ### Trigger Conditions - Developing desktop software for macOS, Windows, and Linux using React, Vue, or Next.js static exports. - Hardening Electron application security to prevent Remote Code Execution (RCE) via IPC or XSS vulnerabilities. - Configuring automatic background software updates and code-signing pipelines (Apple Notarization & Windows EV Authenticode). - Implementing multi-window managers and native operating system menus. ### Core Security & Process Isolation Architecture ``` ┌────────────────────────────────────────────────────────┐ │ 1. MAIN PROCESS (Node.js Environment) │ │ Direct OS access, window lifecycle, file system │ └───────────────────────────┬────────────────────────────┘ │ ipcMain.handle() ▼ ┌────────────────────────────────────────────────────────┐ │ 2. PRELOAD SCRIPT (Secure Bridge) │ │ `contextBridge.exposeInMainWorld('electronAPI', ...)`│ └───────────────────────────┬────────────────────────────┘ │ window.electronAPI ▼ ┌────────────────────────────────────────────────────────┐ │ 3. RENDERER PROCESS (Chromium Sandbox) │ │ Pure UI: React 19 / Vite. Zero direct Node.js access │ └────────────────────────────────────────────────────────┘ ``` ### Production Security Configuration (`main.ts`) ```typescript // src/main/index.ts import { app, BrowserWindow, ipcMain } from 'electron'; import path from 'node:path'; let mainWindow: BrowserWindow | null = null; function createSecureWindow() { mainWindow = new BrowserWindow({ width: 1280, height: 800, webPreferences: { preload: path.join(__dirname, '../preload/index.js'), contextIsolation: true, // MANDATORY: Isolates preload from page JS nodeIntegration: false, // MANDATORY: Prohibits Node.js in renderer sandbox: true, // MANDATORY: Enables OS-level sandbox webSecurity: true, // MANDATORY: Enforces Same-Origin Policy allowRunningInsecureContent: false, }, }); // Strict Content Security Policy (CSP) header enforcement mainWindow.webContents.session.webRequest.onHeadersReceived((details, callback) => { callback({ responseHeaders: { ...details.responseHeaders, 'Content-Security-Policy': ["default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"], }, }); }); if (process.env.NODE_ENV === 'development') { mainWindow.loadURL('http://localhost:5173'); } else { mainWindow.loadFile(path.join(__dirname, '../renderer/index.html')); } } app.whenReady().then(() => { createSecureWindow(); // Type-Safe IPC Handlers ipcMain.handle('app:get-version', () => app.getVersion()); ipcMain.handle('system:notify', (_event, title: string, body: string) => { // Validate inputs strictly before triggering OS dialogs return { status: 'delivered', title }; }); }); ``` ### Type-Safe Preload Script (`preload.ts`) ```typescript // src/preload/index.ts import { contextBridge, ipcRenderer } from 'electron'; export interface DesktopBridge { getAppVersion: () => Promise; sendNotification: (title: string, body: string) => Promise<{ status: string }>; } const desktopAPI: DesktopBridge = { getAppVersion: () => ipcRenderer.invoke('app:get-version'), sendNotification: (title, body) => ipcRenderer.invoke('system:notify', title, body), }; contextBridge.exposeInMainWorld('desktopAPI', desktopAPI); ``` ## Orchestration & Integration - **`design-system-architect`**: Desktop window chrome, custom titlebars, and native OS theming. - **`ui-ux-pro-max`**: Desktop ergonomics, keyboard accelerators, and system tray popover layouts. - **`visual-ui-auditor`**: Multimodal vision auditing of desktop application windows. - **`anti-slop`**: Anti-slop desktop UI craft, zero generic web-looking fake desktop windows. - **`tauri-expert`**: Provides architectural comparison (Electron's ecosystem matureness vs. Tauri's low memory footprint). - **`senior-frontend`**: Structures the React 19 UI running inside the sandboxed renderer window. - **`ci-cd-devops-architect`**: Configures GitHub Actions for macOS notarization and Windows code signing. - **`error-resilience-expert`**: Catches unhandled exceptions in the Main process and handles renderer crashes gracefully. ### Sovereign Execution, Token Efficiency & Invariants | Dimension | Sovereign Mandate & Deterministic Contract | | :--- | :--- | | **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) | | **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out | | **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec desktop-electron-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` | --- --- ## Bahasa Indonesia ### Integrasi Orkestrasi Terhubung dan mengorkestrasi bersama `design-system-architect`, `ui-ux-pro-max`, `visual-ui-auditor`, `anti-slop`, `tauri-expert`, `senior-frontend`, `ci-cd-devops-architect`, dan `error-resilience-expert`. ### Deskripsi Panduan produksi untuk membangun aplikasi desktop cross-platform yang aman dan efisien menggunakan Electron 33+. Mengutamakan keamanan IPC dengan Context Isolation, isolasi proses renderer berbasis sandbox, integrasi sistem operasi natif (system tray, menu bar, notifikasi desktop), pembaruan otomatis (*auto-updates*), dan packaging multi-OS (Windows .exe, macOS .dmg/.app, Linux .AppImage). ### Kondisi Pemicu - Membangun aplikasi desktop menggunakan teknologi web (React, Vue, Vite, Tailwind CSS). - Memperketat keamanan Electron untuk mencegah kerentanan eksekusi kode jarak jauh (*Remote Code Execution* / RCE). - Menerapkan komunikasi antarmuka (Renderer) ke sistem file (Main) secara type-safe via `contextBridge`. - Menyiapkan alur pembaruan otomatis (*auto-updater*) tanpa mengganggu pengalaman pengguna. ### Pola Konsumsi API di Komponen React Renderer ```tsx // src/renderer/components/SystemInfoCard.tsx import { useEffect, useState } from 'react'; declare global { interface Window { desktopAPI: { getAppVersion: () => Promise; sendNotification: (title: string, body: string) => Promise<{ status: string }>; }; } } export function SystemInfoCard() { const [version, setVersion] = useState('Memuat...'); useEffect(() => { window.desktopAPI.getAppVersion().then(setVersion); }, []); const handleNotify = () => { window.desktopAPI.sendNotification('Vibes Desktop', 'Pembaruan aplikasi siap dipasang.'); }; return (

Informasi Aplikasi Desktop

Versi Terpasang: {version}

); } ``` ### 3 Hukum Keamanan Mutlak Electron 1. **Wajib Context Isolation**: `contextIsolation: true` wajib aktif agar skrip halaman web tidak dapat mengakses atau memodifikasi objek internal Node.js di preload script. 2. **Matikan nodeIntegration di Renderer**: `nodeIntegration: false` mutlak ditegakkan. Renderer dilarang mengimpor modul `fs`, `child_process`, atau `crypto` secara langsung. 3. **Sandbox Chromium Aktif**: Selalu nyalakan `sandbox: true` untuk membatasi akses proses renderer ke tingkat kernel sistem operasi. ## Integrasi Orkestrasi - **`design-system-architect`**: Frame jendela desktop kustom, titlebar native, dan theming OS. - **`ui-ux-pro-max`**: Ergonomi desktop, pintasan keyboard, dan tata letak popover system tray. - **`visual-ui-auditor`**: Audit visual multimodal untuk jendela aplikasi desktop yang dirender. - **`anti-slop`**: Desain UI desktop anti-slop, mengeliminasi mockup browser palsu di window desktop. - **`tauri-expert`**: Menjadi acuan pembanding jika pengguna mempertimbangkan framework alternatif berbasis Rust. - **`senior-frontend`**: Menyediakan arsitektur komponen UI yang responsif di dalam window aplikasi. - **`ci-cd-devops-architect`**: Menangani penandatanganan sertifikat digital (*code signing*) pada pipeline rilis. - **`error-resilience-expert`**: Mencegah aplikasi tertutup tiba-tiba (*crash*) saat terjadi unhandled error di Main process. ### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian | Dimensi | Mandat Berdaulat & Kontrak Deterministik | | :--- | :--- | | **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) | | **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out | | **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec desktop-electron-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |