Built with by Lazar Dragos George. The content may not be distributed without my permission.

27 April 2025
Effortless Limelight Tuning & Streaming with Panels
Introduction
If you've used a Limelight for FTC vision, you've probably run into two major headaches:
- You
- You can't
These limitations break the development flow: you’re docking your robot, plugging in, adjusting, unplugging - over and over.
Enter
Limelight Proxy: Tuning & Preview on the Fly
The Limelight Proxy plugin by Panels (FTControl) solves these pain points:
-
-
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’
Happy Coding!