Contributing
Known gaps
Ranked open gaps, the feature investigation matrix and what has been closed.
Status: imports, snippets and export dialogs are in. The response-body picker and full zip restore are still open.
Gaps are ranked by user-visible importance. Prefer them over new P2/P3 features. Each row names the evidence that would close it.
Open (ranked)
Gap 8 is closed (see Closed), so the numbering skips it.
| # | Gap | What is wrong | How to close it |
|---|---|---|---|
| 1 | Control-channel synthetic input | --control implements inspect/command/set/screenshot. click, key and type return a refusal, because safe eframe/egui has no supported way to inject raw pointer/key events into a running app pass. | Either a kittest-driven control.rs suite over the shell (the honest alternative), or an owner decision on a platform input-injection dependency. |
| 2 | URL-to-file import | The brief asks the import box to accept a URL and fetch it only on an explicit user action. The import box refuses with guidance instead (no implicit network). | Add an explicit Fetch button that uses the engine's capped GET. Show the size and format before importing. |
| 3 | Zip restore is documents-only | All-data export includes files/protos/history, but import reads .json documents and skips the rest. | Stage entries with path validation. Merge files/protos with the same clash rules. |
| 4 | Response body save picker | Save Response writes <workspace>/files/response-<tab>.bin. The dialog and name suggestion are still missing. | Add the save dialog and name suggestion. |
| 5 | Idle RSS over budget | The release app measured 100.7 MiB RSS on an empty workspace at the last measurement. The budget is 90 MiB. Idle CPU (0.2%) and cold start (~176 ms to first inspect) are inside budget. | Profile the eframe/glow/engine baseline. Trim loaded state or fonts. Evidence: ps -o rss on a release build after 3 s idle. |
| 6 | 10 MB Pretty is disabled | PRETTY_CAP is 5 MB, and Pretty formats on the UI thread when under it. The budget asks for a 10 MB Pretty view in <= 1.5 s off-thread. Raw is virtualised and measured (first frame 10 ms). | Format off-thread, add a formatting indicator and raise the cap. Evidence: the response.pretty_ms bench metric. |
| 7 | Console virtualisation | The engine ring buffer masks secrets and caps at 5000 entries, but the panel lays out every filtered row in one ScrollArea. | Use show_rows. Add a 5000-row frame-time test. |
| 9 | Header case on the wire | hyper writes header names lowercase (http::HeaderName). The case the user typed is not preserved. | Confirm whether this differs observably from Postman via observation request 2 (echo server headers). Then either document the behaviour (the CLI or scripting reference pages), or implement a raw serializer if the owner decides it matters. |
| 10 | Cold start with 10 restored tabs not measured | Empty-workspace first inspect is ~176 ms. The budget's 10-tab session needs a synthetic session fixture and the same measurement. | Add the fixture and measure. |
| 11 | Remaining budget metrics | Send overhead (click to first byte, last byte to Pretty for 100 KB), 100 MB body, 50 000 timeline messages and Pretty for 10 MB are not in xtask bench yet. | Add them to xtask bench. |
| 12 | cargo-deny advisories | Licence/source checks run locally. RUSTSEC advisories need cargo-deny installed or CI's cargo-deny-action (runs in CI now). | The owner approves the install. xtask deny then delegates. |
| 13 | Fuzz coverage | url, vars, curl, script, data, openapi and har targets run. The Postman importer and cookie parser still need targets. | cargo xtask fuzz --time 300 runs the full registry clean. |
| 14 | Observation requests 1-3 | Postman defaults (auto headers, settings defaults, shortcuts) are unverified until the owner runs them with synthetic data. | Items that depend on them keep their parity notes unverified until then. |
Additional leftovers, ranked below the gaps above:
- Cookies manager add/edit and templates.
- The Save Response example picker and 5 MB example cap.
- Splitter position and two-pane persistence in the session.
- Shortcut-conflict checking.
- History day grouping.
Postman v12 feature investigation matrix
This table maps every area the Postman v12 documentation index lists (https://learning.postman.com/llms.txt, read 2026-02) to what Postguy has.
Statuses use the parity vocabulary:
shipped: usable today, with a cited test.partial: part exists. The notes say what is missing.planned: not started.na: deliberately out of scope for an offline app.
The authoritative per-feature record is parity/postman-features.toml. Use this table as the reading order when you decide what to build next.
| Postman v12 doc area | Postguy status | Where it stands |
|---|---|---|
| Get started: workbench, install, quick start, system requirements | partial | h.window, h.tabs, h.sidebar are shipped; local workbench is complete. Sign-up/sign-in and cloud onboarding are na (no account, no network without a user action) |
| Send requests: request builder, params, headers, body modes | shipped | c.body-modes, c.params-tab, c.headers-tab; per-request settings shipped (c.settings-tab) |
| API authentication and authorization | partial | Basic/Bearer/API key/Digest/JWT/OAuth 1.0/OAuth 2.0/AWS Sig v4/Hawk applied (c.auth-p0, c.auth-m5). Missing: implicit grant and the Manage-tokens screen |
| Variables, environments, globals, dynamic values | shipped | b.environments-crud, b.globals, b.resolution, b.dynamic-variables, b.secrets. Remaining polish is b.chips-and-autocomplete's popover actions and b.set-as-variable |
| Response data and the response viewer | partial | c.response-viewer: Pretty/Raw/Preview/Hex, syntax colours, search tint, save/copy. Open: image previews, regex/whole-word search |
| Debug API requests (console, troubleshooting) | partial | h.console (filters, masking, ring buffer). Open: virtualised scrolling, request/response body inspector |
| GraphQL requests | shipped | c.body-modes: query/variables/operation editors, schema introspection with Refresh |
| gRPC requests | partial | d.unary-invoke, d.reflection, d.method-selector, d.metadata and d.streaming work through descriptors; the request tab has a grouped method picker, a Service definition tab (reflection listing or a picked .proto), unknown-key highlighting in the message editor, auth, metadata, request-level scripts and the Test tab. Proto-aware completion, interactive streaming, trailers and the grpcurl snippet are not implemented yet |
| WebSocket requests | partial | e.connect, e.subprotocols, e.timeline; binary composers, saved messages and reconnect policy are not implemented yet |
| MCP requests (Postman as an MCP client) | na | Not in the brief. Postguy ships the opposite direction: an opt-in MCP server (f.mcp) so agents can drive it |
| AI requests / Agent Mode / Postbot | na | Offline by design: no model endpoint, no telemetry. The local equivalent is the automation tool table an agent already drives |
| Collections and folders | shipped | a.tree-view, a.create-organise, a.keyboard-and-multiselect, a.filter, a.collection-auth, a.overview-tab |
| Native Git | na | A Postguy workspace is plain files in a folder, so any Git client versions it; a built-in Git UI is not planned |
| Postman Vault (cloud secrets) | na | Local equivalent: .postguy/secrets.json at 0600 with masking (b.secrets) |
| Tests, scripts and assertions | partial | f.expect, f.sandbox-hardening, the request Tests tab (assertions plus test script, f.tests-tab) and pg/Bruno-global scripting are shipped, and gRPC requests run their own scripts and Test tab; f.scripts, f.test-results and f.script-ui are partial (WebSocket script phases, re-running tests from a saved response and autocomplete are missing) |
| Collection Runner and data-driven runs | shipped | f.runner, a.runs-tab; sequential order, iterations, CSV/JSON data, delay, stop-on-error, setNextRequest; runs read one collection snapshot and write no history; CSV/XLSX/PDF reports; gRPC and WebSocket requests are skipped. Performance/load testing (Postman's cloud runners) is na |
| Postman CLI / Newman: run collections from CI | shipped | f.runner-cli with cli/json/junit/html/csv/xlsx/pdf reporters and exit codes 0/1/2; f.run-script drives the engine |
| Import (collections, environments, specs, other clients) | partial | g.postman-collection, g.postman-env, g.bruno-import (Bruno folders), g.curl, g.import-dialog, g.openapi, g.har and g.proto-import shipped; external $refs, callbacks and webhooks in OpenAPI are reported, not imported |
| Export and all-data backup | partial | Postman/native export and snippets shipped; g.all-data-zip exports but document-only restore is open (gap 3); a response-body picker is open (gap 4) |
| Code snippets (cURL, HTTP, fetch, requests, Go, reqwest, PowerShell, axios) | shipped | g.snippets, syntax-coloured in the right panel; grpcurl is planned |
| Mock servers and API design (Spec Hub) | na | Running a mock server contradicts "no listener by default"; OpenAPI import is the useful slice and is shipped (g.openapi) |
| Monitors, scheduled runs | na | Needs a scheduler and cloud execution; the CLI runner is the local equivalent |
| Flows (low-code editor) | na | Out of scope by design |
| API governance, scorecards, catalog | na | Out of scope by design |
| Documentation and publishing (including "Run in Postman") | na | The local description/Docs tab is shipped (h.detail-tabs, h.builder); publishing to a public domain needs a service |
| SDK and CLI generators | na | Out of scope by design |
| Postman API, VS Code extension, plugin marketplace | na | The local equivalents are postguy-cli (f.agent-tools, f.run-script), the opt-in MCP server (f.mcp) and the opt-in UI control channel (f.ui-control) |
| Collaboration, workspaces sharing, version control, webhooks, integrations, Insights | na | Offline and single-user by design; sharing is "copy the folder" |
| Administration, billing, plans, SSO/SCIM, API keys | na | No accounts |
| Platform: packaging, budgets, accessibility | partial | i.platform-services and i.packaging are open; byte/bench budgets are enforced but idle RSS is over budget (gap 5) |
Two observations from the audit:
- The script sandbox and the runner are shipped for HTTP requests, and gRPC requests run request-level scripts and tests. WebSocket script phases are the open slice.
- Almost every
naabove is a cloud capability. The offline surface is now short only of auth polish, protocol polish and automation.
Closed
- Script engine memory and wall-clock limits (was gap 8). rquickjs enforces a heap limit, an interrupt deadline, a stack limit and cancellation. Evidence:
crates/script/tests/sandbox.rs::a_memory_bomb_stops_at_the_memory_limit,an_infinite_loop_stops_at_the_wall_clock,deep_recursion_stops_cleanly. - 10 000-request tree and 10 MB Raw frame-time harness (
xtask bench, measured 5.8/10.2 ms on the reference machine). - One minified 10 MB line froze the viewer (a single 10 MB galley).
LargeTextViewnow splits physical long lines into <= 4 KiB display rows and caches the Raw text per buffer. - Shortcut table, control channel (inspect/command/set/screenshot),
postguy-cli ui, headlessshotexample andxtask screenshots. - Renderer choice (glow), HTTP stack choice (hyper-direct), large body strategy and the icon/logo pipeline are settled.