Repository navigation
Releases: eugenezimin/Pace-Maker
Release list
v.15
Pace Maker 15: safer by design
This release focuses on security and privacy. Credentials move to the Keychain, the app runs in the macOS sandbox, and every request now goes exactly where you point it.
Security & privacy
- Credentials in the Keychain: values of credential headers (Authorization, Cookie, API keys and similar) are stored in your login keychain instead of the settings file. Values saved by earlier versions move there automatically on first launch
- Redirects aren't followed: a 3xx response is shown as the response itself, so every request measures the URL you entered and no load (or credentials) reaches another host
- Bounded memory for large responses: response bodies are streamed. The start is kept for display and the rest is only counted, so a huge response can't exhaust memory
- Only web addresses: targets must be
http://orhttps://; other schemes such asfile:are refused - Safer server text: text from a server's response can no longer turn into clickable links in the explanations under each tab
- Sandboxed: the app runs in the macOS App Sandbox with access only to outgoing network connections. Your settings carry over from earlier versions
What's new
- Plain
http://targets work everywhere: before, macOS blocked plain-HTTP servers other than localhost and IP addresses - Help menu: Pace Maker Support and Privacy Policy, instead of an empty help item
- Sensible limits: Max RPS, Max Connections (up to 1,024), Queue Depth and the stop conditions have upper limits, so a typo can't overwhelm your Mac
- Starts at your own server: new installs point at
http://localhost:8080instead of a public website - A note on first launch: a one-time reminder to test only servers you own or have permission to test
- Closing the window pauses the test: reopen it from the Dock to see it paused and ready to resume
- One window: Pace Maker is now a single-window app, so two windows can't overwrite each other's settings
Changed
- The Transport setting is gone: Pace Maker tests HTTP endpoints
- The Googlebot user-agent preset has been removed
Fixed
- The 3xx status explanation no longer claims that redirects are followed
Requirements
macOS 14 or later on Apple Silicon. Downloads are signed with a Developer ID and notarized by Apple.
Downloads
| File | SHA-256 |
|---|---|
PaceMaker-15.dmg |
a08c77c092ba0a04eb5e93a7008dff002478c93330948654734c247b043243ea |
PaceMaker-15.zip |
6bf45e18f5c16841c957dabe1325bb1080b6af977eb505f40415604ac457e77a |
v.14.1
Pace Maker 14.1
A small fix for the hint line under the chart.
Fixed
- Right after lowering the rate with the slider, the hint could say the server "can't keep up" while reporting more requests going out than the new target (for example "251 of 120 RPS"). The last sample still reflected the old rate. The hint now says it's slowing down to the new target until the rate settles.
Requirements
macOS 14 or later on Apple Silicon. Downloads are signed with a Developer ID and notarized by Apple.
Downloads
| File | SHA-256 |
|---|---|
PaceMaker-14.1.dmg |
c063d7fd3d8302336e362f8b73e473c17fec90a2cac5174de1cfae407daba77a |
PaceMaker-14.1.zip |
63faa531a0597a5d8195b858ad8afa54ca2508e72deb1bee51a2cf3e4963cae2 |
v.14
Pace Maker 14: a smoother, clearer live chart
The Chart tab has been redesigned. It scrolls smoothly while a test runs, gives Error Rate its own scale, and lets you change the request rate without stopping the test.
What's new
- Change the rate live: a slider under the chart sets the request rate while the test runs, from 1 up to Max RPS
- Max RPS: the Target RPS setting is now called Max RPS and sets the slider's upper limit
- Adjust settings while a test runs: changes under Load, Stop When, Headers, and Display take effect immediately, without restarting. New headers go out with the requests sent after the change
- Status line: see at a glance whether the test is ready, sending, paused, or finished, with the elapsed time and sent count
- Hint line: a short note under the chart explains what's happening and what to try next, such as when the server can't keep up and requests are shed, or when responses start failing. It updates only on significant changes, at most every 3 seconds
- Smooth live scrolling: the chart glides between samples instead of jumping once per sampling interval, and new data enters at the right edge
- Cleaner lines: smooth curves without a dot on every sample, a gradient under Sent, and a dot on the newest value while the test runs
- Error Rate on its own axis: a percentage scale on the right, so error rate no longer squashes the RPS scale. It's now shown by default, and its axis hides when you hide the series
- Target line: a dashed line marks the current target rate, so you can see at a glance when the achieved rate falls short
- Readable scales: gridlines land on round numbers, and the time axis reads −30s … now (or "end" once a test finishes)
- Live readouts under the chart: Target, Achieved, Shed and Latency
- New look: colours and text sizes matching the Pace Maker website, and capsule legend pills with a dashed-line icon for Error Rate
- 30-second chart window by default for new windows (adjustable from 5 seconds to 5 minutes as before)
Stats, Texts and Load, redesigned
- Stats: metrics grouped into Progress, Throughput, Responses, Latency and Connection & data. Click any metric to learn what it means, how it's measured and what its value says right now
- New metrics: p50 / p90 / p99 latency with fastest and slowest, a status-code breakdown, peak RPS, success rate, achieved share of target, data received and data rate, average response size, the negotiated protocol, and progress with an estimated finish time
- Texts: the request with coloured headers and a highlighted body (even before a test starts), and responses as cards with status, protocol, latency and size. Requests that got no response show the reason, and clicking a response explains its status code
- Load: content-type buttons, JSON Format and Minify, a well-formedness check with the error's position, and tips for the situation at hand
- Body and method apply live: edits reach a running test with the next requests
- 4xx responses are flagged: they still count as received, but the chart hint and Stats call it out when most responses are client errors (e.g. 401 Unauthorized)
Fixed
- The average latency now covers the whole test instead of restarting after a pause
Requirements
macOS 14 or later on Apple Silicon. Downloads are signed with a Developer ID and notarized by Apple.
Downloads
| File | SHA-256 |
|---|---|
PaceMaker-14.dmg |
db4e882c25bce835ac2be8dcfd146dcefadbace45cdd93d2771fb7e9d359f8ee |
PaceMaker-14.zip |
528a1c9c35c244dc75b8d18e34814615cf91f060fc3819d9d22a692e97f7151a |
v.13
Pace Maker 13: every HTTP method, with a request body editor
Pace Maker now load-tests write endpoints too. Pick any HTTP method, compose a request body in the new Load tab, and watch your API under real POST, PUT, PATCH, or DELETE traffic.
What's new
- All HTTP methods: GET, HEAD, POST, PUT, PATCH, DELETE, and OPTIONS, chosen with the new Method picker in Settings
- Load tab: a new tab next to Chart, Stats, and Texts for the request body
- Content types: JSON, form, plain text, or XML
- Syntax highlighting for JSON and XML as you type, in Light and Dark Mode
- A live check shows the body size and whether your JSON is valid
- Quotes and dashes stay exactly as you type them; macOS no longer turns
"into curly quotes - For GET, HEAD, and OPTIONS the tab explains that no body is sent and offers a one-click switch to POST
- Content-Type is set for you from the chosen content type, unless you add your own under Headers
- Safety reminder: methods that change data show a note to point them at a test environment
- Texts tab shows the full request, including the method and body
Fixed
- Header name suggestions didn't appear on macOS 27
- The ZIP download now unzips straight to PaceMaker.app, and the DMG includes an Applications shortcut for drag-to-install
Requirements
macOS 14 or later on Apple Silicon. Downloads are signed with a Developer ID and notarized by Apple.
Downloads
| File | SHA-256 |
|---|---|
PaceMaker-13.dmg |
fe3d334476a8d4de82a23cfb618bdd052c96803ed4a95ed2433d392cfe3826cf |
PaceMaker-13.zip |
b73efc7ff38ac753274836f2fffc8edb97c7fb732716a4eb4dcde255bbe4f932 |
v.12
Pace Maker 12: native macOS redesign
Pace Maker now looks and behaves like a modern Mac app: the chart takes the whole window, settings live in an inspector, and run controls sit in a Liquid Glass toolbar.
What's new
- Toolbar controls: one Start / Pause / Resume button plus Reset, and a Chart | Stats | Texts switcher in the toolbar
- Live status in the title bar: run state, elapsed time and requests sent, e.g.
Running · 12 s · 600 sent - Test menu with shortcuts: ⌘R to start, pause or resume; ⇧⌘R to reset
- Settings inspector: every setting in one native panel beside the chart (target, load, stop conditions, headers, display); toggle it from the toolbar
- Remembers your layout: inspector visibility, selected view and chart window are restored per window
- macOS 27 and 26 design: the view switcher uses macOS 27's new tab style, and the Start button uses the prominent Liquid Glass style on macOS 26+
Improvements
- White background behind the chart, stats and the request/response text (follows Dark Mode)
- More compact stat cards
- Smoother, more accurate chart lines: curves no longer overshoot into peaks and dips that never happened
- Cleaner sampling-interval slider (still in 0.1 s steps)
- Errors appear in a standard alert
Removed
- The Dashboard tab: everything it summarized is now visible and editable in the inspector
- The bottom control bar: its controls and counters moved to the toolbar and title bar
Requirements
macOS 14 or later. The new macOS 26/27 styles appear on those systems; earlier versions keep the classic look.
Downloads
| File | SHA-256 |
|---|---|
PaceMaker-12.dmg |
58895ed211cc79388b8a22d2d124e802ec6980dc8641c88ca8058abc75f0c2f5 |
PaceMaker-12.zip |
01ec4510eb342acb599dfb7a66a25451b47641c391aa0079495aec24ddb87467 |
v.10
Summary
v.10 introduces significant architectural improvements to the load testing engine, focusing on memory efficiency, accurate metrics tracking, and cleaner separation of concerns. The most substantial change is the introduction of a producer-consumer JobQueue pattern that replaces per-request task spawning with a bounded, batched approach. This release also adds comprehensive request tracking (dispatched and shed counts) and fixes several metrics calculation issues.
Major Changes
Architecture: Producer-Consumer JobQueue Pattern
- Replaced per-request task spawning with a bounded producer-consumer model for substantially improved memory efficiency
- Introduced
JobQueue: a 10ms-paced token-bucket producer that batches rate deficit into a single offer - Atomic shedding: requests are dropped atomically in batch by the queue rather than individually per request
- Simplified
InFlightCounterto act solely as an adaptive permit gate (acquire/release) without queueing or shedding logic - Moved all backpressure and drop accounting to
JobQueuefor clearer separation of concerns - Worker pool drains from queue without re-spawning tasks per request
- Memory consumption now stays flat regardless of throughput
- Graceful shutdown: producer stops, workers exhaust queue, cancellation cleans up
Metrics & Request Tracking
- New Metrics: Added
totalDispatchedandtotalShedtoLoadTestEvent.tickfor comprehensive request tracking - Model Tracking: Track dispatched and shed requests in LoadTestModel with proper pause/resume offset handling
- UI Improvements: Display "Sent" as dispatched requests and add dedicated shed requests card
- Icon Clarity: Renamed "Sent" icon from checkmark to paperplane for better UX
Performance Improvements
- RPS Calculations: Moved avgRps calculation to model as computed property, maintained incrementally across operations
- Memory Efficiency: Implemented
maxRetainedPointstrimming to prevent unbounded memory growth in metrics - Render Path: Removed O(n) reduction operations from UI render path for faster updates
State Management
- Pause/Resume: Enhanced offset tracking for elapsed, completed, and failed counters to preserve accumulated values across pause/resume cycles
- Initialization: Offsets properly initialized on run start and updated on pause/completion
Configuration & Logging
- Backpressure Configuration: Added missing
backpressureQueueDepthdecoding from config with 512 as default - Opt-in Logging: Transport logging is now opt-in via
loggingparameter (defaults to false) to eliminate unnecessary overhead - Logging Control: Only wraps adapter with LoggingTransportAdapter when explicitly requested
- Debug Output: Simplified LoggingTransportAdapter logging output for clarity
Bug Fixes
- Fixed avgRps calculation and incremental maintenance across rpsData trimming
- Fixed backpressure queue depth not being read from configuration
- Removed duplicate response text display in StatsTextsTab
- Fixed offset tracking for pause/resume to maintain accurate accumulated counters
UI/UX
- Added connections display in stats grid
- Enhanced stats visualization with shed requests information
- Clearer icon representation for sent requests
Technical Details
Memory Management: The new JobQueue architecture eliminates per-request task creation, resulting in flat memory usage regardless of load level. Previous versions would accumulate tasks when throughput exceeded worker capacity, causing unbounded memory growth.
Metrics Accuracy: RPS averages are now computed and maintained in the model rather than recalculated on every render, and pause/resume cycles no longer reset accumulated counters.
Backpressure Handling: Shedding is now batched atomically at the queue level rather than one request at a time, improving performance and reducing contention.
Comparison with v.9.2
v.9.2 used a per-request task-spawning model where backpressure led to task accumulation. v.9.3 replaces this with a bounded producer-consumer architecture that keeps memory flat under all load conditions. Combined with improved metrics tracking (dispatched/shed visibility) and calculation fixes (incremental RPS, proper offset tracking), v.9.3 provides a more reliable and efficient load testing engine.
The producer-consumer pattern also establishes a cleaner architectural foundation for future performance monitoring and adaptive concurrency enhancements, as sampling and adaptive mechanisms can now operate as pure observers without interfering with core dispatch logic.
v.9.2
v.9.2 Release Notes
Improvements
- HeaderRowView Stability: Refactored header row binding to use ID-based identification instead of array indices. This improves stability when headers are reordered or deleted, and aligns with SwiftUI best practices for dynamic lists.
Technical Details
- Changed
HeaderRowViewto accept a UUID identifier instead of array index - Added computed
headerIndexproperty to safely locate current header - Updated
ForEachloop inHeadersTabto iterate with ID-based tracking - Wrapped header view body in optional binding for safer state management