DEV Community

Mykyta Zotov
Mykyta Zotov

Posted on

I connected a Flipper Zero to the browser using Blazor WebAssembly and Web Serial API - no backend, no drivers

I wanted to control Flipper Zero hardware from C# — read GPIO pins, blast IR signals, scan NFC tags — without writing a single line of C firmware. That tool didn’t exist, so I built it over 7 days.

The result is DolphinLink: a small C daemon (FAP) that runs on stock Flipper firmware and exposes 47 commands across 12 hardware subsystems over a plain NDJSON RPC on USB CDC. You install nothing on the Flipper itself beyond the daemon — no custom firmware, no modifications.

The part I’m most proud of: it works from a browser

The Blazor WebAssembly app connects to the Flipper directly from Chrome or Edge via the Web Serial API. No backend. No drivers. No install. You plug in the Flipper, open the page, and you’re talking to real hardware over USB from inside a browser tab.

WEB demo: https://streamable.com/4xbw8o

The web app includes:

  • Interactive playground — every command and stream rendered from JSON schemas, with auto-generated inputs. Fill in fields, hit Send, watch typed responses come back.
  • RPC console — raw NDJSON traffic with timestamps and round-trip times, visible on every page.
  • Three live demos: an LED color picker that changes the Flipper’s RGB LED in real time, a canvas that mirrors your drawings to the 128×64 Flipper display, and a gamepad demo where the Flipper’s physical D-pad controls a Snake game running in the browser.

The architecture that made it clean

JSON schemas are the single source of truth. The same schema files generate both the C dispatch tables in the daemon and the strongly-typed C# command classes in the client. Adding a new command means touching one schema file — everything else regenerates.

The Bootstrapper handles the annoying part: it uploads the daemon FAP to the SD card via the Flipper’s native protobuf RPC and launches it automatically. One method call to go from a USB cable to a working client.

var result = await Bootstrapper.BootstrapAsync("COM3", "COM4");
await using var flipper = result.Client;
await flipper.LedSetRgbAsync(0, 255, 0); // green LED
Enter fullscreen mode Exit fullscreen mode

The wire protocol is plain NDJSON documented in PROTOCOL.md — simple enough to implement a client in Python, Go, or Rust in an afternoon.

Try the playground (Chrome/Edge + Flipper required): https://blaze6950.github.io/DolphinLink/

Source: https://github.com/blaze6950/DolphinLink

Top comments (0)