Skip to main content

Versioning

Control4 identifies a driver build by the integer <version> in driver.xml, and Director only reloads a driver when it sees a higher number. driverforge manages that integer for you, using a versioning scheme you choose once during driverforge init.

Preview

The driverforge CLI is in preview. Commands and flags documented here may change before the stable release. Follow along or share feedback on our roadmap.

The two schemes

Your scheme is recorded in .driverforge/config when you initialise the project:

Date is the default for new drivers. Versions are the date plus a two-digit sequence: 2026070501 is the first version of 5 July 2026. The first bump on a given day jumps to that day's 01; later bumps the same day count up from there. The number always grows, reads as a date at a glance, and needs no bookkeeping. (Ship more than 99 times in a day and the sequence simply spills forward; it stays monotonic.)

Integer is a plain counter: each bump adds one, preserving any zero-padding. This is what driverforge init proposes for an existing driver whose <version> doesn't look like a date, so an established numbering scheme is never silently converted. The wizard states which scheme it detected before anything is written.

When the version changes

CommandEffect on <version>
driverforge buildNever changes it. The driver builds exactly as authored.
driverforge build --incrementBumps per your scheme, persisted to driver.xml after a successful build.
driverforge build --version NStamps the exact value you give, persisted to driver.xml after a successful build.
driverforge syncNever changes it. A hot-swap updates the running instance without a reload.
driverforge deployBumps per your scheme. Director needs a higher version to reload, so every deploy consumes a version slot.

Uninitialised projects

Plain driverforge build works on any driverpackager-style project with no account and no setup, and the version passes through exactly as authored. What driverforge init unlocks is version management and the ship commands: bumping needs a scheme, and the scheme is chosen during init. Without one, --increment stops with a friendly "Versioning not configured" pointing you at driverforge init, and sync/deploy require an initialised project up front.

--version is the exception: an explicit value needs no scheme, so it works anywhere, initialised or not.