Skip to content

2026 to 2027

This course teaches the 2026 release, because that is what the team's code is written in today. At kickoff you will switch to 2027, and a few names will be different. Here is the whole list.

The short version

Everything you learned about the shape of robot code survives. A subsystem is still a subsystem, a command is still a command, the loop still runs every 20ms. What changes is the imports and a handful of method names.

The same subsystem, twice

Left is what you write here. Right is the same file at kickoff. Look at how much of it is identical.

2026what you write today
IntakeSubsystem.java
package frc.robot.subsystems;
import edu.wpi.first.wpilibj.motorcontrol.PWMVictorSPX;import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;import edu.wpi.first.wpilibj2.command.Command;import edu.wpi.first.wpilibj2.command.SubsystemBase;
public class IntakeSubsystem extends SubsystemBase {
  private final PWMVictorSPX motor = new PWMVictorSPX(2);
  private void setSpeed(double speed) {    motor.set(speed);  }
  public Command intakeCommand() {    return startEnd(() -> setSpeed(0.7), () -> setSpeed(0.0)).withName("Intake");  }
  @Override  public void periodic() {    SmartDashboard.putNumber("Intake Speed", motor.get());  }}
2027what it becomes in January
IntakeSubsystem.java
package frc.robot.subsystems;
import org.wpilib.hardware.motor.PWMVictorSPX;import org.wpilib.command2.Command;import org.wpilib.command2.SubsystemBase;
public class IntakeSubsystem extends SubsystemBase {
  private final PWMVictorSPX motor = new PWMVictorSPX(2);
  private void setSpeed(double speed) {    motor.setThrottle(speed);  }
  public Command intakeCommand() {    return startEnd(() -> setSpeed(0.7), () -> setSpeed(0.0)).withName("Intake");  }
  @Override  public void periodic() {    // SmartDashboard is gone; this is the Telemetry API's job now.  }}

Four lines moved: three imports and one method call. The class, the command factory, the lambdas, the periodic override and every idea in the file are untouched.

Every import gets a new address

edu.wpi.first becomes org.wpilib, and the tree is reorganised by topic while it moves — so it is not a find-and-replace. The good news: the VS Code project importer does the rename for you when you open last season's project.

What it is20262027
The robot base classedu.wpi.first.wpilibj.TimedRobotorg.wpilib.framework.TimedRobot
Motor controllersedu.wpi.first.wpilibj.motorcontrol.*org.wpilib.hardware.motor.*
Drivetrainsedu.wpi.first.wpilibj.drive.*org.wpilib.drive.*
Digital inputsedu.wpi.first.wpilibj.DigitalInputorg.wpilib.hardware.discrete.*
The driver stationedu.wpi.first.wpilibj.DriverStationorg.wpilib.driverstation.*
Commands (the ones you know)edu.wpi.first.wpilibj2.command.*org.wpilib.command2.*
Commands v3 (brand new)does not existorg.wpilib.command3.*

Six calls that change their name

  • robotInit()the Robot() constructor

    robotInit is gone. You already write the constructor version here.

  • motor.set(0.5)motor.setThrottle(0.5)

    Same number, same meaning, new name.

  • motor.stopMotor()motor.disable()

    Same idea: stop driving this motor.

  • testInit() / testPeriodic()utilityInit() / utilityPeriodic()

    Test mode becomes utility mode on the new driver station.

  • SmartDashboard.putNumber(...)the Telemetry API

    SmartDashboard and Shuffleboard are removed. Tunables replace tuning sliders.

  • SendableChooserSelectable

    The auto chooser, renamed.

What does not change at all

  • The 20ms loop. autonomousInit, autonomousPeriodic, teleopInit, teleopPeriodic — same names, same order, 50 times a second.
  • Subsystems and commands: initialize, execute, end, isFinished, requirements, default commands.
  • Triggers: onTrue, whileTrue, toggleOnTrue, and binding them in one place.
  • arcadeDrive, tankDrive and curvatureDrive — same arguments, same squaring by default.
  • XboxController: getLeftY() is negative when you push forward, triggers are 0 to 1, the D-pad is degrees.
  • MathUtil.clamp and MathUtil.applyDeadband, doing exactly what they do now.

The robot's computer changes too

The roboRIO is replaced by SystemCore. WPILib calls it the biggest control system update since the cRIO. It adds more CAN buses, Smart IO and an onboard gyro, and it drops relays, analog outputs and SPI. Java goes from 17 to 25, and there is a new cross-platform Driver Station that runs on macOS and Linux as well as Windows.

None of that is your problem on day one. Somebody on the team will have flashed the SystemCore and got the drivetrain moving before you are asked to add a button.

2027 is still alpha

As of September 2026 the newest 2027 build is v2027.0.0-alpha-7, and vendor libraries from REV and CTRE are still catching up with it. Details on this page can still move before the release lands at kickoff. That is exactly why this course teaches 2026 and this page is a heads-up rather than a lesson.

Where this came from

Everything above was read from the WPILib source at tags v2026.2.2 and v2027.0.0-alpha-7, and from WPILib's own “New for 2027” changelog, in the project's API research notes (WPILIB_REFERENCE.md, section A).

New for 2027SystemCore

Next: what happens between now and kickoff