Software used for running custom display walls.
Init diesel database and make schema changes
# inital setup
docker compose -f docker-compose.diesel.yml run --rm diesel setup && docker compose -f docker-compose.diesel.yml down --remove-orphans
# create migration
docker compose -f docker-compose.diesel.yml run --rm diesel migration generate init && docker compose -f docker-compose.diesel.yml down --remove-orphans
# run migrations and print schema to file
docker compose -f docker-compose.diesel.yml run --rm diesel migration run && docker compose -f docker-compose.diesel.yml run --rm diesel migration redo && docker compose -f docker-compose.diesel.yml down --remove-orphans
# redo migrations while developing on a running instance
docker compose -f docker-compose.diesel.yml run --rm diesel migration run && docker compose -f docker-compose.diesel.yml run --rm diesel migration redoRun dev mode
echo -e "UID=$UID\nHOME=$HOME" > .env
docker compose updocker compose -f docker-compose.buildrun.yml updocker compose -f docker-compose.build.yml up --abort-on-container-exit && docker compose -f docker-compose.build.yml down --remove-orphansOr legacy linux versions (older glibc).
docker compose -f docker-compose.buildlegacy.yml up --abort-on-container-exit && docker compose -f docker-compose.buildlegacy.yml down --remove-orphansdocker compose -f docker-compose.buildwindows.yml up --abort-on-container-exit && docker compose -f docker-compose.buildwindows.yml down --remove-orphansCAUTION: js must have been compiled beforehand -> run Build for linux, legacy or windows first!!!!
docker buildx create --use
docker login
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t kellehorreur/jta-display-wall-adapter:latest \
-f docker/run/Dockerfile \
--push .- Copy over the executable from the previous compilation step (
/target/x86_64-pc-windows-gnu/release/jta-display-wall-adapter.exe) - Also copy the batch file
/start-jta-display-wall-adapter.batand the icon/Link-Icon.ico - Put that together in a folder somewhere you desire
- Now right click on the .bat file "Send to Desktop (create a shortcut)"
- Edit the shortcut and prepend/edit the location with
C:\Windows\System32\cmd.exe /c "<...this is the content that was previously in the field...>"- Now this is seen as an executable and you can pin it to the taskbar by dragging
- Now for this shortcut you can set the icon
- For running the Wind server automatically
- Do everything in this readme
- Get the correct Com-Port from the device manager
- Modify the
start-jta-display-wall-adapter.batfor use with wind-server mode (set Com-port and usb-iteration delay if you want) by setting mode towind - Place a windows compiled version alongsite the .bat in a folder
- Create a link to the .bat, by right-clicking -> Desktop-shortcut
- Open the startup-folder by
Win+R:shell:startup - Place the link inside it
Generally, to run this you require an installation of Docker with Docker compose.
In the case of this all being available, you only need to run the following command inside the main folder of this repository.
sudo ./run.sh
# or the native version
sudo ./run.sh [compose dir path] --nativeStarting with a blank Raspberry Pi 3B and flashing the default Raspberry Pi OS Trixie (64 bit) image with desktop with the use of Raspberry Pi Imager.
In this case, the user that is used in installation is called wall (as we use this for a local video wall).
Upgrade the installation and install docker:
sudo apt-get update
sudo apt-get upgrade
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl enable docker
sudo systemctl start docker
mkdir -p ~/.docker/cli-plugins/
ARCH=$(uname -m)
curl -SL https://github.com/docker/compose/releases/download/v2.40.3/docker-compose-linux-$ARCH -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-composeSet the session to Wayland (should be already) and make the user auto-login on boot:
sudo raspi-config # check that is set to wayland -> screen blank can be also dissable there, but I do not think it does anything after switching to sway
sudo apt install sway foot
sudo nano /usr/share/wayland-sessions/sway.desktop # check if it is there and filledsudo nano /etc/lightdm/lightdm.confModify the config file that opens.
At the Part [Seat:*] (probably it reads rpd-labwc) replace with the following settings
user-session=sway
autologin-session=sway
autologin.user=wall # the user of the pi is called wall
autologin-user-timeout=0
mkdir ~/.config/sway
sudo nano ~/.config/sway/config# Set mod key (Super/Windows key)
set $mod Mod4
# Basic keybindings
bindsym $mod+Return exec foot
# Move focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# Close window
bindsym $mod+Shift+q kill
# Bar (status bar) at the bottom
bar {
position bottom
}
# hide cursor
seat * hide_cursor 1000
exec foot -e sh -c "cd /home/wall/Desktop/jta-display-wall-adapter && ./run.sh /home/wall/Desktop/jta-display-wall-adapter --native"
On Sway you can open a console with Windows + Enter.
swaymsg reload
swaymsg -t get_tree
swaymsg "[title=\"JTA Display Window\"]" move position 100 200Save, then the command echo $XDG_SESSION_TYPE should produce wayland.
And echo $DESKTOP_SESSION should yield sway.
On re-log you should also immediately boot into sway tiling window manager now.
Is already achieved with the last line of the sway config.
Fill the new file with the correct folder location (this assumes, that the repo was cloned to home/wall/Desktop/jta-display-wall-adapter).
The following command shows the name of the wired connection (use any other interface you want to target).
We assume, that the system uses NetworkManager.
Caution, you probably lose internet access after this, if your network can't handle the newly static assigned IP/Subnet.
nmcli device status # find devices (later, name is already filled in as "eth0")
nmcli connection # find the name of the default connection (later, name is already filled in as "Wired connection 1")Modify the connection (Here the IP is pre-filled with 192.168.150.150, replace with your IP if needed):
sudo nmcli connection add type vlan con-name vlan12 dev eth0 id 12 \
ipv4.method auto \
ipv6.method ignore \
connection.autoconnect yes
sudo nmcli connection add type vlan con-name vlan11 dev eth0 id 11 \
ipv4.addresses 192.168.150.150/24 \
ipv4.method manual \
ipv6.method ignore \
connection.autoconnect yes
sudo nmcli connection del "Wired connection 1" # remove default connection -> might come back after restart, but not connect
sudo systemctl restart NetworkManagerNow running ifconfig whould show that the main network connection has a static IP on V11 and DHCP on V12.
This is a relativiely specific configuration, tailored to the needs to this setup. It is most likely not useful exactly for anyone else, as probably noone has the exact VLAN configuration at their raspberry pis ethernet port.
Make the networking delay on boot (as otherwise the switch is not yet ready...):
sudo mkdir -p /etc/systemd/system/NetworkManager.service.d
sudo nano /etc/systemd/system/NetworkManager.service.d/delay.confFill the newly opened config with the following;
[Service]
ExecStartPre=/bin/sleep 30
And run the remaining commands to enable the changes and trigger a reboot to test everything:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo rebootRust:
cargo install cargo-license
cargo license -a > THIRD-PARTY-LICENSES-RUSTJS:
npx generate-license-file
cd web_client
npx generate-license-file \
--input package.json \
--output ./../THIRD-PARTY-LICENSES-JS \
--overwriteCopyright © 2025 Just in Time Association - Website
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International License.
Additional Requirement:
Users must notify Just in time Association at contact@just-in-time-association.de prior to any public use or distribution of this software.
This project includes third-party assets licensed under separate terms. See Third Party Licenses
