Xradiator is a cross-platform Avalonia app (ported from the WPF app Cradiator) that displays a summary of Continuous Integration (CI) project statuses. It is basically an Information Radiator for CI.
Xradiator supports two modes of CI integration:
- TeamCity native REST API — rich data including build breakers, categories, and server names
- CCTray XML feed — basic status (name, activity, last build status/time) from any CI server that exposes the CCTray v1 format. This includes TeamCity (built-in), Jenkins (via plugin), CruiseControl.NET, CruiseControl (Java), and any other CCTray-compatible server.
Xradiator is most suited to display on a dedicated monitor where it is visible to developers working on a project. There are various screen layouts or skins to choose from:
Projects are arranged in a stack (top-to-bottom). A countdown of how many seconds to go before refreshing can also be shown (this can be switched off).
Projects are arranged in a grid.
Shows an image alongside a broken project (based on the breaker's username). Only 1 breaker is shown.
| Color | Status |
|---|---|
| Green | Success/Normal |
| Red | Failure/Exception/Error |
| Yellow | Building |
| White | Unknown |
Pre-built binaries for Windows, macOS, and Linux are attached to each GitHub release.
| Download | Platform |
|---|---|
Xradiator-*-win-x64.zip |
Windows (64-bit) |
Xradiator-*-osx-x64.tar.gz |
macOS (Intel) |
Xradiator-*-osx-arm64.tar.gz |
macOS (Apple Silicon) |
Xradiator-*-linux-x64.tar.gz |
Linux (64-bit) |
Each archive is self-contained — no .NET installation required. Extract and run the Xradiator executable (or Xradiator.exe on Windows).
To cut a release, push a version tag and GitHub Actions will build and publish all four targets automatically:
git tag v1.0.0
git push origin v1.0.0To build locally for all platforms, run ./publish.sh from the repo root. Output lands in publish/<rid>/.
-
Polling Frequency - In seconds. Default is 30
-
Views/view - Each 'view' can be defined in this xml section
- If more than 1 view is specified, then the view is switched (on a rotation cycle) at each poll interval.
- Each view contains a url & other base settings as documented below
-
view/url - The CI server URL. Any URL not matching the TeamCity REST pattern is treated as a generic CCTray feed.
TeamCity (native REST API — rich data)
http://localhost:8111/guestAuth/app/rest— guest authhttp://localhost:8111/app/rest?token=YOUR_TOKEN— access token auth
TeamCity (CCTray feed — basic status only, no breakers/category/server)
http://localhost:8111/guestAuth/app/rest/cctray/projects.xml
Other CCTray-compatible servers (basic status only)
- Jenkins:
http://localhost:8080/cc.xml(requires the CCtray XML plugin) - CruiseControl.NET:
http://localhost/ccnet/XmlStatusReport.aspx - CruiseControl (Java):
http://localhost:8080/cctray.xml - Any other server exposing the CCTray v1 format
Debug mode — prepend the URL with the word
debugto use a localDummyProjectStatus.xmlfile instead of connecting to a server (useful for testing/screenshots) -
multi-url - URL can be split (using space as a delimiter), to refer to multiple urls.
- eg value="http://url1 http://url2"
- All project data is collected into one screen output
- DEBUG MODE (ie prepending word 'debug' to URL) overrides the multiurl feature; no multiurls are read if debug is on
-
view/project-regex - RegEx used to filter which projects are included (by name)
- Defaults to ".*" (even if config is "")
-
view/category-regex - as for ProjectNameRegEx but filters by category name
-
view/server-regex - as for ProjectNameRegEx but filters by server name
-
view/name - the name for this view, will be shown when ShowOnlyBroken = true and there are no broken projects
-
view/showServerName - shows the servername below the project name if true, handy if you monitor multiple servers with identical project names
-
view/showOutOfDate - 'true' or 'false'. When true, projects whose last build is older than outOfDateDifferenceInMinutes are flagged as out of date
-
view/outOfDateDifferenceInMinutes - the age (in minutes) after which a project is considered out of date (only applies when showOutOfDate is true)
-
view/skin - Currently 3 choices
- Grid - arranged in a grid format
- Stack - arranged in a stack (ie top-to-bottom listbox type) format
- StackPhoto - same as Stack but shows an image of the build breaker as well as text
last/first listed - is the last/first person to commit while build is broken - where 'last/first' is dependent on the setting 'BreakerGuiltStrategy' (below) - and not necessarily honored by the server producing XML, so use with a grain of salt
-
photo/image - requires a sub-folder named 'images' (relative to the folder in which the app resides) with a JPEG ([username].jpg) corresponding to each username
- The JPEG file must be named using the username - eg bsimpson requires a filepath 'images/bsimpson.jpg'
- If a file/photo does not exist for a user, everything will still work as normal (ie it's not considered an error)
-
ShowCountdown - 'true' or 'false' (case insensitive) ,so { True False TRUE FALSE } are all valid
- Shows a clock that counts down the 'time to go' before refreshing the screen (updated approx every second)
-
ShowProgress - 'true' or 'false', whether to show a progress indicator while build data is being fetched
-
PlaySounds - true/false, whether to play sounds on events (described below) (.WAV files only)
-
BrokenBuildSound - the filename (without path) of the .WAV file
- The file is assumed to be in a sub-folder named 'sounds' (relative to the folder in which the app resides)
- A 'BrokenBuildSound' plays in response to a project that starts 1) not Broken (FAILURE|EXCEPTION) followed by 2) Broken
-
FixedBuildSound - as for BrokenBuildSound, but plays in the case of 1) Broken (FAILURE|EXCEPTION) followed by 2) SUCCESS
-
usernames - a section for mapping usernames to real or full-length names, used when displaying the build breaker
- eg if your username is 'jbloggs' you can map it to 'Johann Bloggs' via this config so the full name is shown instead of the username
- A username of 'jsmith' is mapped to 'John Smith' by default, in app.config, to make the format required obvious
- BreakerGuiltStrategy - 'First' or 'Last'
- How to determine the 'Breaker', is the 'First' build breaker always guilty?, or do subsequent committers ('Last' breaker) assume guilt when they commit over a breaking build?