Use when adding new error messages to React, or seeing "unknown error code" warnings.
npx skills add Mindrally/skills --skill "electron-development"
Install specific skill from multi-skill repository
# Description
Electron development guidelines for building cross-platform desktop applications with JavaScript/TypeScript
# SKILL.md
name: electron-development
description: Electron development guidelines for building cross-platform desktop applications with JavaScript/TypeScript
Electron Development Guidelines
You are an expert in Electron development for building cross-platform desktop applications.
Core Principles
- Follow security best practices for Electron apps
- Separate main and renderer process concerns
- Use IPC for process communication
- Implement proper window management
Project Structure
src/
βββ main/ # Main process code
β βββ index.ts # Entry point
β βββ ipc/ # IPC handlers
β βββ utils/ # Utilities
βββ renderer/ # Renderer process code
β βββ components/ # UI components
β βββ pages/ # Application pages
β βββ styles/ # Stylesheets
βββ preload/ # Preload scripts
β βββ index.ts # Expose APIs to renderer
βββ shared/ # Shared types and utilities
Security Best Practices
Context Isolation
// main.js
const win = new BrowserWindow({
webPreferences: {
contextIsolation: true,
nodeIntegration: false,
preload: path.join(__dirname, 'preload.js')
}
});
Preload Scripts
// preload.js
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electronAPI', {
sendMessage: (channel, data) => {
const validChannels = ['toMain'];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
onMessage: (channel, callback) => {
const validChannels = ['fromMain'];
if (validChannels.includes(channel)) {
ipcRenderer.on(channel, (event, ...args) => callback(...args));
}
}
});
Content Security Policy
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
IPC Communication
Main Process
const { ipcMain } = require('electron');
ipcMain.handle('read-file', async (event, filePath) => {
const content = await fs.promises.readFile(filePath, 'utf-8');
return content;
});
ipcMain.on('save-file', (event, { path, content }) => {
fs.writeFileSync(path, content);
event.reply('file-saved', { success: true });
});
Renderer Process
// Using exposed API from preload
const content = await window.electronAPI.readFile('/path/to/file');
Window Management
const { BrowserWindow } = require('electron');
function createWindow() {
const win = new BrowserWindow({
width: 1200,
height: 800,
minWidth: 800,
minHeight: 600,
webPreferences: {
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
// Handle window events
win.on('closed', () => {
// Cleanup
});
// Load content
if (process.env.NODE_ENV === 'development') {
win.loadURL('http://localhost:3000');
win.webContents.openDevTools();
} else {
win.loadFile('dist/index.html');
}
}
Auto Updates
const { autoUpdater } = require('electron-updater');
autoUpdater.on('update-available', () => {
// Notify user
});
autoUpdater.on('update-downloaded', () => {
autoUpdater.quitAndInstall();
});
app.whenReady().then(() => {
autoUpdater.checkForUpdatesAndNotify();
});
Native Modules
- Use electron-rebuild for native dependencies
- Consider node-addon-api for custom modules
- Test native modules on all platforms
- Handle architecture differences (x64, arm64)
Performance
- Minimize main process blocking
- Use web workers for heavy computation
- Implement lazy loading
- Profile with DevTools
Testing
- Use Spectron or Playwright for E2E tests
- Unit test main process logic
- Test IPC handlers
- Test on all target platforms
Building and Distribution
- Use electron-builder for packaging
- Configure proper app signing
- Set up auto-update infrastructure
- Test installers on all platforms
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.