NEW v0.1.0 — variables you can see, and fix in place.

The HTTP client
that knows your
image is base64.
The HTTP client
that knows
your image is
base64.
The
HTTP client
that knows
your image
is base64.

Multimodal LLM APIs want your image as base64 inside JSON. Generic HTTP clients leave you to copy-paste a 300KB blob by hand. MMRequest doesn't.

bytes stay in your browser Postman-compatible export
The problem

Vision LLMs want JSON.
You hand-carry a 300KB string.

Every multimodal API — GPT-4o, Claude vision, Gemini, vLLM, Llama vision — expects the file as a base64 string buried inside the request body. Generic HTTP clients (Postman, Insomnia, Bruno) don't help: they were built for REST in a pre-multimodal world.

Without MMRequest
The loop you've been doing manually:
  • Drop image into a base64-encoder website. Hope it doesn't log your file.
  • Copy the 300KB string. Paste it into Postman's body. Watch the editor stutter.
  • Image changes? Re-encode. Re-paste. Re-format the JSON. Re-send.
  • Push a Postman collection — your teammate gets a 300KB blob in their git diff.
  • Debug "Content-Type mismatch" on a multimodal endpoint that takes 12 different body shapes.
With MMRequest
The new loop:
  • Drop the file. Encoded in your browser by FileReader. Bytes never leave your machine.
  • Reference {{base64Image}} wherever your API expects it. JSON body stays human-readable.
  • Send. Substitution happens at the network boundary — collection files stay 1 KB, not 300.
  • Export to Postman when teammates ask for it. They don't need MMRequest to run it.
  • Stream merged. Reasoning + content chunks rejoin into one clean JSON, not 200 NDJSON lines.
How it works

Three steps. No proxies. No upload services.

Everything happens in your browser — no cloud, no account, no proxy server in front of your API.

01 · DROP

Attach the file.

Drag & drop, file picker, or ⌘ + V paste. Image or audio. Multiple files.

02 · REFERENCE

Use the variable.

Drop {{base64Image}} or {{rawBase64Image}} wherever the API expects it. Custom names allowed.

03 · SEND

Hit ⌘+Enter.

MMRequest substitutes at the network boundary. Inspect via Pretty, Raw, Stream, Headers, or Console.

vs. existing tools

It's not Postman, and that's the point.

Postman, Insomnia, and Bruno are excellent general HTTP clients. MMRequest is built around one specific workflow they leave to you. Here's what differs.

Postman / Insomnia / Bruno
MMRequest
Auto base64 for images / audio Drop a file → bound to a variable
Manual
Built-in
Ready-made LLM API templates OpenAI · Claude · Gemini · vLLM bodies, one click
~ Community-hosted
Curated, built-in
Token usage & cost tracking Per-request input/output + auto cost — even on SSE streams
Manual
Built-in
Streaming response merge NDJSON / SSE chunks → one combined JSON
Raw chunks
Auto-merged
Reasoning token capture o-series / DeepSeek reasoning + content joined
None
Both channels
Collapsible JSON viewer Long base64 strings fold per-field
~ Flood
Per-field fold
Privacy Where do your bodies + tokens live?
~ Cloud-synced
Browser only
Postman Collection v2.1 import / export Real base64 embedded — runs standalone
Native
Compatible
Whole-app themes + system sync Light/dark + 10 hand-tuned palettes
~ Theme limited
10 themes
Bottom line: if you call multimodal LLM APIs, MMRequest removes the one step that breaks the rest of your workflow. Keep using Postman for everything else — and import/export between them whenever you need.
In-browser editing

Edit anything you drop in.

Annotate images, trim audio, and edit documents — all without leaving the tab. Every transform happens in-browser; nothing is uploaded.

🎨

Image annotator

Six tools — Select, Shape (○ ▢ →), Sketch, Text, Crop, Transform (rotate 45° / flip). 5-color palette, configurable stroke width, font size, undo / redo, draggable corner handles. PNG / JPG / WebP export.

🎚

Audio editor

Waveform with draggable trim handles + numeric Start / End inputs + Preview. Mono mix-down and sample-rate downsample (16 kHz for Whisper, 8 kHz for telephony) re-encode to WAV right in the browser.

📄

Document editor (10+ formats)

PDF · DOCX · XLSX · PPTX · HWPX (text extraction) plus 60+ code / config extensions (py, js, ts, go, rs, java, sh, sql, yaml, html, css, Dockerfile, …). CodeMirror-backed editor with syntax highlight, line numbers, multi-cursor, search.

🛡

Large-media guard rails

Images past 8000 px auto-downscale on open. Audio is hard-capped at 200 MB / 1 hour (Gemini Files ceiling); exports over 25 MB warn since OpenAI Whisper / Groq cap requests at exactly that. Local-first by design — nothing leaves your browser.

Features

All the HTTP-client niceties.
Plus the one thing nobody else does.

Built on the actual day-to-day workflow developers have against LLM APIs.

🖼

Auto base64 — your file, in your body.

Drag, paste, or pick. Encoded in-browser via FileReader. Multiple files, raw + data-URL variants, renameable variables.

// 3 files attached {{base64Image}} → 34 KB {{base64Image2}} → 28 KB {{base64Audio}} → 184 KB // substituted only at Send time
📦

Postman compatible.

Export to Collection v2.1 with real base64 embedded — runs anywhere. Import Postman collections too. No lock-in.

🌊

Streaming, merged.

A Stream tab merges chunked NDJSON / SSE (incl. reasoning tokens) into one combined JSON. OpenAI, vLLM, Anthropic, Gemini, or your own.

🌲

Collapsible JSON.

Pretty view folds per field. Long strings collapse with "…expand" — base64 stops flooding your screen.

⌨️

VS Code-style editor.

CodeMirror: bracket match, multi-cursor, padded line numbers, ⌘ + / comments.

🗂️

Tabs & collections.

Multi-session, drag & drop reorder, pin favorites. ⌘ + S save · ⌘ + E rename.

Themes

Ten themes.
Pick one — or sync with your system.

Whole-app recoloring (not just an accent). Seven dark, three light. Auto day/night follows your OS.

🌙 Midnight
🌊 Ocean
🌲 Forest
🌌 Aurora
🌅 Sunset
🩸 Crimson
❄ Nord
☀ Daylight
📄 Paper
🌿 Mint
Changelog
shipped · 2026-06-24

Variables you can see — and fix in place.

⌨️
Type {{ for autocompleteIn the URL, header values, the Auth token, or the body editor, type {{ and a dropdown lists the active environment's variables (name + value preview). Arrow / Enter / click inserts the name and the closing }}.
🎨
Live {{variable}} highlightingA closed {{name}} turns blue when it resolves and red when it doesn't, so a typo or undefined name is visible as you type — URL, headers, auth, and body.
Hover to editHover a resolved (blue) token to see its value and edit it in place; editing an environment variable saves back to the active environment. A chip shows the source — Environment, and in the body editor also Request variables and Media bindings (with the file name) — color-coded, with the one in effect marked.
🔗
Jump from the cardThe hover card links straight to the Environments editor and to a quick "Variables in request" list.
🌲
Reorder folders, paste in placeDrag a folder onto a sibling's top or bottom edge to drop before / after it (the middle still nests); collections and sub-folders reorder freely. Copy / paste in the sidebar now drops each copy right under its original — every one, for multi-select — instead of at the bottom.
📋
PolishRunner tabs sit first in the tab strip. The response Copy button copies what the active tab shows — formatted JSON on Pretty, key:value on Headers, the merged chunk on Stream — and a Pretty-view selection copies as valid JSON.
shipped · 2026-06-22

Hindi support, and a quieter, safer console.

🇮🇳
Hindi (हिन्दी)The guide, landing, store listing, and Chrome locale now ship in Hindi — the 9th language.
🔒
Quieter, safer consoleThe in-app Console no longer floods the browser DevTools, and secret values (auth token / API key / Basic password / secret variables) are masked in the logged URL, headers, and body — safe to screen-share.
🏃
Judge score rollupRunning an LLM-as-Judge set now shows an average of numeric scores and a tally of non-numeric verdicts in the Runner totals.
shipped · 2026-06-17

A real guide, secrets that stay hidden, a sharper Runner.

🧭
In-app guide, rebuiltA left-nav, multi-page reference (11 pages) plus a new Edit media page, in 8 languages.
🔒
Credentials stay maskedAuth tab (Bearer / Basic / API key) and secret Variables mask by default with an eye toggle; a {{var}} reference is never masked.
🏃
Runner upgradesRun variables are now the highest-priority layer (override the whole run without editing the data file), the data file takes drag-and-drop with a built-in sample, and a pinned OpenAI (Runner) example grades {{prompt}} against {{expected}}. The result table now carries Prompt / Response columns (hover for the full text) and a Score column that extracts the judge verdict; totals average numeric scores and tally verdicts, and a JSON export re-loads as a data file.
⚖️
LLM-as-Judge templatesA new ⚖️ LLM-as-Judge (OpenAI) book ships 23 evaluator prompts (hallucination, faithfulness, toxicity, …) plus a Korean version; inputs/outputs unified to {{prompt}} / {{response}}, so one data file batch-grades every judge through the Runner.
🌊
Stream tab re-assembles cleanlyA streamed OpenAI response is rebuilt into one completed chat.completion.chunk (full delta.content, finish_reason + usage preserved); each frame's obfuscation is kept as obfuscation_history. Raw tab still shows the original SSE.
📤
Export to PostmanDownload all collections as one .zip of .postman_collection.json files (Postman v2.1).
🌲
Environments: reorder & quick attachDrag variable rows to reorder; click an empty FILE cell to attach.
🧩
Copied code carries attributionCopy as cURL / Python / JavaScript prepends a Generated by MMRequest comment.
💾
Your open sub-tab sticksThe active request sub-tab (Body / Headers / Auth / Test / Variables) persists across reloads.
🐛
PolishDiscord link is now Bug Report; Media Input rows are read-only; per-method colors.
shipped · 2026-06-14

Drop once, send everywhere. And grade what comes back.

🌐
Global Media panel — drop once, send everywhereDrop a file once and it binds as {{base64Image}} in every request tab — compare the same image across GPT-4o, Claude, and Gemini without re-dropping. A per-file eye toggle includes / excludes files from binding without deleting them.
🖼
Response Preview tabGenerated images and TTS audio render right in the response — b64_json, inlineData, image URLs, or binary bodies. Edit a result or drag it into the Media panel to feed the next request.
Auto-poll for async image APIsFLUX / Replicate-style jobs return {id, polling_url} first; press Send once and the result is polled until the image lands — in the same tab.
Test tab — declarative checks, no scriptsPass / fail rules built with dropdowns. Response-text checks are vendor-normalized — one rule reads OpenAI, Claude, and Gemini replies alike — plus status, latency, and output-token / cost caps.
📊
Runner, grown into an evaluation harnessJSONL / JSON data files (each row = one iteration binding its keys as variables), run-level variables, the shared Media panel with toggles, and a per-row test report that calls out failures with the actual value.
🔗
Click-to-save variablesHover a response field, click {{+}}, and it's a variable for the next request. upload → file_id → use, without copy-paste.
📦
Body modes — form-data / x-www-form-urlencodedBoth render a KV editor; file rows attach from the Media panel or the OS file picker. OpenAI / Claude Files API templates included.
Import from cURL & Copy as Python / JavaScriptPaste a vendor's curl to build the whole request; export working requests as Python (requests / OpenAI SDK) or JS fetch — secrets as env vars, media as file-read code.
🔌
WebSocket mode (WS)Pick WS in the method dropdown, press Connect, and work a live message timeline — sent ↑ / received ↓ frames with timestamps, {{vars}} substituted.
🔒
Secret variablesMask an API key with the lock toggle — safe for screen shares. The real value still substitutes into requests at Send.
🗂
Sidebar multi-selectSelect folders, requests, and examples together — ⌘/Ctrl-click toggles one, Shift-click takes the whole range in between. Drag the selection into any folder or collection. Copying a partially-selected folder keeps its structure but carries only the items you picked. Whole collections can be multi-selected the same way (⌘/Shift) and bulk-deleted in one go. Bulk delete always uses the in-app confirm, never the browser dialog.
📑
Examples grow upEvery example row gets a ⋯ menu (Rename / Duplicate / Copy / Delete), an EX tag, and a saved/unsaved dot. Drag or copy an example into another request. And saving an example now saves into that example — not its parent request.
🎨
Per-method colorsGET / POST / PUT / DELETE / PATCH / WS each read in their own color across the sidebar, tab strip, and Runner. The method picker is now a real DOM dropdown instead of a native select.
🛟
Data-loss fix — FILE values move to IndexedDBA FILE value in a request's Variables tab or an Environment used to sit in localStorage, eating its quota — and once full, a reload could roll your whole collection back. Those payloads now live in IndexedDB, and a quota-blocked write warns instead of silently dropping the change.
shipped · 2026-06-09

Edit anything you drop in. Images, audio, documents — right in the tab.

🎨
Image annotatorIn-browser editor with six tools — Select / Shape (○ ▢ →) / Sketch / Text / Crop — plus a 5-color palette, configurable stroke width, font size, undo / redo (⌘Z / ⌘⇧Z), draggable corner handles for resize, and PNG / JPG / WebP export. Press Enter on a crop rectangle to commit the crop and keep editing on the smaller image.
📄
Document attachments (PDF / Office / HWPX / text / code)Drop 10+ document formats: PDF, DOCX, XLSX, PPTX (vendor-native multimodal input), HWPX with on-device text extraction (JSZip + OWPML), and 60+ code / config extensions (py, js, ts, go, rs, java, sh, sql, yaml, html, css, Dockerfile, …) read as inline text. Edit modal uses the same CodeMirror surface as the body editor — syntax highlight, line numbers, multi-cursor, search.
🖼️
Custom regions (3-area image picker)Settings → Custom drops your own image into three idle regions — left sidebar background, right Media panel background, and the empty Response area — with a master toggle to hide all three at once without losing the uploads. Sidebar gap also doubles as an inline note field (click to type, Enter to save).
Image resizeLock-aspect W × H form with JPEG quality slider and 256 / 512 / 1024 presets — the values vision LLMs auto-downscale to anyway, so you save the request body bytes instead of paying for the round-trip.
🎚
Audio editor — trim / mono / sample-rateWaveform with draggable trim handles + numeric Start / End inputs + Preview button. Mono mix-down and sample-rate downsample (16 kHz for Whisper / Gemini, 8 kHz for telephony) re-encode to WAV in-browser — no external tools. Native ▶ also obeys the trim range.
🔍
Lightbox + edited markerClick a thumbnail to view full size (Esc closes). Once a clip is run through Resize / Annotate / Audio Edit it picks up an accent outline (images) or a blue gradient + ✓ badge (audio) so originals and edits are obvious at a glance.
🛡
Large-media guard railsDrone shots and hour-long recordings no longer crash the editor. Images past 8 000 px / 48 MP auto-downscale on open. Audio is hard-capped at 200 MB / 1 hour (Gemini Files' ceiling); Apply also flags exports over 25 MB — exactly the OpenAI Whisper / Groq request limit.
📋
Copy-to-clipboard confirmThe 📋 Copy button on each media item now confirms before writing megabytes of base64 to your clipboard, with a one-click shortcut to the Setting that turns the prompt off (Settings → General).
💾
Storage rework — IndexedDB + Settings → StorageLarge attachments no longer trigger silent localStorage quota loss. Drop-panel media moves to IndexedDB; Settings → Storage gives a per-bucket breakdown (Media / Request / Env) with a selection modal that requires typing "delete" to confirm.
🌲
Runner as a real treeFolders, nested examples, and a folder-level bulk-toggle checkbox. Toggling a request cascades to its examples. Draggable horizontal and vertical pane resizers that clamp against the other pane so neither side can collapse.
TPS readout (tokens per second)Response tab inline label, footer status chip, Runner totals bar, and every Runner row now show generation throughput. Compare models / providers side-by-side. Re-sending faster than before pulses the status chip green.
🪟
Media panel layoutSidebar-height float; the dropzone bottom aligns with the request-tabs bottom on every viewport. Sticky M | R | E size footer pinned to the panel bottom shows what's about to ride on the wire.
🎛
Five new Settings → General togglesVariables tab hint, Resolved URL preview, Response tab inline status, Media panel info chips, and the Response watermark. Each preference persisted independently.
📏
Variables tab metadataPicking a file now records dimensions and duration, so the meta row reads "640×440 · 44.7 KB" instead of just a size estimate. Lazy backfill for already-attached entries.
Example renameThe ✎ button or Cmd/Ctrl+E on any example row in the sidebar starts an inline rename; Esc with an example tab active deletes it (skips when typing in an input).
🎨
Five more light themesFrost, Blossom, Sand, Lavender, Linen — each with its own brand pair. Settings → Themes now ships 8 light + 7 dark.
🫧
Auto-hide scrollbarsSidebar Collections, Runner sequence list, and the body editor now reveal their scrollbars only on hover. Cleaner read at idle.
shipped · 2026-06-07

Tokens, properly. Collection Runner, properly.

🔢
Stream-aware token extractionServer-sent event responses (OpenAI / vLLM / Anthropic / Gemini) are parsed end-to-end. Token usage and cost surface even when the request is streamed — the detail panel shows merged content + usage, with a one-click toggle to the original SSE frames.
💵
Total cost rollupEvery Runner result carries a footer with ↑ input · ↓ output · total cost. Lives outside the table so columns stay aligned at any width.
📐
Pricing pane — actually editableNumber inputs in Settings → Pricing now select-to-replace on click. The per-million rate you type sticks, even on values like 0. Each row is decoupled.
Collection Runner, rebornTwo-pane layout — Run Sequence on the left, configuration on the right. Drag a collection or folder from the sidebar to load it. Iterations, delay, stop-on-failure, per-row skip checkbox.
🪟
Multi-tab Runner instancesEach press of ▶ Runner opens a new tab, auto-named after the collection you drop in. Run several suites side-by-side without losing earlier results.
🔍
Per-row response panelClick any result row to open a right-side detail panel showing the full response, status, duration, and content type — for successful rows too, not only errors.
Unresolved variable warningsIf a selected request references a {{var}} not bound by the active environment or its own variables, a ⚠ appears on the row and a banner above Run lists every missing key — caught before the request fires.
shipped · 2026-06-04

Folders, environments, and serious power-user kit.

📁
Folder hierarchyPostman-compatible nested folders inside collections. Drag & drop, rename, duplicate, with full round-trip on export.
🌐
EnvironmentsGroup variables into named environments (Dev / Staging / Prod). One active at a time, available everywhere as {{var}}.
📎
Media variablesAttach an image or audio file directly to any variable — globally or inside an environment. Reference as {{base64Image}} / {{base64Audio}}; swap files per request without touching the dropzone.
📥
Postman archive importDrop a Postman export folder — collections, folders, and environments come in together. Secrets stripped, plain values kept.
Multi-select & bulk opsShift+click to range-select across collections. Bulk copy, paste, and delete with a single confirmation.
🪄
Smarter copy / pasteCmd+V pastes into the folder or collection you have selected. Unsaved tabs prompt before being copied stale.
⌨️
Power shortcuts⌘ S save · ⌘ E rename · ⌘ C / V copy & paste · delete · ⌘ Enter send.
shipped · 2026-05-27

The biggest release yet.

🎨
10 themes + system syncSeven dark, three light. Whole-app recoloring, ambient gradient, brand-tinted UI.
📦
Postman compatibleExport to Collection v2.1 with real base64 embedded. Import Postman collections.
🌊
Stream tabMerges NDJSON / SSE chunks (incl. reasoning tokens) into one combined JSON.
🌲
Collapsible JSON viewerPer-field fold. Long strings collapse with "…expand" — no more base64 floods.
⌨️
VS Code-style body editorCodeMirror with bracket matching, multi-cursor, padded line numbers, ⌘ + / comment toggle.
🗂️
Tabs & collections polishRight-click menu, drag & drop reorder, pin favorites, rename / duplicate / copy, search.
Install

Stop pasting base64.
Start shipping.

One click install. Everything runs in your browser.

Get on the Chrome Web Store →
Got feedback? Join us on Discord →