electron-react

A development guide for building desktop applications with Electron, React, Vite, and TypeScript. Electron lets web technologies run as desktop apps, while IPC is the communication between the app's main and user-interface processes.

In plain words
What is it for?
Use it when creating Electron apps, configuring electron-vite, building React user interfaces, adding preload scripts, or implementing typed IPC communication.
Why use it?
It provides a consistent structure for desktop app code and the boundary between privileged system actions and the interface. This makes setup and communication easier to implement and maintain.

Skill for Claude CodeCodex

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/macromania/agentop/electron-react
Any agent
npx skills add macromania/agentop --skill electron-react
Clone the repo
git clone --depth 1 https://github.com/macromania/agentop

Made for: Claude Code, Codex.

Per session 68 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,944 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00068 $0.01944
Opus 5 $0.00034 $0.00972
Sonnet 5 $0.00014 $0.00389
Haiku 4.5 $0.00007 $0.00194

Measured 2d ago against content hash 6baa8ef82d90, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

electron-react scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.github/skills/electron-react/SKILL.md · 300 lines

How it starts

The opening of the file, as written. The whole thing — 300 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Electron + React Development

Build modern desktop applications with Electron, React, and TypeScript using electron-vite for optimal developer experience.

When to Use This Skill

  • Creating new Electron applications with React
  • Setting up IPC (Inter-Process Communication) between main and renderer
  • Implementing preload scripts with context bridge
  • Configuring electron-vite for development and production builds
  • Building type-safe communication layers

Project Structure

apps/electron/
├── src/
│   ├── main/           # Electron main process
│   │   ├── index.ts    # Entry point, window creation
│   │   └── ipc/        # IPC handlers
│   ├── preload/        # Context bridge scripts
│   │   ├── index.ts    # Exposed APIs
│   │   └── types.d.ts  # TypeScript declarations
│   └── renderer/       # React application
│       ├── index.html
│       ├── main.tsx
│       └── components/
├── electron.vite.config.ts
└── package.json

Core Patterns

Main Process Entry Point

// src/main/index.ts
import { app, BrowserWindow, ipcMain } from 'electron';
import path from 'path';

let mainWindow: BrowserWindow | null = null;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      preload: path.join(__dirname, '../preload/index.js'),
      contextIsolation: true,  // Required for security
      nodeIntegration: false,  // Keep disabled
      sandbox: true,
    },
  });

  // Load the renderer
  if (process.env.NODE_ENV === 'development') {
    mainWindow.loadURL('http://localhost:5173');
    mainWindow.webContents.openDevTools();
  } else {
    mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'));
  }
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

Type-Safe IPC Layer

// packages/core/src/ipc-types.ts
export interface IPCChannels {
  // Request-Response patterns
  'db:tasks:list': { request: void; response: Task[] };
  'db:tasks:create': { request: CreateTaskInput; response: Task };
  'db:tasks:update': { request: UpdateTaskInput; response: Task };
  'db:tasks:delete': { request: string; response: void };
  
  // Streaming patterns (main -> renderer)
  'agent:session:stream': { request: string; response: AgentStep };
}

export type IPCChannel = keyof IPCChannels;

Read the full file on GitHub · 300 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 300 lines · 68 tokens per session scan A 6baa8ef82d90

Subscribe to this mod's changes

electron-react is a skill published in the GitHub repository macromania/agentop (10 stars, last pushed 5mo ago), licensed MIT. It adds 68 tokens to every session and 1,944 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.