v1.4.0 — Operational Visibility
Downloads
| Platform | File | Size |
|---|---|---|
| 🍎 macOS (Intel + Apple Silicon universal) | AMQPush_1.4.0_universal.dmg |
10.5 MB |
| 🪟 Windows x64 — NSIS installer | AMQPush_1.4.0_x64-setup.exe |
3.6 MB |
| 🪟 Windows x64 — MSI installer | AMQPush_1.4.0_x64_en-US.msi |
5.3 MB |
| 🐧 Linux x64 — Debian/Ubuntu | AMQPush_1.4.0_amd64.deb |
6.6 MB |
| 🐧 Linux x64 — RPM (Fedora/RHEL) | AMQPush-1.4.0-1.x86_64.rpm |
6.6 MB |
| 🐧 Linux x64 — portable | AMQPush_1.4.0_amd64.AppImage |
82 MB |
Binaries are not code-signed. macOS Gatekeeper / Windows SmartScreen will warn on first launch.
- macOS: right-click
AMQPush.app→ Open → confirm.- Windows: click "More info" → "Run anyway" on the SmartScreen dialog.
- Linux (
.AppImage):chmod +x AMQPush_*.AppImage && ./AMQPush_*.AppImage.
[1.4.0] — 2026-05-12
Highlights
- Clients inspector (new
⌘5sidebar item) — see everyone currently attached to the broker, including AMQPush itself. Left pane lists active connections (client address, user, inferred protocol, session count, age). Click a row to see the consumers attached to that connection on the right, with Credit showing how many messages each consumer is currently holding. AMQPush's own management / notification consumers are filtered out by default (toggle via a header button). A "Raw" debug overlay surfaces the verbatim broker response when you need to diagnose field-name mismatches across Artemis versions. - "Who holds it?" drill-down on peeked messages — every expanded peek message in Browser gets a Users chip that, on click, loads the consumers attached to that queue, joined to their client connection. Rows with non-zero credit (the practical "who is sitting on this message right now?" answer) are highlighted. Companion feature to Clients.
- Live broker latency indicator — a small
Xmschip in the header next to the green "Connected" dot, polled every 5 s via a trivial management RPC. Goes amber at >100 ms, red at >500 ms — surfaces degrading network / broker conditions before a send or subscribe stalls. - Send progress sparkline — Batch and CSV sends now render a tiny throughput sparkline next to the running counter, so you can see when the broker starts throttling instead of staring at a flat "247 / 1000 sent".
- Body diff against previous send — every History entry now has a Compare with previous to action that opens a side-by-side LCS diff vs. the most recent prior send to the same destination. Useful for "wait, what changed since last time this worked?" moments.
- Configurable subscriber reconnect backoff — per-profile base / max / multiplier knobs (Advanced tab in Connection). Defaults match the old hard-coded behaviour (1 s → 30 s, ×2) but you can now tune them down for fast-iteration dev work or up to spare the broker log during long outages.
Added — Clients view
- New
⌘5sidebar item Clients, between Browser and History. - Two Tauri commands
list_broker_connections/list_broker_consumerscalling Artemis'slistConnectionsAsJSON/listAllConsumersAsJSONover the same long-lived management channel as Browser. Field extraction is tolerant of cross-version key renames (connectionIDvsconnectionIdvsid;consumerIDvssequentialId;messagesInTransitvsdeliveringCount; etc.) and copes withusersreturned as aSet<String>. - Protocol is inferred from the implementation class when the broker omits the
protocolfield (e.g.ActiveMQProtonRemotingConnection→ AMQP,Stomp*→ STOMP). - Internal AMQPush consumers (UUID-named dynamic-source receivers for management RPC, the notifications drainer, and request-reply) are hidden by default with a
(+N internal)counter; toggle with the Internal header button. - Raw JSON debug overlay — toggle via the
<>Raw header button to see exactly what the broker returned for both RPCs. - Filter input narrows connections by user / host / protocol / connection-id.
- Auto-refresh every 3 s while the view is visible; 1 Hz tick keeps "ago" timestamps fresh in place.
Added — Browser view
- Who holds it? chip in the expanded peek-message header. Lazy-loaded panel listing consumers attached to this queue (joined to their connection's
clientAddress/users) with credit outstanding and last-RX timestamp. Non-zero credit rows highlighted in blue. - The Requeue all button on DLQ queues is now always rendered (disabled when the queue is empty) so its location is discoverable even before messages arrive — the existing DLQ banner mentions it explicitly, a hidden button was confusing.
Added — Header / status bar
- Broker latency chip (
Xms) next to the green Connected dot — colours: ≤100 ms green, ≤500 ms amber, otherwise red. Polled viabroker.getNameover the existing management channel so the broker doesn't see extra connections.
Added — Send view
- Live throughput sparkline alongside batch and CSV progress counters. Auto-scales Y to the running max, fills in as samples accumulate, hides when below 2 samples.
Added — History view
- Compare with previous to action on each entry — opens a modal with the side-by-side LCS diff of the two bodies, JSON / XML pretty-printed before diffing.
- New
src/utils/diff.tsmodule shares the LCS implementation between History and the existing two-message compare on Receive.
Added — Connection / Advanced tab
- New Subscriber reconnect backoff card with three numeric inputs: base ms, max ms, multiplier. Persisted per profile.
Profileschema (Rust + TS) gainedreconnect_base_ms,reconnect_max_ms,reconnect_multiplier, all optional with sensible defaults — oldprofiles.jsonfiles keep working unchanged.
Changed
- Sidebar shortcuts shifted down to accommodate Clients: History →
⌘6, Stats →⌘7, Logs →⌘8. subscriber::startreads the backoff knobs from theAmqpClientstate on each call rather than using compile-time constants.- Help modal grew a new Clients section and a Who holds this message? subsection inside Browser. Pre-script docs were rewritten with seven worked examples, an API reference, and best-practices guidance.
Fixed
- Pre-script now runs as an async function —
await crypto.subtle.digest(...)and other async APIs work as the docs claim. Three call sites updated toawait runPreScript(...). - Templates table: dropped the always-narrow Props column (moved into Features icons), Kind rendered as plain text instead of a chip, every column left-aligned, row heights pinned, Features icon order matches the Send tab strip exactly.
- Properties / Variables row alignment in the Send view — the WebKit-only render gap (15-iteration saga) is recorded in
CLAUDE.mdas the "measure first" rule. - Format helpers (
fmtBytes/fmtDuration) are now imported fromsrc/utils/format.tseverywhere instead of being re-implemented inside PublisherView.
Backend
BrokerConnection/BrokerConsumertypes inbroker.rsare populated via hand-walkedserde_json::Valueextraction so AMQPush survives the dozen+ slightly-different field naming conventions across Artemis 2.x versions and ActiveMQ Classic.- Long-lived management channel now handles four call shapes:
list_queues_via,ping_via,list_connections_via,list_consumers_via. All four reuse the sameSender+ dynamic-sourceReceiver, avoiding the SESSION_CLOSED notification storm that comes with per-call channels. - New Tauri commands:
list_broker_connections,list_broker_consumers,fetch_broker_connections_raw,fetch_broker_consumers_raw,ping_broker. The two*_rawcommands return the unparsed JSON string for the Clients view's debug overlay. - Foundation hardening landed alongside the headline features:
- schema migration scaffolding (
version: u32+migrate_*_v1_to_v2) inprofiles.rsandtemplates.rs; #[serde(flatten)] extra: HashMap<String, Value>on Profile / Template so manually-added fields survive save round-trips;- one-time history trim on load so pre-cap installations don't keep growing
history.jsonpast 200 entries; - subscriber permanent-failure detection — surfaces "address deleted" / "permission denied" as a non-retried red-banner event instead of looping forever.
- schema migration scaffolding (