A Unity-based VR prototype for exploring the structure, timing, concurrency, and failures of GitHub Actions workflow executions in a spatial environment.
This project was developed as an individual Master's thesis in Informatics and Computing Engineering at FEUP. It investigates a practical question: can spatial interaction make execution histories easier to inspect than a conventional CI/CD dashboard?
Thesis grade: 17/20
Author: Anete Medina Pereira
Completed: July 2025
Thesis: Read the full dissertation (PDF)
Generated factory overview: workflows are stacked as floors, while runs and jobs extend along a shared time axis.
GitHub Actions presents workflows primarily as lists, run pages, and textual logs. Those views are useful for inspecting one execution in detail, but relationships across many runs can be difficult to see at once, especially:
- which runs and jobs overlapped in time;
- where failures occurred across a workflow history;
- how long executions lasted;
- where long periods of repository inactivity separate groups of runs.
The prototype translates that history into a navigable 3D factory. It is a research prototype, not a replacement for GitHub Actions or a production monitoring tool.
I designed and implemented the prototype as an individual thesis project under academic supervision. The authored system covers four connected areas:
- Data: loading workflow data from the GitHub REST API or local JSON snapshots and converting it into a shared workflow, run, and job model.
- Visualization: procedurally generating a factory-style layout from execution timestamps and outcomes.
- Interaction: VR locomotion, floor navigation, hover inspection, a hand-mounted menu, dominant-hand support, and a magnifier.
- Audio: placing looping 3D failure alerts at failed workflow runs, with global mute control.
The repository also contains Unity packages, XR Interaction Toolkit samples, Unity VR template assets, TextMesh Pro assets, and third-party media. These are dependencies or supporting assets, not original contributions of the thesis.
| CI/CD information | Spatial representation |
|---|---|
| Workflow | One horizontal factory floor, with floors stacked on the Y-axis |
| Workflow run | A colored block on its workflow's conveyor belt |
| Job | A smaller block positioned on top of its parent run |
| Start and end time | Position and length along the Z-axis |
| Concurrent runs or jobs | Separate side-by-side lanes along the X-axis |
| Sequential executions | Front-to-back placement along the time axis |
| Outcome | Blue for success, yellow for in progress, red for failure |
| Repository-wide inactive period | A labeled time-compression portal |
| Failed run | A spatialized alert located at the run, when audio is enabled |
The implementation models workflows, workflow runs, and jobs. Although steps are part of the GitHub Actions execution model discussed in the thesis, steps and logs are not loaded or visualized by this prototype.
| Concurrent execution | In-world controls |
|---|---|
![]() |
![]() |
| Overlapping runs are placed in separate lanes, making concurrency visible. | The hand-mounted panel controls spatial audio and navigation between workflow floors. |
The dominant-hand magnifier helps users inspect labels and small execution details from within the scene.
The latest timestamp in the loaded dataset becomes the temporal origin. Older events extend away from the entry point along the positive Z-axis:
z = (latest dataset timestamp - event timestamp) * time scale
Run and job lengths are derived from their execution intervals, so duration is visible as spatial extent. Timeline markers are generated every 30 minutes, with fuller labels at day boundaries and after compressed gaps.
Runs are sorted by start time and assigned to the first lane where they do not overlap an existing run. The same strategy assigns jobs to tracks inside each run. New lanes are created only when every existing lane conflicts.
This makes observed concurrency visible without allowing time intervals to overlap geometrically. It is important to note that the prototype infers parallel and sequential structure from timestamps. It does not retrieve or parse declared GitHub Actions needs dependencies.
Long inactive periods would otherwise produce large empty travel distances in VR. The system merges all runs into a chronological view, finds gaps with no activity in any workflow, and collapses gaps longer than a configurable threshold, set to two hours in the thesis prototype.
Each collapsed interval is represented by a labeled portal. Portal thickness grows logarithmically with gap duration so that longer gaps remain distinguishable without dominating the scene.
Failed runs create a looping Unity AudioSource at the run's 3D position. The implementation uses full spatial blending, logarithmic attenuation, a 1-unit minimum distance, a 10-unit maximum distance, and a volume of 0.7. Sounds start muted and can be enabled from the hand-mounted menu.
The audio cue is supplementary in the normal interface. A separate no-color study mode removed visual and textual outcome cues to evaluate audio-only failure localization.
GitHub REST API or local JSON snapshot
|
v
IWorkflowDataProvider
|
v
Workflow -> Runs -> Jobs model
|
v
timestamp mapping, overlap detection,
lane assignment, and gap compression
|
v
Unity factory scene generation
|
+---------+---------+
| |
v v
VR navigation and spatial failure
run inspection audio
The live provider calls three GitHub Actions REST endpoint families:
/repos/{owner}/{repo}/actions/workflows/repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs/repos/{owner}/{repo}/actions/runs/{run_id}/jobs
The current implementation requests up to 100 runs and 100 jobs per request but does not follow pagination links. Large repositories or date ranges can therefore be incomplete.
- Room-scale physical movement through
XROrigintracking. - Smooth joystick locomotion and configurable turning.
- Point-and-click teleportation.
- X and Y controller buttons for moving down or up one workflow floor.
- A workflow dropdown for teleporting directly to a selected floor.
- Controller-ray hover panels with run ID, status, outcome, event, timestamps, duration, attempt, and job summary.
- A dominant-hand magnifier for inspecting distant or small text.
- Left-handed and right-handed placement of the menu and magnifier.
- Global spatial-audio control.
The final thesis reports a 20-participant, within-subjects study comparing the VR prototype with the GitHub Actions web interface. Ten participants used GitHub Actions first and ten used VR first. Both conditions used the same Facebook Relay workflow data from 28 August to 1 September 2024.
Participants completed three comparative tasks:
- locate the time of the latest run of a specified workflow;
- locate the latest failed run of another workflow and report part of its ID;
- identify the jobs responsible for that failure.
A fourth VR-only task asked participants to locate a failed run using sound after visual and textual status cues had been removed. The study measured task time, binary task success, SUS usability scores, spatial-audio ratings, and qualitative feedback.
| Task | GitHub Actions median | VR median | Thesis-reported result |
|---|---|---|---|
| Temporal navigation | 84.82 s | 18.22 s | VR faster, p < .001 |
| Failed-run identification | 119.58 s | 13.17 s | VR faster, p < .001 |
| Failed-job identification | 8.04 s | 16.16 s | GitHub Actions faster, p = .015 |
Across the three comparative tasks, the observed success rates were 76.7% for GitHub Actions and 95.0% for VR (p = .013). The clearest task-level success difference was temporal navigation: 55.0% with GitHub Actions and 90.0% in VR (p = .016). Success differences for failed-run and failed-job identification were not statistically significant.
The VR prototype received a mean SUS score of 78.0, compared with 56.38 for GitHub Actions (p < .001) in this study. For the audio-only task, 13 of 20 participants located a failed run successfully. Participants rated sound as less effective than visual cues and reported difficulty distinguishing vertical direction.
These results describe this small, controlled study and its selected tasks. They do not establish that VR is generally better for CI/CD work. The study instead suggests complementary strengths: the spatial view supported overview and temporal-navigation tasks, while GitHub Actions was faster for detailed job-level lookup.
- The sample contained 20 predominantly young participants recruited at FEUP, most with limited CI/CD and GitHub Actions experience.
- The selected tasks represent only a subset of CI/CD analysis work.
- A fixed historical dataset improved comparability but did not reproduce a live, changing pipeline.
- Counterbalancing reduced, but could not eliminate, learning effects.
- The study was not designed to represent experienced industry teams or long-term tool use.
- Unity
6000.0.24f1 - C# and .NET Standard 2.1
- XR Interaction Toolkit
3.0.6 - OpenXR
1.12.1 - Universal Render Pipeline
17.0.3 - Unity Input System
1.11.1 - TextMesh Pro
- GitHub Actions REST API
- Unity Hub with Unity Editor
6000.0.24f1 - A configured OpenXR runtime
- A compatible VR headset and motion controllers
The evaluation used a Meta Quest 3 connected to a Windows laptop. The project also has standalone OpenXR controller profiles enabled, but those configurations have not all been validated as part of this repository audit.
- Clone the repository.
- Add the
thesis_vrdirectory as a project in Unity Hub. - Open it with Unity
6000.0.24f1and allow Unity to restore the packages inPackages/manifest.json. - Open
Assets/Scenes/BasicScene.unity. - Confirm that your OpenXR runtime and headset are active.
- Enter Play mode.
Local JSON datasets are included under Assets/Resources. The thesis scene is configured for local JSON data, which allows the visualization to run without a GitHub token or network request.
- In
BasicScene, locate the component usingJsonLoader. - Change its data source from
LocalJsontoGitHubApi. - Set the repository owner, repository name, and optional date range in the Inspector.
- For authenticated requests, create
thesis_vr/Assets/Resources/github_config.json:
{
"accessToken": "YOUR_GITHUB_TOKEN"
}- No workflow step, log, artifact, branch, commit, or pull-request visualization.
- Job dependency declarations are not parsed. Layout relationships are inferred from timestamps.
- The API provider does not follow pagination beyond the first requested page.
- The scene is generated only after the complete selected dataset is loaded.
- Information panels prioritize run summaries and provide limited job detail.
- Spatial audio has weak vertical localization in the evaluated implementation.
- There is no packaged release or documented headset-by-headset compatibility matrix.
Dissertation: Immersive Visualization of CI/CD Pipelines
Degree: Master's in Informatics and Computing Engineering, FEUP
Author: Anete Medina Pereira
Supervisors: Rui Pedro Amaral Rodrigues and Daniel Filipe Martins Tavares Mendes
Date: July 2025
The repository's original code is available under the MIT License. Third-party assets and package content may have separate terms. Their provenance and redistribution rights should be audited before treating the entire Assets directory as MIT-licensed.



