An open-source Postman-style API client + JMeter-style load testing desktop app
Postman-like debugging · JMeter-style performance testing · Java desktop · Local-first
简体中文 · English · 📦 Download · 📖 Docs · 💬 Discuss · WeChat: lakernote
- 💡 About
- 🖼️ Visual Tour
- 🧭 Example Workflows
- ✨ Features
- 📦 Download
- 🚀 Quick Start
- 🧪 Collection CLI
- 🛠️ Development
- 🤝 Contributing
- 📚 Documentation
- ❓ FAQ
- 💖 Support
EasyPostman combines a Postman-style API debugging workspace with JMeter-style performance testing in one local-first desktop app. It is built with Java 17, Swing, and FlatLaf, stores data locally by default, and uses Git workspaces when teams need sync, review, and version control without a hosted cloud service.
| 🎯 Postman-style Debugging | ⚡ JMeter-style Load Testing | 🔒 Local-first Desktop |
|---|---|---|
| Collections, environments, auth, scripts, imports, history, and response inspection | Thread groups, timers, extractors, assertions, realtime metrics, reports, and distributed runs | Your API and test data stay on disk unless you choose a Git workspace |
EasyPostman is a GUI-first tool, and the project value is easier to judge when both halves are visible: Postman-style API work and JMeter-style load testing. These screenshots are from the current desktop app.
| Postman-style API Debugging | JMeter-style Load Testing |
|---|---|
![]() |
![]() |
| Scripts & Assertions | Git Workspace Collaboration |
![]() |
![]() |
📸 View the full screenshot gallery →
| Workflow | What it looks like in practice |
|---|---|
| Debug a REST API like Postman | Create or import a collection, choose an environment, send a request, inspect formatted response bodies, headers, cookies, timing, and the network event log. |
| Chain requests with scripts | Use pre-request scripts and test scripts to read variables, create signatures, extract response data, assert results, and pass values into the next request. |
| Share API work through Git | Keep workspace data local, then use Git workspace operations to commit, pull, push, and review collection/environment changes with your team. |
| Run Postman Collections in CI | Download the cross-platform JAR or build it from source, then run collections with environments, data files, scripts, assertions, and file uploads. |
| Run load tests like JMeter | Build a performance plan visually, export plan.json, run it headlessly, or distribute it with master/worker mode while preserving global user and CSV sharding. |
- Local workspaces - Keep personal API projects fully on disk
- Git workspaces - Commit, pull, push, and share collections or environments through your own Git repository
- Workspace isolation - Each workspace keeps its own collections, environments, settings, and history
- Portable mode - Run with data beside the app when the portable marker or system property is enabled
- HTTP/HTTPS - REST requests with headers, params, cookies, auth, redirects, and body editors
- SSE & WebSocket - Stream and realtime protocol workflows
- Multiple body types - Form Data, x-www-form-urlencoded, JSON, XML, text, and binary payloads
- Variables - Environment, global, request, and iteration data support for repeatable runs
- Import/Export - Postman v2.1 and cURL support, with HAR and OpenAPI/Swagger paths under active development
- Headless collection runs - Run Postman Collections from the cross-platform JAR with environments, data files, scripts, assertions, uploads, and CI exit codes
- Scenario design in the GUI - Thread groups, timers, extractors, assertions, and result views
- Thread group modes - Fixed, ramp-up, stair-step, and spike load profiles
- Realtime monitoring - TPS/QPS, response time, error rate, trend charts, and result trees
- Headless & distributed runs - Export
plan.jsonfrom the GUI, then run it with CLI or master/worker mode - Global user sharding - GUI virtual users represent total concurrency; workers split continuous ranges and CSV rows follow the same ranges to avoid duplicates
- Pre-request and test scripts - Postman-style
pmAPIs, assertions, variables, and request chaining - Bundled JS helpers -
crypto-js,lodash, andmoment - Script extension points - Plugins can register script APIs, completions, snippets, toolbox panels, and services
- Official plugins - Plugin manager, client certificates, capture proxy, Redis, Kafka, and Java decompiler
- Network event log - Detailed request/response and stream diagnostics
- Light & Dark Mode - Comfortable viewing in any lighting
- Multi-language - English, 简体中文
- Syntax Highlighting - JSON, XML, JavaScript
- Cross-platform - Windows, macOS, Linux
🔗 GitHub Releases | Gitee Mirror (China)
| Platform | Package | Notes |
|---|---|---|
| 🍎 macOS (Apple Silicon) | EasyPostman-{version}-macos-arm64.dmg |
M1/M2/M3/M4 |
| 🍏 macOS (Intel) | EasyPostman-{version}-macos-x86_64.dmg |
Intel-based Mac |
| 🪟 Windows (Installer) | EasyPostman-{version}-windows-x64.exe |
Auto-update support |
| 🪟 Windows (Portable) | EasyPostman-{version}-windows-x64-portable.zip |
No install needed |
| 🐧 Linux AMD64 (Generic) | EasyPostman-{version}-linux-amd64.deb |
For common x86_64 / amd64 Linux systems |
| 🐧 Linux ARM64 (Generic) | EasyPostman-{version}-linux-arm64.deb |
For common aarch64 / arm64 Linux systems |
| 🐧 Linux ARM64 (Compatibility) | EasyPostman-{version}-linux-arm64-compat.deb |
Same app as the generic ARM64 package, repacked for older Debian / Ubuntu dpkg environments |
| 🐧 RHEL / Rocky / CentOS / Fedora (x64) | EasyPostman-{version}-1.x86_64.rpm |
Available on GitHub Releases only |
| 🐧 RHEL / Rocky / CentOS / Fedora (ARM64) | EasyPostman-{version}-1.aarch64.rpm |
Available on GitHub Releases only |
| ☕ Cross-platform JAR | easy-postman-{version}.jar |
Requires Java 17+ |
🐧 About the ARM64 Compatibility DEB
The compatibility package contains the same EasyPostman application and runtime as
linux-arm64.deb. It only changes the DEB archive format to use xz-compressed members, which helps olderdpkgversions that cannot install packages containing newer compression formats such ascontrol.tar.zstordata.tar.zst. Preferlinux-arm64.debfirst; uselinux-arm64-compat.debonly when the generic package fails during installation because of DEB archive compression compatibility.
⚠️ First Run Notice
- Windows: SmartScreen warning → "More info" → "Run anyway"
- macOS: "Cannot be opened" → Right-click → "Open" → "Open"
The app is 100% open-source. Warnings appear because we don't purchase code signing certificates.
🌏 Gitee Mirror only provides macOS (ARM) DMG and Windows packages. Linux DEB/RPM packages are published on GitHub Releases only.
- Grab the package for your platform from Releases
- Install and run:
| Platform | Command / Action |
|---|---|
| macOS | Open DMG → drag to Applications |
| Windows Installer | Run .exe, follow wizard |
| Windows Portable | Extract ZIP → run EasyPostman.exe |
| Linux DEB (AMD64, Generic) | sudo dpkg -i EasyPostman-{version}-linux-amd64.deb |
| Linux DEB (ARM64, Generic) | sudo dpkg -i EasyPostman-{version}-linux-arm64.deb |
| Linux DEB (ARM64, Compatibility) | sudo dpkg -i EasyPostman-{version}-linux-arm64-compat.deb |
| Linux RPM (x64) | sudo rpm -ivh EasyPostman-{version}-1.x86_64.rpm |
| Linux RPM (ARM64) | sudo rpm -ivh EasyPostman-{version}-1.aarch64.rpm |
| JAR | java -jar easy-postman-{version}.jar |
If you're not sure which Linux package to use, run uname -m first:
x86_64-> useEasyPostman-{version}-linux-amd64.deborx86_64.rpmaarch64-> useEasyPostman-{version}-linux-arm64.deb- if
dpkgreports an unsupported archive compression format while installing the generic ARM64 DEB -> useEasyPostman-{version}-linux-arm64-compat.deb
git clone https://github.com/lakernote/easy-postman.git
cd easy-postman
mvn -pl easy-postman-app -am -DskipTests clean package
java -jar easy-postman-app/target/easy-postman-*.jar📖 Build Guide →
🔌 Plugin Architecture & Installation (Chinese) →
- Create a Workspace — Local (personal) or Git (team)
- Create a Collection — Organize your API requests
- Send Your First Request — Enter URL, configure params, click Send
- Set Up Environments — Switch between dev / test / prod easily
Run Postman Collection v2.1 files headlessly without installing Node.js or Newman.
Choose either option:
A. Download: Get easy-postman-{version}.jar from GitHub Releases, then verify that the selected release contains the command:
java -version # Java 17+ is required
java -jar easy-postman-6.x.x.jar collection run --helpIf collection run isn't shown, download a newer release or build the current source.
B. Build from source:
git clone https://github.com/lakernote/easy-postman.git
cd easy-postman
mvn -pl easy-postman-app -am -DskipTests clean package
java -jar easy-postman-app/target/easy-postman-*.jar \
collection run --helpThe repository example includes a collection, Postman environment, CSV iteration data, and a real upload fixture. It sends two multipart requests to Postman Echo:
java -DCONSOLE_LOG_LEVEL=ERROR \
-jar easy-postman-app/target/easy-postman-*.jar \
collection run docs/examples/collection-cli/upload.postman_collection.json \
-e docs/examples/collection-cli/postman-echo.postman_environment.json \
-d docs/examples/collection-cli/users.csv \
--folder "Upload API" \
--bail \
--out target/collection-cli-result.jsonFor a downloaded JAR, replace easy-postman-app/target/easy-postman-*.jar with its local path. Clone the repository for the sample assets, or download docs/examples/collection-cli separately.
The collection file is the only required CLI argument. The minimum command is:
java -jar easy-postman.jar collection run ./demo.postman_collection.jsonAll other options are optional; add -e, -g, or -d when the collection depends on those variables. The exit code is 0 for success, 1 for request/assertion failures, and 2 for invalid arguments or input files.
-e, -g, and -d accept both relative and absolute paths. Relative paths use the command's current working directory, not the collection directory. --working-dir affects upload files only and does not change these three input paths. Quote paths that contain spaces.
Uploads accept relative or absolute paths, either directly or through variables. Relative paths resolve from the collection directory unless --working-dir is set; absolute paths are unaffected. The repository sample uses {{uploadFile}}, so changing its environment value to /opt/fixtures/file.txt or C:\\fixtures\\file.txt demonstrates an absolute path.
At runtime, disabled collection/folder variables are ignored, iteration data is visible through both {{name}} and pm.variables, and values set with pm.variables.set(...) remain available across requests and iterations in the same run. Pre-request pm.test(...) assertions are included in reports and exit status. Postman file fields whose src is an array upload every listed file under the same multipart field name.
--folder "Upload API" runs only that folder and its descendants. Repeat the option to select more than one folder; see the complete guide for exact-match and no-match behavior.
📖 Complete download/build, sample files, options, uploads, and GitHub Actions guide →
| Task | Command |
|---|---|
| Full package, skip tests | mvn clean package -DskipTests |
| Fast host app package | mvn -pl easy-postman-app -am -DskipTests clean package |
| Quick compile check | mvn -q -pl easy-postman-app -am -DskipTests compile |
| Build app plus one plugin | mvn -pl easy-postman-app,easy-postman-plugins/plugin-redis -am clean package -DskipTests |
| Run one test class headlessly | mvn -q -pl easy-postman-app -am -Dtest=<TestClass> -Dsurefire.failIfNoSpecifiedTests=false -Djava.awt.headless=true test |
The host JAR is written to easy-postman-app/target/easy-postman-{version}.jar. Native packaging scripts live under build/ and produce platform installers with jpackage.
We welcome all forms of contribution — bug reports, feature requests, code, or docs!
| Type | How |
|---|---|
| 🐛 Bug Report | Open an issue |
| ✨ Feature Request | Share your idea |
| 💻 Code | Fork → branch → PR |
| 📝 Docs | Fix typos, add examples, translate |
Every PR triggers automated checks: build, tests, code quality, and format validation.
| Doc | Description |
|---|---|
| 📖 Features | Comprehensive feature documentation |
| 🚀 Build Guide | Build from source & generate installers |
| 🧪 Headless Collection CLI | Lightweight Postman Collection runs with variables, scripts, data files, uploads, and CI exit codes (Chinese) |
| ⚡ Distributed Performance Testing | GUI remote mode, CLI master/worker, CSV sharding, realtime refresh, and result details |
| 🔌 Plugin Architecture | Plugin modules, development flow, and installation (Chinese) |
| 🖼️ Screenshots | All application screenshots |
| 📝 Script API Reference | Pre-request & test script API |
| ❓ FAQ | Frequently asked questions |
Q: Why local storage instead of cloud sync?
We value developer privacy. Local storage ensures your API data is never leaked to third parties. Use Git workspace for team collaboration while maintaining full control over your data.
Q: How to import Postman data?
In the Collections view, click Import and select a Postman v2.1 JSON file. Collections, requests, and environments are converted automatically.
Q: Why does Windows/macOS show security warnings?
- Windows SmartScreen: No code signing cert (~$100–400/year). → Click "More info" → "Run anyway". Warnings decrease as download count grows.
- macOS Gatekeeper: No Apple Developer cert ($99/year). → Right-click → "Open", or run:
sudo xattr -rd com.apple.quarantine /Applications/EasyPostman.app
This project is fully open-source and auditable on GitHub.
If EasyPostman helps you, consider:
- ⭐ Star this repo — it means a lot!
- 🍴 Fork & contribute — help make it better
- 📢 Share with friends — spread the word
- 💬 WeChat group — add lakernote for direct communication
- 💬 GitHub Discussions — ask questions & share ideas
- 📮 Contact — WeChat:
lakernote
Thanks to these awesome open-source projects:
| Project | Role |
|---|---|
| FlatLaf | Modern Swing theme |
| RSyntaxTextArea | Syntax highlighting editor |
| OkHttp | HTTP client |
| Termora | Terminal emulator inspiration |
Postman-style API debugging. JMeter-style load testing. Local-first desktop workflow.
Made with ❤️ by laker



