New for 2027¶
The change from the roboRIO to Systemcore is the biggest control system update since the introduction of the cRIO. A number of improvements have been made to WPILib to take advantage of Systemcore. This article will describe and provide a brief overview of the new changes and features as well as a more complete changelog for Java/C++ WPILib changes. This document only includes the most relevant changes for end users, the full list of changes can be viewed on the various WPILib GitHub repositories. There’s more information about Systemcore in the Systemcore Introduction.
It’s recommended to also review the list of known issues.
Importing Projects from Previous Years¶
Due to internal GradleRIO changes, it is necessary to update projects from previous years. After Installing WPILib for 2027, any 2026 projects must be imported to be compatible.
Major Changes (Java/C++/Python)¶
In order to more closly track C++ compiler feature support, the supported Linux distribution has changed to only the latest Ubuntu LTS. See Supported Operating Systems and Architectures for more information.
Warning
Windows 10 support from Microsoft ended in October 2025. While we will not explicitly block Windows 10 from being used, future releases may inadvertently break compatibility with Windows 10. We will not postpone these changes in order to maintain Windows 10 compatibility, and Windows 10 support may break as a result.
Use Java 25 and C++ 23. Visual Studio 2026 on Windows and GCC 14.x on Linux are required for C++ teams for simulation.
Alpha 5: Add Commands v3 framework for Java. Documentation is in work. In the meantime, see the Commands v3 Conference, Design Document and the port of the Hatchbot example to Commands v3.
Alpha 5: Add OpMode framework, similar to FTC. See OpMode Framework for documentation.
Alpha 6: Support for the 2027 FIRST Driver Station bringing multi-platform support.
Alpha 5: Reorganize java packages from
edu.wpi.firsttoorg.wpiliband c++ namespaces fromfrc::towpi::and create new subpackages for better organization. The VS Code importer will attempt to update code for these changes as part of the import process.Alpha 2: Systemcore has different hardware support. Support multiple CAN buses, Smart IO, onboard IMU, Expansion Hub. Removed relay, analog output, SPI and SPI IMUs (ADIS16448, ADIS16470, ADXL345, ADXRS450), analog gyro, DMA, built-in accelerometer, Digital Glitch Filter, interrupts, counter, ultrasonic, analog trigger, Nidec Brushless, Servo, Jaguar
Alpha 2: Removed Network Tables v3 support. See the Network Tables v4 migration guide for details on how to update your code from Network Tables v3 to v4. Users of pynetworktables will need to update to pyntcore.
Alpha 6: Python functions and variables have been renamed to use snake_case instead of camelCase for consistency with Python naming conventions.
Alpha 6: Many of the simple examples were moved to snippets to de-clutter the VS Code examples. The snippets are available here: Java / C++. We’re thinking of ways to make these easier to discover.
Alpha 7: SmartDashboard, SendableChooser, and Sendable APIs have been replaced with Telemetry and Tunables APIs. The new version of SendableChooser is called Selectable. While wpilib-docs has not yet been updated, API documentation and initial migration guides from the 2026 APIs are available for telemetry and tunables
Alpha 7: All constants (including enumerated values) have been changed to ALL_CAPS style
Alpha 7: Catch2 is now the default test framework for C++ (instead of GoogleTest)
The WPILib AprilTag and CameraServer libraries have been moved to vendordeps.
AprilTagFieldsis now part of an integratedFieldsclass
WPILib¶
Note
As the 2026 and 2027 development happened in parallel, some of these changes are new to 2027 Alpha 5 compared to earlier alphas, but not new compared to 2026.
General Library¶
2027 Alpha 2: Update POV to use enums
2027 Alpha 2: Use steady clock directly on Systemcore
2027 Alpha 5: Replace libprotobuf with upb for dynamic decode
2027 Alpha 5: Remove
robotInit(). Use theRobot()constructor instead.2027 Alpha 5: Add a few unit overloads
2027 Alpha 5: Remove deprecated
MotorControllerGroup2027 Alpha 5: Replace individual gamepad classes (e.g.
XboxController,PS4Controller,PS5Controller,StadiaController) with a singleGamepadclass. Alpha 7 adds back support for individual gamepad classes.2027 Alpha 5: Add Touchpad support for gamepads
2027 Alpha 5: Remove
MotorController::StopMotor(). UseMotorController::Disable()instead.2027 Alpha 5: Switch to new game data
2027 Alpha 5: Make joystick unplugged warning better in cases of out of range axis/button
2027 Alpha 5: Preferences Listener should not depend on mutable fields
2027 Alpha 5: Replace Speeds with Velocities in method signatures where appropriate
2027 Alpha 5: Rename FPGA clock to monotonic clock
2027 Alpha 5: Rename constants to all caps style
2027 Alpha 5: Fix HSV to RGB conversion off-by-one error
2027 Alpha 5: Rename
MotorControllerset()tosetThrottle()2027 Alpha 5: Add FTC fields
2027 Alpha 5: Make swerve and differential kinematics functions immutable
2027 Alpha 5: Rename “Test” robot mode to “Utility” to emphasize that it can be used for more than just testing
2027 Alpha 5: Split
DriverStationinto smaller classes,MatchStateandRobotStateprimarily.2027 Alpha 6: Fix crash when using OpMode robot on Systemcore.
2027 Alpha 7: More package moves in Java and header moves in C++. Some geometry classes moved to shape, Preferences moved to preferences
2027 Alpha 7:
DriverStationDisplayhas been added–this is a text display integrated into the DS that supports ANSI escape codes2027 Alpha 7: Integer (raw) timestamps are now nanoseconds instead of microseconds. Datalog and NT still use microseconds in files/network comms.
2027 Alpha 7: Alert moved to wpiutil and has added functionality; usage reporting also moved to wpiutil. Joystick warnings are now alerts
2027 Alpha 7: ExpansionHub Follower Fixes
2027 Alpha 7: Rename gamepad face-button trigger APIs to directional names (faceUp/Down/Left/Right)
2027 Alpha 7: Add a default deadband to all gamepads
2027 Alpha 7: Cache HID wrappers
2027 Alpha 7: Remove OpMode UserControls
2027 Alpha 7: Add new generation for gamepads
2027 Alpha 7: Remove Axis from Gamepad Triggers
2027 Alpha 7: Change
DriverStationSimto usewpi::hal::RobotMode2027 Alpha 7: Crash robot program if an exception occurs during opmode construction
2027 Alpha 7: Change
DriverStationSimto use a C++ enum for alliance station2027 Alpha 7: Fix incorrect robot name in reported error
2027 Alpha 7: Add
DSGamepadChooser2027 Alpha 7: Rename
FMSInfotable toDriverStation2027 Alpha 7: Switch robot construction back to supplier
2027 Alpha 7: Refactor
ExpansionHubMotorto introduceNeutralModefor motor control2027 Alpha 7:
OpModeRobotDon’t initialize classes during scan for opmodes2027 Alpha 7: Fix opmode reset and callback handling
2027 Alpha 7: Use alerts for joystick warnings
2027 Alpha 7: Add Timer.createStarted() convenience factory
2027 Alpha 7: Put the
OpModeRobot#addOpModeclass/lambda arguments at the end2027 Alpha 7: Add option to varargs string array for
DSGamepadChooser2027 Alpha 7: Move Preferences from util to preferences package
2027 Alpha 7: Remove useless AutoCloseable implementations
2027 Alpha 7: Add raw rumble API
Commands v2¶
Remove RamseteCommand
Remove control commands and subsystems
2027 Alpha 2: Deprecate
Command.schedule()2027 Alpha 5: Remove
Mecanum/SwerveControllerCommand2027 Alpha 5: Add
Subsystem.idle()2027 Alpha 5: Fix
WaitUntilCommandfor match time counting down
Commands v3¶
2027 Alpha 5: Add
CommandGamepadfor V3 commands2027 Alpha 5: Add compile-time checks for unsafe or incorrect coroutine usage
2027 Alpha 6: Add rising and falling edge trigger factories
2027 Alpha 6: Add a declarative state machine API on top of commands v3
2027 Alpha 7: Mechanism is now an interface instead of a class
2027 Alpha 7: Make sideload functions scoped and improve docs
2027 Alpha 7: Add trigger multi press and continuous bindings
2027 Alpha 7: Add example and template projects for commands v3 and make hatchbot example idiomatic
2027 Alpha 7: Add Coroutine.waitUntil overload with timeout
2027 Alpha 7: Multiple periodic callbacks in the same scope
2027 Alpha 7: Fix Untils not Including “Until Condition”
2027 Alpha 7: Allow fork/await failures to be handled by user code
NetworkTables¶
Remove NT3 support
2027 Alpha 2: Check id ranges in control messages
2027 Alpha 5: Handle interrupted save in NetworkServer
2027 Alpha 5: PubSubOption: Use record approach for Java
2027 Alpha 5: Prefix log levels to avoid macro conflicts
2027 Alpha 7: Add API to get and set user data on NT_Topic
2027 Alpha 7: Add PubSubOption to disable handle signaling
2027 Alpha 7: Split SetServerTeam and SetServerFixed, add mDNS resolver
2027 Alpha 7: Fix publish-triggered announcements being blocked by subscription announcements
2027 Alpha 7: Multiple bugfixes
Data Logging¶
2027 Alpha 5: Use reflection to access non-public superclass fields
2027 Alpha 5: Optimize time and memory usage of epilogue backends
2027 Alpha 5: Support logging of protobuf-serializable types
2027 Alpha 5: Use full class names in static logger fields
2027 Alpha 7: Multiple bugfixes
Hardware interfaces¶
Add SPARKmini to PWM support
2027 Alpha 2: Fix I2C order on Systemcore
2027 Alpha 2: Fix analog scaling for updated image
2027 Alpha 2: Add support for onboard IMU mount orientations with Euler angles
2027 Alpha 5:
AddressableLED: Restore alternative color order support2027 Alpha 5: Integrate support for ExpansionHub over USB
2027 Alpha 7: Updated hardware support (e.g. brownout, quadrature encoders, counters)
2027 Alpha 7: All CAN device classes now take a
CANPortenum instead of an integer port to disambiguate Systemcore ports from Motioncore ports.2027 Alpha 7: Create drivers library
2027 Alpha 7: Add Gobilda Pinpoint support
Math¶
Warning
Silent Breaking: Rotation2d’s getRadians(), getDegrees(), and getRotations() methods now return a wrapped angle. See PR #7490 for the math reasons why. Those who don’t want wrapping should use double or Angle instead of Rotation2d.
Fix
SimpleFeedforwardoverload setFix duplicate
Rotation2dconstructorRemove LUTs from LTV controllers
Remove
RamseteControllerandRamseteCommandUse immutable member functions in
ChassisSpeedsClean up arm and elevator feedforward APIs
Remove PathWeaver support
Fix
SimpleMotorFeedforwardno-accel overload returning negative voltage outputs2027 Alpha 2: Fix
TrapezoidProfilelimiting velocity incorrectly2027 Alpha 5: Remove redundant transposes on symmetric matrices
2027 Alpha 5: Add vector product and squared length operations to
Translation2d/3d2027 Alpha 5: Remove
Mecanum/SwerveControllerCommand2027 Alpha 5: Added structs for
TrapezoidProfile.StateandExponentialProfile.State2027 Alpha 5: Replace
Pose2/3d.exp(Twist2/3d)withPose2/3d.plus(Twist2/3d.exp())to match math notation better2027 Alpha 5: Refactor
MathUtil.interpolate()andMathUtil.inverseInterpolate()to handle extrapolation2027 Alpha 5: Fix units overload resolution
2027 Alpha 5: Add 2D variants of
MathUtil.applyDeadbandandMathUtil.copySignPowfor circular joystick inputs2027 Alpha 5: Rename 1D
copySignPowto match 2DcopyDirectionPow2027 Alpha 5: Add Kraken X44 and Minion to
DCMotor2027 Alpha 5: Scale transforms instead of twists in
PoseEstimator2027 Alpha 5: Fix
ElevatorSim::GetCurrentDraw()2027 Alpha 5: Add
ChassisAccelerationsand drivetrain accelerations classes, and add forward and inverse kinematics for accelerations to the interface2027 Alpha 5:
TrapezoidProfile.StateimplementStructSerializable2027 Alpha 5: Add multi-tap boolean stream filter and multi-tap trigger modifier (double-tap detector)
2027 Alpha 5: Speed up pose estimator correction computation
2027 Alpha 5: Add limit setters to
SlewRateLimiter2027 Alpha 5: Implement
Rotation3dinterpolation as slerp instead of lerp2027 Alpha 5: Don’t clamp
Rotation2dinterpolation2027 Alpha 5: Prevent
CoordinateSystemfrom accepting left-handed systems2027 Alpha 5: Make swerve and differential kinematics functions immutable
2027 Alpha 5: Mark all geometry classes as final
2027 Alpha 7: Add PoundSquareInches MOI unit, and improve KilogramMetersSquaredPerSecond definition
2027 Alpha 7: Fix C++ Odometry ResetRotation missing a negation
2027 Alpha 7: Use triangular solves to compute UKF Kalman gain
2027 Alpha 7: Add drivetrain anti-tipping utility
2027 Alpha 7: Add
BiquadFilterclass for Second Order Section filters2027 Alpha 7: Switch std::is_constant_evaluated() to consteval
2027 Alpha 7: Rewrite Trajectory API
2027 Alpha 7:
Quaternion::Log(): Avoid potential divide-by-zero2027 Alpha 7: Make
TrajectorySampleonly contain time2027 Alpha 7: Give trajectory generator and parameterizer more specific names
2027 Alpha 7: Fix trapezoid profile
2027 Alpha 7: Add body rate integration to
Rotation3d2027 Alpha 7: Document that transforms are intrinsic
2027 Alpha 7: Use “reference” instead of “setpoint” in feedforward docs
2027 Alpha 7: Note that gain setters are for online tuning
2027 Alpha 7: Fix adaptive RKDP advancing by the next step size
2027 Alpha 7: Remove unused full-pivoting QR
2027 Alpha 7: Remove epsilon check from RKDP
2027 Alpha 7: Move
EllipseandRectangleto shape package2027 Alpha 7: Split shape proto from geometry proto
2027 Alpha 7: Move generated Protobuf classes into separate proto packages
2027 Alpha 7: Make
SimpleMotorFeedforwardaccept dimensionless units2027 Alpha 7: Add
atReference()to LinearSystemLoop2027 Alpha 7: Clean up DARE solver docs and cache intermediate result
2027 Alpha 7: Remove
Matrix.diag()2027 Alpha 7: Make
Translation2d.getAngle()return optional2027 Alpha 7: Add Matrix pseudoinverse
2027 Alpha 7: Add static methods for creating Rotation3d from Euler angles
2027 Alpha 7: Add
TwoDeadWheelOdometry
Telemetry/Tunable¶
2027 Alpha 7: Add Telemetry and Tunable APIs
AprilTag/Fields¶
2027 Alpha 7: [fields] Split images, change to generation, merge AprilTags content
2027 Alpha 7: [apriltag] Convert to vendordep
Simulation¶
2027 Alpha 6: Don’t wait on init for
ExpansionHubin simulation.2027 Alpha 6: Add Onboard IMU Simulation
2027 Alpha 6: GUI: fix game message string lifetime
2027 Alpha 6: Make HalSim DS extension a no-op, fixing crash when running with the real DS option. Support for the real DS simulation option will be added in a future release.
Romi/XRP¶
2027 Alpha 5: Adding XRP Java and C++ examples for Timed Robot
2027 Alpha 6: Show IP and port of XRP/Romi to user on connection
2027 Alpha 7: Fix motor support and https://github.com/wpilibsuite/allwpilib/pull/8915
Java units¶
2027 Alpha 5: Make measure implementations immutable only
2027 Alpha 5: Rename
AngularMomentumUnit.multtoper2027 Alpha 5: Make RPM an alias of RotationsPerMinute
2027 Alpha 5: Fix incorrect magnitudes in some MutableMeasure mutations
2027 Alpha 5: Remove deprecated divide and negate functions
CameraServer¶
Remove Axis Camera
Util¶
2027 Alpha 5: Add reverse iterators to
wpi::circular_bufferandwpi::static_circular_buffer, make other iterators bidirectional2027 Alpha 5: Fix windows mDNS announcer long startup times
2027 Alpha 5: Fix
uv_tcp_keepalivetime2027 Alpha 5: Remove
CombinedRuntimeLoader2027 Alpha 5: Fix port having incorrect endian on Windows resolver
2027 Alpha 5: Rename
CreateEventandCreateSemaphoreto Make2027 Alpha 5: Change C++ json to jart/json.cpp
2027 Alpha 5: Change Java JSON to Avaje Jsonb
2027 Alpha 5: Use C++23 stacktrace library on Windows
2027 Alpha 7:
wpi::expectedandfmt::formathave been replaced withstd::expectedandstd::format2027 Alpha 7: Move Pair from wpimath to wpiutil
2027 Alpha 7: Add protobuf List pack/unpack for Java
2027 Alpha 7: Add
Struct<char>support in C++2027 Alpha 7: Always use steady_clock for timestamp
2027 Alpha 7: Accept UTF-8 struct schema identifiers
2027 Alpha 7: Move Alert from HAL/wpilib to wpiutil
2027 Alpha 7: Use nanoseconds for timestamps
2027 Alpha 7: Add usage reporting API
Javac Plugin¶
2027 Alpha 7: Add compiler check for integer division in floating-point contexts
Glass / OutlineViewer / Simulation GUI¶
2027 Alpha 2: Fix NT int64 value display
2027 Alpha 5: NetworkTables: Show struct enum values
2027 Alpha 5: Fix handling for optionals and empty arrays
2027 Alpha 5: Fix color order for sim GUI LEDs
2027 Alpha 5: FMS: Fix reading past end of GSM buffer
2027 Alpha 5: Fix NT server mode
2027 Alpha 5: Add correct time for rebuilt
2027 Alpha 5: Update to SDL joystick mappings from 1-19-2026
2027 Alpha 6: Fix memory corruption and incorrect POV count
2027 Alpha 7: The desktop GUI tools and simulation GUI now use SDL rendering and gamepad access for consistency with the 2027 Driver Station
2027 Alpha 7: Sim GUI: Fix buttons starting at 1 instead of 0
2027 Alpha 7: Add sim GUI support for DS display
2027 Alpha 7: Change to SDL3
2027 Alpha 7: [glass] Add NT button for System server, add force restart
GradleRIO¶
2027 Alpha 5: Upgrade to Gradle 9.4.1
2027 Alpha 5: Add ZGC as a GC option and make it the default
2027 Alpha 5: Force encoding for written files to UTF-8
2027 Alpha 5: Add Avaje Jsonb and remove Jackson
2027 Alpha 7: Update avajeVersion from 3.11 to 3.14
2027 Alpha 7: Only use single USB IP based off of host os
2027 Alpha 7: Use java run task for sim, deploy using classpath
2027 Alpha 7: Correct gdbserver host arg
2027 Alpha 7: Fix tool launching on macOS
2027 Alpha 7: Support catch2 for C++ unit tests
2027 Alpha 7: Add drivers, tunables, telemetry, and fields libraries
2027 Alpha 7: Change install directory to XDG_DATA_HOME/wpilib on Linux
WPILib All in One Installer¶
2027 Alpha 2: Use unique icons for tools
2027 Alpha 5: Update to VS Code 1.116.0
2027 Alpha 5: VS Code extension updates: cpptools 1.31.4, javaext 1.54
2027 Alpha 5: Show deprecated message on Windows 10
2027 Alpha 5: Hide recommended vscode extensions to install
2027 Alpha 5: Hide the chat sidebar by default
2027 Alpha 5: Use unique strings for tool display vs executable names
2027 Alpha 5: Change installer to AOT, convert tools updater to AOT app
2027 Alpha 5: Catch download failures and show URL
2027 Alpha 5: Remove Python VS Code extensions
2027 Alpha 5: Improve error handling for 0 length downloads
2027 Alpha 5: Fix Windows CRLF line break in installer when creating Linux desktop files
2027 Alpha 5: Update to Avalonia 12
2027 Alpha 6: Fix progress bar on Linux
2027 Alpha 7: Native Arm64 Installers are included for Windows and Linux.
2027 Alpha 7: Show VS Code download size
2027 Alpha 7: Integrate CLI installer
2027 Alpha 7: Switch UI to fluent theme
2027 Alpha 7: Make vscode prompt to trust when opening new workspaces
2027 Alpha 7: Add wayland support to installer
2027 Alpha 7: Change install directory to XDG_DATA_HOME/wpilib on Linux
2027 Alpha 7: wpilibcode: fix bash scripting bugs
2027 Alpha 7: Add Linux docs shortcut
2027 Alpha 7: Remove VSCode AppArmor profile
2027 Alpha 7: Update to VS Code 1.134.0
2027 Alpha 7: VS Code extension updates: CPP extension 1.31.4 to 1.33.8 Java extension 1.54.0 to 1.55.0 Java Dependency extension 0.27.2 to 0.27.6
Visual Studio Code Extension¶
Remove standalone utility
2027 Alpha 5: Improve RIOLog UI
2027 Alpha 5: Fix blank window after installing dependency from local copy
2027 Alpha 5: Remove unnecessary setting change commands
2027 Alpha 5: Support Commandsv3 vendordep
2027 Alpha 5: Move source backup in jar to backup directory
2027 Alpha 5: Set java project source/targetCompatibility to 25
2027 Alpha 5: Use shadow plugin to make shaded JARs
2027 Alpha 5: Port Java simulation canceling to C++
2027 Alpha 5: Move wpilibHome to the top of the plugin repository list
2027 Alpha 7: Change the language in project import error to be more descriptive
2027 Alpha 7: locale.ts: Don’t print error for missing en locale
2027 Alpha 7: Disable Run/Debug Java CodeLens provider
2027 Alpha 7: Only warn if C++ extension is missing if project requests C++ Intellisense
2027 Alpha 7: Fix tool launching on macOS
2027 Alpha 7: Remember previous selections for step 2 of project creation
2027 Alpha 7: Update importer for DS MatchState and RobotState split
2027 Alpha 7: Importer: Add replacements for test to utility, drivers, DCmotor, Color, Alert
2027 Alpha 7: Bring back logging to VS Code’s Output panel
2027 Alpha 7: Don’t require new main class
2027 Alpha 7: Fix RIOLog on Systemcore
2027 Alpha 7: Reload Java project config on build
2027 Alpha 7: Pass build.gradle path to project reload command
2027 Alpha 7: Fix WPILib tool detection on Linux
SysId¶
2027 Alpha 5: Remove Phoenix5 CANcoder preset
2027 Alpha 5: Fix crash on partially empty raw data
AdvantageScope¶
2027 Alpha 5: Use AdvantageScope 27.0.0-alpha-4
2027 Alpha 7: Use AdvantageScope 27.0.0-alpha-6
Elastic¶
2027 Alpha 5: Use Elastic 2027.0.0-alpha7
2027 Alpha 6: Use Elastic 2027.0.0-alpha8
2027 Alpha 7: Use Elastic 2027.0.0-alpha9
WPIcal¶
2027 Alpha 5: Use updated thirdparty-ceres and move resource files
2027 Alpha 5: Refactor to use WPILib libraries and modern C++ conventions and improve UX
2027 Alpha 5: Remove tag ID limit
Shuffleboard¶
Warning
Shuffleboard has been removed for 2027 due to its lack of a maintainer and resource utilization issues. Users can find additional modern dashboard options here
SmartDashboard¶
Warning
SmartDashboard has been removed for 2027 due to its usage of Network Tables v3. Users can find additional modern dashboard options here
PathWeaver¶
Warning
PathWeaver has been removed for 2027 due to its lack of swerve support and lack of a maintainer. Users may find Choreo, PathPlanner, or Bline more useful. They have an intuitive user interface and swerve support.
RobotBuilder¶
Warning
RobotBuilder has been removed for 2027 due to its declining usage and burden of updating for the 2027 control system.