Skip to content

quietkit/Forge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

154 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ”₯ Forge

The .http-native desktop API client for developers who live in their editor.

Plain text. Git-native. No proprietary format. No account. No cloud.


Latest Release License: MIT Platform Stars CI

Install Β· Features Β· Why Forge Β· Directives Β· Roadmap Β· Contributing


Forge icon

Beta. Forge is actively used daily for real API development. All core features (parse, run, capture, history, scripting, collection runner, auth) are complete. The roadmap focuses on polish, distribution, and growing the .http-native story. See Roadmap for what's left.


πŸ”₯ Why Forge

Every API client invents its own format and locks you into it:

  • Postman β†’ proprietary JSON collections, account required, cloud-sync friction
  • Bruno β†’ .bru files, only Bruno reads them natively
  • Insomnia β†’ was open-source, then went subscription + cloud-sync

Meanwhile the .http / .rest format used by VS Code REST Client, JetBrains, and httpYac is plain text, sits in git alongside your code, and is editable in any IDE β€” but no standalone desktop app treats it as the source of truth.

Forge does. It reads your .http files directly and adds the things IDE extensions can't:

Forge Postman Bruno Insomnia
Open source (MIT) βœ… ❌ βœ… partial
File format .http (universal) proprietary JSON .bru proprietary JSON
Works with VS Code REST Client files βœ… ❌ ❌ ❌
Works with JetBrains HTTP files βœ… ❌ ❌ ❌
Git-native (plain text) βœ… ❌ βœ… ❌
No account / sign-in βœ… ❌ βœ… ❌
Zero telemetry Β· fully offline βœ… ❌ βœ… ❌
Desktop app (not web-only) βœ… βœ… βœ… βœ…
Native binary (not Electron) βœ… Tauri/Rust ❌ Electron ❌ Electron ❌ Electron
Capture response β†’ write to file βœ… ❌ ❌ ❌
Per-endpoint response history βœ… βœ… ❌ βœ…
Pre/post-request JS scripting βœ… Bruno-compat βœ… βœ… βœ…
Collection runner (CI-ready) βœ… βœ… βœ… βœ…
OpenAPI 3.0 export βœ… βœ… ❌ βœ…
Static HTML docs generation βœ… ❌ ❌ ❌
Postman / Bruno / OpenAPI import βœ… βœ… partial βœ…

Trademarks: Postman, Bruno, and Insomnia are trademarks of their respective owners. This comparison is independent and unaffiliated.

The wedge: run a request β†’ capture the real response β†’ write it back into the .http file as a documented example β€” in plain text, in git. The feedback loop closes without touching the format that VS Code REST Client and JetBrains already understand. .http stays the single source of truth.


✨ Features

πŸ“‚ Tree that speaks your file system

  • Folder tree mirrors your directories β€” no import step, no sync, no re-import after edits
  • Inline filter with fuzzy match across request names, methods, and URLs
  • Collapsible groups, keyboard navigation (VS Code-style arrow keys through any collection)
  • Method badges color-coded per verb (GET, POST, PUT, PATCH, DELETE)

⚑️ Run, capture, repeat

  • Send + Save β€” fires the request and captures the response body, status, headers, and timing directly into the .http file as a documented example block
  • Response history per endpoint β€” scroll back through every response you've seen, diff two runs side by side
  • run-all mode β€” chains all requests in a file or directory, passing @captured variables forward; exits non-zero on any failed @assert (CI-ready API test suite, zero config)

✏️ Edit in the UI, save to the file

  • Method, URL, headers, body, auth, form fields, query params, scripts β€” all editable inline; dirty-state indicator shows unsaved changes
  • Environments β€” multiple .env-style files per collection; switch the active one from the toolbar; {{variable}} interpolation everywhere (URL, headers, body, scripts)
  • Bulk edit mode for headers and query params β€” paste a block of key: value pairs

πŸ”’ All auth schemes, no cloud

  • Bearer token Β· Basic Β· API key
  • Digest Β· NTLM Β· WSSE
  • AWS Signature v4 Β· OAuth 1.0a
  • OAuth 2.0: Client Credentials Β· Password Grant Β· Auth Code (+ PKCE) Β· Implicit

🧩 Bruno-compatible scripting

Pre- and post-request JavaScript sandboxed via the Boa engine. The API is intentionally Bruno-compatible so scripts from Bruno collections port over without changes:

// @script:pre
req.setUrl(`${bru.getVar("baseUrl")}/search`);
req.setHeader("X-Trace", bru.getVar("traceId"));
bru.setVar("startedAt", Date.now());
// @end

// @script:post
test("status is 200", () => {
  expect(res.status).to.equal(200);
});
bru.setVar("userId", res.json.data.id);
// @end

πŸ“Š Response panel

  • JSON tree with collapse / expand, animated chevron carets, line numbers, and copy-value buttons
  • Raw, Preview (HTML iframe), and Headers tabs with live count badges
  • Status Β· timing Β· size as prominent mono stat chips
  • Script test results inline (pass / fail per test() block)
  • Assertion results with actual vs. expected values
  • Visual captures β€” bru.visualize() renders arbitrary HTML in the response pane

πŸ“€ Export & docs

  • OpenAPI 3.0 export β€” convert any collection to a full spec with paths, methods, and request/response schemas derived from captured examples
  • Static HTML docs β€” one-click self-contained documentation page from your .http collection; drop the output into any static host

⌨️ Keyboard Shortcuts

Action Shortcut Action Shortcut
Filter / search collection ⌘K Send request βŒ˜β†©
Navigate tree items ↑ / ↓ Save to file ⌘S
Expand / collapse folder β†’ / ← Open environment picker ⌘E
Focus URL bar ⌘L Switch response view ⌘1 – ⌘9

πŸ“ .http Directives

Forge extends the standard .http format with # comment directives. They are intentionally # comments β€” invisible to VS Code REST Client, JetBrains, and httpYac β€” so your files stay fully compatible with any tool that already reads them.

### Create user
POST {{host}}/users
Content-Type: application/json
Authorization: Bearer {{token}}

{
  "name": "Sara",
  "role": "admin"
}

# @tag       smoke auth-flow                ← label requests; searchable in tree
# @auth      bearer {{token}}               ← auth: bearer|basic|apikey|oauth2|digest|ntlm|aws4|oauth1|wsse
# @capture   userId = body.data.id          ← extract value β†’ {{userId}} for later requests
# @assert    status == 201                  ← pass/fail; CLI exits non-zero on any failure
# @assert    body.data.role == admin        ←   ops: == != > < >= <= contains matches exists empty
# @assert    timingMs < 500
# @form      key = value                    ← form field (urlencoded; multipart if any @file)
# @file      attachment = /path/to.pdf      ← file upload part (β†’ multipart/form-data)
# @body-file /path/to/payload.bin           ← raw binary body
# @graphql                                  ← sends body as GraphQL query (trailing {…} = variables)
# @script:pre
#   req.setBody(JSON.stringify({ ts: Date.now() }));
#   bru.setVar("startedAt", Date.now());
# @end
# @script:post
#   test("created", () => expect(res.status).to.equal(201));
#   bru.setVar("userId", res.json.data.id);
# @end

run-all exits non-zero if any assertion fails, so a .http file doubles as an API test suite in CI with no extra tooling. Directives are plain # comments β€” other .http tools silently ignore them.


πŸ—οΈ Architecture

forge/
β”œβ”€β”€ crates/
β”‚   β”œβ”€β”€ forge-core/        # Pure parser + model + import/export β€” no I/O, fully headless-testable
β”‚   β”‚   β”œβ”€β”€ src/model.rs          # HttpFile, HttpRequest, Auth, Capture, Assertion…
β”‚   β”‚   β”œβ”€β”€ src/parser.rs         # .http parser
β”‚   β”‚   β”œβ”€β”€ src/capture.rs        # Write response back into .http file
β”‚   β”‚   β”œβ”€β”€ src/import_collection.rs  # Postman / Bruno collection import
β”‚   β”‚   β”œβ”€β”€ src/import_openapi.rs     # OpenAPI / Swagger import
β”‚   β”‚   β”œβ”€β”€ src/export_openapi.rs     # .http β†’ OpenAPI 3.0 JSON
β”‚   β”‚   β”œβ”€β”€ src/docs.rs               # Static HTML docs generator
β”‚   β”‚   └── tests/                    # Integration tests
β”‚   β”œβ”€β”€ forge-engine/      # Async HTTP execution + scripting + variable interpolation
β”‚   β”‚   β”œβ”€β”€ src/exec.rs        # reqwest client, proxy, TLS, streaming
β”‚   β”‚   β”œβ”€β”€ src/script.rs      # Boa JS sandbox (req / res / bru / expect / test)
β”‚   β”‚   β”œβ”€β”€ src/runner.rs      # Collection runner (chaining, assertion gate, exit code)
β”‚   β”‚   β”œβ”€β”€ src/interpolate.rs # {{var}} resolution
β”‚   β”‚   β”œβ”€β”€ src/auth.rs        # All 12 auth scheme implementations
β”‚   β”‚   └── src/assert.rs      # Assertion evaluation
β”‚   β”œβ”€β”€ forge-history/     # SQLite history store (per-endpoint response timeline)
β”‚   └── forge-cli/         # CLI front-end (parse / run / run-all / import / history / curl)
└── app/
    β”œβ”€β”€ src-tauri/         # Tauri backend β€” bridges Rust engine to the frontend via commands
    └── src/               # Vanilla TypeScript + Vite frontend (no framework)
        β”œβ”€β”€ main.ts        # All UI logic, DOM rendering, event wiring
        β”œβ”€β”€ pure.ts        # Pure utility functions (unit tested)
        └── styles.css     # CSS custom properties, full theme system, density modes

A Cargo workspace: forge-core is fully decoupled from I/O, so it stays unit-testable headless. The desktop app is a thin Tauri layer β€” the same forge-engine that powers the CLI also powers every "Send" button click in the GUI.


πŸš€ Build & Run

Prerequisites

  • Rust stable toolchain
  • Node.js 18+ and npm
  • Platform build tools: Xcode Command Line Tools (macOS) Β· Visual Studio C++ build tools (Windows) Β· build-essential + libwebkit2gtk-4.1-dev (Linux)

Desktop app

git clone https://github.com/quietkit/Forge.git
cd Forge/app
npm install
npm run tauri dev        # launch with hot-reload
npm run tauri build      # produce a signed native bundle
                         # β†’ .dmg / .app        (macOS)
                         # β†’ .msi               (Windows)
                         # β†’ .deb / .AppImage   (Linux)

CLI

cargo build --release
# or: cargo install --path crates/forge-cli

forge parse   <file.http>                          # parse β†’ JSON model
forge run     <file.http> -r <n>                   # execute request n
forge run     <file.http> -r 1 -e token=abc --save # interpolate + capture response into file
forge run-all <file|dir>                           # collection runner (assertions β†’ exit code)
forge curl    <file.http> -r <n>                   # print as cURL command
forge import  <collection.json> -o <dir>           # import Postman / OpenAPI / Bruno β†’ .http
forge history <file.http> [-r <n>]                 # show recorded response timeline

Tests

cargo test               # Rust test suite across all crates
cd app && npm test       # TypeScript unit tests (pure.ts helpers)

πŸ“¦ Install

Pre-built binaries

Grab the latest release for your platform from Releases:

Platform File
macOS (Apple Silicon) Forge_x.y.z_aarch64.dmg
macOS (Intel) Forge_x.y.z_x64.dmg
Windows Forge_x.y.z_x64-setup.exe
Linux (Debian/Ubuntu) forge_x.y.z_amd64.deb
Linux (AppImage) forge_x.y.z_amd64.AppImage

Homebrew (macOS)

brew tap quietkit/forge https://github.com/quietkit/Forge.git
brew install --cask quietkit/forge/forge

The app is not yet notarized; if macOS blocks the first launch, run xattr -cr /Applications/Forge.app.


πŸ—ΊοΈ Roadmap

Phase Scope State
0 Project setup, icon, license βœ…
1 forge-core: .http parser + model + CLI + tests βœ…
2 forge-engine: HTTP execution + {{var}} interpolation βœ…
3 forge-history: SQLite history + capture-response-into-file βœ…
4 Desktop app (Tauri): tree + run + response pane βœ…
5 UI variables, Send+Save capture, history diff, themes βœ…
6 Cross-platform CI + release packaging βœ…
7 Environments, request chaining, JSON viewer, copy-as-cURL βœ…
8 Assertions + collection runner βœ…
9–10 Auth: bearer / basic / API key / OAuth 2 βœ…
11 Collection search & filter, collapsible groups βœ…
12 GraphQL body mode βœ…
13 Cookie jar Β· cURL import Β· multipart/binary Β· capture button βœ…
14 Postman import Β· request tags Β· expanded auth (digest/ntlm/aws4/oauth1/wsse) βœ…
15 Pre/post-request scripting (req, res, bru.*, expect, test) βœ…
16 Editable auth/form/scripts in UI Β· dirty-state save workflow βœ…
17 OpenAPI export Β· HTML docs generation βœ…
18 Bruno-parity UI polish (typography, params table, response panel) βœ…
19 Homebrew cask Β· code-signed macOS release πŸ”œ
20 gRPC / WebSocket body modes πŸ”œ
21 Plugin system (custom auth schemes, body renderers) πŸ”œ

Pull requests welcome on any item marked πŸ”œ.


🀝 Contributing

Forge is MIT β€” fork it, use it commercially, and contribute back what you find useful.

High-impact contributions:

  1. Bug reports β€” attach a minimal .http file + steps to reproduce
  2. Engine integration tests β€” test HTTP execution paths against a local mock server
  3. New body modes β€” gRPC, WebSocket, Server-Sent Events
  4. UX feedback β€” if something feels off, open an issue; screenshots welcome

Please open an issue before a large PR to align on approach.


πŸ’› Credits

Forge is designed, built, and maintained by Gamal Anwar β€” creator and lead developer.
πŸ™ @GamalAnwar

Published under Quietkit, an indie studio crafting fast, private, native desktop tools.


πŸ“„ License

MIT License.

Forge is free and open-source. Use it, fork it, build on it β€” commercially or otherwise β€” with minimal restrictions. See LICENSE for details.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors