This guide is for the people who deploy, secure, operate, extend, or contribute to Insomnia: platform engineers rolling it out to a team, security reviewers assessing its data-handling, and developers building on or hacking the codebase. It documents Insomnia's architecture, configuration surface, security model, build/release pipeline, internal module structure, and known technical debt — at a depth sufficient to reason about the app without reading the source yourself.
Note
Audience split. The companion User Guide covers using the app and the
insoCLI. This guide covers everything behind that surface: how it is built, how it stores and moves data, and how to operate and extend it.
1. Executive Summary
Insomnia is a cross-platform desktop API client built by Kong (Apache-2.0). It is an Electron application: a Chromium renderer running a React single-page app, paired with a Node.js main process that performs privileged work (native HTTP via libcurl, filesystem access, OAuth browser flows, Git operations). A companion CLI, inso, reuses the same core to run collections, tests, and linting headlessly.
| Attribute | Value |
|---|---|
| Product | Insomnia desktop API client (insomnia package v12.5.1-alpha.0 at this commit) |
| Vendor | Kong, Inc. |
| License | Apache-2.0 |
| Runtime | Electron 41 (Chromium + Node.js), Node >=24 / npm >=11 for development |
| UI stack | React 18, React Router 7 (loaders/actions), React Aria Components, TailwindCSS |
| Networking | @getinsomnia/node-libcurl (native libcurl), undici, ws, @grpc/grpc-js, socket.io-client |
| Local store | NeDB (@seald-io/nedb) embedded NoSQL |
| Repo layout | npm-workspaces monorepo, 8 published/internal packages |
| Companion CLI | inso (insomnia-inso), Commander-based, packaged with @yao-pkg/pkg |
| Source scale | ~1,905 files, ~3.4M source chars at commit bece185 (2026-06-05) |
Architectural one-liner: a renderer SPA holds UI state and the data layer; anything requiring OS or network privilege is delegated to the Electron main process over a typed IPC bridge; the same data/networking core is bundled into a standalone CLI.
2. Architecture
2.1 Process model
┌──────────────────────────────────────────────────────────────┐
│ Electron Main Process (Node.js) │
│ • Window + menu management (window-utils, squirrel-startup) │
│ • Native HTTP via node-libcurl (curlRequest) │
│ • OAuth browser flows (authorizeUserIn{Window,DefaultBrowser})│
│ • Git operations (isomorphic-git, fs-clients) │
│ • Filesystem: secure/insecure read, writeFile, backups │
│ • Spectral ruleset compile/bundle, importers, HAR export │
│ • Plugin install/window, MCP, LLM config │
│ • IPC handler registry (src/main/ipc/main.ts) │
└───────────────▲──────────────────────────────────────────────┘
│ typed IPC bridge (ipcMainHandle / ipcMainOn)
│ exposed to renderer via preload (entry.preload.ts)
┌───────────────┴──────────────────────────────────────────────┐
│ Renderer Process (Chromium) — React SPA │
│ • React Router 7 route tree = the entire feature surface │
│ • NeDB data layer (requests, environments, workspaces, …) │
│ • CodeMirror / Monaco editors for every input field │
│ • Pre-request / after-response scripting sandbox │
│ • Nunjucks template rendering │
└──────────────────────────────────────────────────────────────┘
- Entry points:
packages/insomnia/src/entry.main.ts(main),entry.preload.ts(preload bridge / env injection), and the Vite-served renderer. - IPC bridge:
src/main/ipc/main.tsregisters allipcMainHandle/ipcMainOnchannels. The renderer never touches libcurl, the filesystem, or Git directly — it calls a channel. Aservices.invokechannel multiplexes data-service calls. - Why this matters: the privilege boundary is the IPC surface. Anything a renderer (and therefore a plugin or a malicious response-driven script) can do to the host must pass through a named, typed channel in
main.ts.
2.2 Key IPC channels (the privilege surface)
| Channel | Responsibility |
|---|---|
curlRequest |
Send an HTTP request via native libcurl |
getAuthHeader / getOAuth2Token |
Compute auth headers / fetch & refresh OAuth2 tokens |
authorizeUserInWindow / authorizeUserInDefaultBrowser / onDefaultBrowserOAuthRedirect |
OAuth login flows |
database.* / services.invoke |
Data-model CRUD against NeDB |
secureReadFile / insecureReadFile / writeFile / readDir / readOrCreateDataDir |
Filesystem access |
parseImport |
Convert Postman/OpenAPI/cURL/WSDL/HAR → Insomnia resources |
bundleSpectralRuleset / refreshCompiledRuleset / deleteCompiledRuleset |
OpenAPI lint ruleset compilation |
generateCodeSnippet / getCodeSnippetTargets |
Code generation (httpsnippet) |
exportHarCurrentRequest / exportRequestsHAR / exportWorkspacesHAR |
HAR export |
createPlugin / plugin window channels |
Plugin lifecycle |
backup / restoreBackup |
Local data backup/restore |
writeResponseBodyToFile |
Persist response bodies |
Important
secureReadFileexists alongsideinsecureReadFiledeliberately. The "secure" path enforces constraints;insecure*variants do not. Filesystem reach for scripts and the runner is further bounded by thedataFoldersallow-list (settings, or CLI-f).
2.3 The renderer feature surface (React Router route tree)
Insomnia's feature inventory maps directly onto its React Router route tree (packages/insomnia/src/routes). The major route clusters:
| Route cluster | Feature |
|---|---|
auth.*, auth.{create,validate,reset,clear}-vault-key, auth.update-vault-salt |
Login/logout, account, Vault key lifecycle |
organization.$organizationId.* |
Organizations, members, collaborators, invites, roles, permissions |
…project.$projectId.* |
Projects, project CRUD, move, lint ruleset (refresh/update/delete) |
…workspace.$workspaceId.debug.* |
The Debug screen: request/folder CRUD, send, response history, runner |
…workspace.…spec.* |
Design documents: OpenAPI editing, generate request collection |
…workspace.…test.test-suite.* |
Unit test suites, run-all, test results |
…workspace.…mock-server.* |
Mock servers and mock routes |
…workspace.…environment.* |
Environment CRUD, set-active, set-active-global |
…workspace.…insomnia-sync.* |
Cloud Sync: snapshots, branches, pull/push/restore/rollback/merge |
git.*, git-credentials.*, git-provider.* |
Git Sync: clone/commit/push/fetch/branches/diff/stage |
import.{resources,scan} |
Import pipeline |
…workspace.…{cacert,clientcert}.* |
CA / client certificate management |
…workspace.…mcp.tsx, ai.* |
MCP client + AI features (commit-message/sampling generation) |
onboarding.*, settings.update, organization.$organizationId.storage-rules |
Onboarding, settings, storage policy |
Tip
When auditing or extending Insomnia, start from the route tree. Each
*.tsxroute is a React Router loader/action pair — theactionis the mutation entry point, which is the cleanest place to understand "what does this feature actually do."
2.4 Data layer and models
Data lives in an embedded NeDB database (in-memory with on-disk persistence) plus some localStorage and a file-backed fake-localStorage for window state. The model definitions live in packages/insomnia-data/src/models and are shared by the app and the CLI.
Full model inventory (each is a typed document with init() defaults and a service layer):
ApiSpec, CaCertificate, ClientCertificate, CloudCredential, CookieJar, Environment, GitCredentials, GitRepository, GrpcRequest, GrpcRequestMeta, McpRequest, McpPayload, McpResponse, MockRoute, MockServer, OAuth2Token, Organization, PluginData, Project, ProjectLintRuleset, ProtoDirectory, ProtoFile, Request, RequestGroup, RequestGroupMeta, RequestMeta, RequestVersion, Response, RunnerTestResult, Settings, SocketIORequest/SocketIORequestMeta/SocketIOPayload/SocketIOResponse, Stats, UnitTest, UnitTestResult, UnitTestSuite, UserSession, WebSocketRequest/WebSocketRequestMeta/WebSocketPayload/WebSocketResponse, Workspace, WorkspaceMeta.
Note
The model hierarchy is polymorphic by
parentId— every document points at its parent (request → request-group/workspace → project → organization). De-polymorphizing this database is an explicit roadmap item (see §9).
2.5 Networking
- HTTP/REST is sent by native libcurl (
@getinsomnia/node-libcurl) via thecurlRequestIPC channel — chosen for maximum control and debuggability of TLS, redirects, proxies, and HTTP versions. The full exchange is captured into a timeline (NDJSON), surfaced in the response pane and the CLI--verboseoutput. - gRPC uses
@grpc/grpc-js+@grpc/proto-loader, withgrpc-reflection-jsfor server reflection. - WebSocket uses
ws; Socket.IO usessocket.io-client; GraphQL usesgraphql+codemirror-graphql. - Auth signing is computed in the main process: AWS v4 (
aws4), OAuth 1 (oauth-1.0a), Hawk (hawk), ASAP (httplease-asap), plus basic/bearer/api-key/NTLM.
2.6 Templating and rendering
User input fields support Nunjucks-based template tags ({{ ... }}) resolved by src/common/render.ts and src/templating. Tags include dynamic values (UUID, timestamp, hashing, base64), prompts, and response tags that chain a value from one request into another. liquidjs is also present in the scripting environment.
2.7 Sync architecture
Insomnia has two independent VCS implementations:
- Git Sync (
src/sync/git): a real Git client built on isomorphic-git with a stack of pluggable filesystem clients (mem-client,ne-db-client,routable-fs-client,project-routable-fs-client,fs-client) and an HTTP client. It maps Insomnia documents onto files in your repo and supports clone/commit/push/pull/branch/diff. Providers (src/sync/git/providers) cover GitHub/GitLab via OAuth (CustomProvider,GitRemoteProviderRegistry). - Cloud Sync (
src/main/cloud-sync/core): a bespokeVCSclass with delta/merge logic (3-way merge, content hashing) for Insomnia's cloud backend, exposing branches, snapshots, pull/push/restore/rollback.
Tip
These are genuinely separate code paths. A Git-Sync bug will not live in
cloud-sync/coreand vice-versa. The sync code is acknowledged by the maintainers as among the gnarliest in the repo ("sync code is spaghetti" — §9).
2.8 The inso CLI architecture
inso (packages/insomnia-inso) is Commander.js-based. It imports the renderer's getSendRequestCallbackMemDb (to reuse the database, Nunjucks templating, libcurl networking, and plugin hooks) and insomnia-testing's generate/runTestsCli. Build/packaging:
esbuildtranspilessrc→dist/index.js(CommonJS).bin/insois a shell wrapper pointing atdist/index.js(development).@yao-pkg/pkgproduces a standalonebinaries/insoexecutable (no Node required).
Warning
Per the maintainers' own notes,
insocurrently bundles almost the entire renderer (React components included) and stubs Electron to run in Node. This is a known abstraction problem that limits networking improvements — see the roadmap.
3. Requirements
3.1 End-user runtime
- OS: macOS, Windows, or Linux (64-bit).
- No separate runtime needed — Electron is bundled. The CLI binary is self-contained.
- Native module: the app ships a prebuilt
node-libcurlmatched to its Electron version.
3.2 Developer / build environment
| Requirement | Value |
|---|---|
| Node.js | >=24 (see .nvmrc) |
| npm | >=11 |
| Electron (build) | 41.0.3 |
| node-libcurl | 3.2.2 (electron target 41.0.3, node target 24.14.0) |
| Linux build deps | libfontconfig-dev (Debian/Ubuntu), libcurl-devel (Fedora) |
| Windows secure wrapper | MSYS2 + mingw-w64-ucrt-x86_64-gcc (windres, g++) |
Note
A
flake.nix/shell.nixis provided for a reproducible Nix dev shell.
4. Configuration Mastery
4.1 Settings reference (complete)
Settings are a Settings data-model document (packages/insomnia-data settings.ts). Defaults come from init(). This is the authoritative list.
| Setting | Type | Default | Meaning |
|---|---|---|---|
theme / lightTheme / darkTheme |
string | app defaults | Active / light / dark color theme |
autoDetectColorScheme |
bool | false |
Follow OS light/dark |
autoHideMenuBar |
bool | false |
Hide menu bar (Win/Linux) |
fontInterface / fontMonospace |
string|null | null |
UI / mono font overrides |
fontSize |
number | 13 |
UI font size |
fontVariantLigatures |
bool | false |
Enable ligatures |
editorFontSize |
number | 11 |
Editor font size |
editorIndentSize |
number | 2 |
Editor indent width |
editorIndentWithTabs |
bool | true |
Indent with tabs |
editorKeyMap |
string | default |
default/vim/emacs/sublime |
editorLineWrapping |
bool | true |
Wrap long lines |
enableKeyMapForInlineTextEditors |
bool | false |
Apply keymap to inline editors |
autocompleteDelay |
number (ms) | 1200 |
Autocomplete popup delay |
nunjucksPowerUserMode |
bool | false |
Edit raw template syntax |
showVariableSourceAndValue |
bool | false |
Show variable source + value |
followRedirects |
bool | true |
Follow 3xx |
maxRedirects |
number | 10 |
Redirect cap |
timeout |
number (ms) | 30000 |
Request timeout (0=none) |
preferredHttpVersion |
enum | default |
V1_0/V1_1/V2_0/V2PriorKnowledge/v3/default |
validateSSL |
bool | true |
Verify TLS on requests |
validateAuthSSL |
bool | true |
Verify TLS on auth endpoints |
clearOAuth2SessionOnRestart |
bool | true |
Drop OAuth2 session at startup |
maxHistoryResponses |
number | 20 |
Responses kept per request |
maxTimelineDataSizeKB |
number | 10 |
Timeline capture cap |
filterResponsesByEnv |
bool | false |
Scope response history to env |
disableResponsePreviewLinks |
bool | false |
Disable clickable links in previews |
disableHtmlPreviewJs |
bool | false |
Disable JS in HTML preview |
proxyEnabled |
bool | false |
Use a proxy |
httpProxy / httpsProxy / noProxy |
string | '' |
Proxy configuration |
useBulkHeaderEditor |
bool | false |
Default to bulk header editor |
useBulkParametersEditor |
bool | false |
Default to bulk params editor |
updateAutomatically |
bool | true |
Auto-install updates |
updateChannel |
enum | stable |
stable/beta |
disableUpdateNotification |
bool | false |
Suppress update notices |
enableAnalytics |
bool | true |
Anonymous usage telemetry |
showPasswords |
bool | false |
Reveal masked secrets |
hotKeyRegistry |
map | defaults | Keyboard shortcut bindings |
pluginPath |
string | '' |
Plugin install directory |
pluginConfig |
map | {} |
Per-plugin { disabled } flags |
pluginNodeExtraCerts |
string | '' |
Extra CA certs for plugin Node |
npmRegistryUrl |
string | '' |
Custom npm registry for plugins |
scriptSandboxEnabled |
bool | true |
Run scripts sandboxed |
scriptStrictModeEnabled |
bool | true |
Scripts run in strict mode |
enableVaultInScripts |
bool | false |
Allow scripts to read vault |
saveVaultKeyLocally |
bool | true |
Persist vault key on disk |
saveVaultKeyToOSSecretManager |
bool | true |
Store vault key in OS keychain |
vaultSecretCacheDuration |
number (min) | 30 |
External vault secret cache TTL |
dataFolders |
string[] | [] |
Folders scripts/runner may read/write |
disabledSecurityRules |
string[] | [] |
Disabled security lint rules |
disabledBlockedProperties |
string[] | [] |
Allow specific blocked script properties |
disabledBlockedRoots |
string[] | [] |
Allow specific blocked script roots |
hasKonnectPat |
bool | false |
Konnect PAT present |
forceVerticalLayout |
bool | false |
Force vertical layout (also auto-on under Playwright) |
deviceId |
string|null | null |
Anonymous device id for analytics |
4.2 Environment variables
These configure build/runtime behavior (mostly for the main/preload process and the CLI). They are read via process.env.
| Variable | Where | Purpose |
|---|---|---|
INSOMNIA_DATA_PATH |
main | Override the app data directory |
INSOMNIA_ENV |
constants | Environment label |
INSOMNIA_API_URL, INSOMNIA_AI_URL, INSOMNIA_MOCK_API_URL, INSOMNIA_APP_WEBSITE_URL |
preload | Backend service URLs |
KONNECT_API_URL |
preload | Kong Konnect API endpoint |
INSOMNIA_GITHUB_API_URL, INSOMNIA_GITHUB_REST_API_URL |
preload | GitHub endpoints for Git Sync |
INSOMNIA_GITLAB_CLIENT_ID, INSOMNIA_GITLAB_API_URL, INSOMNIA_GITLAB_REDIRECT_URI |
preload | GitLab OAuth for Git Sync |
OAUTH_REDIRECT_URL, OAUTH_RELAY_URL |
preload | OAuth login relay |
INSOMNIA_SESSION |
preload | Injected session |
INSOMNIA_SECRET_KEY, INSOMNIA_PUBLIC_KEY |
preload | E2EE keypair material |
INSOMNIA_VAULT_KEY, INSOMNIA_VAULT_SALT, INSOMNIA_VAULT_SRP_SECRET |
preload | Vault key material / SRP |
INSOMNIA_SKIP_ONBOARDING |
preload | Skip onboarding |
PORTABLE_EXECUTABLE_DIR |
preload | Windows portable build dir |
HTTP_PROXY/HTTPS_PROXY/NO_PROXY (+ lowercase) |
CLI | Proxy config for inso |
INSO_TELEMETRY_DISABLED |
CLI | Disable inso telemetry |
DEFAULT_APP_NAME |
CLI | App name used to locate data dir |
APPDATA / XDG_DATA_HOME |
CLI/app | Platform data dir roots |
VERSION, BUILD_DATE, NODE_ENV |
build | Version/build stamping |
Caution
INSOMNIA_SECRET_KEY,INSOMNIA_VAULT_KEY,INSOMNIA_VAULT_SALT, andINSOMNIA_VAULT_SRP_SECRETare secret material. Never log them, never bake them into images, and never commit a.envcontaining them.
4.3 The .insorc CLI config
inso loads a cosmiconfig-style config (.insorc, YAML/JSON) from the working/current dir or --config. It carries options (workingDir/ci/verbose/printOptions) and scripts (named inso aliases). See the User Guide §11.8.
4.4 Organization storage rules
Organizations can enforce storage rules (organization-storage-rules.ts, the storage-rules route) — for example mandating Local Vault or Git Sync and forbidding cloud storage for sensitive orgs. Admins use this to set policy centrally.
5. Security
5.1 Data residency — the central security property
Insomnia's defining security feature is per-project storage choice:
- Local Vault keeps everything on disk; nothing leaves the machine.
- Git Sync stores data in your repository — no Insomnia cloud involvement.
- Cloud Sync is opt-in and can be end-to-end encrypted (SRP + keypair material).
- Private Environments are always local regardless of project storage.
For regulated environments, set organization storage rules to forbid cloud storage and require Local Vault or Git Sync.
5.2 Secrets and the Vault
- The Vault encrypts secrets behind a Vault Key. The key may be saved locally (
saveVaultKeyLocally) and/or in the OS secret manager (saveVaultKeyToOSSecretManager). - Vault salt/key/SRP material is injected via env (
INSOMNIA_VAULT_*). - Vault values are not exposed to scripts unless
enableVaultInScriptsis enabled. - External-vault integration caches secrets for
vaultSecretCacheDurationminutes (default 30).
5.3 Script sandboxing
Pre-request/after-response scripts and unit tests run user JavaScript. Controls:
scriptSandboxEnabled(default on) andscriptStrictModeEnabled(default on).disabledBlockedProperties/disabledBlockedRootsare allow-list escape hatches for the script sandbox's blocked globals — they widen the sandbox, so treat any non-empty value as a deliberate risk acceptance.dataFoldersbounds filesystem reach for scripts/runner (CLI-f).
Warning
An after-response script executes code influenced by an external server's response. Combined with a widened sandbox (
disabledBlockedRoots) orenableVaultInScripts, a hostile API could exfiltrate secrets. Keep the sandbox tight andenableVaultInScriptsoff unless required.
5.4 TLS and certificates
validateSSL/validateAuthSSL(both default on) verify server certs. The CLI can disable per-run with--disableCertValidation; never do this against production.- Client certificates (mTLS) and CA certificates are configured per workspace and scoped to a host.
pluginNodeExtraCertsadds CA certs for the plugin Node runtime.
5.5 Windows DLL-hijack mitigation (secure wrapper)
The repo ships a native secure wrapper (packages/insomnia/src/cpp, built via build-secure-wrapper.sh) that uses Windows PROCESS_MITIGATION_POLICY to prefer system paths, mitigating a local DLL search-path hijack (VulDB 295961) where a malicious DLL placed in the install directory (writable by underprivileged users) could be loaded by the Electron app.
5.6 Plugins — trust boundary
Plugins are npm-style code installed into pluginPath with Node access. They are a trust boundary: a plugin can do what the main process can. Vet third-party plugins, pin versions, and use pluginConfig to disable ones you do not need. npmRegistryUrl lets enterprises pin plugins to an internal registry.
5.7 Telemetry
Anonymous analytics (enableAnalytics, default on) is sent via Segment/Customer.io. Disable it app-wide (enableAnalytics=false) or per-CLI (INSO_TELEMETRY_DISABLED=1). The CLI honors the app's analytics setting.
5.8 Accounts, compliance, and reporting
- Account data is stored under ISO 27001 / SOC 2 Type II / ISO 27018 / CSA STAR per Kong's policy.
- Report vulnerabilities to [email removed] (see
SECURITY.md); do not file public issues for security bugs.
6. Build, Package, and Release
6.1 Monorepo layout
npm workspaces, 8 packages:
| Package | Role |
|---|---|
insomnia |
The Electron desktop app (renderer + main) |
insomnia-inso |
The inso CLI |
insomnia-data |
Shared data models, services, DB adapters, common data utils |
insomnia-scripting-environment |
The insomnia scripting object + sandbox helpers |
insomnia-testing |
Test generation + Mocha/Chai test runner used by app and CLI |
insomnia-api |
API fetch utilities (configureFetch) |
insomnia-analytics |
Shared analytics client (Segment) for app + CLI |
insomnia-smoke-test |
Playwright smoke/critical tests + mock servers |
(insomnia-component-docs is a Docusaurus base-component playground, not shipped.)
6.2 Build the app
npm i # install + patch-package + libcurl + verify bundled plugins
npm run dev # renderer (vite) + electron, live reload
npm run dev:autoRestart # also auto-restart main process
# Production build + package
npm run app-build # react-router build + esbuild main entrypoints
npm run app-package # electron-builder per electron-builder.config.js
- The renderer is built with react-router build + Vite; the Electron main entrypoints are bundled with esbuild (
esbuild.entrypoints.ts). - Packaging uses electron-builder (Squirrel/NSIS on Windows). On Windows the secure wrapper must be built separately (
build-secure-wrapper.sh). postinstallrunspatch-package, verifies bundled plugins, and installs the Electron-targeted libcurl.
6.3 Build the CLI
npm run inso-start # esbuild watch
npm run inso-package # build:production + @yao-pkg/pkg → binaries/inso
./packages/insomnia-inso/bin/inso -v
6.4 Validation
npm run lint # ESLint across all workspaces
npm run type-check # react-router typegen + tsc across workspaces
npm test # Vitest across workspaces
Smoke/E2E (Playwright) live in insomnia-smoke-test:
npm run test:smoke:dev # against the dev bundle
npm run test:smoke:build # against the built bundle
npm run test:crit:dev # critical-path suite
Note
Bundling the native libcurl module across Windows/macOS/Linux is the single biggest build-maintenance burden the maintainers call out. One dependency (
apiconnect-wsdl) has an over-restrictive engine ceiling requiring a manual lockfile edit on refresh.
6.5 Updates and channels
Auto-update is handled by electron-updater. Users are on the stable or beta updateChannel. To pin a fleet, ship a managed build and disable updateAutomatically / disableUpdateNotification via a settings policy.
7. Operations
7.1 Where data lives
| Platform | App data directory |
|---|---|
| macOS | ~/Library/Application Support/Insomnia |
| Windows | %APPDATA%\Insomnia (or portable dir) |
| Linux | $XDG_DATA_HOME/Insomnia or ~/.config/Insomnia |
Override with INSOMNIA_DATA_PATH. The CLI resolves the same path (via DEFAULT_APP_NAME).
7.2 Backup and restore
The main process exposes backup / restoreBackup IPC channels (also surfaced as a backup.ts service). For portable backups, export workspaces to YAML or use Git Sync so the canonical copy lives in version control. Back up before clearing caches.
7.3 CI/CD operation
inso is the operational surface for pipelines: lint specs (inso lint spec), run tests (inso run test), run collections (inso run collection), export specs (inso export spec). It exits non-zero on failure. Prefer -w over a locally installed app on build agents, pin a version, and pass --ci. Keep secrets in CI secret stores and inject as environment variables; prefer --includeFullData=redact if you must emit a report.
7.4 Fleet/enterprise rollout checklist
- [ ] Set organization storage rules to match your data-residency policy.
- [ ] Decide on Cloud Sync (E2EE) vs Git Sync vs Local Vault per team.
- [ ] Disable
enableAnalyticsif telemetry is disallowed. - [ ] Pin plugins to an internal
npmRegistryUrl; disable unused plugins. - [ ] Keep
enableVaultInScriptsoff and the script sandbox tight by default. - [ ] Standardize a
.spectral.yamlruleset in repos so app +insolint identically. - [ ] Control updates (
updateChannel,updateAutomatically) for production stability. - [ ] On Windows, ship the build with the secure wrapper to mitigate DLL hijack.
8. Module Reference (developer internals)
packages/insomnia/src is the heart of the app:
| Path | Responsibility |
|---|---|
entry.main.ts / entry.preload.ts |
Electron main entry; preload bridge + env injection |
main/ |
Main-process services: ipc/main.ts (channel registry), network/, git-service.ts, cloud-sync/core (VCS), importers/, mcp/, backup.ts, updates.ts, proxy.ts, secure-read-file.ts, plugin lifecycle |
ui/ |
React SPA: routes/ (feature surface), components/ (editors, modals, sidebar, panes, settings, websockets, socket-io, graph-ql-explorer, mcp), context/, hooks/, worker/ |
common/ |
Cross-process utils: database.ts (NeDB), render.ts (templating), send-request.ts (getSendRequestCallbackMemDb), insomnia-v5.ts + insomnia-schema-migrations/ (import/migrate), bundle-spectral-ruleset.ts, import.ts, constants.ts, private-host.ts, organization-storage-rules.ts |
network/ |
Request execution + auth: network.ts, authentication.ts, certificate.ts, {basic,bearer,api-key}-auth, grpc/, main/network/o-auth-{1,2} |
sync/ |
git/ (isomorphic-git + fs-clients + providers), vcs/, delta/, schemas |
templating/ |
Nunjucks tags + rendering |
plugins/ |
Plugin install/load/context API |
cpp/ |
Windows secure wrapper (DLL-hijack mitigation) |
Supporting packages:
| Path | Responsibility |
|---|---|
insomnia-data/src/models |
Typed data models + init() defaults |
insomnia-data/node-src/services |
Node-side model services (validation, CRUD) |
insomnia-inso/src/cli.ts |
Commander command tree (run/lint/export/script/generate-docs) |
insomnia-inso/src/db |
DB adapters (NeDB, insomnia export, git-repo) + model loaders |
insomnia-scripting-environment/src/objects |
The insomnia scripting object: request, response, environments, variables, cookies, test, execution, auth, urls, send-request, etc. |
insomnia-testing/src |
generate (test-file generation) + run/runTestsCli (Mocha/Chai) |
8.1 Request lifecycle (end to end)
User edits request (CodeMirror fields, {{ tags }})
→ action route resolves & persists the Request model (NeDB)
→ render.ts interpolates Nunjucks tags using active environment/variables
→ pre-request script runs in the sandbox (insomnia.*)
→ main process computes auth header (getAuthHeader / getOAuth2Token)
→ curlRequest (native libcurl) sends; timeline (NDJSON) captured
→ Response model persisted; history trimmed to maxHistoryResponses
→ after-response script runs; unit-test assertions recorded
→ response pane renders body/headers/timeline/timing
The CLI runs the same pipeline headlessly via getSendRequestCallbackMemDb, swapping the UI for stdout reporters.
9. Technical Debt and Roadmap
Straight from the maintainers' DEVELOPMENT.md (verbatim status):
Open debt:
- NeDB is unmaintained (last published 2016) and deeply tied to the architecture; migration is hard. De-polymorphizing the database is pending.
- CodeMirror is unmaintained — every templating/autocomplete field is a CodeMirror instance.
insobundles almost the entire renderer and stubs Electron, which "limits networking improvements." Ideas: a shared DB+templating package, an adapter swappingnode-libcurlforfetch, or removing plugin support frominsoand reintroducing a fixed API.- Sync code is "spaghetti"; template rendering "is spaghetti and has poor discoverability."
- gRPC state should move from the renderer into the main process.
curl.tsandlibcurl-promiseimplementations should be unified.- The testing feature doesn't scale with investment.
- Large responses (~20 MB) can crash the app on weaker hardware.
apiconnect-wsdlforces a manual lockfile engine-ceiling edit on each refresh.
Completed (for context): migrated Redux→Remix/React-Router, Lerna→npm workspaces, class→function components, Electron/Spectral upgrades, react-aria+tailwind styling, send-request extraction, NeDB removal in progress.
Tip
If you contribute, the highest-leverage, well-scoped wins are: unifying the two libcurl code paths, moving gRPC state to main, and extracting a standalone DB+templating package to free
insofrom bundling the renderer.
10. Contributing
- Use the
.nvmrcNode version (fnm use "$(cat .nvmrc)") and npm 11+. npm cifrom repo root in fresh worktrees — do not use--ignore-scripts(leaves Electron partially installed and breaks validation).- Follow
AGENTS.md: rely on ESLint/Prettier (no unsolicited reformatting), keep changes strictly scoped. - Before considering work done:
npm run lint,npm run type-check,npm test. Add smoke tests for UI-visible changes. - Unit tests live beside the file under test (
foo.ts→__tests__/foo.test.ts); smoke tests live ininsomnia-smoke-test(Playwright, POM-based — see its README). - Check for circular imports with
npm run check-cycle-references(madge).
11. Troubleshooting (operational)
Error: Fetch has not been configured. Please call configureFetch() at application startup.
- Cause:
insomnia-api's fetch was used beforeconfigureFetch()ran. In the CLI this is wired at startup; in embedding scenarios it may be missing. - Solution: Ensure
configureFetch(...)runs before any API call (the CLI does this incli.ts). - Prevention: Don't call API utilities before app/CLI bootstrap completes.
Error: 3-way merge hit impossible state / Cannot delete master branch (Cloud Sync)
- Cause: Cloud-sync VCS merge/branch invariants violated (e.g. deleting the protected
masterbranch, or a corrupt delta). - Solution: Use a different branch name; pull the latest snapshot before merging; avoid deleting
master. - Prevention: Keep snapshots current; don't hand-edit synced data.
Error: Invalid Spectral ruleset / Failed to resolve host (lint)
- Cause: A malformed
.spectral.yaml, or a remote$ref/ruleset that can't be fetched. - Solution: Validate the ruleset is an object at the top level; ensure remote refs are reachable or vendor them locally.
- Prevention: Keep rulesets self-contained and in-repo; lint them in CI.
Error: Failed to parse API spec / Failed to parse yaml file to Insomnia schema
- Cause: Invalid OpenAPI/YAML, or an Insomnia v5 schema mismatch on import.
- Solution: Validate the YAML/OpenAPI; check the export was produced by a compatible Insomnia version.
- Prevention: Export/import with matching major versions; lint specs before importing.
Symptom: Native module / libcurl build failures
- Cause: Electron/Node ABI mismatch or missing platform build deps.
- Solution: Install platform deps (§3.2), then
npm run install-libcurl-electron. Clear~/.cache/electronon Linux if Electron install conflicts. - Prevention: Pin Node/Electron via
.nvmrc; runnpm ci(not--ignore-scripts).
Symptom: inso can't find data in CI
- Cause: No locally installed app and
DEFAULT_APP_NAMEunset. - Solution: Always pass
-wpointing at the repo/export, and--ci. - Prevention: Commit the
.insomnia/export into the repo and reference it in.insorc.
12. Quick Reference
12.1 Repo facts
| License | Apache-2.0 |
| App version (this commit) | 12.5.1-alpha.0 |
| Commit | bece185 (2026-06-05) |
| Node / npm (dev) | >=24 / >=11 |
| Electron | 41.0.3 |
12.2 Key commands
npm run dev # run app with live reload
npm run app-package # build + package the desktop app
npm run inso-package # build the standalone inso binary
npm run lint && npm run type-check && npm test # validate
npm run check-cycle-references # detect circular imports
12.3 inso command tree
inso run collection [id] # run a collection (data-driven, reporters, --output)
inso run test [id] # run unit test suites
inso lint spec [id|file] # Spectral-lint an OpenAPI spec
inso export spec [id] # export an OpenAPI spec (-o, --skipAnnotations)
inso script <name> # run a named .insorc script
inso generate-docs # print CLI docs
12.4 Security defaults to verify
| Setting | Secure value |
|---|---|
validateSSL / validateAuthSSL |
true |
enableVaultInScripts |
false |
scriptSandboxEnabled / scriptStrictModeEnabled |
true |
disabledBlockedRoots / disabledBlockedProperties |
[] |
enableAnalytics |
false (if telemetry disallowed) |
| Storage backend | Local Vault / Git Sync for sensitive projects |