Files
insomnia/DEVELOPMENT.md
Curry Yang d524dfb9a3 Feat/ia merge (#9904)
* refactor: route fs backed cleanup (#9806)

* refactor: shared browser safe helper cleanup (#9810)

* refactor: shared browser-safe helper cleanup

* style: run eslint autofix

* fix: preserve empty url handling

* fix: address remaining copilot comments on pr3

* remove loader class

* fix: unhandledrejection error (#9774)

* fix: resolve sentry promise error (#9786)

* fix: resolve sentry promise error

* fix: leave fallback when error

* fix: improve credential validation handling in GitRepoForm to avoid a loop of re-loading the list of repos and branches (#9820)

* add e2e and cli skills (#9818)

* add e2e and cli skills

* address feedback

* address feedback

* move to claude

* feat: konnect integration proxy url and regex support (#9811)

* chore: move konnect sync behind feature flag (#9832)

* chore: isolate gRPC proto file preparation behind IPC boundary (#9828)

* chore: isolate gRPC proto file preparation behind IPC boundary

Move proto temp-file creation out of the renderer by adding a
grpc.writeProtoFile IPC handler (main process) and wiring it up
in the preload bridge. The renderer's ProtoFilesModal previously
called writeProtoFile() directly, pulling node:fs / node:os /
node:path into the renderer bundle. It now calls
window.main.grpc.writeProtoFile(protoFile._id) instead.

Changes:
- src/main/ipc/electron.ts: add 'grpc.writeProtoFile' to HandleChannels
- src/main/ipc/grpc.ts: export writeProtoFileById helper, add to
  gRPCBridgeAPI, register ipcMainHandle('grpc.writeProtoFile')
- src/entry.preload.ts: wire grpc.writeProtoFile via ipcRenderer.invoke
- src/ui/components/modals/proto-files-modal.tsx: remove direct
  write-proto-file import; use window.main.grpc.writeProtoFile in
  the directory-import validation loop
- config/renderer-node-import-baseline.json: remove 5 stale/resolved
  baseline entries (proto-directory-loader.tsx x2 already gone;
  write-proto-file.ts fs/os/path x3 now main-process-only)
- src/main/ipc/__tests__/grpc.test.ts: add writeProtoFileById unit
  tests as contract coverage for the new privileged bridge path

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: validate proto syntax in writeProtoFileById IPC handler

The directory-import validation loop relied on writeProtoFile for proto
content validation, but writeProtoFile only writes the temp file without
parsing. Add a protoLoader.load call inside writeProtoFileById so invalid
proto syntax throws before the result is returned to the renderer.

Also update the test to mock @grpc/proto-loader.load and assert it is
called with the correct file path and includeDirs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: konnect integration strips nunjucks templates on sync (#9831)

* fix(Git Sync): auto-resolve non-YAML file conflicts to remote during merge (#9798)

* fix: filter conflict paths to include only YAML files

* fix: enhance conflict resolution by auto-resolving non-YAML files to theirs

* fix: keep buffer raw so that binary files are not corrupted

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: enhance merge conflict handling by introducing auto-resolved conflicts for non-YAML files

* fix: add test for handling merge conflicts, ensuring only YAML conflicts are returned

* fix: prevent HEAD update during auto-resolve of merge conflicts

* fix: enhance merge conflict resolution by auto-completing merges when all conflicts are non-YAML

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* feat: konnect integration expressions support (#9830)

* Show more specific error when creating mock route fails (#9841)

* fix: insomnia-ai-plugin uses securedPath (INS-2244) (#9748)

* feat: add custom npm registry mirror setting for plugin installation (#9837)

* feat: default user-agent for cURL imports [INS-2416] (#9838)

* feat: default user-agent for cURL imports

* respect disableAppVersionUserAgent setting

* fix: view transition error - [INS-2316] (#9792)

* fix: view transition error

* fix

* change default behavior when delete cloud sync workspaces (#9844)

* feat: integrate v3 user endpoints (#9785)

* feat: integrate v3 user endpoints

* feat: use public sdk for insomnia-api

* chore: applied PoLP to workflows (#9840)

* chore: resolve GHA warning annotations and reduce CI time [INS-2312] (#9839)

* fix: resolves INS-2366 (#9852)

* fix: resolves INS-2366 dependency issues

* Refactor:use electron store for oauth session (#9851)

* move oauth session to electron storage

* create electron storage bridge

* use electronStorage bridge for managing oauth window handles

* fix build

* move key to constants

* tolerate changing userData folder path

* Update packages/insomnia/src/main/ipc/electron-storage.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* init store

* fix singleton class

* feedback

* feedback

* Update packages/insomnia/src/main/electron-storage.ts

Co-authored-by: aikido-pr-checks[bot] <169896070+aikido-pr-checks[bot]@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: aikido-pr-checks[bot] <169896070+aikido-pr-checks[bot]@users.noreply.github.com>

* chore: decouple releases (#9842)

* INS-2145 Decouple releases

* fix security error

* fix

* check version

* refactor: auth header to main (#9834)

* remove deprecated baseUrl

* add failing test

* fix AI playwright runs

* move getAuthHeader to main

* address feedback about dynamic import

* move oauth 1 + 2 flow to main

* handle bad cookie

* handle bad apikey

* fix imports

* block main process imports

* extract plugins

* fix vite config

* console log

* move init store

* Fix OAuth imports after rebase

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* clean up

* Revert config changes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* clean up hawk

* use bridge

* update node require

* remove this

* define process type

* remove 14

* ignore reports folder

* fix e2e tests

* address feedback

* remove unused

* tidy constants

* feat: add getOAuth2Token IPC bridge

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix tests

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: Support pin and unpin websocket and socketio requests (#9865)

* support pin websocket and socketio requests

* feat(Git Sync): Add support for canonical repository output (#9789)

* initial support for canonical repo output (#9739)

* Feat/git repo output sync queue (#9790)

* feat: implement SyncQueue for serial async task processing

* refactor: enhance repo file watcher for improved sync and error handling

- Replace NeDB client with a unified disk client for all file operations.
- Introduce a serial queue to manage sync tasks and prevent race conditions.
- Implement content-hash deduplication to avoid unnecessary file imports.
- Add problem tracking for YAML files with conflicts or parse errors.
- Streamline watcher start/stop logic and improve notification handling.
- Ensure immediate DB→FS flush before git operations to maintain consistency.
- Enhance import logic to handle workspace deletions and renames effectively.

* refactor: simplify projectRoutableFSClient by removing unused parameters and consolidating logic

* feat: add git.db-synced event listener for revalidation in Root component

* feat: add button to open local repository folder in ProjectSettingsForm

* refactor: remove unused GitProjectNeDBClient

* refactor: update imports to use services for workspace and workspaceMeta

* refactor: update models usage to services in git repo migration and project settings form

* refactor: streamline file watcher initialization and import process

* feat: ensure immediate processing of pending debounced imports in RepoFileWatcher

* refactor: improve file rename handling in RepoFileWatcher to prevent data loss

* feat: enhance RepoFileWatcher to track last written hash and sync mtime for improved file management

* refactor: remove unused parameters from upsertDocs in RepoFileWatcher for cleaner code

* fix revalidator (#9826)

* fix: handle detached HEAD during rebase in getCurrentBranch method (#9843)

* fix: handle detached HEAD during rebase in getCurrentBranch method

* fix: add return type to getCurrentBranch method

* fix: refresh ui after sync (#9848)

* fix: (git cli)skip flush problematic files (#9846)

* fix: skip flush problematic files

* fix

* feat: (git cli)ux for invalide status (#9836)

* feat: ux for invalide status

* update ux

* fix

* fix

* add tab warning

* del log

* feat(Git Sync): Handle non-origin remotes (#9833)

* feat(git): detect non-origin branch tracking and guard sync operations

- Add getBranchTrackingRemote(), getRemoteUrl(), getBranchRemoteInfo() to GitVCS
- Add getBranchRemoteInfo IPC endpoint with BranchRemoteInfo interface
- Add assertBranchOnOrigin() guard to push, pull, fetch, commitAndPush
- canPushLoader returns { canPush: false } for non-origin branches
- Add unit tests for remote detection methods

* feat(git): add support for non-origin branch tracking and display warnings in UI

* Show local git repo path [INS-2315] (#9858)

* Update the style of local git folder path in project setting modal

* Add Git CLI tip in commit changes modal

* Repo Migration flow [INS-2256] (#9824)

* initial support for canonical repo output (#9739)

* feat: enhance git repository migration with concurrency guard and symlink handling

* feat: enhance git repository migration with config sanitization and file overwrite handling

* feat: implement repo migration version tracking and improve migration idempotency

* feat: add runAllGitRepoMigrations function and migration view for Git projects

Co-authored-by: Copilot <copilot@github.com>

* fix: reset initial migration status to 'default' in MigrationView component

* refactor: simplify MigrationView component and update navigation logic

* refactor: remove legacy directory structure migration from loadGitRepository function

* feat: enhance runAllGitRepoMigrations to return logs and improve error handling in MigrationView

* feat: update runAllGitRepoMigrations to return detailed logs and failed projects; enhance MigrationView to handle migration results

* feat: optimize runAllGitRepoMigrations by batch-fetching git repositories and improving project filtering

* feat: introduce CURRENT_MIGRATION_VERSION constant for migration tracking and update references in git-repo-migration and router

* feat: handle failed projects in runAllGitRepoMigrations by converting them to local projects

Co-authored-by: Copilot <copilot@github.com>

* feat: integrate CURRENT_MIGRATION_VERSION for migration tracking and update router logic to handle migration screen visibility

* feat: reorder import statements in ProjectSettingsForm for consistency

* feat: update MigrationStatus type and related logic for better error handling

* feat: enhance migration logging with detailed error stack and include CURRENT_MIGRATION_VERSION in logs

* feat: simplify migration logging messages for clarity and consistency

* feat: improve migration check logic to prioritize version stamp over disk layout

* feat: add tests for migrateRepoStructureIfNeeded function to ensure migration logic correctness

* feat: update migration logic to re-run when old git/ directory exists, ensuring correct migration handling

* test: update migration tests to ensure directory existence checks are accurate

* refactor: remove redundant useEffect for localStorage in Component

* feat: enhance path validation in runAllGitRepoMigrations to prevent path traversal vulnerabilities

* feat: enhance path handling in migration functions to prevent directory traversal vulnerabilities

* feat: enhance directory traversal protection in moveDirectoryContents function

---------

Co-authored-by: James Gatz <jamesgatzos@gmail.com>
Co-authored-by: Copilot <copilot@github.com>

* fix: Delete old folders (#9867)

* refactor: remove unused migration version handling from localStorage

* fix: update directory removal logic to handle non-empty directories

---------

Co-authored-by: Curry Yang <163384738+CurryYangxx@users.noreply.github.com>
Co-authored-by: yaoweiprc <6896642+yaoweiprc@users.noreply.github.com>
Co-authored-by: Pavlos Koutoglou <pkoutoglou@gmail.com>
Co-authored-by: Copilot <copilot@github.com>

* refactor: move sync code to main (#9827)

* move sync code to main

* improve sync tests

* update plan

* test: reset cloud sync smoke state

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* guard against bad test env

* fix skill

* remove new test

* udpate plan

* with proxy

* checkpoint

* move files

* autofix

* update plan

* make all sync bridge async

* fix window imports

* refactor: move main-only sync helpers

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix lint

* move chunkArray tests

* smaller interfaces

* move store under vcs

* move cloud-sync to main

* create a second vcs for pull operations

* added a invoke wrapper to remove error prefixes

* rebase error

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: update insomnia-plugin-ai (#9862)

* fix: bump node-libcurl and add ipv6 tests (#9869)

* feat: revamping pre/post scripting sandbox (#9794)

* feat: revamping pre/post scripting sandbox
* feat: added UI setting to enable/disable specific checks

* fix false positives

* revert

* fix: user can not resolve conflict in app (#9872)

* fix: conflict ux

* fix

* fix

* Git server for smoke test [INS-2258] (#9816)

* Git server for smoke test

* Try to solve flaky test

* feat: remove unused Git hook samples and add Credentials tab functionality

- Deleted various sample Git hook scripts from the git-server fixture, including post-update, pre-applypatch, pre-commit, pre-merge-commit, pre-push, pre-rebase, pre-receive, prepare-commit-msg, push-to-checkout, sendemail-validate, and update hooks.
- Introduced a new PreferencesCredentialsTab class to manage Git credentials within the Insomnia Preferences.
- Updated the PreferencesPage to include the new Credentials tab for Git credentials management.
- Enhanced the ProjectPage with a method to create a Git Sync project, including branch creation and switching.
- Added comprehensive tests for Git Sync functionality, including creating branches, committing changes, and merging branches.
- Updated UI components to support new features, including data-testid attributes for better testability.

Co-authored-by: Copilot <copilot@github.com>

* feat: update path import and add Git sync tests

* revert package.json

* Update package.json

* feat: add new dependencies for Git HTTP mock server and related utilities

* refactor: remove commented-out code in addAccessTokenGitCredential function

* fix: update export tests to use toHaveLength for file count assertions

---------

Co-authored-by: Copilot <copilot@github.com>

* feat: import deep-link login experience [INS-2416] (#9860)

* refactor: replace node:url with URL in cert and proxy match (#9515)

* refactor: import to main (#9809)

* squash

* re add comments

* fix process fork

* update base line 18 left

* revert

* check cert url without node

* fix handlerId

* exclude url matches cert host from scope

* fix rebase

* Fix style issue that file list in the middle of commit modal is collapsed [INS-2315] (#9875)

* Fix style issue that file list in the middle of commit modal is collapsed

* fix: update links to Git Sync documentation in staging modal and project settings form

* Chore: playwright dx v2 (#9876)

* Update E2E test for git sync [INS-2258] (#9878)

* Add more test cases for git sync

* tmp

* Update package.json

* feat: update migration image and urls (#9868)

* feat: update migration image and path for improved clarity

* feat: update error message and support links in migration view

* feat(Git Sync): Downgrade -> Upgrade path (#9882)

* feat: add mechanism to flush newer DB workspaces to disk during downgrade

* feat: implement effective Git repository ID handling for project connections

* feat: enhance Git repository ID handling for improved project queries and updates

* Chore: refine e2e docs by agent for agent (#9881)

* improve agent docs

* added error context note

* chore: Security update for dependencies and github workflows (#9884)

* chore: resolves INS-2457, INS-2458, INS-2459, and INS-2460.

* feat: include app version in window title [INS-2465] (#9888)

* feat(Git Sync): improve git migration onboarding UX and local file system access [INS-2462] (#9890)

* feat(Migration): enhance migration summary with total projects count and improve UI feedback

* fix(Migration): clarify update instructions and improve user messaging

* style(ManualCommitForm): adjust text sizes for improved readability

* style(StagingModal): adjust layout and spacing for improved UI consistency

* fix(ManualCommitForm): update clipboard text to include 'cd' command for easier navigation

* fix(ProjectSettingsForm): update repository path copy functionality and add option to open in file system

* fix(ManualCommitForm): enhance file system interaction with tooltips for better user guidance

* fix(ProjectSettingsForm): add tooltip for 'Open in file system' button to enhance user guidance

* fix(GitProjectSyncDropdown): add 'Open folder' action to sync dropdown for easier access to repository path

* fix(Component): display relative path of current issue in modal for better context

* fix(git-service): count only successfully migrated projects in totalProjects

* fix(project-settings-form): platform-aware shell quoting for cd command

* fix(git-project-staging-modal): platform-aware shell quoting for cd command

* fix(project-settings-form): update aria-label to reflect cd command clipboard content

* fix(git-project-staging-modal): update aria-label to reflect shell command clipboard content

* fix(ManualCommitForm): replace tooltip with dialog for enhanced information display

* fix(MigrationView): update migrated count calculation to reflect total projects

---------

Co-authored-by: James Gatz <jamesgatzos@gmail.com>

* chore: normalize konnect api responses (#9895)

* feat(Git Sync): enhance migration view with best practices note and UI improvements (#9900)

* chore: comment out smctl credentials save in workflow (#9898)

the command is no longer executed while keeping it in place for future reference.

* feat: migrate model imports, base types, org model and helpers (#9802)

* fix

* fix vcsinstance

* fix type issues

---------

Co-authored-by: Jack Kavanagh <jackkav@gmail.com>
Co-authored-by: James Gatz <jamesgatzos@gmail.com>
Co-authored-by: Shelby <13246465+shelby-moore@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: yaoweiprc <6896642+yaoweiprc@users.noreply.github.com>
Co-authored-by: kwburns-kong <kyle.burns@konghq.com>
Co-authored-by: jeremyjpj0916 <31913027+jeremyjpj0916@users.noreply.github.com>
Co-authored-by: Ryan Willis <ryan.willis@konghq.com>
Co-authored-by: Kent Wang <kent.wang@konghq.com>
Co-authored-by: Alison Sabuwala <alison.sabuwala1024@gmail.com>
Co-authored-by: aikido-pr-checks[bot] <169896070+aikido-pr-checks[bot]@users.noreply.github.com>
Co-authored-by: Jay Wu <jay.wu@konghq.com>
Co-authored-by: Pavlos Koutoglou <pkoutoglou@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Fares Osman <43153226+fiosman@users.noreply.github.com>
Co-authored-by: Bingbing <ZxBing0066@gmail.com>
Co-authored-by: Vivek Thuravupala <2700229+godfrzero@users.noreply.github.com>
2026-05-08 13:46:28 +08:00

7.0 KiB

Development Overview

The purpose of this document is to provide a general overview of the application architecture.

Technologies

Insomnia is a desktop application built on top of Electron. Electron provides a Chromium runtime for the Insomnia web app to run inside, as well as additional tools to provide access to operating system features.

There are a few more technologies and tools worth mentioning:

  • React is the library used for all UI components.
  • tailwind is used for styling UI components.
  • Electron Builder is used to help build, sign, and package Insomnia for distribution.
  • libcurl is the library that Insomnia uses to make requests. We used libcurl as our HTTP client of choice because it allows the deepest amount of debuggability and control of HTTP requests.
  • NeDB a local in-memory database.
  • node-libcurl is a Node.js wrapper around the native libcurl library.
  • CodeMirror is a web-based, extendable, code editor used for highlighting and linting of data formats like JSON, GraphQL, and XML.
  • Commander.js is used for building the Inso CLI.

Project Structure

Insomnia uses npm workspaces to manage multiple npm packages within a single repository. There are currently the following package locations:

  • /packages contains related packages that are consumed by insomnia or externally.

Insomnia Inso CLI is built using a series of steps

  1. insomnia-inso uses monorepo references to import insomnia and insomnia-testing to expose getSendRequestCallbackMemDb and generate, runTests, runTestsCli respectively
  2. packages/insomnia-inso/dist/index.js is transpiled with esbuild to commonjs
  3. packages/insomnia-inso/bin/inso is shell script which points at packages/insomnia-inso/dist/index.js and is used for local development
  4. packages/insomnia-inso/binaries/inso is an executable made with pkg

getSendRequestCallbackMemDb exposes some behavior from the insomnia renderer.

  • database: to fetch needed models
  • nunjucks templates: to interpolate the fields containing tags
  • node-libcurl: to send the request
  • fs: to persist responses
  • plugins: potentially needed by the community, unclear if the implementation works

Problems

  • inso bundles almost the entire renderer, react components included, meaning that although we are intending to use this code in node we are bundling it using rules intended for browsers and stubs electron.
  • node-libcurl present bundling issues because it needs to re-download a different version from npm each time you want to work on either insomnia or inso.
  • nunjucks codepaths haven't been touched in a long time, they need some love in order to be able to understand how to make them composable.

Unexplored ideas in this area.

  • create a database package with nunjucks templating and have both insomnia and inso use it with project references, use node-libcurl directly, that way we don't need to stub electron and only import the code we use.
  • use an adapter pattern in inso to replace node-libcurl with fetch in order to avoid the bundling issues NaN modules present.
  • remove plugin support from inso and reimplement later with a fixed and supported API.

The insomnia Main Package

/packages/insomnia is the entry point for the app. All other packages are imported from this one.

There are a few notable directories inside it:

  • /entry.main.js Entry for Electron.
  • /src/main Stuff that runs inside Electron's main process.
  • /src/ui React components and styling.
  • /src/common Utilities used across both main and render processes.
  • /src/plugins Logic around installation and usage of plugins.
  • /src/insomnia-data Data models, services and database for managing application state.
  • /src/network Sending requests and performing auth (e.g. OAuth 2).
  • /src/templating Nunjucks and rendering related code.
  • /src/sync and /src/account Team sync and account stuff.

Data and State Architecture

Insomnia stores data in a few places:

  • A local in-memory NeDB database stores data for data models (requests, folder, workspaces, etc.).
  • localstorage
  • a fake localstorage api that writes to file and is used for window sizing

Note: NeDB is officially unmaintained (even for critical security bugs) and was last published in February 2016. Due to this, we hope to move away from it, however doing so is tricky because of how deeply tied it is to our architecture.

Automated testing

We use Vitest and Playwright

Unit tests exist alongside the file under test. For example:

  • /src/common/database.js contains the database business logic
  • /src/common/__tests__/database.test.js contains the database tests

Unit tests for components follow the same pattern.

The structure for smoke tests is explained in the smoke testing package: packages/insomnia-smoke-test.

Technical Debt

This is just a brief summary of Insomnia's current technical debt.

  • We use npm engines feature to improve the dx of node upgrades. However one of our deps node_modules/apiconnect-wsdl has an overly restrictive engine max, so each time we refresh the package lock we are running npm install --force then manually editing the lock file to extend this engine config from <21 to <23

  • Loading large responses (~20 MB) can crash the app on weaker hardware.

  • Bundling libcurl (native module) has caused many weeks of headaches trying to get builds working across Windows, Mac, and Linux. More expertise here is definitely needed.

  • All input fields that support features like templating or code completion are actually CodeMirror instances. This isn't really debt, but may affect things going forward.

  • upgrade spectral e2e testing

  • upgrading electron

  • preload electron main functions

  • update react classes to function components

  • remove excess packages

  • migrate redux to remix

  • migrate lerna to npm workspaces

  • CI slow ~30m (now 10m)

  • styling vision (react-aria + tailwind)

  • de-polymorph database

  • codemirror is unmaintained

  • nedb is unmaintained

  • grpc state state should be in main rather than renderer

  • drag and drop is flakey

  • sync code is spaghetti

  • template rendering is spaghetti and has poor discoverability

  • inso abstraction limits networking improvements

  • testing feature doesn't scale with investment

  • unify curl.ts and libcurl-promise implementations

  • send-request

Electron upgrade

https://releases.electronjs.org/

bump the following node and electron versions

  • .npmrc
  • .nvmrc
  • packages/insomnia/package.json electron and node-libcurl
  • shell.nix