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.
| 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 |
| Tool | Version |
|---|---|
| Rust | 1.77+ (rustup update stable) |
| Node | 20+ |
| npm | 10+ |
On macOS you also need Xcode command-line tools:
xcode-select --installFor cross-arch builds (Intel binary on Apple Silicon or vice-versa):
rustup target add x86_64-apple-darwin aarch64-apple-darwingit 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 devOn 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.
npm run tauri buildOutput appears in src-tauri/target/release/bundle/:
- macOS:
.appand.dmg - Windows:
.msiand.exe - Linux:
.deb,.AppImage,.rpm
rustup target add x86_64-apple-darwin aarch64-apple-darwin
npm run tauri build -- --target universal-apple-darwinrustup target add x86_64-apple-darwin
npm run tauri build -- --target x86_64-apple-darwin| 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 | 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.
<acceptor name="amqp">tcp://0.0.0.0:5672?protocols=AMQP</acceptor>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.
┌─────────────────┐ 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/Sessionfor the publisher with a per-address cache ofSenderlinks. 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
ManagementChannelis used for Artemis management RPC (queue list / metrics) so polling doesn't churn sessions or trigger DLQ spam fromSESSION_CLOSEDnotifications. - Multi-queue subscriber: each subscribed queue is its own
tokiotask with an independent connection and reconnect loop. Messages from all queues flow through onemessage_receivedevent tagged withqueueso the UI can render a mixed feed. - The frontend uses Tauri events:
message_received, plus per-queue lifecycle eventssubscriber_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) andsrc/utils/(format,bodyView) so the three split-pane views stay visually cohesive.
| 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) |
PRs welcome. Run formatters before committing:
npx tsc --noEmit # type-check the frontend
( cd src-tauri && cargo build ) # build the Rust sideSee CHANGELOG.md for release notes.
MIT