The API client that respects you.
Offline-first. Git-native. Single binary. Zero bloat.
~4 MB binary · <10ms startup · 5 MB RAM · 0 dependencies
Install • Quick Start • The .volt Format • How Volt Compares • Features • Web UI • Docs • Benchmarks
Volt is a complete API development toolkit built from scratch in Zig. 72 modules, 49,000+ lines, 653 tests — zero external dependencies. Plain-text .volt files live in your git repo alongside your code. No account required. No cloud sync. No telemetry. No Electron. Just a single binary that does everything Postman does in 1/100th the size.
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/volt-api/volt/main/scripts/install.sh | bash
# Homebrew
brew install volt-api/volt/volt
# Scoop (Windows)
scoop bucket add volt https://github.com/volt-api/scoop-volt && scoop install voltOr download a pre-built binary — it's a single file, just put it on your PATH.
More install options
- uses: volt-api/volt-action@v1
with:
command: test| Platform | Download |
|---|---|
| Linux x86_64 | volt-linux-x86_64 |
| Linux ARM64 | volt-linux-aarch64 |
| macOS ARM | volt-macos-aarch64 |
| macOS Intel | volt-macos-x86_64 |
| Windows | volt-windows-x86_64.exe |
Requires Zig 0.14.1:
git clone https://github.com/volt-api/volt.git && cd volt
zig build -Doptimize=ReleaseFast
# Binary at ./zig-out/bin/voltvolt init # Initialize project (creates .voltrc)1. Create a request — it's just a text file:
# api/get-users.volt
name: Get Users
method: GET
url: https://jsonplaceholder.typicode.com/users
headers:
- Accept: application/json
tests:
- status equals 200
- header.content-type contains json
- $.0.name equals Leanne Graham2. Run it:
volt run api/get-users.volt # Execute request
volt run api/ # Run entire directory as collection
volt quick GET httpbin.org/get # HTTPie-style shorthand (alias: volt q)3. Test it:
volt test api/ # Run all tests (variables chain between files)
volt test --report junit -o results.xml # CI/CD output
volt test --watch # Watch mode — re-runs on file changes
volt test --data users.csv # Data-driven testing4. Commit it. Your API tests now live in git alongside your code. No cloud. No sync conflicts. Just files.
Plain text. Human readable. Git diffable. Everything in one file. It's YAML‑like plain text designed for readability and clean diffs (parsed by Volt's own reader) — not strict YAML.
# api/create-user.volt
name: Create User
description: Creates a new user account
method: POST
url: https://{{host}}/api/users
timeout: 5000
headers:
- Content-Type: application/json
- X-Request-ID: {{$uuid}}
auth:
type: bearer
token: {{$api_token}}
body_type: json
body: |
{
"name": "{{username}}",
"email": "{{$randomEmail}}",
"created": "{{$isoTimestamp}}"
}
tags:
- users
- create
pre_script: |
set timestamp {{$timestamp}}
tests:
- status equals 201
- header.content-type contains json
- $.id exists
- $.name equals {{username}}
post_script: |
extract user_id $.id
extract auth_token $.token# _env.volt — shared variables for all requests in directory
environment: dev
variables:
host: api.dev.example.com
$api_key: dev-secret-key-123 # $ prefix = masked as *** in outputvolt run request.volt --env production # Switch environments
volt env list # List all environments
volt env set key value # Set a variable
volt env get key # Get a variable
volt env create staging # Create new environmentGenerated fresh on every request:
| Variable | Output |
|---|---|
{{$uuid}} / {{$guid}} |
550e8400-e29b-41d4-a716-446655440000 |
{{$timestamp}} |
1708300800 (Unix seconds) |
{{$isoTimestamp}} / {{$isoDate}} |
2026-03-07T08:00:00Z |
{{$date}} |
2026-03-07 |
{{$randomInt}} |
7291 (0–9999) |
{{$randomFloat}} |
0.4832 (0–1) |
{{$randomEmail}} |
user4832@example.com |
{{$randomString}} |
a8f3k2x9 (8 alphanumeric chars) |
{{$randomBool}} |
true or false |
api/
_env.volt # Environment variables
_collection.volt # Collection-level defaults (shared auth, headers)
01-auth/
01-login.volt # Numeric prefixes set execution order
02-get-token.volt
02-users/
get-users.volt
create-user.volt
_env.volt— Variables scoped to the directory and below_collection.volt— Shared auth, headers, base URL inherited by all requests- Numeric prefixes (01-, 02-) establish execution and dependency order
- Variable chaining — Variables extracted in one request are available to the next
| Volt | curl | HTTPie | Bruno | Insomnia | Postman | |
|---|---|---|---|---|---|---|
| Install size | ~4 MB | ~300 KB | ~30 MB | ~150 MB | ~470 MB | ~500 MB |
| Startup | <10ms | ~46ms | ~500-2000ms | ~800-2000ms | ~2-4s | ~3-8s |
| RAM (idle) | ~5 MB | ~3 MB | ~30 MB | ~80-150 MB | ~200-400 MB | ~300-800 MB |
| Dependencies | 0 | libcurl | Python | Electron | Electron | Electron |
| Account required | No | No | No | No | Optional | Yes |
| Works offline | Always | Yes | Yes | Yes | Partial | Requires login |
| Git native | Yes | N/A | N/A | Yes | No | No |
| Built-in tests | Yes | No | No | No | No | Separate (Newman) |
| CI/CD ready | Copy 1 file | N/A | pip install | npm install | npm install | npm install |
| Data format | Plain text | N/A | N/A | JSON files | JSON + DB | JSON (cloud) |
If you open your API client 20 times a day: Volt costs you 0.2 seconds. Postman costs you 100 seconds (~50 minutes per month wasted on startup alone).
Full methodology and raw data: BENCHMARKS.md
volt import postman collection.json --output api/ # From Postman
volt import insomnia export.json --output api/ # From Insomnia
volt import openapi spec.yaml --output api/ # From OpenAPI / Swagger
volt import curl 'curl -X POST ...' --output req.volt # From cURL
volt import har recording.har --output api/ # From HAR filesOne command. Your collections become plain text files in git.
| Feature | Command |
|---|---|
| Execute requests | volt run <file.volt> |
| Run collections | volt run <directory>/ |
| Test assertions | volt test [files...] |
| Data-driven testing | volt test --data data.csv |
| Watch mode | volt test --watch |
| Load testing | volt bench <file> -n 1000 -c 50 |
| Mock server | volt mock api/ --port 3000 |
| Request workflows | volt workflow pipeline.workflow |
| Endpoint monitoring | volt monitor health.volt -i 30 |
| HTTPie-style shorthand | volt quick POST :3000/users name=John |
| Download with progress | volt run file.volt --download |
| Resume download | volt run file.volt --download --continue |
| Named sessions | volt run file.volt --session=myapi |
| Offline / dry run | volt run file.volt --offline |
| JWT inspection | volt jwt decode <token> |
| XPath queries | volt run file.volt (use $.xpath(...) in tests) |
| Initialize project | volt init |
| Lint .volt files | volt lint api/ |
| Terminal UI | volt (no arguments) |
| Web UI | volt ui (opens browser, no Electron) |
Built-in assertions — no separate test runner needed:
tests:
- status equals 200
- status != 404
- status > 199
- status < 500
- header.content-type contains json
- header.x-request-id exists
- body contains "success"
- $.data.users[0].name equals Alice
- $.data.count > 0
- $.id existsAssertion operators: equals (==), !=, <, >, contains, exists
| Output | Command |
|---|---|
| JUnit XML (GitHub Actions, Jenkins) | volt test --report junit -o results.xml |
| HTML report (dark theme) | volt test --report html -o report.html |
| JSON (custom tooling) | volt test --report json |
| Data-driven | volt test --data users.csv |
| Watch mode | volt test --watch |
| Schema validation | volt validate file.volt --schema schema.txt |
| Auto-generate tests | volt generate tests file.volt |
Import from any tool:
volt import postman collection.json # Postman v2.0/v2.1
volt import insomnia export.json # Insomnia
volt import openapi spec.yaml # OpenAPI 3.x / Swagger
volt import curl 'curl -X POST ...' # cURL command
volt import har recording.har # HAR filesExport to 18 languages:
volt export curl request.volt # cURL command
volt export python request.volt # Python (requests)
volt export javascript request.volt # JavaScript (fetch)
volt export go request.volt # Go (net/http)
volt export rust request.volt # Rust (reqwest)
volt export java request.volt # Java (HttpClient)
volt export csharp request.volt # C# (.NET)
volt export php request.volt # PHP (cURL)
volt export ruby request.volt # Ruby (Net::HTTP)
volt export swift request.volt # Swift (URLSession)
volt export kotlin request.volt # Kotlin (OkHttp)
volt export dart request.volt # Dart (http)
volt export r request.volt # R (httr)
volt export httpie request.volt # HTTPie command
volt export wget request.volt # wget command
volt export powershell request.volt # PowerShell
volt export openapi api/ # OpenAPI spec from collection
volt export har request.volt # HAR recordingDocumentation generation:
volt docs api/ --format html # Generate HTML API docs
volt design spec.json generate # Generate .volt files from OpenAPI
volt design spec.json validate # Validate OpenAPI spec| Type | Syntax |
|---|---|
| Bearer token | auth: { type: bearer, token: ... } |
| Basic auth | auth: { type: basic, username: ..., password: ... } |
| API key (header or query) | auth: { type: api_key, key_name: ..., key_value: ..., key_location: header } |
| Digest auth | auth: { type: digest, username: ..., password: ... } |
| AWS Signature v4 | auth: { type: aws, access_key: ..., secret_key: ..., region: ..., service: ... } |
| Hawk | auth: { type: hawk, id: ..., key: ..., algorithm: ... } |
| OAuth 2.0 (client credentials) | auth: { type: oauth_cc, client_id: ..., client_secret: ..., token_url: ..., scope: ... } |
| OAuth 2.0 (password grant) | auth: { type: oauth_password, client_id: ..., token_url: ..., username: ..., password: ... } |
| OAuth 2.0 (PKCE) | volt auth oauth <token-url> --client-id <id> |
| Collection-level | Defined in _collection.volt, inherited by all requests |
volt login github # OAuth login (GitHub)
volt login google # OAuth login (Google)
volt login custom --auth-url <url> --token-url <url> # Custom OAuth provider
volt login --status # Check login status
volt login --logout # Clear tokens| Protocol | Command | Status |
|---|---|---|
| HTTP/HTTPS | volt run request.volt |
Stable |
| GraphQL | volt graphql query.volt |
Stable |
| WebSocket | volt ws wss://ws.example.com/socket |
Stable |
| SSE | volt sse https://api.example.com/events |
Stable |
| gRPC | volt grpc list service.proto |
Beta |
| HTTP/2 | Frame building, HPACK compression, stream management | Beta — TLS negotiation WIP |
| HTTP/3 (QUIC) | Frame building, QPACK compression, stream management, ALPN | Stable |
| MQTT | volt mqtt broker:1883 pub topic msg |
Beta |
| Socket.IO | volt socketio http://localhost:3000 |
Beta |
GraphQL features:
volt graphql query.volt # Execute GraphQL query/mutation
volt graphql introspect https://api.example.com/graphql # Schema introspection| Feature | Command |
|---|---|
| E2E encrypted secrets | volt secrets keygen / encrypt / decrypt |
| Secret detection | volt secrets detect file.volt |
| Share requests | volt share file.volt --format curl|url |
| OAuth login (PKCE) | volt login github|google|custom |
| Request signing | volt run file.volt --sign (HMAC-SHA256) |
- Variables prefixed with
$are automatically masked as***in all output - Secrets vault uses E2E encryption — keys never leave your machine
volt secrets detectscans files for accidentally committed secrets
Pre-request and post-response scripts let you chain requests, extract values, and build workflows:
# Login and extract token
pre_script: |
set timestamp {{$timestamp}}
post_script: |
extract auth_token $.data.token
extract user_id $.data.user.idExtracted variables are available in subsequent requests within the same collection run, enabling multi-step workflows like login → use token → verify.
| Feature | Command |
|---|---|
| Watch mode | volt watch api/ --test |
| Request diff | volt diff a.volt b.volt --response |
| Request history | volt history list / volt history clear |
| Replay from history | volt replay <index> --verbose --diff |
| Collection search | volt search <query> --dir api/ --tree --stats |
| OpenAPI design | volt design spec.json generate|validate |
| Proxy capture | volt proxy --port 8080 |
| Color themes | volt theme list|set|preview <name> |
| Plugin system | volt plugin list|run|init |
| Zero-config CI | volt ci (auto-detects 7 CI environments) |
| Shell completions | volt completions bash|zsh|fish|powershell |
| Generate tests | volt generate tests file.volt |
| Generate docs | volt docs api/ --format html |
| Response viewer | HTML-to-text, XML highlighting, timing waterfall |
Full flag reference
Output control:
| Flag | Description |
|---|---|
-v, --verbose |
Show full request/response exchange |
-q, --quiet |
Only output response body |
--print=WHAT |
Control output: H(req headers) B(req body) h(resp headers) b(resp body) m(metadata) |
--pretty=MODE |
Formatting: all | colors | format | none |
--sorted |
Sort headers and JSON keys alphabetically |
-o, --output FILE |
Save response body to file |
Request behavior:
| Flag | Description |
|---|---|
--timeout MS |
Request timeout in milliseconds |
--retry N |
Retry on failure (max N retries) |
--retry-strategy STRATEGY |
Backoff: constant | linear | exponential |
--dry-run |
Show request without sending |
--offline |
Print raw HTTP request, don't send |
--sign |
Sign request with HMAC-SHA256 |
--check-status |
Exit with HTTP status code mapping |
--env NAME |
Use named environment |
Downloads & streaming:
| Flag | Description |
|---|---|
-d, --download |
Download response to file with progress bar |
-c, --continue |
Resume interrupted download |
-S, --stream |
Stream response output (SSE/chunked) |
--chunked |
Use chunked transfer encoding |
-x, --compress |
Compress request body (deflate) |
Sessions:
| Flag | Description |
|---|---|
--session=NAME |
Use named session (persists headers/cookies) |
--session-read-only=NAME |
Use session without saving updates |
TLS & certificates:
| Flag | Description |
|---|---|
--cert PATH |
Client certificate for mutual TLS |
--cert-key PATH |
Client certificate private key |
--ca-bundle PATH |
Custom CA certificate bundle |
--verify=yes|no |
SSL/TLS verification |
--ssl=tls1.2|tls1.3 |
Pin TLS version |
--proxy URL |
Proxy (HTTP, HTTPS, SOCKS5) |
Meaningful exit codes for CI/CD pipelines (HTTPie-compatible):
| Code | Meaning |
|---|---|
0 |
Success |
1 |
Generic error |
2 |
Timeout |
3 |
Too many redirects |
4 |
Client error (4xx) |
5 |
Server error (5xx) |
6 |
Connection failed |
7 |
TLS/SSL error |
Use --check-status to enable HTTP status code mapping.
Volt includes a full browser-based UI — served from the same binary. No Electron. No install. No account.
volt ui # Opens browser to localhost:8080
volt ui --port 3000 # Custom port
volt serve --port 8080 # Bind to 0.0.0.0 (team/self-hosted access)Request builder — method selector, URL bar, tabbed editor for params, headers, body (JSON/form/XML/multipart/raw), auth, tests, and pre/post scripts.
Response viewer — syntax-highlighted body, headers panel, timing waterfall, copy/export buttons.
Collections & environments — file tree navigation, environment switcher, variable editor, collection search, tag filtering.
History & tools — request history with replay, cURL import, code export to 18 languages, auto-generate tests from responses, save as .volt.
Themes — Dark, Light, Solarized, Nord. PWA-enabled — install to your desktop, works offline.
One binary. CLI, TUI, and web UI. Under 5 MB.
name: API Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: volt-api/volt-action@v1
with:
command: test --report junit -o results.xml
- uses: actions/upload-artifact@v4
with:
name: test-results
path: results.xmlapi_tests:
script:
- volt test --report junit -o results.xml
artifacts:
reports:
junit: results.xmlvolt ci # Auto-detects GitHub Actions, GitLab CI, Jenkins, Travis, CircleCI, AppVeyor, Azure PipelinesNo runtime to install. No npm install. Just a binary.
Volt is built entirely in Zig — the same language behind Bun, Tigerbeetle, and infrastructure at Uber, Cloudflare, and AWS.
- Zero dependencies. Only the Zig standard library. No package manager, no node_modules.
- Cross-compilation built in.
zig build -Dtarget=x86_64-linuxproduces a Linux binary from any OS. - No hidden allocations. Every byte is accounted for. This is why Volt uses 5 MB while Postman uses 500 MB.
72 modules | 49,000+ lines of code | 653 tests | 0 dependencies
Volt is production-ready for HTTP requests, testing, collections, import/export, CI/CD, and the web UI. Some newer features are still maturing:
- HTTP/2: Frame layer and HPACK are built. TLS ALPN negotiation is WIP — real HTTP/2 endpoints fall back to HTTP/1.1.
- HTTP/3: Full H3 framing pipeline (QPACK headers, QUIC varints, HTTP/3 frames). Requests encoded through H3 layer with
--http3. - MQTT / Socket.IO: Packet building and parsing work. Not yet battle-tested against real brokers/servers.
- gRPC: Proto parsing and
.voltgeneration work. Actual calls depend on HTTP/2 over TLS (see above). - OAuth browser flow: PKCE and token exchange work. Localhost callback server not yet automatic — generates URL for manual flow.
- Plugin system: Manifest and discovery work.
volt plugin install <url>not yet implemented. - No native desktop app: Terminal-first (CLI + TUI + web UI via
volt ui). No Electron wrapper.
- Full HTTP/2 over TLS (ALPN negotiation)
- CI results dashboard (web — first paid feature)
- Team secrets vault (E2E encrypted, multi-member)
- VS Code extension (syntax highlighting)
- HTTP/3 (QUIC) support
See CONTRIBUTING.md. All tests must pass: zig build test
Stop paying for bloatware. Start using Volt.
Install now — it takes 10 seconds.