# NixOS - Packaging Vision Client and Perspective Workstation

**URL:** <https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703>\
**Category:** Ignition\
**Tags:** perspective, vision\
**Created:** [September 9, 2024, 12:20am UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703 "2024-09-09T00:20:51Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [September 9, 2024, 12:20am UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/1 "2024-09-09T00:20:51Z")

</div>

Hey,

I'm trying to package the Vision Client / Perspective Workstation for [NixOS](https://nixos.org/) in order to build reproducible kiosks.

I've got the Vision Client working with the following package config. It's just been a bunch of trial and error to discover the `targetPkgs` required to run, but I've got both the launcher and the client working:

```python
# vision-client.nix
{
  pkgs,
  stdenv,
  buildFHSEnv,
}:
let

  pname = "vision-client";
  version = "8.1.43";

  src = pkgs.fetchzip {
    name = "vision-client";
    url = "https://files.inductiveautomation.com/release/ia/8.1.43/20240820-1049/visionclientlauncher.tar.gz";
    curlOpts = "--referer https://inductiveautomation.com/downloads/ignition";
    sha256 = "sha256-UdzpFCPAGtzh/6PdHg520ioOVtFWSv+OnDJmInWwbts=";   
  };

in buildFHSEnv {

  inherit pname version;
  runScript = "${src}/app/visionclientlauncher.sh";

  targetPkgs = pkgs: with pkgs; [
    fontconfig
    glib
    gtk3
    zlib
    xorg.libX11
    xorg.libXcursor
    xorg.libXext
    xorg.libXi
    xorg.libXtst
    xorg.libXrender
  ];
}

```

Now I'm trying to do the same for Perspective Workstation but I've hit a dead end. The launcher loads, but when launching a client I get the following error and I don't know what else to try. I figure it's probably another missing dependency, but the log is not very helpful:

![20240908_200830](https://us1.discourse-cdn.com/inductiveautomation/original/3X/6/5/65b536c2329cabed77582a2f6156270b89bc938a.png)

```python
ERROR [BrowserUtils] [2024/09/08 23:55:32]: Failed to start Browser Engine with options
 com.teamdev.jxbrowser.engine.EngineOptions:
  autoplayEnabled: true
  chromiumDir: /home/kiosk/.ignition/cache/resources/jxbrowser/7.12.1
  chromiumSwitches: []
  diskCacheSize: <unknown>
  fileAccessFromFilesAllowed: false
  isGpuDisabled: false
  isIncognitoEnabled:false
  language:en-us
  passwordStore: <unknown>
  remoteDebugginPort: 9224
  renderingMode: HARDWARE_ACCELERATED
  isSandboxDisabled: false
  secureOriginWhitelist: []
  isTouchMenuEnabled: true
  userAgent: <unknown user agent value>
  userDataDir:/home/kiosk/.ignition/clientlauncher-data/workstationUserData/2
  webSecurityDisabled: false
.
com.teamdev.jxbrowser.engine.ChromiumProcessStartupFailureException: Process exit code: 127
        at com.teamdev.jxbrowser.engine.internal.EngineImpl.throwExceptionAndCleanup(EngineImpl.java:478)
        at com.teamdev.jxbrowser.engine.internal.EngineImpl.newInstance(EngineImpl.java:281)
        at com.teamdev.jxbrowser.engine.Engine.newInstance(Engine.java:106)
        at com.inductiveautomation.ignition.launcher.workstation.utils.BrowserUtils.lambda$getOrCreateEngine$34(BrowserUtils.java:575)
        at com.inductiveautomation.ignition.launcher.workstation.utils.BrowserUtils.runResourceLockedAction(BrowserUtils.java:996)
        at com.inductiveautomation.ignition.launcher.workstation.utils.BrowserUtils.getOrCreateEngine(BrowserUtils.java:575)
        at com.inductiveautomation.ignition.launcher.workstation.utils.BrowserUtils.getOrCreateEngine(BrowserUtils.java:614)
        at com.inductiveautomation.ignition.launcher.workstation.utils.BrowserUtils.lambda$openAsyncImpl$13(BrowserUtils.java:306)
        at com.inductiveautomation.ignition.launcher.common.service.SimpleService$1.call(SimpleService.java:23)
        at javafx.concurrent.Task$TaskCallable.call(Task.java:1426)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at javafx.concurrent.Service.lambda$executeTask$6(Service.java:728)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.concurrent.Service.lambda$executeTask$7(Service.java:727)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)

```

Here's the current Perspective Workstation config:

```python
# perspective-workstation.nix
{
  pkgs,
  stdenv,
  buildFHSEnv,
  writeScript,
}:
let

  pname = "perspective-workstation";
  version = "8.1.43";

  src = pkgs.fetchzip {
    name = "perspective-workstation";
    url = "https://files.inductiveautomation.com/release/ia/8.1.43/20240820-1049/perspectiveworkstation.tar.gz";
    curlOpts = "--referer https://inductiveautomation.com/downloads/ignition";
    sha256 = "sha256-4N2P+rUopcZliRjIWDJhi6GdtcKN1qrayqj2Ur89ikU=";   
  };

in buildFHSEnv {

  inherit pname version;
  runScript = "${src}/app/perspectiveworkstation.sh";

  targetPkgs = pkgs: with pkgs; [
    fontconfig
    glib
    gtk3
    zlib
    xorg.libxcb
    xorg.libX11
    xorg.libXcursor
    xorg.libXext
    xorg.libXi
    xorg.libXtst
    xorg.libXrender
  ];
}

```

Any suggestions?

Chromium in kiosk mode is easy, but it'd be fun to say I have both first-party launchers working.

---

<div class="post-metadata">

**Author:** ![joe.bernicke](https://avatars.discourse-cdn.com/v4/letter/j/ea666f/32.png) [@joe.bernicke](https://forum.inductiveautomation.com/u/joe.bernicke)\
**Post date:** [October 7, 2025, 12:07am UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/2 "2025-10-07T00:07:33Z")

</div>

did you ever figure this out?

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [October 7, 2025, 12:19am UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/3 "2025-10-07T00:19:42Z")

</div>

Nope, we ultimately gave this up 😞

I still think this is a good idea though, I'm open to working on this again.  
No big push at the moment though.

---

<div class="post-metadata">

**Author:** ![David\_Stone](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/david_stone/32/79749_2.png) [@David\_Stone](https://forum.inductiveautomation.com/u/David_Stone)\
**Post date:** [October 7, 2025, 2:48am UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/4 "2025-10-07T02:48:59Z")

</div>

Shameless plug, but the perspective kiosk is pretty easy.

> [@Building a Custom Perspective Kiosk on Linux Hardware](https://forum.inductiveautomation.com/t/building-a-custom-perspective-kiosk-on-linux-hardware/79551):
>
> Just thought I would chuck a little guide together to get a working Perspective Kiosk on simple Raspberry Pi 4 Hardware. Main Features: Webkit Browser Engine: supported by Ignition as part of Safari compatibility. Full Kiosk Mode: No desktop OS on this system, no other apps, no way to exit. Hardware Acceleration: Panel PC hardware supported by linux is able to be utilised. On Screen Keyboard: Critical missing piece of 99% of similar attempts. Auto opens and closes with focus…

---

<div class="post-metadata">

**Author:** ![Kyle.Chase](https://avatars.discourse-cdn.com/v4/letter/k/3bc359/32.png) [@Kyle.Chase](https://forum.inductiveautomation.com/u/Kyle.Chase)\
**Post date:** [October 15, 2025, 6:35pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/5 "2025-10-15T18:35:12Z")

</div>

I looked into this a few years ago. The included JxBrowser library includes some libraries that need to get unzipped, have their ELF libraries and executables patched manually with patchelf, rezipped then included back in the original JAR file (I think, I haven’t looked into this in years). The next problem is that JxBrowser then compares the deployed resources with a known good file hash, which no gets invalidated. This is where I got blocked when I was looking into this.

This should mostly be correct, I am a bit foggy on the details.

---

<div class="post-metadata">

**Author:** ![bmusson](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmusson/32/87530_2.png) [@bmusson](https://forum.inductiveautomation.com/u/bmusson)\
**Post date:** [October 15, 2025, 7:21pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/6 "2025-10-15T19:21:46Z")

</div>

That matches what I was running into.

Getting the Vision client launcher to run wasn’t too bad, however.

---

<div class="post-metadata">

**Author:** ![joe.bernicke](https://avatars.discourse-cdn.com/v4/letter/j/ea666f/32.png) [@joe.bernicke](https://forum.inductiveautomation.com/u/joe.bernicke)\
**Post date:** [October 21, 2025, 12:02pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/7 "2025-10-21T12:02:57Z")

</div>

This is fantastic. I got it up and running on Ubuntu. However, I am running into the color of one of my animated fans is not correct. Since I cannot inspect the page I’m not sure how to troubleshoot. The following are animated fans on a currently working page. However, on the kiosk mode, they just show up as grey. Any ideas?

Probably worth noting the color comes from a “filter:sepia(40%) hue-rotate(100deg) saturate(10)” Prop.

\*\*\*\* After looking into it, the filter is being overwritten by the a url prop, but only in the kiosk hmi.

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/2/b/2b3933c374050c686d39873f8a2ff57431cab79e.png)

---

<div class="post-metadata">

**Author:** ![David\_Stone](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/david_stone/32/79749_2.png) [@David\_Stone](https://forum.inductiveautomation.com/u/David_Stone)\
**Post date:** [October 21, 2025, 1:46pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/8 "2025-10-21T13:46:55Z")

</div>

Are you using chromium or Firefox as the browser in the end?

---

<div class="post-metadata">

**Author:** ![joe.bernicke](https://avatars.discourse-cdn.com/v4/letter/j/ea666f/32.png) [@joe.bernicke](https://forum.inductiveautomation.com/u/joe.bernicke)\
**Post date:** [October 21, 2025, 2:54pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/9 "2025-10-21T14:54:41Z")

</div>

> [@Building a Custom Perspective Kiosk on Linux Hardware](https://forum.inductiveautomation.com/t/building-a-custom-perspective-kiosk-on-linux-hardware/79551/1):
>
> Webkit Browser Engine: supported by Ignition as part of Safari compatibility

I just followed that guide exactly on a fresh install of Ubuntu LTS Server edition. Never deliberately installed chromium or firefox.

---

<div class="post-metadata">

**Author:** ![Spencer\_Lommel1](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/spencer_lommel1/32/78679_2.png) [@Spencer\_Lommel1](https://forum.inductiveautomation.com/u/Spencer_Lommel1)\
**Post date:** [October 21, 2025, 3:19pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/10 "2025-10-21T15:19:33Z")

</div>

You might need to use [nix-ld](https://github.com/nix-community/nix-ld) for this. I have only used NixOS a bit but I have some friends that are more experienced with packaging programs for Nix.

I might give this a try over the weekend and see if I can get it working. Let me know if you try out nix-ld and if you have any luck 😄

---

<div class="post-metadata">

**Author:** ![David\_Stone](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/david_stone/32/79749_2.png) [@David\_Stone](https://forum.inductiveautomation.com/u/David_Stone)\
**Post date:** [October 21, 2025, 7:12pm UTC](https://forum.inductiveautomation.com/t/nixos-packaging-vision-client-and-perspective-workstation/95703/11 "2025-10-21T19:12:37Z")

</div>

> [@Building a Custom Perspective Kiosk on Linux Hardware](https://forum.inductiveautomation.com/t/building-a-custom-perspective-kiosk-on-linux-hardware/79551/7):
>
> Agreed. The frequent crashes of mir-kiosk made it a non-starter, even though the ease-of-installation/configuration/use was a huge benefit. Firefox has, so far, proven to be more stable, albeit far more complicated to configure. Recent Ignition versions include updates to Java, and recent Perspective Workstation versions include updates to JxBrowser, of which supports Wayland. When time allows...I intend to dabble... A bash script to migrate from the above mir-kiosk snap to Firefox snap might r…

Perhaps try the script in this post, we definitely found a couple of issues with the initial method later on in the topic and tried other methods with success.
