Skip to content

DEADover/AMQPush

Repository files navigation

AMQPush — A modern desktop client for AMQP 1.0 brokers

AMQPush

A modern desktop client for AMQP 1.0 brokers — built with Tauri 2 + Rust + React. Send and receive messages, browse broker queues live, peek messages without consuming them, manage multiple connection profiles, and inspect every message header.

License Platform Built with Tauri


Features

Area Capabilities
Connection Multiple saved profiles · workspaces (grouping label) · global profile switcher · Quick-connect from URL (paste amqp:// / amqps:// / ws:// / wss://) · Import / Export profiles as JSON · auto-connect to last-used on startup · TLS / AMQPS · mTLS client certificates (PEM or PKCS#12) · AMQP-over-WebSocket transport · idle heartbeat · connect timeout · custom Container ID · SASL ANONYMOUS · transparent auto-reopen on dead session · per-profile subscriber reconnect backoff · per-profile publisher send retry · live broker latency chip in header
Send Messages JSON / XML / plain text with live validator and Beautify · binary file send · custom properties with history-based autocomplete (keys + per-key value picker) · user-defined {{variables}} · 35+ Faker tokens · Pre-script (async JavaScript run before each send) · batch send (repeat × delay × schedule) · CSV bulk send (header-driven {{column_name}} tokens) · request-reply round-trip with timeout · saved templates · Chaos tab (oversized body / wrong content-type / malformed JSON / stripped property — poison-pill testing)
Receive Messages Multi-queue subscribe — listen to several queues at once · JMS-style broker selectors with a saved-selector library · Topic-pattern subscribe (wildcards via apache.org:legacy-amqp-topic-binding) · split-pane list + preview (full AMQP metadata) · Reply button auto-fills target/correlation-id · Pause/Resume · Highlight rules (regex → colour tag) · AUTO|RAW|HEX body viewer · session stats · regex filter across body / id / content-type / app-properties · message-to-message diff (line-level LCS) · Recording + Replay — capture incoming live messages to ~/.amqpush/recordings/<name>.json and replay later to any queue at configurable speed · persist messages across restarts (last 500) · CSV / JSON export · OS notifications · auto-reconnect with exponential backoff
Browser Live queue list with auto-refresh · peek up to 5000 messages or All (queue-reported message_count, capped at 50k) · sortable table · checkbox multi-select with Purge selected (Artemis removeMessages(filter)) / Shovel selected / Edit & Requeue (DLQ) · DLQ auto-detection by name pattern · per-message Edit & Requeue… walkthrough with editable body and target override · Cross-broker Shovel — copy peeked messages to any other saved profile with optional JS transform · AUTO|RAW|HEX body viewer · per-message Who holds it? drill-down (consumers + credit)
Broker Clients Active broker connections + their consumers, joined cross-table · collapsible host grouping (connections from the same host stack under one header with aggregate Cons / Sess / Age) · per-consumer credit / unacked / last-delivery / queue · auto-refresh every 3 s · Raw debug overlay of the verbatim broker response · internal-consumer hide toggle
History Persisted send log (200 last entries) · Outlook-style split layout · collapsible sections · AUTO|RAW|HEX body viewer · Resend including file attachments · search by ID / profile / queue / body · JSON / CSV export · body diff against the previous send to the same queue
Stats Throughput sparklines (60 s rolling) · per-queue leaderboard · message-size distribution · content-type breakdown · reliability score · peak rates · per-profile buckets with profile selector (All aggregates every bucket)
Logs In-app console with level filter · search · auto-scroll · persists across restarts
UI Postman-style tabs · light / dark / system theme · collapsible sidebar · global profile switcher in header · OS window title reflects the running version · maximised on first launch · selectable in-app Help with searchable sections, recipes, and worked examples

Requirements

Tool Version
Rust 1.77+ (rustup update stable)
Node 20+
npm 10+

On macOS you also need Xcode command-line tools:

xcode-select --install

For cross-arch builds (Intel binary on Apple Silicon or vice-versa):

rustup target add x86_64-apple-darwin aarch64-apple-darwin

Quick start

git clone https://github.com/DEADover/AMQPush.git
cd AMQPush

# 1. Install JS dependencies
npm install

# 2. Run in dev mode — Vite + Tauri runner with hot reload
npm run tauri dev

On first launch the app starts at 127.0.0.1:5672 without TLS or credentials. Open Connection (⌘1), enter your broker host/port, click Connect, and you're in.


Building a release

Current architecture only

npm run tauri build

Output appears in src-tauri/target/release/bundle/:

  • macOS: .app and .dmg
  • Windows: .msi and .exe
  • Linux: .deb, .AppImage, .rpm

macOS — universal binary (Intel + Apple Silicon)

rustup target add x86_64-apple-darwin aarch64-apple-darwin
npm run tauri build -- --target universal-apple-darwin

macOS — Intel only (on an Apple Silicon machine)

rustup target add x86_64-apple-darwin
npm run tauri build -- --target x86_64-apple-darwin

Keyboard shortcuts

Shortcut Action
⌘1 Connection view
⌘2 Send
⌘3 Receive
⌘4 Browser (broker queue browser)
⌘5 History
⌘6 Stats
⌘7 Logs
⌘L Toggle Logs view
⌘↵ Send message (in Send view)

Broker compatibility

Broker AMQP support Browser / queue management
Apache ActiveMQ Artemis ✅ AMQP 1.0 (default) ✅ via AMQP management RPC
Apache ActiveMQ Classic ✅ via the AMQP module ✅ via AMQP management RPC
RabbitMQ w/ AMQP 1.0 plugin ❌ different management API
Azure Service Bus ✅ AMQP 1.0 over TLS

Queue auto-creation: on brokers with auto-create-queues=true (Artemis default), sending to a non-existent queue creates it on first publish. The Browser view shows both bound queues and addresses.

Artemis broker.xml example acceptor

<acceptor name="amqp">tcp://0.0.0.0:5672?protocols=AMQP</acceptor>

Persistent data

All user data is stored in ~/.amqpush/:

File Contents
profiles.json Saved broker profiles (host, port, creds, TLS, advanced options)
templates.json Send templates
history.json Last 200 sent messages (with file content for files ≤ 2 MB)

Logs and UI preferences live in WebView localStorage.


Architecture

┌─────────────────┐   IPC commands   ┌──────────────────┐
│ React frontend  │ ───────────────▶ │ Rust backend     │
│ (Tauri WebView) │                  │ (tokio + fe2o3)  │
└─────────────────┘ ◀───── events ── └──────────────────┘
                                              │
                                              ▼
                                      ┌──────────────┐
                                      │ AMQP 1.0     │
                                      │ broker (TLS) │
                                      └──────────────┘
  • The Rust backend keeps a single long-lived Connection/Session for the publisher with a per-address cache of Sender links. On dead-session errors (Illegal session state, broker idle timeout) it transparently re-opens and retries the send once — the user never has to manually reconnect.
  • A separate persistent ManagementChannel is used for Artemis management RPC (queue list / metrics) so polling doesn't churn sessions or trigger DLQ spam from SESSION_CLOSED notifications.
  • Multi-queue subscriber: each subscribed queue is its own tokio task with an independent connection and reconnect loop. Messages from all queues flow through one message_received event tagged with queue so the UI can render a mixed feed.
  • The frontend uses Tauri events: message_received, plus per-queue lifecycle events subscriber_reconnecting / subscriber_reconnected / subscriber_error / subscriber_stopped, each carrying a {queue, message?} payload.
  • All views remain mounted between switches — state is preserved without prop drilling.
  • Shared UI primitives live under src/components/ (CollapsibleSection, PropsList, EmptyState) and src/utils/ (format, bodyView) so the three split-pane views stay visually cohesive.

Tech stack

Layer Technology
Desktop shell Tauri 2
AMQP client fe2o3-amqp 0.14 — native Rust, async, AMQP 1.0
Frontend React 19 + TypeScript + Vite 7
Styling Tailwind CSS v3 with semantic CSS-variable tokens
Editor CodeMirror 6 (@uiw/react-codemirror) — JSON / XML highlighting
Icons Lucide React
Async runtime Tokio (full features)

Contributing

PRs welcome. Run formatters before committing:

npx tsc --noEmit                    # type-check the frontend
( cd src-tauri && cargo build )     # build the Rust side

Changelog

See CHANGELOG.md for release notes.


License

MIT

About

Modern desktop client for AMQP 1.0 brokers (Artemis, ActiveMQ Classic, RabbitMQ). Tauri 2 + Rust + React.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages