MQTT Deck does the five things a working MQTT client must do — connect, subscribe,
watch, publish, and get your existing connections in — without shipping a
browser engine's worth of overhead.
formerly Ember. The first start of 0.2.0 moves your connections, history and
passwords across for you — nothing to re-enter, nothing to export.
6.6MB
Binary
3.1MB
.deb package
50,000
Messages held
0
Network calls of its own
The interface1440 × 950 · dark · demo data
01 / What it does
Five jobs, done properly.
Connect, subscribe, watch, publish, import. MQTT Deck does not chart, script, mock
a broker or sync a team, because a feature that does not beat what is already
there is not a feature. An agent can drive the same five jobs over MCP.
Connections
TCP, TLS, WebSocket and secure WebSocket; MQTT 3.1.1 and 5.0. A username and
password, your own client ID, keep-alive, clean session and a connect timeout.
TLS takes a custom CA or a client certificate and key. Last will, auto-reconnect
with backoff and automatic re-subscription belong to the connection, not to a
wizard.
mqtt://mqtts://ws://wss://MQTT 5.0
Several brokers, one window
One tab per connection, each with its own buffer, filter, subscription state and
compose draft. File them into groups you create yourself — Production, Client A,
Testing — then drag, right-click or use the row menu. Search reaches into
collapsed groups, and deleting a group never deletes a connection.
groupstabssearch
The message stream
Direction, timestamp, topic, payload, QoS and retain on a 29px row. Copy the
payload, reuse it in the composer, pin the topic or filter to it without leaving
the list. Two independent searches — by topic, and by payload, hex for binary. A
virtualised grid holds 50,000 messages without slowing the window, and every
topic carries a live message rate so a device going quiet is a number falling.
QoS 0/1/2retainrate/spause
Inspector and topics view
Click a row for a collapsible JSON tree, syntax-coloured text, raw, a hex dump and
MQTT 5 properties; binary payloads are decoded in Rust. A diff shows what changed
since the previous message on that topic, line by line. The topics view is one row
per topic with its latest payload, age and count.
JSON treediffhexproperties
Publishing
Topic autocomplete from everything you have seen. Payloads as text, JSON, base64
or hex — binary-safe, encoded in Rust. QoS 0/1/2, retain, and MQTT 5 publish
properties: user properties, content type, response topic, correlation data,
expiry. Publish history recalls any of them in one click, and the payload field
resizes by dragging the band above it.
textbase64hexhistory
Subscriptions with options
Every filter carries the MQTT 5 options that change what the broker sends: No
Local, Retain As Published, Retain Handling and a subscription identifier. They
are editable after the fact, shown as badges beside the filter, and refused on a
3.1.1 connection instead of being dropped without a word.
no-localraprh 0/1/2sid
Import and export
MQTTX exports import without blocking the window, from the usual OS paths or
dropped onto it — existing connections are the usual way in. Connections travel
as JSON, YAML, XML, CSV or XLSX, one row each, subscriptions and last will included.
Every message is appended to a local daily log for seven days and can be replayed
read-only.
MQTTXYAMLXMLCSVXLSX
Every day, not just the first hour
Full keyboard operation, including the stream itself. Light, dark, or follow the
system. Buffers, filters, drafts, groups and the panel size survive a restart
unless you clear them. No telemetry, no accounts, no network call you did not ask
for.
keyboardthemesrestore
Agents can drive it
mqttdeck-mcp exposes the same engine to any MCP client: list connections,
connect, subscribe, publish, read the stream, wait for a message. It is a bridge,
not a second client — what the agent does is what you see in the window. Loopback
only, token in a 0600 file, one switch to turn it off.
MCPloopback14 tools
Anatomy of a message row
Everything a line in the stream carries, at the density the window uses. Data is
monospace; status and direction each keep their own colour.
About 81 MB, because it bundles WebKitGTK so it runs on any distribution. Prefer
the .deb or .rpm when the system already has webkit2gtk-4.1.
git clone https://github.com/alexsofroniev/mqttdeck
cd mqttdeck
npm install
npm run app:build
Rust 1.77+ and Node 22+, plus the Tauri system dependencies for your platform.
Bundles land in src-tauri/target/release/bundle.
04 / Local
Local, and that is a promise.
No telemetry, no accounts, no update pings. MQTT Deck talks to the brokers you point
it at and nothing else.
Nothing phones home
No analytics, no crash reporting, no version check. The binary makes no network request of its own.
Passwords in the keyring
Secret Service, Keychain or Credential Manager. If no keyring exists they stay in
connections.json with mode 0600 — and Settings says so.
Session logs on disk
The daily log is a local file under the data folder, kept seven days. Settings →
Data folder shows the exact path.
05 / Agents
The window an agent can operate.
MQTT Deck speaks MCP. Point Claude Code, Cursor, Codex or any MCP client at
mqttdeck-mcp and the agent works the same engine you do —
same sockets, same buffer, same subscriptions.
Setup
claude mcp add mqttdeck -- mqttdeck-mcp
Anyone who can read agent.json can drive the app, so the file is
mode 0600 and holds a token regenerated on every start. Settings → Agent access
turns the listener off completely.
No path, no port, no key: the bridge finds the running window by itself and
says so plainly when the app is closed.
status and connection list
create, connect, disconnect
subscribe with MQTT 5 options
publish text, JSON, base64, hex
wait for a message
read the buffer by filter
one row per topic
connection log
export to JSONL, JSON, CSV
Fourteen tools, all of them the same calls the interface makes. Payloads come
back as text when they are text and as base64 when they are not.
06 / Credits
Made by one person.
AS
Alex Sofroniev
Design and code
MQTT Deck is designed and built by Alex Sofroniev — the interface, the Rust engine,
the releases. The source is public, the licence is MIT, and nothing in the product
depends on a private service.