v4.1.0
usebruno/brunov4.1.0Aug 20, 2026by sid-bruno
AI Summary
This release introduces a Mock Server, a rich text documentation editor, and global client certificate support, alongside security improvements for authorization headers.
Key Highlights
- Mock Server implementation
- Rich text docs editor
- Global client certs support
- Fix for authorization header leaks
- Environment search filter
New Features
- Mock Server implementation
- Rich text docs editor
- Global client certs and disabling individual client certs
- Handling authorization header leaks on redirect
- Search filter to environment selector dropdown
- Drag-and-drop and alphabetical sorting for variables
- GCP Secret Manager support
- Git remote operation modals and proxy configuration
- SQLite SDK for secondary queries
- Preserve scripts option for Postman import/export
Full Release Notes
# Changelog ### Features - feat: Mock Server implementation by @utkarsh-bruno and @shubh-bruno in [#8734](https://github.com/usebruno/bruno/pull/8734) - feat(docs): Rich text docs editor by @Gopi-bruno in [#8559](https://github.com/usebruno/bruno/pull/8559) - feat(cli): add --global-env-var to override global environment variables at runtime by @abhishekp-bruno in [#8620](https://github.com/usebruno/bruno/pull/8620) - feat(client certs): add global client certs and allow disabling individual client certs. by @morsh-bruno in [#8751](https://github.com/usebruno/bruno/pull/8751) - feat(auth-headers): handling authorization header leaks to third party servers on redirect by @Gopi-bruno in [#8380](https://github.com/usebruno/bruno/pull/8380) - feat(envs): adding search filter to environment selector dropdown by @Gopi-bruno in [#8277](https://github.com/usebruno/bruno/pull/8277) - feat(environment): add default env to presets by @sachin-thakur-bruno in [#8612](https://github.com/usebruno/bruno/pull/8612) - feat: support drag-and-drop and alphabetical sorting for variables by @adwait-bruno in [#8603](https://github.com/usebruno/bruno/pull/8603) - feat: add sorting to the secrets tab as well by @adwait-bruno in [#8871](https://github.com/usebruno/bruno/pull/8871) - feat(collections): open multiple collections from a monorepo by @gopu-bruno in [#8724](https://github.com/usebruno/bruno/pull/8724) - feat(collections): add description text to open collection selection modal by @gopu-bruno in [#8793](https://github.com/usebruno/bruno/pull/8793) - feat(presets): updated presets design by @sachin-thakur-bruno in [#8828](https://github.com/usebruno/bruno/pull/8828) - feat(presets): updated dropdown with menu dropdown and label weight ux changes by @sachin-thakur-bruno in [#8841](https://github.com/usebruno/bruno/pull/8841) - feat(migrate): enhance migration modal to handle collection drafts by @naman-bruno in [#8899](https://github.com/usebruno/bruno/pull/8899) - feat: add migrate-to-YML pill to collection header by @naman-bruno in [#8882](https://github.com/usebruno/bruno/pull/8882) - feat(converters): add support for script execution flow in yml configuration by @naman-bruno in [#8745](https://github.com/usebruno/bruno/pull/8745) - feat: add preserve scripts option for Postman import/export by @gopu-bruno in [#8726](https://github.com/usebruno/bruno/pull/8726) - feat(snapshot): persisting sidebar state in the snapshot by @Gopi-bruno in [#8328](https://github.com/usebruno/bruno/pull/8328) - feat(code-mirror-search): add replace and replace-all with search position, debouncing and tests by @sachin-thakur-bruno in [#8715](https://github.com/usebruno/bruno/pull/8715) - feat(db): sqlite as a re-usable SDK for secondary queries by @chirag-bruno in [#8533](https://github.com/usebruno/bruno/pull/8533) - feat(request): warn when binary body file is missing on disk by @sanish-bruno and @rajashreehj-bruno in [#8753](https://github.com/usebruno/bruno/pull/8753) - feat(size/M): Default to no environments selected in the Generate Documentation modal by @sachin-bruno in [#8785](https://github.com/usebruno/bruno/pull/8785) - feat(ai): add focus for prompt input after AI response completion by @naman-bruno in [#8747](https://github.com/usebruno/bruno/pull/8747) - feat(secrets): add GCP Secret Manager support by @abhishekp-bruno - feat(git): implement Git remote operation modals and enhance branch selection UI by @utkarsh-bruno - feat(proxy): implement Git proxy environment configuration by @utkarsh-bruno - feat(git-providers): apply network config for git provider APIs by @gopu-bruno - feat(app/git): inform the user that edits are being made on protected branches by @sid-bruno - feat(workspace): warning about unsynced collections excluded from Fetch in Bruno embed by @ravindra-bruno - feat(license): report app version, OS, arch and telemetry id on licence calls by @hassan-bruno ### Fixes - fix(auth): stop AWS V4 auth headers from leaking on cross-origin redirects by @Gopi-bruno in [#8893](https://github.com/usebruno/bruno/pull/8893) - fix(secrets): block duplicate secret names to prevent value loss by @pooja-bruno in [#8750](https://github.com/usebruno/bruno/pull/8750) - fix(security): overflow on chip list styling by @naman-bruno in [#8748](https://github.com/usebruno/bruno/pull/8748) - fix(app): global environment variables for apps by @naman-bruno in [#8900](https://github.com/usebruno/bruno/pull/8900) - fix(app): re-add new request shortcut by @sid-bruno in [#8805](https://github.com/usebruno/bruno/pull/8805) - fix(workspace): stopped the same collection from rendering twice with conflicting status by @ravindra-bruno in [#8947](https://github.com/usebruno/bruno/pull/8947) - fix(workspace): showing only the remove option for the failed collection in workspace overview by @ravindra-bruno in [#8932](https://github.com/usebruno/bruno/pull/8932) - fix(workspace): notify about collections that fail to open in Workspa… by @ravindra-bruno in [#8719](https://github.com/usebruno/bruno/pull/8719) - fix(workspaces): switch to default workspace on close so header shows correct name by @ravindra-bruno in [#8425](https://github.com/usebruno/bruno/pull/8425) - fix(editor): fixed search and replace input border by @sachin-thakur-bruno in [#8930](https://github.com/usebruno/bruno/pull/8930) - fix(editor): tab indentation on code blocks by @sachin-thakur-bruno in [#8926](https://github.com/usebruno/bruno/pull/8926) - fix(editor): add guessed language in language dropdown picker by @sachin-thakur-bruno in [#8925](https://github.com/usebruno/bruno/pull/8925) - fix(editor): allow app keybindings if that keybindings is not present in rich text editor by @sachin-thakur-bruno in [#8894](https://github.com/usebruno/bruno/pull/8894) - fix(codemirror-search): keybinding for focusing search and replace inside the search container by @sachin-thakur-bruno in [#8895](https://github.com/usebruno/bruno/pull/8895) - fix(sidebar): prevent drag divider from disappearing on zoom-out by @gopu-bruno in [#8266](https://github.com/usebruno/bruno/pull/8266) - fix: OpenAPI Spec Viewer: throws resolver errors for `$ref` schemas by @arpit-bruno in [#8892](https://github.com/usebruno/bruno/pull/8892) - fix(openapi): strip trailing dots from operation names on import by @adwait-bruno in [#8812](https://github.com/usebruno/bruno/pull/8812) - fix: populate collection & folder docs on OpenAPI/swagger imports by @adwait-bruno in [#8803](https://github.com/usebruno/bruno/pull/8803) - fix(transient-request): unable to create transient request when preset is websocket by @chirag-bruno in [#8889](https://github.com/usebruno/bruno/pull/8889) - fix: cmd+w now works for transient tabs by @adwait-bruno in [#8429](https://github.com/usebruno/bruno/pull/8429) - fix: persist additional request values in preferences general tab save by @morsh-bruno in [#8823](https://github.com/usebruno/bruno/pull/8823) - fix(proxy): update timestamp label format by @abhishekp-bruno in [#8870](https://github.com/usebruno/bruno/pull/8870) - fix(ws): disable message queuing when in intermediate connection states by @sid-bruno in [#8879](https://github.com/usebruno/bruno/pull/8879) - fix(ws): remove auto-reconnect in websockets by @sid-bruno in [#8605](https://github.com/usebruno/bruno/pull/8605) - fix(ws): add height for ws msgs to fix search overlap by @sachin-thakur-bruno in [#8814](https://github.com/usebruno/bruno/pull/8814) - fix(mount): hydrate websocket message uids in the cached mount path by @chirag-bruno in [#8862](https://github.com/usebruno/bruno/pull/8862) - fix: change-version modal ui by @adwait-bruno in [#8735](https://github.com/usebruno/bruno/pull/8735) - fix: keep sort column header from shifting when the arrow appears by @adwait-bruno in [#8833](https://github.com/usebruno/bruno/pull/8833) - fix(generate-code): encode a literal colon in the path when url encoding is enabled by @pooja-bruno in [#8834](https://github.com/usebruno/bruno/pull/8834) - fix(generate-code): generate code for url interpolation by @pooja-bruno in [#7308](https://github.com/usebruno/bruno/pull/7308) - fix(presets): ux fixes for dropdown and icon spacing by @sachin-thakur-bruno in [#8827](https://github.com/usebruno/bruno/pull/8827) - fix: Description missing for the import export yml for the environments by @sachin-bruno in [#8822](https://github.com/usebruno/bruno/pull/8822) - fix: add dynamic font size adjustment for CodeMirror info display by @adwait-bruno in [#8817](https://github.com/usebruno/bruno/pull/8817) - fix(export/import): OpenCollection YAML drops collection and folder-level post-response variables by @sachin-bruno in [#8815](https://github.com/usebruno/bruno/pull/8815) - fix(node-vm): resolve npm modules from additionalContextRoots via native walk-up by @sanish-bruno in [#8538](https://github.com/usebruno/bruno/pull/8538) - fix(curl-import): treat inline --data-binary as body, not file by @pooja-bruno in [#8617](https://github.com/usebruno/bruno/pull/8617) - fix(dev-tools): console and network filter dropdown position to top if no space by @sachin-thakur-bruno in [#8713](https://github.com/usebruno/bruno/pull/8713) - fix(bruno-response): normalize response header name lookup to be case-insensitive by @abhishekp-bruno in [#8461](https://github.com/usebruno/bruno/pull/8461) - fix(runner): collection runner loader issue by @sharan-bruno in [#8783](https://github.com/usebruno/bruno/pull/8783) - fix: avoid network probe in PAC myIpAddress by @cyphercodes in [#8588](https://github.com/usebruno/bruno/pull/8588) - fix: url truncates in docs by @adwait-bruno in [#8468](https://github.com/usebruno/bruno/pull/8468) - fix: env configure remains visible by @adwait-bruno in [#8530](https://github.com/usebruno/bruno/pull/8530) - fix: Folder Sequencing When we try to move any folder at the bottom of the folders list by @ravindra-bruno in [#8722](https://github.com/usebruno/bruno/pull/8722) - fix(environment): auto save on env table removing some characters by @sachin-thakur-bruno in [#8732](https://github.com/usebruno/bruno/pull/8732) - fix(timeout): allow inherit request timeout for yaml requests by @shubh-bruno in [#8746](https://github.com/usebruno/bruno/pull/8746) - fix: binary body lost on importing from postman by @sanish-bruno and @rajashreehj-bruno in [#8729](https://github.com/usebruno/bruno/pull/8729) - fix(converters): add missing auth mappings on postman export, add additional parameters mapping on postman import by @morsh-bruno in [#8494](https://github.com/usebruno/bruno/pull/8494) - fix: failing test case fix by @utkarsh-bruno in [#8801](https://github.com/usebruno/bruno/pull/8801) - fix(git): fixing pac proxy and removing buildGitProxyEnv as the secondary proxy implementation by @utkarsh-bruno - fix(git): use primary color for create branch cta by @gopu-bruno - fix(git): update onClose to use handleBackToOverview by @naman-bruno - fix(proxy-util): enhance proxy environment configuration by @utkarsh-bruno - fix(GitHub): deduplicate instance URL save on OnBlur/Enter by @gopu-bruno - fix(GitHub): prevent redundant URL saves in GitHub configuration by @naman-bruno - fix: added Git submodule initialization and fetch for workspace collections by @ravindra-bruno - fix(workspace): written .gitmodules for git-synced collections so submodules resolve by @ravindra-bruno - fix(Embed): showing warning before sharing a workspace with unsynced changes by @ravindra-bruno - fix(doc-url): replaced Fetch In Bruno doc url for workspace embeding by @ravindra-bruno - fix(watcher): improve unlink logic to handle both formats by @naman-bruno - fix(external-secrets): correct external secret variables autocomplete duplicates and its variable-info scope by @lohit-bruno - fix: added a min and max height with an overflow to avoid the resizing based on the remotes fetched by @utkarsh-bruno - fix(openapi): export scheme-less request URLs as server entries by @adwait-bruno - fix(export): Postman export modal rendering in Share Collection by @gopu-bruno - fix(default-env): load env from file destructing by @sachin-thakur-bruno - fix(runner): Collection Runner - Loader still keeps running even after Cancelling the execution by @sharan-bruno - fix(UI): In Runner post execution "Run again" button is missing by @sharan-bruno - fix(collection-runner): disable runner in iterations count by @shubh-bruno ### Others - feat(tests): enhance Playwright configuration for sharded CI runs by @sid-bruno in [#8742](https://github.com/usebruno/bruno/pull/8742) - security(ipc): confine file-write handlers to known collections and api specs by @chirag-bruno in [#8274](https://github.com/usebruno/bruno/pull/8274) - refactor(ai): moved AI Assist from floating overlay into request pane and collection/folder settings tab bars by @ravindra-bruno in [#8693](https://github.com/usebruno/bruno/pull/8693) - refactor(ai): update API key handling in openai comp providers by @naman-bruno in [#8749](https://github.com/usebruno/bruno/pull/8749) - refactor(tests): update data type assertions to use data-selected-type attribute for consistency by @bijin-bruno in [#8731](https://github.com/usebruno/bruno/pull/8731) - yml migration rework by @naman-bruno in [#8795](https://github.com/usebruno/bruno/pull/8795) - reported how many collections failed to open on workspace load by @ravindra-bruno in [#8831](https://github.com/usebruno/bruno/pull/8831) - Added the ignore for the collection nested folders by @ravindra-bruno in [#8725](https://github.com/usebruno/bruno/pull/8725) - Added the fix for bru.runner.stopExecution() while running collection run from tests by @ravindra-bruno in [#8720](https://github.com/usebruno/bruno/pull/8720) - ci: move all linux to self hosted by @sid-bruno in [#8791](https://github.com/usebruno/bruno/pull/8791) - ci(tests-macos): disable mac runners on each PR by @sid-bruno in [#8752](https://github.com/usebruno/bruno/pull/8752) - test: fix the draft indicator tests for collection client certs by @morsh-bruno in [#8824](https://github.com/usebruno/bruno/pull/8824) - test(converters): add round trip tests for Postman <-> Bruno converters by @morsh-bruno in [#8534](https://github.com/usebruno/bruno/pull/8534) - chore: enhance claude rules & skills by @bijin-bruno in [#8829](https://github.com/usebruno/bruno/pull/8829) - chore(design-system): added segmented control component with storybook by @sachin-thakur-bruno in [#8683](https://github.com/usebruno/bruno/pull/8683) - chore: PR checklist update by @sachin-thakur-bruno in [#8806](https://github.com/usebruno/bruno/pull/8806) - chore(eslint): disable autofix for const by @sachin-thakur-bruno in [#8760](https://github.com/usebruno/bruno/pull/8760) - chore(eslint): adds eslint config warnings for unused-vars, debuggers, duplicate-imports by @sachin-thakur-bruno in [#8505](https://github.com/usebruno/bruno/pull/8505) - chore(pr-decription): updated pr description by @sachin-thakur-bruno in [#8786](https://github.com/usebruno/bruno/pull/8786) - chore(coderabbit): adds coderabbit instructions for adding new file as ts/tsx in bruno app by @sachin-thakur-bruno in [#8717](https://github.com/usebruno/bruno/pull/8717) - fix(tests): jest mock for css imports and change paste timer by @sid-bruno in [#8858](https://github.com/usebruno/bruno/pull/8858) - fix(e2e): Playwright failures from mock server and lazy mount by @sid-bruno in [#8835](https://github.com/usebruno/bruno/pull/8835) - added the validations check and added the ux for this by @ravindra-bruno - feat(telemetry): instrument app lifecycle and monetization events (app_first_launched, first_request_sent, paywall_viewed, monetization_cta_clicked, paid_state_recognized) and stamp event_version on all desktop events via shared capture by @ankit-bruno - feat(telemetry): add trial flow events with classified failure reasons and trial-window boundaries for session_activity by @ankit-bruno - fix(tests): pass tmpDir to CLI run commands in integration tests by @sanish-bruno - fix(test): postman to bruno test assertion by @sachin-thakur-bruno - fix(RunnerResults): add data-testid attribute to cancel button by @sanish-bruno ### New contributors * @morsh-bruno made their first contribution in https://github.com/usebruno/bruno/pull/8494 * @cyphercodes made their first contribution in https://github.com/usebruno/bruno/pull/8588 * @Gopi-bruno made their first contribution in https://github.com/usebruno/bruno/pull/8328 * @arpit-bruno made their first contribution in https://github.com/usebruno/bruno/pull/8892 **Full Changelog:** https://github.com/usebruno/bruno/compare/v4.0.0...v4.1.0