New developer guide
Welcome to postman-app — the Postman desktop and web client. This is the repository that ships Postman to millions of developers around the world.
This guide gets you from a fresh machine to a running app and your first PR. Read it fully before touching code — it will save you hours later.
Before you start: get system access
The private @postman NPM packages are gated. Without access, yarn install fails with 404s on every @postman/* package.
1. Join the @postman npm org. Request an invite from an NPM administrator. Membership matters: npm returns 404 (not 403) for private packages you cannot see, so no access looks exactly like bad auth.
2. Create a granular access token on npmjs.com under Settings → Access Tokens: grant Read on All packages and leave Organizations on No access (that dropdown is often empty; ignore it).
3. Authenticate Yarn with the token:
yarn config set -H npmAuthToken <YOUR_TOKEN>
npm login alone does not work: it writes ~/.npmrc, which Yarn v4 does not read. Treat the token as a secret.
The canonical reference is the NPM Registry page on Confluence.
Common install issues
| Symptom | Cause and fix |
|---|---|
404 on every @postman/* package | Yarn has no valid credential. Run yarn config set -H npmAuthToken <token> (not just npm login). |
404s return after it worked before | The granular token expired. Regenerate it and re-run yarn config set -H npmAuthToken <token>. |
404s persist with a fresh token | A stray postman scope in ~/.yarnrc.yml routes @postman/* to the public mirror. Run yarn config get 'npmScopes[postman].npmRegistryServer'; if it prints registry.yarnpkg.com, delete that line so the scope falls back to the project default. |
Also check the Prerequisite setup for local app development on Confluence — it covers SSL certificates and OS-level dependencies that vary by machine.
Setting up Node
postman-app uses a specific Node version. Use NVM or N so you can switch versions cleanly:
# With NVM — run inside the repo root:
nvm use
# With N:
n auto
Both tools read .nvmrc / .n-node-version in the repo root and switch automatically. The app currently requires Node v24.
Running the app for the first time
# 1. Clone
git clone git@github.com:postman-eng/postman-app.git
cd postman-app
# 2. Install dependencies (takes ~5-10 minutes the first time)
yarn install
# 3. In terminal 1 — start the dev server
yarn run start
# 4. In terminal 2 — open the app (after the build finishes)
yarn run open
The dev server starts at https://matrix.postman-beta.co:8777. You need two terminals running simultaneously — one for the server, one to open the Electron window.
The dev server runs over HTTPS, so on a fresh machine you need mkcert installed and its local CA registered once:
# macOS
brew install mkcert nss && mkcert -install
# Windows
choco install mkcert && mkcert -install
# Linux: install libnss3-tools + the mkcert binary, then:
mkcert -install
After that, yarn start generates a trusted certificate automatically (no need to create or commit one). Without it, the browser/Electron app blocks the page — postman-beta.co uses HSTS, so there is no "proceed anyway". See Prerequisite setup for local app development for full details.
SELF_SIGNED_CERT_IN_CHAINIf yarn install or yarn open fails while building a native dependency with SELF_SIGNED_CERT_IN_CHAIN, Cloudflare WARP is intercepting the dependency downloads. On Node 24 the quickest fix is export NODE_USE_SYSTEM_CA=1, then re-run. See Running the app → Troubleshooting for the full explanation and fallback. This is a separate issue from the dev-server certificate above.
Hot module replacement (HMR) is enabled by default. Most code changes appear in the app without a restart.
yarn run start uses Webpack. For faster builds, use:
yarn start # Rspack dev server
yarn open # Open the Rspack-built app
yarn start --target browser
yarn open --target browser
The 5 things to know before touching code
1. Never add code to src/renderer/
src/renderer/ is the legacy codebase — 19,000+ JavaScript files with no module boundaries. It runs in production but you must never add new code here. All new work goes into the Nx packages: views/, ui-features/, data/, platform-libs/, platform-ui/, or libs/.
When in doubt: ui-features/.
2. Dependencies only flow downward
views/ → ui-features/ → data/ / platform-libs/ → libs/. A layer can import from below, never from above. The linter enforces this — violations fail CI.
3. Use the Nx generator to create packages
Never create a package by hand. The generator creates the correct directory structure, project.json tags, and tsconfig paths automatically:
npx nx generate @postman/app-generator:library
4. Use @postman-app/* import aliases
// ✅ Correct
import { WorkspaceStore } from '@postman-app/workspace-data';
// ❌ Wrong — never cross-package relative imports
import { WorkspaceStore } from '../../data/workspace-data/src';
5. apps/black is not production
apps/black is an inactive proof-of-concept, not in the main CI or build pipeline. It is kept in the monorepo only to share code. The production entry point is src/renderer/.
Where is everything?
| Looking for… | Go here |
|---|---|
| A UI feature (sidebar, modal, workbench tab) | ui-features/<name>/ |
| A URL-routed screen | views/<name>/ |
| A Zustand store or API client | data/<domain>-data/ |
| i18n, analytics, API gateway | platform-libs/<service>/ |
| Design system components | platform-ui/aether-components/ |
| Build configs, bundler setup | config/ |
| Environment URLs (dev/stage/prod) | config/environments/ |
| Electron packaging per channel | starship/ |
| CI / automation scripts | scripts/ |
| Translation strings | locales/en-US/ |
| Legacy code (do not add to) | src/renderer/ |
Running tests
# Full check — lint + unit + system
yarn run test
# Lint only
yarn run test-lint
# Unit tests for a specific package
nx test @postman-app/workspace-data
# With coverage
yarn run test-unit -- --coverage
# Lint a specific package
nx lint @postman-app/workspace-data
# Clean all build artifacts and caches
yarn run clean
yarn run clean-cache
Unit tests live co-located with the code they test, inside each package's src/ directory.
Making your first PR
# Branch from develop (not main)
git checkout develop && git pull
git checkout -b feat/your-feature-name
# After coding — check locally before pushing
nx lint @postman-app/your-package
nx test @postman-app/your-package
yarn typecheck:affected
# One lib: yarn nx run @postman-app/your-package:typecheck
# PR title format: [JIRA-TICKET] type(scope): description
# Example: [CSDK-1234] feat(workspace): add activity feed widget
Getting help
- Slack:
#desktop-platform-engfor architecture questions,#client-distributionfor CI/build - AGENTS.md in the repo root: coding conventions and architecture rules
- Confluence spaces: Web Platform (WP) · Client Build and Release
- Your onboarding buddy — ask them everything
Next steps
- Running the app → — every command and flag in detail
- Architecture overview → — how the system fits together
- Adding a feature → — where new code goes, step by step
- Team knowledge base → — key Confluence docs, curated by topic