A Jenkins view that turns your jobs into a wall of big coloured tiles, built for the television in the corner of the office.
Hexagons interlocked into a honeycomb. Jobs building right now sort to the top left, and the striped fill means Jenkins has no duration estimate to draw a progress bar from yet.
A minute and a half against a real controller: the shape, animation, palette and ordering all changed on a live wall, then the kiosk page a television would be pointed at.
demo.mp4
No player above? Watch the demo — the inline video only renders on GitHub.
Inspired by the excellent Build Monitor plugin, which pioneered the idea. Live Wall is a rethink of the same idea for one specific situation: a large screen that nobody is standing next to.
That leads to three promises, and they are the whole design.
There is no pagination, and there never will be. Tiles are measured against your actual screen and scaled so that every job in the view is visible at the same time. A job you can only see half the time is a job nobody sees.
A tile has a job name and a colour. That is it. No commit messages, no durations, no avatars — at four metres you cannot read them anyway, and they cost the space the job name needs.
The palettes are fully saturated rather than pastel, and the text colour on each tile is chosen from the measured contrast ratio against its fill, so it stays legible whatever colours you pick — including ones you invent.
A building job fills up in step with its estimated duration, and falls back to indeterminate stripes the moment it overruns that estimate. The animation never lies about how far along a build is.
The same jobs as rounded rectangles. Ten shapes, six palettes, and an adjustable gap — the default is zero, so the tiles meet and the wall reads as one surface.
- Manage Jenkins → Plugins → Available plugins, search for Live Wall, and install it.
- New View → name it → Live Wall, then pick your jobs the way you always do.
- Point the television at
…/view/<name>/wall— the kiosk page, with no Jenkins chrome on it at all. The Full screen button on the view page does the same for a browser you are already sitting in front of.
That is the whole setup. Everything else is optional, and every default is chosen to be the one you would have picked.
Requires Jenkins 2.555.3 or newer, running on Java 21 or newer. Java 21 is a requirement of Jenkins itself at this version, not of this plugin — core 2.555.3 is compiled to Java 21 bytecode, so a Java 17 controller cannot run that Jenkins at all, with or without Live Wall.
Prefer to build it yourself, or want a throwaway Jenkins to try it on rather than your own? docs/building.md covers building and installing from source, and docs/demo.md starts a disposable controller with the plugin and a spread of sample jobs in one command.
| Palettes | Vivid · Neon · High contrast · Daylight · Colour-blind safe · Midnight, plus per-colour overrides on top of any of them |
| Shapes | Rectangle · Rounded · Square · Circle · Octagon · Hexagon · Diamond · Parallelogram · Chevron · Cross |
| Animations | Progress fill · Sweep · Stripes · Pulse · None |
| Contents | All jobs, or only problems — an alert board where an empty screen means everything is fine |
| Order | Running first (default) · Failed first · Passing first · Name (nothing ever moves) · Most recent · View order |
| Which jobs | Tick them in the job picker, or filter by name with ci-*, *-pipeline or just drools — wildcards and plain words, no regular expressions |
| Labels | Folder paths on or off, and a regex to strip the noise: ^ci-|-pipeline$ turns ci-decision-control-pipeline into decision-control, and lets it be drawn twice as large |
| Packing | Interlocked by default, so hexagons tessellate into a honeycomb and diamonds into a lattice, with an adjustable gap (0 by default) and a hairline separator that keeps touching tiles countable |
| Sizing | Fit everything on one screen, or hold a readable size and scroll continuously |
| Panel care | Optional slow drift to protect OLED and plasma screens from burn-in |
Try any of it without saving by putting it in the URL — handy for a screen you cannot comfortably type on:
…/view/pipelines/wall?palette=neon&shape=octagon&refresh=10&header=0
The view page also has a preview bar: drop-downs for palette, shape, animation, packing and order, and sliders for the gap and the separator, all applied to your real jobs as you change them. Moving one changes the wall in front of you and nothing else, so you can try a palette on the real thing without committing to it — and Save this look then keeps what you arrived at, so the kiosk page and full screen open with it too.
Every setting is documented in docs/configuration.md.
- The colour-blind safe palette uses blue and orange instead of green and red, and adds a hatch pattern to failing and unstable tiles, so status never depends on hue alone.
- Every animation is suppressed for viewers whose browser asks for reduced motion.
- Losing contact with Jenkins raises a banner instead of quietly showing stale colours.
- The clock in the header is a cheap way to tell at a glance that the screen has not frozen.
- A wall in a hidden browser tab backs off automatically, so a forgotten tab is not a load problem.
The server renders an empty shell and then answers …/view/<name>/wallData with a small JSON document — one object per job, carrying a label, a status, and raw timestamps for anything building. Everything else happens in the browser, which is what lets a wall sit open for months without reloading. That endpoint respects permissions: jobs you cannot read are not in it.
Three pieces of that browser code are worth knowing about, all in wall.js:
fitColumns() |
Scores every possible column count by the size of the largest tile it would allow, and picks the winner. This is what replaces pagination. |
fitFontSize() |
Measures the real glyphs on a canvas and binary-searches the largest font size at which a job name still fits its tile, breaking at spaces, hyphens, underscores and slashes. |
inkFor() |
Computes the WCAG relative luminance of each status colour and picks black or white text from the contrast ratio. |
| Trying it locally | The one-command demo script, and how to drive it |
| Building, testing, installing | Development loop, running the tests, installing into your own Jenkins |
| Configuration | Every setting, URL parameters, JCasC, the JSON endpoint |
| Contributing | Issues, pull requests, adding palettes and shapes |
| Releasing | How continuous delivery works here, which labels ship a change, and why versions are not semver |
| The bar | All tests passing and zero shipped CVEs, for every pull request — and why the security scan is two scans |
Issues and pull requests are welcome. Read docs/CONTRIBUTING.md first — especially the short list of things this plugin deliberately does not do.
Every pull request must have all tests passing and zero known vulnerabilities in anything the plugin ships. Both are enforced by CI, and the security scan also runs every Sunday morning, because the code stops changing but the vulnerability database does not. See the bar for why the security scan is two scans rather than one.
The job picker in the view configuration form is adapted from Jenkins core (hudson/model/ListView/configure-entries.jelly, MIT licensed). Thanks again to Build Monitor for showing what a Jenkins radiator should feel like.


