Web-first Zenoh traffic inspector with desktop builds for Windows, macOS, and Linux
Inspect, filter, decode, and publish Zenoh messages in real time.
Carto is an open-source, web-first app for Zenoh observability and debugging. It connects to a Zenoh router through the Remote API WebSocket endpoint, subscribes to key expressions, streams live traffic, and helps you inspect payloads quickly. Desktop packages are still produced for Windows, macOS, and Linux.
The name "Carto" comes from "cartografo" (Spanish for mapmaker).
- Features
- Screenshots
- Installation
- Zenoh Router Requirements
- Run Carto in Docker
- Zenoh Router Docker
- Development
- Load Testing
- Packaging
- Roadmap
- Keywords
- Live Zenoh stream monitoring by key expression
- Multi-subscription workflow with pause, clear, and unsubscribe controls
- Stream filtering by key and message content
- Message drawer with decoded views for JSON, text, and binary payloads
- Protobuf schema loading and Protobuf decode support in stream view
- Publish messages with
json,text,base64, andprotobufmodes - Recent key explorer and key-expression history for subscribe/publish flows
- Connection status, logs, and app-level diagnostics
- Settings import/export for sharing local profiles and schema setup
- Light and dark themes for long monitoring sessions
Prebuilt installers for Windows, macOS, and Linux are available on the Releases page.
Carto requires a Zenoh router with zenoh-plugin-remote-api enabled.
- Enable
zenoh-plugin-remote-apion your router - Ensure the Remote API WebSocket endpoint is reachable (default
ws://127.0.0.1:10000/) - REST is often exposed at
http://127.0.0.1:8000/, but Carto uses WebSocket
Useful links:
Pull the published image:
docker pull tabierto/carto:latestRun it:
docker run --rm -p 8080:8080 tabierto/cartoThen open:
http://localhost:8080
If your Zenoh router is running on the same machine as Docker, you can use the normal local endpoint:
ws://127.0.0.1:10000/
Carto rewrites loopback addresses inside the container to the Docker host automatically. Direct non-loopback IPs also work as long as they are reachable from the container network.
This repository includes a local Docker setup for Zenoh + Remote API:
cd docker
docker compose up --buildDefault endpoint:
ws://localhost:10000
See docker/README.md for Docker-specific details.
Requirements:
- Node.js 24+ for desktop builds
- Node.js for the default web server runtime
- Bun optional for experimentation
Run locally:
npm install
npm run dev:desktopRun the web frontend locally:
npm run build:web
npm run dev:webRun the web/server mode locally:
npm install
npm run build:server
npm run start:webExperimental Bun server run:
bun install
npm run start:web:bunCarto includes a local Zenoh load publisher for reproducing large-payload issues.
Default run:
npm run load:test -- --endpoint ws://127.0.0.1:10000/That sends 100 messages to carto/load-test in bursts of 5, with payload sizes randomized between 600 KiB and 900 KiB.
Example heavier run:
npm run load:test -- --endpoint ws://127.0.0.1:10000/ --count 200 --burst 10 --pause-ms 50 --min-kib 600 --max-kib 900Useful flags:
--keyexprto isolate the test stream--format json|textto switch payload shape--countto control total messages--burstand--pause-msto shape the send rate
Build all supported desktop targets locally:
npm run distBuild per platform:
npm run dist:mac
npm run dist:win
npm run dist:linuxDesktop release automation remains in GitHub Actions via Electron/electron-builder while the app runtime moves toward a web-first architecture.
Zenoh, Eclipse Zenoh, Zenoh inspector, Zenoh monitoring, Zenoh debugging tool, Zenoh desktop client, pub/sub observability, message stream viewer, key expression explorer, Electron Zenoh app, TypeScript desktop app
Made in Puerto Rico. 🇵🇷


