cover

27 April 2025

Effortless Limelight Tuning & Streaming with Panels

1m59s
limelight
FTC
Panels
robotics
vision

Introduction

If you've used a Limelight for FTC vision, you've probably run into two major headaches:

- You must be cable-connected to access the tuning interface.

- You can't preview the camera feed while the robot is running.

These limitations break the development flow: you’re docking your robot, plugging in, adjusting, unplugging - over and over.

Enter Limelight Proxy - a plugin for my Panels dashboard that lets you tune pipelines and view live video feed wirelessly and in real time, even during matches. Here’s how it changes the game.

Limelight Proxy: Tuning & Preview on the Fly

The Limelight Proxy plugin by Panels (FTControl) solves these pain points:

- LL Dash widget: Access and adjust Limelight pipelines and settings directly within Panels’ UI.

- LL Feed widget: Stream live MJPEG video while your robot is running.

You install the JAR into your robot’s TeamCode, add an HTTP proxy dependency (okhttp3), and Panels magically connects to Limelight over whatever network your phone/laptop uses—even battlefield Wi‑Fi. No cables, no hassle.

How It Works: A Reverse Proxy in Kotlin

At its core, the plugin uses several custom proxy classes:

- GenericProxy – handles HTTP requests (e.g., form submissions, pipeline changes).

- GenericSocketProxy – forwards WebSocket traffic (used by the Limelight dashboard UI for real-time updates).

- GenericStreamingProxy – proxies the MJPEG video stream so you can view live camera footage from any device on the same network.

These proxies run on the robot controller, intercepting and forwarding traffic between the Limelight hardware and the Panels dashboard over WiFi. This is essentially a reverse proxy architecture, where the robot acts as an intermediary between the client (browser) and the Limelight server.

One of the most difficult parts of building this proxy was figuring out all the protocols used by the official Limelight dashboard:

Since Limelight doesn’t officially document all these interactions beyond basic API endpoints, I had to inspect browser dev tools, capture network traffic using Burp Suite, and trial-and-error test which endpoints and sockets needed to be proxied.

Once identified, each protocol required a tailored proxy implementation:

- GenericProxy forwards HTTP GET/POST requests.

- GenericSocketProxy bridges WebSocket connections.

- GenericStreamingProxy ensures MJPEG streaming works through proper chunked transfer handling.

Further Reading

1. Limelight Proxy documentation on FTControl

2. Official Limelight 3A Getting Started guide

Conclusion

With Panels’ Limelight Proxy plugin, you ditch cables and frozen feeds. Now you can tune pipelines and preview camera output live, all within your browser while the robot drives. It’s real-time vision tuning, simplified and streamlined.

Happy Coding!