FTC Dashboard
Official FTC Dashboard features, setup, and version notes
Overview
Dashboard is a web dashboard for FTC development. The official project lists live telemetry, plots and field graphics, live configuration variables, camera streaming, custom layouts, and telemetry CSV export. Browser gamepad support is described by the project as volatile because it depends on browser APIs.
Installation
This example uses com.acmerobotics.dashboard:dashboard:0.6.0 from https://maven.brott.dev/. Follow the installation guide for your FTC SDK version before adding it.
Version 0.6.0 remains current as checked 14 October 2026. For hot-reloaded TeamCode, Slothboard is the maintained Dairy fork with Sloth . Choose the ordinary artifact or the fork; they provide the same Dashboard package names and must not both supply those classes.
repositories {
maven { url = 'https://maven.brott.dev/' }
}
dependencies {
implementation 'com.acmerobotics.dashboard:dashboard:0.6.0'
}If your SDK project already has this repository, do not add a duplicate. Some non-standard SDK setups need a different dependency declaration; use the official instructions for those projects.
Telemetry
A TelemetryPacket lets an send key/value data to the dashboard. The official README and examples are the reference for the exact API in your installed release.
FtcDashboard dashboard = FtcDashboard.getInstance();
TelemetryPacket packet = new TelemetryPacket();
packet.put("arm position", armMotor.getCurrentPosition());
dashboard.sendTelemetryPacket(packet);val dashboard = FtcDashboard.getInstance()
val packet = TelemetryPacket()
packet.put("arm position", armMotor.currentPosition)
dashboard.sendTelemetryPacket(packet)You can continue sending essential information to telemetry as well. Avoid sending unnecessary data every loop; test loop timing on the robot.
Runtime tuning
The dashboard's @Config annotation exposes mutable public static fields. Read the field where you use it if you want the latest value to take effect immediately. If you copy a value into another variable during initialization, that copy will not automatically change when you edit the dashboard field.
Create a constants class:
import com.acmerobotics.dashboard.config.Config;
@Config
public class ArmTuning {
public static double KP = 0.003;
public static double TARGET_DEGREES = 30.0;
}import com.acmerobotics.dashboard.config.Config
@Config
object ArmTuning {
@JvmField var KP = 0.003
@JvmField var TARGET_DEGREES = 30.0
}The following loop fragment assumes arm is a mapped DcMotor and dashboard is FtcDashboard.getInstance(). Define COUNTS_PER_DEGREE as a measured, positive, nonzero double, with direction and zero established as in the PID guide. This proportional example omits gravity compensation and travel limits; it is a tuning demonstration, not a complete arm controller.
Read those fields in the control loop and send what the robot is doing:
double currentDegrees = arm.getCurrentPosition() / COUNTS_PER_DEGREE;
double error = ArmTuning.TARGET_DEGREES - currentDegrees;
double power = Math.max(-0.25, Math.min(0.25, ArmTuning.KP * error));
arm.setPower(power);
TelemetryPacket packet = new TelemetryPacket();
packet.put("target deg", ArmTuning.TARGET_DEGREES);
packet.put("measured deg", currentDegrees);
packet.put("error deg", error);
packet.put("power", power);
dashboard.sendTelemetryPacket(packet);val currentDegrees = arm.currentPosition / COUNTS_PER_DEGREE
val error = ArmTuning.TARGET_DEGREES - currentDegrees
val power = (ArmTuning.KP * error).coerceIn(-0.25, 0.25)
arm.power = power
val packet = TelemetryPacket()
packet.put("target deg", ArmTuning.TARGET_DEGREES)
packet.put("measured deg", currentDegrees)
packet.put("error deg", error)
packet.put("power", power)
dashboard.sendTelemetryPacket(packet)Change KP on the dashboard, observe the error and power, and record a stable value back into your source code. Keep the power limit while tuning and use the PID guide for a careful gain adjustment sequence.
Live configuration
The dashboard can expose supported configuration fields so you can tune values during testing. Mark only values that need to be changed at runtime, understand when the code reads them, and copy validated values back into version-controlled constants. A live edit is not automatically a permanent source-code change.
Field view, graphs, and cameras
Use the field view to draw robot-relative or field-relative debugging information when your code supplies the matching coordinates. Graphs can make response trends easier to inspect. Camera streaming can help check what a vision pipeline receives, but the stream itself does not validate detection accuracy.
Network access
Open the dashboard from a browser on the robot network using the address and port configured by your project. The common default shown in FTC Dashboard examples is http://192.168.43.1:8080/dash, but the address, network mode, or project configuration can differ. Do not use a public Wi-Fi network for robot control.