# Erpc Communication

> Guides using eRPC (electron-tRPC) for inter-process communication (IPC) between Electron main and renderer processes. Triggered when handling Electron IPC or tRPC-based systems.

- Skill: `matrixages/erpc-communication` (Agent Skill)
- Install (CLI): `npx skillmds@latest add matrixages/erpc-communication`
- Raw SKILL.md: https://api.skillmd.com/api/skills/matrixages/erpc-communication/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: matrixages (https://skillmd.com/u/matrixages)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/matrixages/erpc-communication

---


# eRPC Communication Guide

This skill provides mandatory instructions for implementing type-safe IPC using eRPC in this project.

## 1. Main Process Implementation

- **Route Definition**: Must use the project's provided router utility to define tRPC routes.
- **Handler Initialization**: Must use `createIPCHandler` from `erpc/main` to bind the router to Electron windows.
- **Context Injection**: Should provide necessary instances (e.g., `BrowserWindow` or `Tray`) through `createContext`.

```typescript
// Always initialize createIPCHandler within the app ready lifecycle
import { createIPCHandler } from 'erpc/main'

import { routers } from './rpcs'

createIPCHandler({
	createContext: async () => ({ win: mainWindow, tray: appTray }),
	router: routers,
	windows: [mainWindow]
})
```

## 2. Preload Script Configuration

- **Expose Bridge Interface**: Must call `exposeElectronTRPC()` provided by `erpc/main` in the preload script.
- **Lifecycle**: Should be called inside `process.once('loaded')`.

```typescript
import { exposeElectronTRPC } from 'erpc/main'

process.once('loaded', () => {
	exposeElectronTRPC()
})
```

## 3. Renderer Process Usage

- **Client Creation**: Create tRPC client using `ipcLink` from `erpc/renderer`.
- **Type Safety**: Always import `Router` type from main process to ensure complete end-to-end type safety.

```typescript
import { createTRPCClient } from '@trpc/client'
import { ipcLink } from 'erpc/renderer'

import type { Router } from '@desktop/rpcs' // Import Router type from main process

export const trpc = createTRPCClient<Router>({
	links: [ipcLink()]
})
```

## 4. Routes and Endpoints Best Practices

- **Single Responsibility**: Each route should correspond to a specific service in the main process (e.g., `window`, `file`, `dialog`).
- **Parameter Validation**: It is strictly prohibited to write complex business logic in Router. Router is only responsible for validating input and output parameters; business logic must be delegated to Service (e.g., calling `WindowService.open()`).
- **Type Reference**: For complex object parameters, type definitions must be placed under the `packages/erpc` package and shared between both ends, avoiding direct cross-package imports of entity logic.

