dripnex.docs
Architecture

IPC Contract

Typed Inter-Process Communication between renderer and main process

IPC Contract

The renderer talks to main only through window.dripnex. Main validates args with Zod before any business logic.

Architecture

Renderer (React)
    ↓ window.dripnex.notes.create()
Preload (contextBridge)
    ↓ ipcRenderer.invoke('notes:create')
Main (defineIpcHandler + Zod)
    ↓ createNoteOperation()
@dripnex/core + SQLiteNoteRepository

Preload API

Namespaces on window.dripnex:

NamespaceOwns
notesCRUD, trash/restore, pin, move, list, search, counts, tags
notebooksHierarchy
dataBackup, export/import, data-folder paths
sync / auth / encryptionOptional E2E sync (not required to take notes)
aiChat, tools, local index
pluginsScan, enable, install, init.js / styles.css
git / integrationsGit notebooks, GitHub, 1Password
settingsCross-window broadcast (API keys never travel this channel)

Main handlers

defineIpcHandler({
  channel: 'notes:create',
  args: z.tuple([z.object({ content: z.string().max(10 * 1024 * 1024) })]),
  handler: input => createNoteOperation(input, noteRepository),
});

There is no syncEngine in sync-core. Push/pull live on desktop SyncService.

Security Rules

RuleDescription
No nodeIntegrationRenderer cannot require Node
contextIsolationPreload is the only bridge
No executeSQLRaw SQL never exposed
Typed channelsZod at the IPC boundary
PluginsTrusted renderer JS. They call PluginContext, not IPC directly

On this page