Postguy
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.

#GapWhat is wrongHow to close it
1Control-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.
2URL-to-file importThe 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.
3Zip restore is documents-onlyAll-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.
4Response body save pickerSave Response writes <workspace>/files/response-<tab>.bin. The dialog and name suggestion are still missing.Add the save dialog and name suggestion.
5Idle RSS over budgetThe 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.
610 MB Pretty is disabledPRETTY_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.
7Console virtualisationThe 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.
9Header case on the wirehyper 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.
10Cold start with 10 restored tabs not measuredEmpty-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.
11Remaining budget metricsSend 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.
12cargo-deny advisoriesLicence/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.
13Fuzz coverageurl, 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.
14Observation requests 1-3Postman 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 areaPostguy statusWhere it stands
Get started: workbench, install, quick start, system requirementspartialh.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 modesshippedc.body-modes, c.params-tab, c.headers-tab; per-request settings shipped (c.settings-tab)
API authentication and authorizationpartialBasic/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 valuesshippedb.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 viewerpartialc.response-viewer: Pretty/Raw/Preview/Hex, syntax colours, search tint, save/copy. Open: image previews, regex/whole-word search
Debug API requests (console, troubleshooting)partialh.console (filters, masking, ring buffer). Open: virtualised scrolling, request/response body inspector
GraphQL requestsshippedc.body-modes: query/variables/operation editors, schema introspection with Refresh
gRPC requestspartiald.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 requestspartiale.connect, e.subprotocols, e.timeline; binary composers, saved messages and reconnect policy are not implemented yet
MCP requests (Postman as an MCP client)naNot in the brief. Postguy ships the opposite direction: an opt-in MCP server (f.mcp) so agents can drive it
AI requests / Agent Mode / PostbotnaOffline by design: no model endpoint, no telemetry. The local equivalent is the automation tool table an agent already drives
Collections and foldersshippeda.tree-view, a.create-organise, a.keyboard-and-multiselect, a.filter, a.collection-auth, a.overview-tab
Native GitnaA 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)naLocal equivalent: .postguy/secrets.json at 0600 with masking (b.secrets)
Tests, scripts and assertionspartialf.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 runsshippedf.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 CIshippedf.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)partialg.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 backuppartialPostman/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)shippedg.snippets, syntax-coloured in the right panel; grpcurl is planned
Mock servers and API design (Spec Hub)naRunning a mock server contradicts "no listener by default"; OpenAPI import is the useful slice and is shipped (g.openapi)
Monitors, scheduled runsnaNeeds a scheduler and cloud execution; the CLI runner is the local equivalent
Flows (low-code editor)naOut of scope by design
API governance, scorecards, catalognaOut of scope by design
Documentation and publishing (including "Run in Postman")naThe local description/Docs tab is shipped (h.detail-tabs, h.builder); publishing to a public domain needs a service
SDK and CLI generatorsnaOut of scope by design
Postman API, VS Code extension, plugin marketplacenaThe 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, InsightsnaOffline and single-user by design; sharing is "copy the folder"
Administration, billing, plans, SSO/SCIM, API keysnaNo accounts
Platform: packaging, budgets, accessibilitypartiali.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 na above 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). LargeTextView now 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, headless shot example and xtask screenshots.
  • Renderer choice (glow), HTTP stack choice (hyper-direct), large body strategy and the icon/logo pipeline are settled.
Copyright © 2026