Privacy and security
Postguy works offline. Your workspace is a folder of files on your machine. The app makes no network request that you did not start.
Network rules
| Rule | Detail |
|---|---|
| No telemetry | The app sends no usage data and no crash reports. |
| No update check | It never contacts a server to look for a new version. |
| No account or sync | There is no sign-in and no cloud storage. |
| Requests only on your action | The only traffic is what you start: sending a request, a gRPC call, a WebSocket connection, an OAuth 2.0 token request, or a script's pm.sendRequest. |
| Browser links | Documentation and GitHub in the Help menu open a page in your browser, only when you choose them. |
| No implicit fetches | The Import box refuses a pasted URL instead of downloading it (see below). |
These are project rules in AGENTS.md (section 5.2):
- Never add telemetry, crash upload, an update check or cloud sync.
- Never log secret variable values, client-certificate passphrases or the control-channel token.
Import never fetches
Paste a URL (text starting with http:// or https://) into the Import box. Postguy answers URL imports are not fetched automatically; download the file and drop it here. Nothing is requested.
Download the file yourself, then drop it onto the window or choose it as a file. See Import and export.
Secrets
You can mark a variable secret in an environment, in globals, or in a collection or folder.
- Secret values go in
.postguy/secrets.jsonin the workspace. On Unix the file is owner-only (0600). Secrets are never written into collection or environment files. - OAuth 2.0 tokens follow the same rule.
- Postguy masks secret values wherever it echoes them: the history snapshot, the Console, script test and failure messages, and code snippets. A masked value shows as
•, one per character, up to 16. - Collection exports blank secret values. Environment and globals exports leave them out unless you choose to include them. The workspace zip leaves out
.postguy/.
.postguy/ out of version control and out of shared folders. Use of the operating system keychain is an undecided future item.The cookie jar is stored on disk in .postguy/cookies.json. See Cookies, proxy and certificates.
TLS verification
SSL certificate verification in Settings › General is on by default. A request can also override it. When you turn it off, the setting reads Verification is off: responses are encrypted but unauthenticated.
Turn it off only for a server you control, such as a local test server with a self-signed certificate. A custom CA bundle in Settings › Certificates is safer. See Settings.
Scripts
Pre-request and test scripts run in an embedded JavaScript engine (QuickJS). Postguy treats them as untrusted input, so the sandbox is strict.
| Area | Limit |
|---|---|
| Filesystem | None. fs is a read-only view of the collection's assets. Writes and .. escapes throw. |
| Process | No access from scripts. |
| Network | Only pm.sendRequest, which goes through the app's own request engine. At most 10 calls per script run. |
| Wall-clock time | 5,000 ms |
| Memory | 64 MiB heap, 1 MiB stack |
| Output | 1,000 console lines, 1,000 test results, 16 KiB per log line |
| Variable values | 1 MiB each |
| Timers and jobs | 10,000 pending timers, 100 timer rounds, 1,000,000 promise jobs |
require | Only .js and .json files from the collection's assets. No npm packages. |
A script that exceeds a limit or throws becomes an error. The error shows its phase, origin and line. It does not crash the app.
Scripts run only for HTTP requests. To turn them all off, enable Disable scripts in Settings › General. See Scripts and tests and the scripting API.
Files from strangers
- Importers and data files cap size, nesting and expansion. On malformed input the app returns an error instead of crashing.
- File paths in requests resolve against the working directory. Reading outside it needs the
Read files outside the working directorysetting. - Saves are atomic. A failed save leaves the previous file intact.
- A corrupt file is renamed with a
.corrupt-<time>suffix, and the app starts without it.
The UI control channel
The control channel lets postguy-cli ui inspect and drive a running window. It is off unless you start the app with --control FILE.
- It listens on
127.0.0.1only, on a random port. - Each launch makes a fresh random token. It writes
{port, token, pid}to the file you named, readable by you only (0600on Unix). The token is never logged. - Every request must carry
Authorization: Bearer <token>. Others get401. - Stopping the app removes the file.
- Synthetic
click,keyandtypeare refused.
Details are in UI control channel.
Headless CLI and --root
postguy-cli runs the same tools with no window and no server. With --root DIR, it refuses any path outside DIR. The refusal is the same whether or not the path exists.
Use --root when you hand the CLI to a script or an agent. See CLI.
MCP
An MCP server is planned. It does not exist yet. The project rule is that it must be opt-in. Nothing may start it, register it with an agent or open a port by default.