Skip to content

Repository files navigation

Artifact HubBuild DLT OS

Shows the dltos logo, with three diagonal stripes in dark blue, cyan, and yellow. In the center, the acronym DLT is displayed in pink.

DLT OS

Custom Bazzite image based on bazzite-nvidia-open. It adds a preconfigured niri + noctalia minimal setup, providing a default system-wide config, as well as any tools or scripts required to solve any annoying or issues we might find. For example, we include a system-wide tray-launch script to wrap misbehaving spawn-at-startup entries that fail to properly load the tray icon.

DLT in dltos stands for Data Lab Tech, so dltos also provides all the software used for development, infra, and data-related tasks, as seen on the YouTube videos by @DataLabTechTV.

I mostly maintain this image for myself and any viewers who want the same experience of what they see on my videos out-of-the-box. Regardless, if you have any requests, please let me know through the Discussion section.

For more details on how to build your own custom image, please read the documentation provided with the Universal Blue template, which also applies to this image.

Maintenance

Switching

In order to switch to dltos from bazzite-nvidia-open, you can simply run the following command:

sudo bootc switch ghcr.io/datalabtechtv/dltos:stable

Caution

Make sure your system has an NVIDIA GPU, otherwise the image is unlikely to work, due to it being based on bazzite-nvidia-open.

After you reboot, you'll be running dltos, with the default KDE and niri as an additional option. You can switch to niri as the default directly from the SDDM login manager shown on boot.

Upgrading

When you need to update your system, you can either do it with ujust update or rpm-ostree upgrade, as usual, or can simply run:

sudo bootc upgrade

Testing Packages with Distrobox

The bundled dltos distrobox is no longer meant to be used as the main working environment. Instead, it can be used to easily sping up an environment that is consistent with the host OS, so that we can temporarily add features for testing and later integration into the custom bootc image.

For example, let's say you needed to install a CLI tool like bat for testing, before you decide to add it to your fork of DLT OS. You could simply create and enter the dltos distrobox:

distrobox assemble create --file /etc/distrobox/dltos.ini --replace && distrobox enter dltos

And then, once inside the distrobox, install the CLI tool and export it:

sudo dnf5 -y install bat
distrobox-export --bin /usr/bin/bat

Once you exit the distrobox, the binary you just exported will be available on your host, through ~/.local/bin.

If, instead, it's a desktop app you want to test:

sudo dnf5 -y install emacs-pgtk
distrobox-export --app emacs

And you'll find that the desktop application is now listed on your system menu.

If, for some reason, you depend on one of the host's tools inside distrobox, you can simply:

sudo ln -s /usr/bin/distrobox-host-exec /usr/local/bin/podman

The example above will expose the host's podman command through distrobox-host-exec. This way, you might be able to launch containers in the host through the emacs instance running inside the distrobox container.

Testing and Managing User Configs

Any user configs provisioned by systemd-tmpfiles on first login can be modified as usual without being overwritten, but if you want to merge them back to your own fork of DLT OS, then you can use the following just commands to help you out:

just diff-all-user-configs # view global changes in a side-by-side diff
just import-all-user-configs # overview repo's configs with the user versions

This can also be done individually using just diff-<app>-user-configs and just import-<app>-user-configs for the following apps:

  • nvim
  • gamescope
  • konsole
  • niri
  • zed

The previous configs cover only the settings that are of interest to be and are, by no means, complete, but it should be enough to help you getting started.

For system-level configs under /etc (e.g., zsh, bat, etc.), I recommend that you check the corresponding package's documentation for the user config directory, if you want to test any settings locally. Depending on the package, user configs might extend or overwrite the system-level configs, so there is no general approach here.

Features

  • Preconfigured niri out-of-the-box, with the noctalia shell, on the custom bootc image.
  • Go, Rust, Python, and Node tooling, providing go, cargo, uv, andnpm, through a bundled distrobox config.
  • System-wide tools, installed via dnf5, go install, cargo install, or uv tool install, making it easy to naturally extend, if you need to add to the bundled distrobox config, while keeping your home clean.

The following sections summarize the packages that DLT OS provides out-of-the-box, where Base refers to the custom bootc image, while everything else is shipped as a distrobox config under /etc/distrobox/dltos.ini, which you can use by running the following commands:

distrobox assemble create --file /etc/distrobox/dltos.ini
distrobox enter dltos

Base

For the base system, defined in the custom bootc image, we add niri and noctalia-shell, alongside a few utilities. We also remove xwaylandvideobridge, which opens a blank window by default on niri, but seems to be deprecated anyway. This let's us run the xwayland-satellite integration without issues.

PackageVersionViaObservation
niri>= 25.11dnf5niri compositor
noctalia-shell>= 4.7.6dnf5Noctalia shell (bar and panels).
niri-float-sticky>= 0.0.8goUtility to keep a window visible on all workspaces (installed as a systemd user service).
xdg-desktop-portal-gnome>=49.0dnf5Required for the Screen Capture (PipeWire) feature on OBS.
qt6ct>=0.11dnf5Let's you pick the Qt theme without using KDE utilities.
wev>=1.1.0dnf5Keyboard and mouse event debugging utility.
wlsunset>=0.4.0dnf5Used for Noctalia's Night Light feature.
cava>=0.10.2dnf5Used for Noctalia's audio visualizers.
playerctl>=2.4.1dnf5Controls your media player (e.g., Spotify) via preconfigured niri keybinds.

Portals

Here are a few notes about portals. The system will install portal configs by default under /usr/share/xdg-desktop-portal. In DLT OS you'll find niri-portals.conf and kde-portals.conf, preinstalled by KDE and niri, respectively. By default, niri-portals.conf should be used. However, we currently still use kwallet6, and we haven't added gnome-keyring yet, so, for now, we provide a custom config under /etc/xdg/xdg-desktop-portal/niri-portals.conf with the following configs:

[preferred]
default=gnomeorg.freedesktop.impl.portal.Notification=kdeorg.freedesktop.impl.portal.FileChooser=kdeorg.freedesktop.impl.portal.Print=kdeorg.freedesktop.impl.portal.ScreenCast=gnomeorg.freedesktop.impl.portal.Screenshot=gnome

Please also notice that the xdg-desktop-portal-gnome package has been bugged since 2022. When adding multiple capture sources, or re-selecting the window for the source, it will not respond correctly. Follow their #40 issue about this problem.

Qt Theming

We use qt6ct for theming Qt apps on niri. This is provided by an environment config under /etc/environment.d/niri.conf containing:

QT_QPA_PLATFORM=wayland
QT_QPA_PLATFORMTHEME=qt6ct
QT_QPA_PLATFORMTHEME_QT6=qt6ct

Make sure to run the following command the logout afterward:

systemctl --user daemon-reexec

Languages

PackageVersionViaObservation
golang>=1.25.8dnf5Used to install system-wide tools under /usr/bin.
cargo>=1.93.1dnf5Used to install system-wide tools under /usr/bin.
uv>=0.10.9dnf5Used to install system-wide tools under /usr/share/uv/tools, symlinked to /usr/bin. Defaults to python >=3.14.3, which is the system default.
node-npm>=10.9.4dnf5Depends on node >=22.22.0, which is installed as a dependency. Let me know if you need pnpm or other node tooling that we currently don't include.
just-lsp>=0.4.0dnf5Language server for your justfile.
gopls>=0.21.1dnf5Language server for Go code.
golangci-lint>=2.11.3dnf5Can be integrated with pre-commit for Go code linting.
shfmt>=3.13.0dnf5Can be used with your editor to format shell scripts.

Shell

PackageVersionViaObservation
kitty>=0.43.1dnf5GPU-accelerated terminal emulator. Highly customizable.
zsh>=5.9dnf5The Z shell is now the default shell for DLT OS.
starfish>=1.24.2dnf5Cross-shell prompt, with good defaults. Requires atim/starship COPR.
chezmoi>=2.70dnf5Used to manage dotfiles. Take a look at the DataLabTechTV/dotfiles repo for an example and instructions on how to use.
direnv>=2.35dnf5Utility to automatically load and unload .envrc or .env files per directory.
zoxide>=0.9.8dnf5Useful cd replacement, with fuzzy matching and filtering.
bat (batcat)>=0.25.0dnf5Replacement for cat with syntax highlighting and pager by default. You can also use it to improve readability for help messages (e.g., cat --help | bat -l help) or man pages (e.g., man cat | bat -l man).
rg (ripgrep)>=14.1.1dnf5Recursive grep alternative. Generally more efficiency than grep -r.
fd (fd-find)>=10.4.2dnf5User-friendly find command. Good for quick file searching, but you might still prefer find, depending on the task.
eza>=0.23.4cargoBeautified version of ls, with features like icons or tree listing.
ncdu>=2.9.2dnf5Utility for recursively measuring storage, identifying largest directories. Useful for large file system cleanup.
prettyping>=1.1.0dnf5Utility ping script useful for visually monitoring packet loss.

Network

PackageVersionViaObservation
rclone>=1.73.0dnf5This is like the rsync for cloud storage. It can connect to wherever, from S3 to Dropbox.
iperf3>=3.19.1dnf5Useful to measure network bandwidth and performance.
mkcert>=1.4.4dnf5Easily run your local CA to issue certificates.
nc>=7.92dnf5Swiss army knife for network communication.
nmap>=7.92dnf5Port mapping software.
mcdevgoMinIO command line client.
s5cmddevgoAnother S3 client.
warpdevgoBenchmark software for S3 object stores, by MinIO.
httpie>=3.2.4uvCommand line REST API request tool. We include support for SigV4.

Graphics

PackageVersionViaObservation
ImageMagick-heic>=7.1.1.47dnf5ImageMagick support for HEIC format.
libheif-freeworld>=1.20.2dnf5Only available on the rpmfusion-free repo. Adds support for Apple's HEIC format.
rembg[gpu,cli]>=2.0.73uvAI tool to remove the background from photos.

Dev

PackageVersionViaObservation
pre-commit>=4.5.1dnf5Useful to run linters and formatters before git commit.
cloc>=2.08dnf5Counts lines of code, so you can get some stats for your codebase.
delta (git-delta)>=0.18.2dnf5A better diff for the CLI, with side-by-side support.
nvim (neovim)>=0.11.6dnf5Replaces vim-minimal. Set as the default alternative for vim (i.e., vim command will run nvim).
lazygit>=0.60.0dnf5Requires the dejan/lazygit COPR.
hugo>=0.111.3goThis is pinned to an older version that works with the blowfish theme.

Containers

PackageVersionViaObservation
docker (docker-cli)>=29.3.0dnf5Uses the user's Podman by default, via the corresponding socket, via the provided script.
docker-compose(docker-compose-switch)>=5.1.0dnf5The docker-compose package is deprecated. This isn't a command to switch compose versions, but a new package they are switching to. Uses the user's Podman by default, via the corresponding socket, via the provided script.
lazydocker>=0.25.0goTUI for docker.
cosign>=3.0.5goUsed to sign container images, like this one.

AI

PackageVersionViaObservation
ramalama>=0.21.0uvTo run your LLM models and coding agents locally in a sandbox.

Data

PackageVersionViaObservation
sqlite3dnf5Embedded SQL database, with support for WAL.
duckdbOfficial ArchiveEmbedded SQL database, that works as a data lakehouse, supporting ETL and analytics locally.
mlr (miller)dnf5CSV query tool.
yq>=4.47.1dnf5YAML query tool similar to what jq is for JSON.
gnuplotdnf5Command line plotting tool, with multiple charting options, that produce images.
termgraphuvCommand line plotting tool, that produces charts directly in the terminal.
visidatauvTUI for data exploration.

Validations

We also include a validations script, where, at this point, we only validate the /etc/niri/config.kdl file.

Acknowledgements

A big thanks to the helpful people at the Universal Blue Discord server, who promptly answered my questions on building a custom image of Bazzite.

About

Custom Bazzite image based on Niri and Noctalia, built for the Data Lab Techs out there.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Packages

Contributors

Languages