⌁ Embedded & Hardware

Web Serial Monitor & Plotter

A serial monitor and plotter in the browser for Arduino, ESP32 and any USB-serial device: baud presets, DTR/RTS reset, text or hex, send, filter, timestamps and log export.

No install (Web Serial) Plotter up to 8 series Hex view & send DTR/RTS reset

Loading Serial Monitor…

What this page sends

  • Your input: Serial data flows between your board and this tab over Web Serial. It is not sent to a server; an exported log is saved by your browser as a download.
  • Page load: Loading the page requests HTML, scripts and images from ByteKiln, fonts from Google Fonts, and sends Google Analytics page views, tool-usage events and catalog interactions (tool/category IDs, result status and whether a click followed search — never your input, output or search terms). Privacy & sharing

How the Web Serial Monitor & Plotter Works

Opening the Arduino IDE just to read a few lines from a board is heavy, and on a locked-down work laptop it may not be installed at all. Chromium-based browsers can talk to serial ports directly through the Web Serial API, so this page is a complete serial monitor and plotter with nothing to install. Click Connect, choose the port, and output streams in with optional timestamps; switch to hex to see the raw bytes. Pick any baud rate from 300 to 2,000,000 or type your own, set data bits, parity, stop bits and flow control, and toggle DTR and RTS — or press Reset board to restart an ESP32 or Arduino. Send text with your choice of line ending (with \n and \xNN escapes) or raw hex bytes. The plotter reads the Arduino Serial Plotter format and charts up to eight series. Filter and highlight lines, pause auto-scroll, and download the log as text or CSV. Output is kept in a ring buffer (10,000 lines by default) and drawn in batches, so a fast device can't freeze the page, and unplugging the board is detected so you can reconnect without reloading.

Reading

Bytes are read from port.readable in a loop and split into lines on LF, CR or CRLF — including a CRLF split across two reads. Text is decoded with a streaming UTF-8 decoder, so a multi-byte character split between reads stays intact and invalid bytes show as � instead of breaking the stream. The hex view shows each line's original bytes.

Performance

Incoming lines go into a fixed-size ring buffer and the screen is updated at most once per animation frame. Only the rows in view are rendered, so 100,000 lines scroll smoothly. Scrolling up pauses auto-scroll; turn it back on to follow the output again.

Errors and disconnects

If the port is already open elsewhere — Arduino IDE, PlatformIO, a terminal or another tab — the tool says so. Closing the port picker isn't treated as an error. Framing and parity errors are reported without dropping the connection; unplugging the device is detected through the disconnect event and read errors.

Control signals

DTR and RTS are set with port.setSignals(). On typical ESP32 boards RTS drives EN (reset) and DTR drives GPIO0 (boot mode) through the auto-reset circuit, so the Reset board button pulses RTS with DTR off to restart the firmware in normal mode.

Limitations

  • Web Serial works in desktop Chrome, Edge and Opera only — not Firefox or Safari, and not most mobile browsers.
  • One port per tab; a port open in the Arduino IDE, PlatformIO or another tab can't be opened here at the same time.
  • The plotter reads numbers from each line; binary protocols need the hex view and your own decoding.
  • Logs are kept in a fixed-size buffer, so the oldest lines are dropped in long sessions — export regularly if you need a complete log.

FAQ

Short answers for the things developers usually ask before trusting a tool.

Is the serial data sent anywhere?

No. The page talks to the port directly through the browser's Web Serial API; the data stays in the tab. Logs are only saved when you click Download.

Which browsers work?

Desktop Chrome and Edge 89 or later, and other Chromium-based browsers such as Opera, on Windows, macOS, Linux and ChromeOS. Firefox and Safari don't implement Web Serial, and mobile browsers don't either. The page must be served over HTTPS, and you have to click Connect and pick the port yourself — sites can't open ports silently.

My board doesn't appear in the port list. Why?

Usually a driver or a cable. On Windows, boards with a CP210x (Silicon Labs) or CH340/CH9102 (WCH) USB-serial chip may need the vendor's driver. Many USB cables are charge-only and have no data wires — try another. On Linux, your user needs access to the port (the dialout or uucp group). Close any other program that has the port open.

Why do I see garbage characters?

The baud rate doesn't match what the firmware uses (Serial.begin(115200) means 115200). Change the baud rate — the port is reopened with the new setting automatically. ESP32 boot messages are printed at 115200 but the ROM bootloader uses 74880 on the ESP8266, which is why the first line often looks garbled there.

Why did my ESP32 reset when I connected or toggled DTR/RTS?

Most ESP32 and Arduino boards wire DTR and RTS to the reset (EN) and boot (GPIO0) pins through transistors, so the USB-serial chip can reset them for flashing. Changing those signals resets the board or puts it in bootloader mode. Leave both on for normal use; "Reset board" pulses RTS to restart the firmware.

How do I use the plotter?

Print one line per sample with numbers separated by commas, spaces or tabs — Serial.print(temp); Serial.print(","); Serial.println(humidity); — or label them: temp:21.5,humidity:40. That's the same format as the Arduino IDE Serial Plotter. Up to 8 series are drawn; lines with any non-numeric text are skipped.

Related tools

Useful follow-ups when one conversion usually turns into three more.