⚡ HTTP Pulse
A fast, beautiful HTTP client that lives inside your .http files.
Run requests with a click, switch environments, use variables, and inspect
responses in a polished panel — without ever leaving the editor.

English · Русский
✨ Why HTTP Pulse?
.http files are the easiest way to keep API calls next to your code. HTTP Pulse
turns them into a full-featured client:
|
Feature |
What it gives you |
| 🚀 |
CodeLens actions |
▶ Run and cURL lenses above every request — no command palette needed |
| 🌍 |
Environments |
Public and private http-client.env.json files, quick switch from the status bar |
| 🧠 |
Smart variables |
File variables, environment variables, $processEnv, .env and dynamic generators |
| 📊 |
Rich response viewer |
Status, timing waterfall, headers, request preview, JSON highlighting, image preview, search |
| 🕘 |
History |
Persistent, searchable history with method/status filters, grouping and per-entry deletion |
| 🔗 |
Response scripts |
Chain requests: extract values with client.global.set and reuse them as {{variables}} |
| 🧾 |
Multipart forms |
Declarative # @form fields, including file uploads |
| 🖥️ |
Proxy & mTLS |
Route through an HTTP proxy and authenticate with client certificates |
| 💾 |
Persistent history |
History survives window reloads (workspace storage) |
| 🍪 |
Cookie jar |
Login → authenticated call → logout flows just work |
| 🔁 |
Redirects & compression |
gzip / deflate / brotli, configurable redirect handling |
| 🧾 |
cURL bridge |
Copy any request as cURL or paste a cURL command straight into the editor |
| 🏗️ |
ASP.NET Core generation |
Build .http files from C#/F# controllers, single actions and minimal APIs in one click |
| 📮 |
Postman export |
Convert any .http file into a Postman Collection v2.1 |
| ✍️ |
Editor superpowers |
Completion, hover values, go-to-definition, outline and snippets |
| 🌐 |
English & Русский |
The whole UI follows your VS Code display language |
| 🔒 |
Local & private |
No telemetry, no cloud — requests go from your machine to your API |
🚀 Quick start
- Install the extension from the Marketplace (or press
F5 in this repo to
run it locally).
- Create a file with the
.http or .rest extension — or run
HTTP Pulse: New .http File from the Command Palette.
- Write a request and press ▶ Run in the CodeLens above it.
@host = https://httpbin.org
### Health check
GET {{host}}/status
Accept: application/json
### Create a user
POST {{host}}/post
Content-Type: application/json
{
"name": "HTTP Pulse",
"requestId": "{{$guid}}",
"sentAt": "{{$isoTimestamp}}"
}
The response opens in a dedicated panel next to the editor — switch between
Body, Headers, Request and Timing tabs, copy anything, save the
body to disk, or press Run again.
🧰 Request templates
Don't want to start from a blank file? HTTP Pulse ships with ready-made request
templates:
- 🆕 HTTP Pulse: New .http File from Template — from the Command Palette or
by right-clicking a folder in the Explorer. Pick a scenario, name the file, and
it is created with
@host and all required variables already declared.
- ➕ HTTP Pulse: Insert Request from Template — from the Command Palette, the
editor context menu, or the Add request CodeLens at the top of any
.http
file. The request is appended to the current file; missing variables are added
automatically and existing ones are reused.
Included scenarios: GET with query parameters, GET by id, POST / PUT / PATCH JSON,
DELETE, application/x-www-form-urlencoded, multipart/form-data, XML, GraphQL,
Bearer token, Basic auth, API-key header, body from a file, webhook and a health
check.
📝 File syntax
Requests
Requests are separated with ###. The ### line can also carry a title.
### List users
GET https://api.example.com/users?limit=20
Accept: application/json
### Create user
POST https://api.example.com/users
Content-Type: application/json
{
"name": "Ada"
}
# and // start a comment line.
- A request line is
METHOD URL [HTTP/1.1]. A bare URL is treated as GET.
- Headers go right after the request line; the body starts after a blank line.
- Long query strings can continue on
? / & lines:
GET {{host}}/search
?q=http%20client
&page=2
Accept: application/json
File variables
@host = https://api.example.com
@token = super-secret
GET {{host}}/me
Authorization: Bearer {{token}}
Environments
Create http-client.env.json next to your .http file (or in any parent
folder). Values in $shared are available everywhere.
{
"$shared": {
"accept": "application/json"
},
"dev": {
"host": "http://localhost:3000",
"token": "dev-token"
},
"prod": {
"host": "https://api.example.com",
"token": "prod-token"
}
}
🔐 Keep secrets out of version control by using
http-client.private.env.json (it overrides the public file and is meant to be
git-ignored) with the same structure.
Switch environments from anywhere:
- 🟢 the status bar item (bottom right) while an
.http file is active;
- 🧭 the Environment CodeLens at the very top of the file;
- 🏷️ the environment chip in the response panel — click it to change;
- ⌨️ HTTP Pulse: Select Environment in the Command Palette.
The quick pick also lets you open the environment file or create a new one.
🔄 The environment format is the widely used http-client.env.json layout
($shared plus named sections, with an optional http-client.private.env.json),
so existing environment files can be reused as-is.
Precedence (highest wins): private environment → public environment →
private $shared → public $shared → variables declared in the .http file.
Dynamic variables
| Variable |
Example value |
Description |
{{$guid}} / {{$uuid}} |
f81d4fae-7dec-11d0-a765-00a0c91e6bf6 |
Random UUID v4 |
{{$timestamp}} |
1735819200 |
Unix timestamp (seconds) |
{{$isoTimestamp}} |
2026-01-02T03:04:05.678Z |
ISO 8601 timestamp |
{{$randomInt}} |
742 |
Integer from 0 to 1000 |
{{$random.integer(1, 100)}} |
42 |
Integer in a range |
{{$random.alphabetic(8)}} |
kQmZtPvB |
Random letters |
{{$random.alphanumeric(12)}} |
a7Kp2Qz9Lm4X |
Letters and digits |
{{$random.email}} |
nora.lee@example.com |
Random e-mail |
{{$random.city}} |
Lisbon |
Random city |
{{$random.boolean}} |
true |
Random boolean |
{{$datetime "yyyy-MM-dd HH:mm"}} |
2026-01-02 03:04 |
Formatted current time |
{{$processEnv %HOME%}} |
/home/you |
Environment variable of the editor process |
{{$dotenv %TOKEN%}} |
— |
Value from a .env file next to the request file |
{{$projectRoot}} |
/work/my-project |
Workspace root path |
Add comment directives inside a request block:
| Directive |
Effect |
# @name login |
Names the request (used in the outline and history) |
# @timeout 5000 |
Per-request timeout in milliseconds |
# @no-redirect |
Do not follow redirects for this request |
# @no-cookie-jar |
Do not send or store cookies |
# @no-log |
Do not write the request to the output channel |
Body from a file
### Upload payload
POST {{host}}/upload
Content-Type: application/json
< ./payload.json
Use <@ ./payload.json to re-indent a JSON file before sending. Variables are
resolved inside the included file.
🖥️ Response viewer
The response panel is intentionally dense but readable:
- 🎯 Status & timing — colour-coded status chip, duration, payload size, environment.
- 💧 Timing waterfall — DNS, TCP, TLS, first byte and total.
- 🔍 Full-text filter for large bodies.
- 🌈 JSON highlighting with optional pretty-printing.
- 🖼️ Image preview for image responses.
- 🧾 Request tab — exactly what was sent, including resolved variables and redirect chain.
- 🗂️ History management — search across URLs and names, filter by HTTP method or status bucket
(2xx/3xx/4xx/5xx/errors), group entries by method, delete a single response or clear everything.
Filters live behind a compact funnel button, so the list stays readable until you need them.
- 📤 Section actions — copy body / save / open live right inside the Body block,
copy headers inside Headers, copy URL and cURL inside Request. The top bar now
holds only a single Run again chip.
🏗️ Generate requests from ASP.NET Core
Working with a C# or F# ASP.NET Core project? Let HTTP Pulse bootstrap the
.http file for you:
- right-click a controller file in the Explorer → HTTP Pulse: Generate .http for Controller;
- right-click inside a controller action → HTTP Pulse: Generate .http for Action;
- or run either command from the Command Palette for the active file.
The generator understands:
[ApiController] / ControllerBase controllers with [Route], [HttpGet],
[HttpPost], [HttpPut], [HttpPatch], [HttpDelete] and route combinations;
[FromRoute], [FromQuery], [FromBody] and [FromHeader] bindings;
- minimal APIs:
app.MapGet(...), MapPost, MapGroup(...), MapMethods, WithName(...);
- the equivalent F# syntax:
[<HttpGet>], member _.GetById(id: int),
app.MapGet("/x", fun () -> ...) and F# record types.
Routes are combined, converted into {{variables}}, and DTO/record types become
JSON skeletons. The result is written next to the source as
UsersController.http; existing files are appended, never overwritten.
📮 Export to Postman
Run HTTP Pulse: Export as Postman Collection on any .http file (editor title
bar, context menu or Command Palette) to get a Postman Collection v2.1 JSON.
Requests, headers, bodies and all file/environment variables are preserved, so
{{host}} keeps working after import. Dynamic variables such as {{$guid}}
map directly to Postman's own dynamic variables.
🔗 Response scripts & chaining
Add a JavaScript handler after the body to extract values and reuse them in later requests:
### Login
POST {{host}}/login
Content-Type: application/json
{ "email": "ada@example.com", "password": "secret" }
> {%
client.global.set("token", response.body.token);
%}
### Profile
GET {{host}}/me
Authorization: Bearer {{token}}
Inside the sandbox you get:
response.status, response.headers, response.body (parsed JSON when possible),
response.contentType, response.size;
request.method, request.url;
client.global.set(name, value), get(name), isEmpty(), clear([name]);
console.log/warn/error → output channel.
Variables set by handlers are available immediately in subsequent requests and take
precedence over environment and file variables. Scripts run with a 3-second timeout
in a restricted sandbox.
Declare fields with # @form, prefix a file value with <:
### Upload
# @form title = Avatar
# @form photo = < ./photo.png
POST {{host}}/api/upload
Content-Type: multipart/form-data
The body is assembled automatically, the boundary is generated, and the
Content-Type header is updated — including a proper filename and MIME type for
uploaded files.
🖥️ Proxy and client certificates
httpPulse.proxy routes all requests through an HTTP proxy (CONNECT is used for
HTTPS) and supports http://user:password@proxy:8080.
httpPulse.clientCertificateFile + httpPulse.clientKeyFile +
httpPulse.clientCertificatePassphrase enable mutual TLS for HTTPS requests.
💾 Persistent history
Responses are stored in the workspace storage folder (response-history.json), so
history survives window reloads. The number of entries follows
httpPulse.responseHistoryLimit; bodies larger than 256 KB are not persisted.
⌨️ Commands & shortcuts
| Command |
Shortcut |
| HTTP Pulse: Run Request |
Ctrl+Alt+R / Cmd+Alt+R |
| HTTP Pulse: Run All Requests |
Ctrl+Alt+Shift+R / Cmd+Alt+Shift+R |
| HTTP Pulse: Copy as cURL |
— |
| HTTP Pulse: Import cURL from Clipboard |
— |
| HTTP Pulse: Select Environment |
— |
| HTTP Pulse: New .http File |
— |
| HTTP Pulse: Show Last Response |
— |
| HTTP Pulse: Rerun Last Request |
— |
| HTTP Pulse: New .http File from Template |
— |
| HTTP Pulse: Insert Request from Template |
— |
| HTTP Pulse: Generate .http for Controller |
— |
| HTTP Pulse: Generate .http for Action |
— |
| HTTP Pulse: Export as Postman Collection |
— |
Right-click an .http file or the editor for the same actions. Everything is
also available in the Command Palette.
⚙️ Settings
| Setting |
Default |
Description |
httpPulse.timeout |
30000 |
Request timeout in ms (0 disables it) |
httpPulse.followRedirects |
true |
Follow 3xx responses |
httpPulse.maxRedirects |
10 |
Redirect limit |
httpPulse.rejectUnauthorized |
true |
Validate TLS certificates |
httpPulse.environmentFile |
http-client.env.json |
Environment file name |
httpPulse.showCodeLens |
true |
Show CodeLens above requests |
httpPulse.showEditorTitleActions |
true |
Show actions in the editor title bar |
httpPulse.responseHistoryLimit |
30 |
Responses kept in history |
httpPulse.prettyPrintJson |
true |
Pretty-print JSON bodies |
httpPulse.defaultHeaders |
{} |
Headers added to every request |
httpPulse.useCookieJar |
true |
Remember cookies during the session |
httpPulse.proxy |
"" |
HTTP proxy URL (CONNECT for HTTPS) |
httpPulse.clientCertificateFile |
"" |
Client certificate (PEM/PFX) for mTLS |
httpPulse.clientKeyFile |
"" |
Client certificate private key (PEM) |
httpPulse.clientCertificatePassphrase |
"" |
Passphrase for the client key |
🌐 Localization
The extension ships with English (default) and Russian UI. All labels,
messages and settings descriptions follow the VS Code display language — no
configuration required. Switch VS Code to Russian and the extension interface
switches with it.
Manifest strings live in package.nls*.json, runtime strings in
l10n/bundle.l10n.*.json.
🧪 Development
npm install # install dev dependencies
npm run compile # type-check and build to out/
npm run watch # incremental build
npm test # 95 unit tests (parser, variables, cURL, transport, generators, templates, scripts)
npm run verify # tests + activation/webview smoke tests + localization check
npm run package # produce a .vsix
🎨 media/logo.svg is the source of the extension icon. The committed
icon.png (128×128) and media/logo.png (512×512) are exported from it.
Press F5 to launch an Extension Development Host with the extension loaded.
License
MIT — full text in LICENSE. © 2026 Dmitry Sorokin (dimanrus).