Releases: DEADover/AMQPush
Release list
v1.5.5 — Minor cycle bundle
Downloads
| Platform | File | Size |
|---|---|---|
| 🍎 macOS (Intel + Apple Silicon universal) | AMQPush_1.5.5_universal.dmg |
11.6 MB |
| 🪟 Windows x64 — NSIS installer | AMQPush_1.5.5_x64-setup.exe |
3.9 MB |
| 🪟 Windows x64 — MSI installer | AMQPush_1.5.5_x64_en-US.msi |
5.8 MB |
| 🐧 Linux x64 — Debian/Ubuntu | AMQPush_1.5.5_amd64.deb |
7.1 MB |
| 🐧 Linux x64 — RPM (Fedora/RHEL) | AMQPush-1.5.5-1.x86_64.rpm |
7.1 MB |
| 🐧 Linux x64 — portable | AMQPush_1.5.5_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.5.5] — 2026-05-20
A minor-cycle bundle on top of 1.5.0 — eight features and a handful of QoL fixes that piled up over a week of dogfooding.
Highlights
- Quick-connect from URL — paste
amqp://user:pass@host:port/queue(oramqps:///ws:///wss://) into a modal, see a live preview of every parsed field, click Apply to fill the form. No saving yet, no surprises. - Import / Export profiles — round-trip the entire profile collection as JSON via the native file picker (
tauri-plugin-dialog). Useful for dotfile sharing across machines. Imports accept either the map shape AMQPush exports or a bare array. - Configurable publisher send retry — per-profile
max attempts+delay. Each user-visible send goes through up to N attempts on transient errors. Disconnect-recovery still happens automatically per attempt (doesn't count against the budget). - Saved JMS selectors — a named library reusable across sessions and queues. 📑 dropdown next to the Selector input lists saved entries; click to apply,
Save current as…to persist. Overwrite-by-name semantics, stored in localStorage. - Broker Clients host grouping — connections from the same host (different ephemeral ports) collapse under a header row with aggregate Cons / Sess / Age. Auto-collapsed on first sight, remembers user expands across polls via
useRef<Set>. - Property / value autocomplete from history — keys and per-key values mined from
history.jsonsurface in the Properties tab. Long_AMQ_*markers are a click away; a small caret next to each value field opens a per-key value picker. - Stats per-profile — every
track*InStatscall writes into a profile-scoped bucket. StatsView gets a profile selector at the top (visible once you've sent on more than one); pick a specific profile orAllfor a merged aggregate. Useful for prod-vs-staging side-by-side. - Chaos tab in Send — four poison-pill toggles for testing consumer error paths: oversized body (pad to N MB), override content-type, malformed JSON (strip last
}/]), strip application property. Applied last, after vars / pre-script. Combine freely.
Added — Connection view
- Overflow
⋮menu in the profile-picker row: Quick-connect from URL, Import profiles, Export profiles. - New Publisher send retry card in Advanced —
max attempts(1 = disabled) +delay between attempts(ms). Defaults1 / 250preserve pre-1.5.x behaviour.
Added — Receive view
- Saved selectors dropdown (📑) next to the Selector input.
- Sticky
Message ID / Date-Timecolumn header (already in 1.5.0, hardened against legacy-format-mixing via thefmtTimestampshim). - REC closure-bug fix —
recordingRef.currentis now updated synchronously intoggleRecording, so the buffer starts filling immediately after click instead of waiting for stale closure.
Added — Browser view
- Selective Purge / Shovel from multi-select selection bar (already in 1.5.0 — additional polish to checkbox alignment in 1.5.5).
Added — Send view
- Chaos tab — see Highlights.
- Properties key + value autocomplete from history.
- The
chaosActivedot on the Chaos tab makes it impossible to forget you've left a poison-pill toggle on.
Added — Broker Clients view
- Per-host grouping with collapsible headers.
- Aggregate stats in group header rows (sum of Cons / Sess, oldest creation_time → Age,
mixedfor User / Proto when group is heterogeneous).
Added — Stats view
- Profile selector in the top bar (
All+ every profile with non-empty stats). mergeStats(buckets)aggregates throughput / queues / kinds / sizes across profiles.
Added — Help
- New Highlight rules section in Receive with 9 rule pattern recipes (JSON field match, XML element match, application property, priority threshold, correlation-id, big bodies, whole-word match, etc.).
- New Chaos helpers section in Send.
- New Profile picker overflow menu section in Connection.
- Per-profile Stats paragraph.
- Newest-first ordering note in Receive.
Changed
- View titles:
Send→ Send Messages,Receive→ Receive Messages,Clients→ Broker Clients. - OS window title now reads
AMQPush <version>— picked up at runtime viagetVersion()/setTitle(). - Window opens maximised by default.
- Browser peek
Maxdropdown goes up to 5000 +All; changing the cap re-peeks immediately (no manual Refresh). - Browser + Receive both render full local
YYYY-MM-DD HH:MM:SStimestamps. Legacy persistedHH:MM:SSentries get today's date synthesised on display for column consistency. - Receive list reversed — newest at the top; underlying array stays chronological for persistence + diff.
- Per-message Stats counting in Batch / CSV — sentCount / size distribution / per-queue chart reflect actual throughput, not "one click".
- Mark ref → Ref (single-line label).
- Workspace combobox replaced the native
<datalist>(unreadable in WebKit); workspaces are now deletable with an inline confirm + automatic migration of profiles into Default.
Fixed
- REC capture buffer didn't fill until the listener closure was rebuilt (
recordingstate was captured by the long-livedlisten("message_received")callback at registration time). Fix routes through arecordingRefupdated synchronously intoggleRecording. - Duplicate Copy button in Receive — the header-level Copy was removed; the Body section's Copy is the canonical one.
- Browser peek-list checkbox alignment when row has 2 lines of content.
- ShovelModal Profile / Queue inputs heights mismatched due to WebKit
<select>rendering — fixed viaappearance-none+h-8 box-border+ customChevronDowncaret. - Receive Help docs about Replay — explainer banner inside the modal so first-time users see what speed / target queue / play actually do.
Backend
Profileschema gainedsend_retry_attempts+send_retry_delay_ms; defaults preserve pre-1.5.x behaviour.AmqpClient::send_messagewraps the per-attempt logic in a retry loop bounded by these knobs. Innertry_send_onceis the same as before; outer loop respectssend_retry_delay_msbetween failures.profiles::export_to(path)writes the entire collection as pretty JSON;import_from(path, overwrite)accepts map or array shape, runsmigrate_profileper entry, returns counts (added / overwritten / skipped / failed).- Tauri commands:
export_profiles,import_profiles. - New deps already pulled in 1.5.0 (
tauri-plugin-dialog,fe2o3-amqp-ws, etc.) — no new direct deps in 1.5.5.
v1.5.0 — Multi-Broker Workflows
Downloads
| Platform | File | Size |
|---|---|---|
| 🍎 macOS (Intel + Apple Silicon universal) | AMQPush_1.5.0_universal.dmg |
11.6 MB |
| 🪟 Windows x64 — NSIS installer | AMQPush_1.5.0_x64-setup.exe |
3.9 MB |
| 🪟 Windows x64 — MSI installer | AMQPush_1.5.0_x64_en-US.msi |
5.7 MB |
| 🐧 Linux x64 — Debian/Ubuntu | AMQPush_1.5.0_amd64.deb |
7.1 MB |
| 🐧 Linux x64 — RPM (Fedora/RHEL) | AMQPush-1.5.0-1.x86_64.rpm |
7.1 MB |
| 🐧 Linux x64 — portable | AMQPush_1.5.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.5.0] — 2026-05-12
Highlights
- Cross-broker shovel — the Browser peek pane has a new Shovel… action that copies the peeked (or selected) messages to a queue on any other saved profile. Source is the currently-active broker; target uses a transient connection that lives only for the run and doesn't disturb the user's primary session. Optional JS transform runs once per message before send (
ctx = { body, properties },return falseto skip). - Receive recording + replay — a REC button on the active-subscription bar captures incoming messages into an in-memory buffer with their arrival timings. Save… flushes the buffer to
~/.amqpush/recordings/<name>.json. The new Replay… modal picks any recording, target queue, and speed multiplier (0.5× / 1× / 2× / 5× / max), then walks the file replaying each message with delays scaled by the speed. Live progress + cancel. - mTLS client certificates — per-profile PEM
.crt+.keyor PKCS#12.p12/.pfxbundle (with passphrase) for mutual TLS. Browse buttons open the native file picker (Finder / Explorer) with cert / key extension filters. Amber warning banner when TLS is off explains where to enable it. Plumbed through every connection path — main client, broker management, subscriber, peek, notification drainer. - AMQP-over-WebSocket — new transport via
fe2o3-amqp-ws. Per-profile toggle in Connection → Security plus an optional WS URL path. Connects viaws://host:port/<path>(orwss://when TLS is on) instead of raw TCP. Picks up brokers behind corporate firewalls that block 5671/5672, plus cloud AMQP endpoints (Azure Service Bus, Amazon MQ RabbitMQ flavour, Tanzu RabbitMQ withrabbitmq_web_amqp). - Topic-pattern subscribe —
# Patterntoggle next to Selector in Receive accepts wildcard expressions likeorders.*orevents.>and attaches them asapache.org:legacy-amqp-topic-binding:stringsource filters. Pattern + Selector can both be active at once; chips on the active-subscription bar show which filters are in play. - DLQ bulk repair-resubmit with inline edit — checkboxes appear on every peeked message (not just DLQ). The selection bar exposes per-broker actions (Shovel selected, Purge selected) plus DLQ-only actions (Edit & Requeue walkthrough, Requeue selected). The walkthrough modal lets the user tweak each message's body and override the target address before resubmit.
Added — Browser view
- Higher peek caps: dropdown now goes up to 5000 plus an All option that resolves to the queue's broker-reported
message_count(hard-capped at 50 000 to avoid catastrophic timeouts). Changing the cap re-peeks immediately — no manual Refresh required. - Sticky column headers —
#/ Message ID / Date-Time with the timestamp formatted asYYYY-MM-DD HH:MM:SSfor cross-view correlation. - Newest-first ordering — rows sorted by AMQP
creation-timedescending; the#Ncolumn still reflects the original broker-delivery order. - Selective purge via Artemis's
queue.removeMessages(filter)— builds a JMS selector matching the AMQPmessage-ids of the picked rows (AMQUserID='a' OR AMQUserID='b' OR …). Confirms with a count before executing.
Added — Receive view
- Sticky
Message ID / Date-Timecolumn header — pinned to the top of the list. Date-Time is the sameYYYY-MM-DD HH:MM:SSas Browser. Messages already in localStorage from before the format change are promoted to today's date so the column stays consistent mid-session. - REC and Save… chips on the active-subscription bar (see Highlights).
- Replay… button in the top bar (see Highlights).
Added — Connection view
- mTLS client certificate card in Advanced — Certificate / Private key paths with Browse buttons (native file picker) plus a Passphrase field for PKCS#12 bundles. Disabled with an amber warning when TLS is off.
- AMQP over WebSocket toggle in Security plus a WS path sub-field that appears when WS is on. The Help-text hint reflects the current scheme (ws / wss) and path.
- Native file picker enabled by adding
tauri-plugin-dialog+dialog:defaultcapability.
Added — Queue picker
- Recent queues MRU — a per-profile list of the 10 most recently used queues (anything successfully sent to or subscribed from). Shown above the live broker queue list in the picker dropdown. Hover a row to reveal a × button that forgets that entry. Persisted in
localStorageunderamqpush.recentQueues.<profile>.
Added — Window / chrome
- Window opens maximised by default (
tauri.conf.jsonmaximized: true). Min size 1080×780 still applies if the user un-maximises. - OS window title now reads
AMQPush <version>— picked up at runtime viagetVersion()so it tracks releases without hand-edits in config. - View titles renamed to Send Messages, Receive Messages, Broker Clients for parity with the sidebar.
Changed
- Stats counts shipped per-message in Batch / CSV sends rather than once per batch —
sentCount, size distribution, per-queue chart now reflect actual throughput instead of "one click". - Receive list now shows the newest message at the top (reversed render order; underlying array stays chronological for persistence + diff).
- "Mark ref" button → "Ref" (one-line label).
Clientsview title →Broker Clients; Help section title matches.- Workspace combobox replaced the native
<datalist>(unreadable in WebKit). Workspaces can now be deleted with an inline confirm — all profiles in the deleted workspace move toDefault.
Fixed
- WebKit
<select>rendered at the wrong height next to a sibling<input>. The Shovel modal's Profile / Queue pair now matches pixel-for-pixel viaappearance-none+h-8 box-border+ a customChevronDowncaret. - Browser peek-list checkbox icon aligned with the first message-row line instead of the row's vertical centre.
- Receive table previously had no column header — the message-row metadata was self-explanatory but the timestamp column was ambiguous between local-arrival and broker-creation time.
- Help selectable via
select-texton the modal panel so users can copy paths / token names directly out of the docs.
Backend
- New direct deps:
fe2o3-amqp-ws = "0.14.0"(WebSocket transport),tauri-plugin-dialog = "2"(native file picker for the mTLS Browse buttons),@tauri-apps/plugin-dialog(TS side). - New Rust types
amqp::ClientCertandamqp::TransportOptsthread throughopen_connection,AmqpClient::connect,ManagementChannel::open,broker::peek_messages,subscriber::start, andnotif_drainer::start. Eight call sites unified. - New Rust module
recordings.rs— versioned JSON file format + load/save/delete/list helpers. Tauri commands:list_recordings,get_recording,save_recording,delete_recording,play_recording(live progress events). - New Tauri commands for the shovel:
shovel_open_target/shovel_send_to_target/shovel_close_target. Transient client stored inAppState::shovel_target, separate from the user's primary connection. - New Tauri command
remove_messages_by_idscalls Artemisqueue.removeMessages(filter)with a JMS selector built from the picked rows'message-ids. start_subscriberTauri command takes the newtopic_pattern: Option<String>arg;Profileschema gaineduse_ws/ws_path/client_cert_path/client_key_path/client_key_passphrase.- Tauri capability
default.jsonexpanded withcore:window:allow-set-title,core:app:allow-version,dialog:default.
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 (
v1.3.0 — CSV bulk send, broker selectors, DLQ tools, workspaces, faker
Downloads
| Platform | File | Size |
|---|---|---|
| 🍎 macOS (Intel + Apple Silicon universal) | AMQPush_1.3.0_universal.dmg |
10.4 MB |
| 🪟 Windows x64 — NSIS installer | AMQPush_1.3.0_x64-setup.exe |
3.5 MB |
| 🪟 Windows x64 — MSI installer | AMQPush_1.3.0_x64_en-US.msi |
5.2 MB |
| 🐧 Linux x64 — Debian/Ubuntu | AMQPush_1.3.0_amd64.deb |
6.5 MB |
| 🐧 Linux x64 — RPM (Fedora/RHEL) | AMQPush-1.3.0-1.x86_64.rpm |
6.5 MB |
| 🐧 Linux x64 — portable | AMQPush_1.3.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.3.0] — 2026-05-10
Highlights
- CSV-driven bulk send — load a spreadsheet, each row becomes a message. Column headers turn into
{{column_name}}tokens that resolve per-row in Body and Properties; live progress, abort, and a dry-run preview let you sanity-check substitutions before kicking off a thousand-message batch. - Broker-side selectors in Subscribe — JMS-style filter expression (
priority > 5 AND application_property:type = 'order') attached as an AMQP 1.0 source filter viaapache.org:selector-filter:string. The broker filters; you only pay the wire cost for messages you care about. - DLQ inspector + requeue — Browser detects dead-letter queues by name (
DLQ,*.DLQ,_dlq,dead, etc.) and surfaces a banner plus a green Requeue all button. Each message is republished to its_AMQ_ORIG_ADDRESS(Artemis) /originalDestination(Classic) with internal markers stripped so the broker doesn't immediately re-DLQ the copy. Per-message Requeue → <origin> action on the details pane too. - Profile workspaces — group your saved brokers under labels like
Dev/Staging/Prod(or per service / project). Workspaces drive sectioned headers in the global profile picker and the Cmd+K palette so a setup with 20+ profiles stops feeling unwieldy. - Faker tokens in Variables — 35+ new built-in tokens for realistic-looking test data:
{{faker.email}},{{faker.fullName}},{{faker.creditCardNumber}},{{faker.iban}},{{faker.streetAddress}},{{faker.lorem(N)}}, and many more. Powered by@faker-js/faker.
Added — Send view
CSV bulk send (new tab)
- New CSV tab in the Send view with a dropzone / file picker for any well-formed CSV (parsed via
papaparse, RFC 4180-compliant). - Header row drives the column-token catalogue: clicking a
{{column_name}}chip copies it to the clipboard for paste into Body / Properties. - Preview table shows the first 5 rows with click-to-select; the highlighted row drives the Dry-run preview that shows exactly how the Body resolves after substitution (so you spot a mistyped column before you blast 10 000 messages out).
- Send N messages action loops over every row, runs Pre-script per iteration with column values available via
ctx.get("col_name"), applies token substitution to Body and every Property value, sends. Live progress bar with ok / fail counts. - Cancel mid-batch via an
AbortController— the loop exits cleanly at the next iteration boundary. - Configurable per-row delay (
csv_delay), useful for pacing against rate-limited consumers. - Schema validation is intentionally skipped in CSV mode — the tab is optimised for throughput; validate on a single representative row in the regular Send view first if you need a guard.
Added — Variables
- Faker token namespace —
{{faker.<path>}}and{{faker.<path>(<arg>)}}covering people (firstName / lastName / fullName / jobTitle / gender), internet (email / username / url / domain / userAgent / password / ip / ipv6 / macAddress / phone), address (streetAddress / city / state / country / countryCode / zipCode / latitude / longitude), finance (creditCardNumber / creditCardCvv / creditCardExpiry / iban / bic / currency / amount), commerce (companyName / productName / productPrice / department), and text (lorem / loremParagraph / word). - All faker tokens surface in the existing autocompletion dropdown and the Variables tab "Built-in presets" list with descriptions.
- Auto-detect of the Raw subtype now keeps a manual JSON / XML pick when the editor is empty (regression noticed in 1.2.0): the dropdown sticks until you actually clear non-empty content.
Added — Subscribe view
- New Selector input — toggleable input below the queue picker accepts a JMS-style filter expression. Sent to
start_subscriberas the newselectorparameter; the Rust side packages it into an AMQP source filter set with descriptorapache.org:selector-filter:string. - Active-subscription chips now show a small filter-icon badge when a selector is set; the tooltip surfaces the actual selector text so you can confirm what's running.
- Compatible with Artemis, ActiveMQ Classic, Qpid Broker-J. Brokers that don't support the filter typically reject the attach with a clear error message we surface in the log.
Added — Browser view (DLQ tooling)
- DLQ detection — the peek pane recognises queues named
DLQ,*.DLQ,*_dlq,ActiveMQ.DLQ,ExpiryQueue, or anything containing "dlq" / "dead" (case-insensitive). - DLQ banner appears under the peek-pane header explaining how requeue works and which property carries the original destination on the user's broker.
- Requeue all button (next to Purge) — iterates the peeked messages, looks up
_AMQ_ORIG_ADDRESS/_AMQ_ORIG_QUEUE(Artemis) ororiginalDestination/JMSXOriginalDestination(Classic), republishes each to its origin via the existingsend_messagecommand. Internal markers are stripped from the republished copy so the broker doesn't re-DLQ it on first failure. - Requeue → <origin> chip on the per-message details pane for selective requeue.
- Progress counter (
Requeue 7/24) replaces the button label while a bulk requeue is in flight.
Added — Connection / profiles
- New Workspace field on every profile (free-form text, datalist autocomplete from existing labels). Empty →
Default. - The header profile picker groups profiles under
<DropdownSection>headers per workspace; user-named groups float to the top,Defaultalways last. - The Cmd+K palette uses workspace as the category for profile-switch actions:
Profiles · Dev,Profiles · Staging, etc., so fuzzy search likedev pmatches Dev profiles before others. - Backward-compatible: legacy profiles without a
workspacekey are loaded asDefaultvia Rust#[serde(default)].
Backend
- New direct dep
serde_amqp = "0.14"(already pulled in transitively byfe2o3-amqp-types, zero compile cost) — used to constructDescribed<Value>+Descriptorfor the JMS-selector filter set. - New direct deps on the frontend:
@faker-js/faker(English locale, ~700 KB) andpapaparse(RFC 4180 CSV parser, ~30 KB). subscriber::startsignature gained aselector: Stringparameter;Receiver::builder().source(Source { filter, ... }).attach(...)is used when the selector is non-empty, falling back to the simplerReceiver::attachpath otherwise.start_subscriberTauri command takes an optionalselector: Option<String>(backward compat: callers that omit it get no-filter behaviour).Profilestruct (Rust + TS) gained aworkspacefield with#[serde(default = "default_workspace")]so olderprofiles.jsonfiles load asDefault.
Fixed
- Auto-detect of the Send view's Raw subtype no longer reverts the user's manual JSON / XML pick when they clear the editor before content arrives — picking a type in an empty buffer now sticks.
v1.2.0 — schema validation, Cmd+K palette, in-app Help, scheduled sends
Downloads
| Platform | File | Size |
|---|---|---|
| 🍎 macOS (Intel + Apple Silicon universal) | AMQPush_1.2.0_universal.dmg |
10.6 MB |
| 🪟 Windows x64 — NSIS installer | AMQPush_1.2.0_x64-setup.exe |
3.5 MB |
| 🪟 Windows x64 — MSI installer | AMQPush_1.2.0_x64_en-US.msi |
5.2 MB |
| 🐧 Linux x64 — Debian/Ubuntu | AMQPush_1.2.0_amd64.deb |
6.7 MB |
| 🐧 Linux x64 — RPM (Fedora/RHEL) | AMQPush-1.2.0-1.x86_64.rpm |
6.7 MB |
| 🐧 Linux x64 — portable | AMQPush_1.2.0_amd64.AppImage |
86 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.2.0] — 2026-05-10
Highlights
- Schema-validated bodies — paste or upload a JSON Schema or XSD into the new Body schema modal; AMQPush validates every send against it (ajv for JSON, lazy-loaded
xmllint-wasmfor XML) and gates the Send button on the result. - Cmd+K command palette — fuzzy-searchable index of every view, action, profile and theme. Keyboard-only navigation, sticky category headers, kbd-shortcut hints inline.
- In-app Help —
?icon (and bare-key?shortcut) opens a 17-section guide with sidebar nav, full-text search, and copy-pasteable examples for every feature. - Browser purge —
Purgebutton in the queue browser wipes a queue via Artemis management RPC, with a confirm modal showing the broker-reported message count. - Scheduled & delayed sends — first-send delay with a cancellable countdown; combine with Batch for scheduled bursts.
- Pre-script tab — small JS sandbox runs before each send (
ctx.set/ctx.get/ctx.iter), perfect for counters, derived IDs, randomized routing keys. - Update checker — silent GitHub Releases poll on startup; new versions surface as a non-intrusive header pill with a "Skip this version" option.
Added — Send view
Body validation (schema modal)
- New shield-pill in the Body sub-toolbar opens a per-language schema editor — JSON Schema for JSON bodies, XSD for XML.
- Modal supports paste and file upload (
.json/.xsd/.xml); Clear / Close buttons; Esc to dismiss. - JSON Schema validation runs synchronously via
ajv(Draft-07 + 2020-12); errors show withinstancePath(e.g./order/lines/0/qty). - XSD validation runs asynchronously via
xmllint-wasm(libxml2 in WebAssembly, ~500 KB) — lazy-loaded only when both an XSD and a non-empty body exist, so startup is unaffected. - Both schemas are saved per-template under
body_schema_json/body_schema_xsd. Older templates with the legacybody_schemafield migrate transparently into the JSON slot. - Status pill states: grey "Schema…" (none), blue "schema" (configured / waiting), green "schema ✓", red "schema ✗ (N)", spinner during async XSD validation.
Variables
- New Variables tab — user-defined
{{name}}substitutions with enable toggle, key, value (chains other tokens), description. - Built-in token catalogue (
{{uuid}},{{timestamp}},{{date}},{{now}},{{random}},{{int}}) is always available in Body / Properties without registration. - Body editor autocomplete pops up on
{{— surfaces user vars first, then built-ins, with descriptions. - Auto-detect of the active subtype now keeps a manual JSON / XML pick when the editor is empty (previously it snapped back to
text).
Pre-script
- New Pre-script tab with a CodeMirror-edited JS snippet that runs before every send.
- API:
ctx.set(key, value),ctx.get(key),ctx.iter(1-based index in Batch loops). - Runs in a sandboxed evaluator — no DOM, no
fetch, pure computation.
Schedule
- New Schedule toggle — delays the first send by N seconds (independent of the Batch loop's per-iteration delay).
- Countdown is shown inside the Send button; Cancel aborts the wait via
AbortControllerso nothing is sent.
Added — Browser view
- Purge queue (red button on the peek pane header) — calls Artemis
removeAllMessagesvia the persistent management channel. - Confirm modal shows the broker-reported message count and a destructive-action warning before executing.
- After purge the queue list and peek pane refresh automatically.
Added — Logs view
- Sortable table — Time / Level / Message columns, click headers to flip direction.
- Date column added (legacy
HH:MM:SS-only entries migrate into a synthesised today-stamp on load). - Date-preset filter — All / Today / Last hour / Last 24h / Last 7 days.
- Per-column substring search; level filter dropdown (info / ok / err).
- Pause vs Follow are now two distinct controls with clear tooltips:
- Pause freezes the table (snapshot mode); new events keep arriving in the buffer.
- Follow keeps the view scrolled to the newest row; turn off when scrolling up to read older entries.
- Export dropdown — JSON / CSV /
.logplain-text; export respects the current filter.
Added — Command Palette (Cmd+K)
- Fuzzy subsequence matching with word-start / consecutive-match bonuses ("gss" matches "Go-to Send" better than "Logs Stats Subscriber").
- Categorised list (Navigation / Actions / Profiles / Theme) with sticky headers.
- Up / Down skip disabled rows; Enter runs; Esc closes.
- Surfaces every reachable action: switch view, connect / disconnect, switch profile, change theme, send now, clear logs, open Help, show update notes.
Added — Help modal
- Opens via the new
?icon in the header (or the bare-key?shortcut, or Cmd+K → "Open Help"). - Left pane: searchable section navigation; right pane: full content; Esc closes.
- 17 sections covering Getting Started, Connection, Send (Body / Variables / Pre-script / Batch & Schedule / Reply / Templates / Body validation), Receive, Browser, History, Stats, Logs, Keyboard shortcuts, Tips & Tricks, Files & Storage.
- All shortcuts, file paths and JSON Schema / XSD examples documented in-app — no need to leave the window.
Added — Update checker
- On startup AMQPush hits
https://api.github.com/repos/DEADover/AMQPush/releases/latestand compares against the running version. - New version → blue header pill
vX.Y.Z; click opens a release-notes modal with Open on GitHub and Skip this version. - Dismissed versions persist in
localStorage.amqpush.dismissedUpdateVersionso the same release won't re-prompt. - Falls through silently on offline / rate-limit; no telemetry, no signing keys, no auto-installer (manual download from GitHub).
Added — UI primitives & polish
- New shared components:
CommandPalette,HelpModal,Callout,CopyButton(with success animation),Dropdown/DropdownItem/DropdownSection/DropdownFooter,SectionLabel,SegmentedControl,Toggle,ViewTopBar. - Connection view split into General / Advanced tabs with an Activity log pane.
- Sidebar collapses smoothly via CSS (single render tree, no layout thrash).
- Theme dropdown replaces the cycle-through-themes button (Light / Dark / Use system preference shown explicitly).
- All long property keys in the Help modal break cleanly inside their column — no text overlap on entries like
amqpush.dismissedUpdateVersion.
Added — macOS polish
Icon at runtime
- Custom
dock_iconmodule setsNSApplication.applicationIconImagefrom the embeddedicon.pngat startup, so dev-mode runs (raw binary, no.appbundle) show the AMQPush logo in the Dock and Cmd-Tab instead of the generic blue-folder placeholder. - The same image is registered under the
NSApplicationIconnamed-image cache, so the standard About panel shows the logo too.
About dialog with build date
build.rsstampsAMQPUSH_BUILD_DATE(formatddMMyyyy) into the binary at compile time.- Setup hook installs a custom Tauri menu whose About item uses an
AboutMetadatawithshort_versionset to the build date — the parenthesised slot now shows(10052026)instead of repeating the version.
Fixed
- Send view's Raw subtype dropdown now sticks when picked on an empty editor (previously the auto-detect would immediately revert to
text). - Variable substitution inside JSON bodies is now schema-validated against the template form —
{"id": "{{uuid}}"}reports as valid even though the unsubstituted token wouldn't satisfy a strict parser. - Auto-detect of the Raw subtype no longer toggles the type while a manual pick is in effect (only releases on explicit clear after content existed).
Backend
- New
dock_icon.rsmodule (~30 LoC) usingobjc2+objc2-app-kit+objc2-foundation(already pulled in transitively by Tauri — zero extra compile cost). - New
notif_drainer.rs— silent consumer ofactivemq.notificationsto prevent unrouted notifications from filling the DLQ on Artemis brokers withsend-to-dla-on-no-routeenabled. - New
purge_queueTauri command using the persistentManagementChannelpattern (lazy-open, drop on error). AboutMetadataBuilderplumbed through a custom macOS menu inlib.rs::install_macos_menu— replicates Tauri's default app menu with our injected metadata.build.rsextended to emitAMQPUSH_BUILD_DATEviachrono(added under[build-dependencies],default-features = false,clockfeature only).Templatestruct (Rust + TS) gainedbody_schema_json/body_schema_xsdwith#[serde(default)]; legacybody_schemaretained for backward compat.LogEntrymigrated fromts: "HH:MM:SS"string totsMs: numberfor date-aware filtering / sorting; loader migrates legacy entries.
v1.1.0 — Receive inspector, design unification, connection resilience
Downloads
| Platform | File | Size |
|---|---|---|
| 🍎 macOS (Intel + Apple Silicon universal) | AMQPush_1.1.0_universal.dmg |
9.4 MB |
| 🪟 Windows x64 — NSIS installer | AMQPush_1.1.0_x64-setup.exe |
3.1 MB |
| 🪟 Windows x64 — MSI installer | AMQPush_1.1.0_x64_en-US.msi |
4.7 MB |
| 🐧 Linux x64 — Debian/Ubuntu | AMQPush_1.1.0_amd64.deb |
6.1 MB |
| 🐧 Linux x64 — portable | AMQPush_1.1.0_amd64.AppImage |
81 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.1.0] — 2026-05-08
Highlights
- Receive view rebuilt from a single-field log into a full message inspector — multi-queue subscribe, split-pane preview, highlight rules, format-aware body viewer, message diff, persistent log.
- Browser, Receive, and History now share a unified design system — same toolbar layout, same collapsible sections, same property list with hover-Copy on every value, same body view-mode toggle.
- Connection resilience — TLS skip-verify is now wired end-to-end; publishers transparently re-open the session on broker idle timeouts so you no longer have to manually reconnect.
Added — Receive view
Multi-queue
- Subscribe to several queues at once. Each subscription is its own background task with an independent reconnect loop. Per-queue chips show live / reconnecting status; click
×to stop one without affecting the others. - Mixed feed tags every message with its source queue (visible badge appears once you have 2+ subscriptions active).
- New Tauri commands:
start_subscriber(address)adds a sub,stop_subscriber(address?)stops one (or all),list_subscribers()lists active.
Message inspection
- Full AMQP metadata extraction for every received message —
message_id,correlation_id,reply_to,content_type,creation_time,priority,durable,ttl,delivery_count, plus all application properties. - Outlook-style split layout (list left / preview right). Preview has collapsible Properties / Application Properties / Body sections, each with hover-Copy on every value.
- Reply button on any message with a
reply-to— opens the Send view with target pre-filled and the originalcorrelation-idcarried over as a custom property. - Pause / Resume without dropping the link — UI freezes while broker delivery continues; counter shows how many were dropped during the pause.
Body viewer
- Segmented
AUTO | RAW | HEXtoggle in the Body section. - AUTO detects content-type / leading character and pretty-prints JSON or XML.
- HEX renders the classic 16-bytes-per-row hex+ASCII dump (capped at 4 KB for UI responsiveness).
Search, stats, export
- Filter input now matches across body / message-id / correlation-id / content-type / application-properties (regex with case-insensitive fallback).
- Session stats live in the status bar: total received, total bytes, average size, rolling rate (5 s window), session duration.
- Export received messages to JSON or CSV via a dropdown in the filter bar.
Highlight rules
- Define regex rules with a colour and name; matching messages get a coloured
border-l-2and dot on their list row. - Rules manager modal with add / edit / delete, live regex validation, six colours (red / amber / green / blue / purple / pink).
- Rules persist across restarts in
localStorage.
Persistent log (opt-in)
- Toggle
Persistin the filter bar — last 500 received messages are saved tolocalStorageand restored on next launch. - Off by default to avoid storing potentially sensitive payloads without consent.
Diff between messages
- Mark any message as the comparison reference, then select another and click Compare.
- Side-by-side modal showing standard properties + application properties (delta-highlighted on amber) plus a line-level body diff (LCS algorithm, JSON / XML pretty-printed before diffing for meaningful alignment).
Added — Browser view
- Property hover-Copy on every field in the message details pane (parity with Receive).
AUTO | RAW | HEXbody viewer for peeked messages.- Text selection in queue list and peeked-messages list (click no longer swallows drag selection).
Added — History view
- Outlook-style split with full preview pane, including all auto-set / custom properties captured at send time.
- Collapsible sections (Properties / Auto-set / Custom / Body) with chevron + uppercase tracking-wider labels matching the rest of the app.
- Hover-Copy on every property; previously read-only.
AUTO | RAW | HEXbody viewer with XML pretty-print and hex dump.- Search now covers body content too (full-text), not just metadata.
Added — Connection
- TLS skip-verify is now actually wired through
connect,start_subscriber,list_broker_queues,peek_messages,await_reply— previously the UI flag had no backend effect for self-signed certs. - Publisher auto-reopens the connection / session transparently on dead-session errors (
Illegal session state,Connection has stopped, idle timeout, etc.) and retries the send once before reporting failure. - Added
native-tlsandtokio-native-tlsdirect deps for the manual TLS handshake path.
Changed — design unification
- Browser, Receive, and History are now visually cohesive — same
px-3 py-1.5pane headers, sameborder-b border-t-line/40row borders, samehover:bg-t-hover/50, same 140 px property-list key column, same empty-state icon size. - BrowserView's native checkboxes (
<input type="checkbox">) replaced with pill-toggle buttons matching Receive's style. - HistoryView preview header collapsed from two rows (
px-4 py-2.5chunky) into one row at the standard padding; Resend is a ghost button instead of filled-blue. - Extracted shared primitives:
src/components/CollapsibleSection.tsxsrc/components/PropsList.tsxsrc/components/EmptyState.tsxsrc/utils/format.ts—fmtBytes,fmtDuration,csvEscapesrc/utils/bodyView.ts—tryPrettyJson,tryPrettyXml,hexDump,detectFormat
Fixed
- Username / password authentication path no longer breaks when the password contains URL-reserved characters (
@,:,/,#,?). The non-TLS connection path now uses an explicitSaslProfile::Plaininstead of embedding credentials in the URL, so passwords are passed as raw bytes. - Long-lived management channel reused across
list_broker_queuespolls — eliminates the stream ofSESSION_CLOSEDnotifications that Artemis would route to DLQ when polling churned sessions. - Removed leftover
msgCountplumbing and the green badge on the Receive sidebar item.
Backend
subscriber.rsrewritten around aHashMap<queue, SubscriberHandle>model.ReceivedMessageextended withqueuefield plus the fullMessageMetaextracted via the same helper Browser uses for peek (broker::extract_peekedis nowpub(crate)).- Per-queue lifecycle events carry a
SubEvent { queue, message? }payload so the UI can show per-queue reconnect indicators. AmqpClientstorescontainer_id,sasl_anonymous,heartbeat_secsso its newreopen()path can re-establish the connection with the same settings the user originally chose.
AMQPush v1.0.0
First public release of AMQPush — a desktop client for AMQP 1.0 brokers.
Highlights
- Connection — multiple saved profiles, auto-connect to last-used on startup, TLS / heartbeat / connect-timeout / SASL ANONYMOUS
- Send — JSON / XML / plain text with live validator, binary file send, custom properties table, user variables
{{...}}, batch send, request-reply - Receive — live subscriber with auto-reconnect, regex filter, OS notifications
- Browser — live broker queue list (Artemis / ActiveMQ Classic) with auto-refresh and message peek (read & release back, no consumption)
- History — persisted send log with Outlook-style split layout, full property inspection, resend (incl. files ≤ 2 MB), JSON/CSV export
- Stats — throughput sparklines, per-queue leaderboard, message-size distribution, content-type breakdown, reliability score
- Logs — in-app console with level filter, persists across restarts
- UI — Postman-style tabs, light/dark/system theme, collapsible sidebar with smooth animation, global profile switcher
Downloads
| File | Size | Architectures | macOS |
|---|---|---|---|
AMQPush_1.0.0_universal.dmg |
11 MB | Intel x86_64 + Apple Silicon arm64 | 11+ |
Download the .dmg, open it, drag AMQPush to Applications.
Build from source
git clone https://github.com/DEADover/AMQPush.git
cd AMQPush
npm install
npm run tauri build -- --target universal-apple-darwinSee README for full requirements and usage.