Downloads

fwci is the command-line interface for FirmwareCI. It lets you configure the Git repositories connected to FirmwareCI and other tasks.


Currently, the tool supports Linux x64 and Linux ARM64 systems.


Installation Options

PlatformPrecompiled BinaryDebian/Ubuntu (.deb)Red Hat/CentOS/Fedora (.rpm)Arch Linux (.pkg.tar.zst)Alpine Linux (.apk)
x64fwci-latest.linux-amd64.tar.gzfwci-latest.linux-amd64.debfwci-latest.linux-amd64.rpmfwci-latest.linux-amd64.pkg.tar.zstfwci-latest.linux-amd64.apk
ARM64fwci-latest.linux-arm64.tar.gzfwci-latest.linux-arm64.debfwci-latest.linux-arm64.rpmfwci-latest.linux-arm64.pkg.tar.zstfwci-latest.linux-arm64.apk

Note: Select the package that matches your operating system and architecture. For detailed installation steps, refer to the instructions below.


Installing the Precompiled Binary

Step 1: Download the Precompiled Binary

Replace linux-amd64 with linux-arm64 if you are on ARM64.

wget https://fwci-cli.s3.eu-central-1.amazonaws.com/latest/fwci-latest.linux-amd64.tar.gz

Step 2: (Optional) Verify the Download

Download the checksum and verify:

The checksum file holds the bare digest, so pair it with the archive name before handing it to sha256sum -c:

wget https://fwci-cli.s3.eu-central-1.amazonaws.com/latest/fwci-latest.linux-amd64.tar.gz.sha256
echo "$(cat fwci-latest.linux-amd64.tar.gz.sha256)  fwci-latest.linux-amd64.tar.gz" | sha256sum -c -

It prints fwci-latest.linux-amd64.tar.gz: OK when the download is intact.

Step 3: Unpack the Archive

tar -xvzf fwci-latest.linux-amd64.tar.gz

Step 4: Install the Binary

The archive holds the binary as fwci-latest.linux-amd64 (fwci-latest.linux-arm64 on ARM64). Install it as fwci:

sudo install -m 755 fwci-latest.linux-amd64 /usr/local/bin/fwci

Step 5: Verify Installation

fwci version

If the installation was successful, this will display the current version of the fwci tool.


For more information on how to use the fwci tool, refer to the Usage Guide


Changelog

v0.18.4 2026-10-21

New Features

  • You can now use the bmc-virtualmedia test step, and size validation errors now clearly tell you the expected format.
  • Invalid regular expressions are now caught before a job starts, with clear messages showing where the problem is and what regex features are unsupported.
  • Runner-related job failures now explain what went wrong, where it happened, and what you can do next.
  • Template errors now point to the exact test step and line, explain why a value is missing, and suggest how to fix it.
  • Tests can now read nested device attributes, including values inside lists and maps.

Bug Fixes

  • Cancelled requests, such as when a client disconnects, no longer appear as server failures in traces and logs.
  • Workflow, branch, and project statistics now load much faster, especially on busy systems.
  • Job inputs with the same file name no longer conflict with each other during test execution.
  • fwci exec error messages now clearly identify the affected test, step, and line, with better hints for missing or mistyped names.

v0.18.3 2026-10-19

New Features

  • You can now choose low, mid, or high priority when starting a job, and that priority is shown in the queue so it’s clear why some jobs move ahead of others.
  • Higher-priority jobs now get devices before lower-priority jobs while jobs at the same priority still run in the order they were queued.
  • A new /healthz endpoint now shows whether the service can still reach its database, making health checks more reliable.
  • The service now exposes more operational metrics, including queue wait time, job preparation time, requeues, device availability, database pool usage, worker restarts, low GitHub rate limit warnings, and basic process health.

Bug Fixes

  • Frequent job updates are now handled more efficiently, so busy jobs should feel more responsive and cause less delay.
  • Job updates now finish more reliably and with less overhead, reducing delays during active runs.
  • Running jobs now place much less load on the database, improving overall responsiveness.
  • Background maintenance activity no longer clutters tracing data, making job traces easier to follow.
  • Calls to external services are now visible in traces, making slow or failing dependencies easier to spot.
  • If a request crashes, you now get a proper 500 error instead of an empty successful response.
  • Dashboard counts for jobs and devices now drop back to zero correctly when nothing remains in that state.
  • Completed-job counts and duration statistics are now accurate, including jobs that failed before they started.
  • Jobs no longer fail just because the registry is temporarily slow or unreachable when the required image is already available locally.
  • Errors are now recorded more clearly in logs and traces, making failures easier to diagnose.
  • Keeping a job log page open no longer creates oversized traces or degrades trace quality.
  • Request metrics now group by route instead of individual URLs, keeping monitoring cleaner and more useful.
  • The OTLP endpoint setting now accepts either a full URL or a simple host-and-port value.
  • MCP continues to work correctly when FirmwareCI is accessed through a local proxy.
  • Log entries now include trace IDs, so you can jump directly from a log line to the related trace.

v0.18.2 2026-10-15

New Features

  • Destructive actions now clearly explain what will be removed, what else goes with it, and whether you can undo it, with safer confirmation prompts and support for --yes in scripts.
  • When deleting a project, you now see what it contains, including its branches, so it is easier to confirm you are removing the right one.
  • You can now restore a previously deleted integration and bring back its devices and storage entries.
  • Projects now stay linked automatically when a GitHub account or organization is renamed.
  • Projects now stay linked automatically when a GitHub repository is renamed.
  • Unmatched GitHub pushes are now logged with the repository details, making it easier to see why nothing happened.
  • Tests can now actively control and verify more BMC behavior, including write operations, retries, events, console access, and KVM checks.
  • Tracing can now be turned off for noisy background work so important activity is easier to spot.

Bug Fixes

  • Jobs no longer get blocked from reserving or releasing devices while a project sync is in progress.
  • Deleting an integration by specifying its source now removes the project you named instead of unexpectedly opening a picker.
  • Project sync state is now handled safely during adds, deletes, and restores, preventing crashes and missed webhooks.
  • Projects continue syncing after a GitHub repository is renamed instead of silently falling out of sync.
  • Background maintenance checks no longer flood tracing data and drown out more useful activity.
  • Trace fields now use consistent names and correctly identify the real caller, making logs and traces easier to follow.
  • Request latency logs now show each request’s actual duration instead of time since the server started.
  • Request and panic logs now follow your configured logging settings, including output destination and tracing hooks.
  • The reported deployment environment now comes from your deployment configuration instead of always appearing as dev.

v0.18.1 2026-10-07

Bug Fixes

  • Finished jobs now continue to appear under the correct device for your organization until they are fully cleaned up, instead of briefly showing another organization’s job there.
  • Repositories opened from a linked worktree now correctly detect their remote and current branch, so validation, project detection, and the repository banner work as expected.

v0.18.0 2026-10-05

New Features

  • You can now see why a queued job is waiting, including which devices are busy, which visible jobs are ahead of it, and whether another unseen job or an external lock is holding the device.
  • Shared devices now serve jobs in true queue order across projects and organizations, so access is fairer and waiting positions stay consistent.
  • Device pages now show whether a device is busy even when it is in use by another project, another organization, or outside FirmwareCI.
  • You can now view a device’s job queue in execution order, including the current holder and the jobs waiting next.
  • Device pages now show how many of your visible jobs are waiting for that device.
  • Waiting jobs are retried as soon as a device becomes free, so they can start sooner instead of waiting for the next polling interval.
  • Superusers can now see active job counts per organization, and fwci-admin jobs shows the same overview.
  • fwci init and fwci validate now support IPMI test steps, so tests can verify BMC-related values.
  • Job files are now served from object storage, giving more reliable downloads and safer handling of uploaded binaries, SSH keys, and other job assets.

Bug Fixes

  • Password reset links now stay valid for 24 hours, while new-account and invitation links now stay valid for 14 days, and the emails reflect those times.
  • fwci init now creates a valid dut.yaml, so a freshly initialized repository passes validation without manual fixes.
  • Job and job-request responses now include the recorded SHA-256 digest for binaries, so reruns and checks use the exact file that was verified.
  • If object storage is unavailable at startup, the service now exits cleanly instead of crashing with a stack trace.
  • File uploads no longer leave behind full temporary archive copies after the request completes.
  • Device lock and unlock attempts now time out after 5 seconds, so an unresponsive device no longer blocks the whole pool indefinitely.
  • Failed jobs now release their device immediately, so the next job can start without waiting for follow-up processing.
  • Database passwords and other connection parameters now work correctly even when they contain spaces or quotes, without leaking into logs on errors.
  • Secret files are now read without exposing their file paths in logs, and trailing newlines no longer break secrets such as webhook URLs.
  • The initial superuser account now gets a random password instead of a fixed default.
  • Logs and verbose output now better hide passwords, tokens, signed URLs, and other secrets.
  • Stored files and cleanup operations are now confined to their intended directories, preventing writes or deletions outside them.
  • Device connection errors now keep their original cause, so you can tell the difference between cases like a refused connection and no network route.
  • Locks left behind after a finished job are now reclaimed automatically, so devices do not stay blocked for hours after a failed release.
  • Release archives now use a compatible timestamp format, avoiding failures during the release packaging step.

v0.17.10 2026-09-10

Bug Fixes

  • Jobs now start on any available matching rig instead of being blocked behind earlier queued jobs waiting on a busy rig.

v0.17.9 2026-09-07

New Features

  • You can now register and manage executor nodes, with one-time access tokens for onboarding and controls over which organizations each node can serve.
  • Devices can now be assigned to a site, laying the groundwork for making sure jobs run in the right lab.
  • Sensitive data stored by the system is now encrypted at rest, and executor connections now have built-in certificate authority support for secure identity verification.
  • Executors now use a dedicated workspace layout that keeps shared cache data separate from per-job files for more reliable cleanup.
  • You can now use an S3-compatible bucket for shared job files, with local caching to speed up repeated downloads on executor nodes.
  • The system now includes the control protocol used for communication between the orchestrator and remote executors.

Bug Fixes

  • fwci files get output now always ends with a newline, so your shell prompt no longer appears on the same line as the result.
  • Storage lookup errors now name the organization that was searched, making it clearer why a file could not be found.
  • Repository syncs now look for uploaded files in the project’s organization, so moved projects no longer fail to sync because files appear to be missing.
  • Archive extraction now rejects entries that would write files outside the target folder.

v0.17.8 2026-08-19

Bug Fixes

  • Pull requests that share the same device pool now wait in a single fair queue instead of taking turns unpredictably.
  • Routine activity now keeps the warning log much quieter, so you only see warnings for real problems or when queued jobs are dropped during shutdown.
  • Validating tests no longer floods the logs with repeated messages, making normal output much easier to read.
  • Uploading files no longer overwrites your existing storage.yaml, including any comments and custom path settings.

v0.17.7 2026-08-18

New Features

  • New job requests now run in the order they were submitted on the same devices, so later requests can’t jump ahead.
  • When you rerun unsuccessful work, only the failed or interrupted tests are queued again instead of rerunning everything.

Bug Fixes

  • Sync no longer fails when the same storage is listed more than once with identical settings, and harmless duplicates now only show a warning.
  • The checksum file for the latest CLI download is now available where the install instructions expect it.
  • API documentation now matches actual responses, making it easier to rely on documented fields, response headers, and authentication payloads.
  • Jobs that finished successfully no longer get marked as failed because cleanup ran into a problem afterward.

v0.17.6 2026-08-06

New Features

  • You can now download stored files directly from the server, including very large files, without needing server shell access.
  • Agents can now view storage defined on any branch, making it easier to inspect feature-branch settings and distinguish same-named entries across branches.

Bug Fixes

  • Error messages in admin commands and other workflows are now shown once and more clearly, without repeated or misleading wording.
  • The remote selection prompt now consistently prefers origin first, with the rest shown in a stable order, so pressing Enter picks the expected project.
  • Sync now rejects duplicate config entries with the same name before making changes, so one definition can’t silently overwrite another.
  • Downloaded files now keep their original names even when the names contain special characters.
  • Storage entries can no longer share the same name within a branch, preventing ambiguous lookups and cleaning up existing duplicates.
  • When a name is already taken, you now get a clear conflict error that tells you exactly which name is in use instead of a generic server error.
  • If a rename is blocked because an entry is still in use, the message now names the existing entry that caused the conflict.
  • Jobs and tests now use storage from their own branch, avoiding failures caused by paths or keys from another branch.
  • Deleting or renaming file entries now correctly checks for references from every branch, not just the default branch.
  • Project, label, storage, and file entries now keep their original creation time instead of showing an incorrect date.
  • Request durations now match the job durations you see in the UI, avoiding off-by-one-second inconsistencies.
  • Uploading a file with a name that already exists now returns a clear conflict message instead of a generic server error.