Skip to content

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 12:38
859f2c0

0.10.0 - 2026-07-22

A UI and consistency release. It began as a rebuild of the welcome screen, and fixing that surfaced whole classes of defect that were not local to it: the same empty state written five ways, colours that failed contrast in one theme only, dividers that did not exist in dark mode, and controls that answered to a mouse but not to a keyboard. The result is a pass over those classes across the app, plus a handful of genuinely new features. The change is almost entirely app-side (/app); the C++ engine is untouched apart from formatting.

Added

  • Welcome screen, rebuilt as a split launcher. A first-run screen that gets you into a request instead of describing the app, with smarter new-request targeting and a direct route into History.
  • OAuth 2.0 in the collection Auth tab. Collections can now hold an OAuth 2.0 configuration, resolved through the same engine-side token cache the request-level mode uses, so a whole collection can inherit it.
  • Per-request redirect policy. A new Settings tab on the request builder exposes followRedirects and maxRedirects. The engine has always accepted them and defaulted to following, but nothing in the app sent them, so a 3xx was followed silently and never reached the response pane. Turning it off shows you the 3xx itself, status and Location header included. Both fields are stored per request and sent on every Send and every load test.
  • Ramp-Up can start from a chosen concurrency. startConcurrency was plumbed through to the engine but never set, so a ramp always began at the engine default.
  • Two new accent schemes, Magenta and Graphite, in both themes.
  • Row action menus for requests and environments, consolidating what used to be a row of hover-only icons.
  • A manual update check in Settings, rather than waiting for the automatic one.
  • Long names stay readable. Tab titles scroll on hover, and a clipped name gets a tooltip, but only while it is actually clipped.

Changed

  • One colour vocabulary for HTTP status classes. Five places decided what colour a status code should be, and they gave four different answers for 3xx. Measured in OKLab, the old mapping collided on three of ten class pairs, including 5xx against a connection failure at exactly 0.000: "the server erred" and "there was no server" were the same colour. One module now classifies a code and returns the tier to paint it in. 3xx is violet, because it has to be distinct from both 2xx and 4xx.
  • A divider's colour is now decided by the surface it sits on. --border is tuned for the canvas and is the same colour as --card in dark mode, so every rule drawn inside a card was invisible. A surface class now declares its background and the rule that reads on it, and a divider inherits the right value per theme: 1.304 in light, 1.278 in dark, matched, where a single token could only get one theme right.
  • Status colours carry three tiers rather than one, because the same hue does three jobs: an indicator, text, and a solid chip under a white label. Using the fill as a foreground was the most common colour bug in the app.
  • Chart series have their own colour tier. They were borrowing UI tokens, and --destructive measured 1.73 against a near-black plot: a button fill doing duty as a data colour. The status chart also stopped borrowing generic series slots, which had made "violet means redirect" untrue.
  • Loading, empty and error are three primitives, not five hand-written variants, and a failed fetch now reads as a failure rather than as an empty workspace.
  • Keyboard operability throughout. Tab strips, {{variable}} tokens, secret-field toggles, the collection tree, history rows, the body editor's splitter, the load profile picker and the drawer are all operable from the keyboard, most for the first time.
  • Type and geometry are back on the scale. 182 arbitrary font sizes, 52 of which duplicated an existing step while skipping its paired line height. Corner radius now follows the Roundedness setting in places that silently ignored it.
  • The system's reduced-motion preference is honoured.

Fixed

  • Bulk-editing headers silently deleted every header if you followed the panel's own placeholder. It demonstrated Authorization: Bearer token while the parser accepted only Name=value, and unmatched lines are dropped without comment. Both separators are accepted now.
  • The Cookies tab displayed wrong data, not merely less of it. A cookie with an Expires date was split in half at the date's comma, inventing a second row; base64 values were truncated so what was shown was not what the server set; and cookie attributes were parsed on every row and rendered nowhere.
  • Restored tabs showed "Request not found" on a cold start. Tabs are persisted, so this ran on every launch; the lookup read a cache that had not filled yet.
  • A request tab lost its timing breakdown on relaunch, and timing phases printed raw milliseconds however large they got.
  • Dark-mode form fields had no boundary, because --input equalled --card. Text fields are the most-used control in the app.
  • Status chips repainted with the accent colour on hover, because a background passed by a caller replaced the variant's fill but not its hover.
  • Global variables showed a neutral badge instead of their scope colour, in several places independently.
  • The dashboard reported neither a stream failure nor a failed stop. Both were recorded and never displayed, and a failed report retried forever without saying so.
  • A failed collection fetch claimed the workspace was empty, and a loading collection was reported as missing.
  • The title bar was undraggable on some platforms and lost its logo when packaged.
  • Plus a long tail across the collection detail tabs, import modal, tree, drawer, history list, Monaco editors and load-test dialog: clipped focus rings, scrollbars that did not match the app, panels that resized when you switched views, and a native window.confirm replaced with the app's own dialog.

Internal

Documentation was audited against the code and five stale values corrected, with a test that now fails CI when a documented token drifts from the stylesheet. Line endings are normalised through .gitattributes, which had made prettier and eslint unusable as signals on Windows. The test suite runs in node by default with a DOM only where one is needed, and a test that asserted the host platform (and so never exercised the macOS branch) was rewritten. The two response viewers now share the parts they had genuinely duplicated.