Skip to content
  • system.yaml v4 badge#

    Manage your whole system with one file.

    • Language:
    • Comes with blendOS:

    File Location
    󰉋 /
    └── 󱀺 system.yaml

    To edit the file, just open it in your favorite text editor ( You will need root privileges.).

What is system.yaml?

system.yaml is a simple host system configuration. It allows you to tweak many essential aspects of the host quickly and easily.

system.yaml is... system.yaml is not...
...device-independent and transferrable ...advanced, config is quite simple.
...simple NixOS
...deployable, via tracks ...the way to use most apps on blendOS


Any options marked with a next to their name in the expanded view can be set by a track.

All values shown here are default values or examples. You can find the default value (as well as info and examples) in the tooltip ().

repo: '' # (1)!

arch-repo: '' # (10)!

impl: '' # (2)!

track: 'plasma' # (3)!

packages: # (4)!
  - 'package_1'
  - 'package_2'

aur-packages: # (5)!
  - 'package_1-git'
  - 'package_2-bin'

services: # (6)!
  - 'service_1'

user-services: # (9)!
  - 'user-service_1'

package-repos: # (7)!
  - name: 'REPO_NAME'
    repo-url: 'REPO_URL'

commands: # (8)!
  - 'echo command_1'
  - 'echo command_2'
  1. repo

    Type: string

    Default Value:

    This option must be set.

    Sets the repo for the core blendOS packages.

  2. impl

    Type: string

    Default Value:

    This option must be set.

    Sets the raw URL prefix (track files are appended to the prefix to make a URL).

    This must be set to ensure that the full URL will serve all available files with a Content-Type of text/plain.


    If the start of the file looks like this:

    repo: ''
    impl: ''
    track: 'plasma'

    The fully generated URL would be:

    which would redirect to:

    which serves the file with a Content-Type of text/plain.

  3. track

    Type: string

    This option must be set.

    Sets the track (a mini system.yaml), which must be a YAML file in the folder of the impl URL.

    Available options are determined by the impl URL.

    If you are creating a custom track that does not inherit anything, set this value to custom.


    If I have a track folder/repo with the following files:

    • track-1.yaml
    • track-2.yaml

    and I set my impl URL properly, I then have 2 track options:

    track: 'track-1'


    track: 'track-2'
  4. packages

    Type: array

    A list of packages to install using pacman (includes any custom repos you have set).

  5. aur-packages

    Type: array

    A list of AUR packages to install using paru.

  6. services

    Type: array

    A list of services to start at boot using systemd.

  7. package-repos

    Type: object array

    Custom repos to add to pacman.conf.

    name: The repo's name parameter in pacman.conf (the value between [])

    repo-url: The repo's URL (no mirrorlists) (the Server variable from pacman.conf)

    Value Placement
    Server = repo-url
    SigLevel = Never
    Example: Chaotic AUR

    To add the Chaotic AUR, the values here would be set to the following:

    The name parameter is used as $repo in these URLs, so do not change it from the maintainer's default!

      - name: 'chaotic-aur'
        repo-url: '$repo/$arch'
  8. commands

    Type: array

    A list of commands to be run as root at system build.

  9. user-services

    Type: array

    A list of services to start at system boot at the user level (systemctl --user).

  10. arch-repo

    Type: string

    Default Value:

    This is not specified in the file, but is rather the default if no value is specified.

    The main Arch Linux repo to use in pacman.conf.

    Do not put a trailing / at the end of the URL.

    Do not do this:

    arch-repo: ''

    Do this:

    arch-repo: ''

    You can find a list of mirror URLs by visiting (and looking at the bullet list, this shows nearby mirrors) or the Arch mirrorlist. Only copy the first part of the URL (before $repo).


    If I want to use the University of Waterloo's mirror (🇨🇦):

    URL shown in the mirrorlist$repo/os/$arch
    arch-repo: ''

    You put the link to the folder that has a directory list like this:

    Some Mirror
    ├── 󰉋 core
    ├── <variants>
    ├── 󰉋 community
    ├── <variants>
    ├── 󰉋 multilib
    ├── <variants>
    └── <more folders>


Always use the .yaml extension when creating track files!

akshara always looks for files with the .yaml extension, not .yml.

Tracks are like mini system.yaml files that you can create. They can inherit other tracks, or be entirely custom. They can be used to set default values for a certain configuration, like a desktop.

Track layout#

A track is structured exactly like a system.yaml, repo and all (yes you must set the repo, impl, and track).

As an example of a custom track, let's look at the official blendos-base track:

track: 'custom'

  - 'alsa-utils'
  - 'amd-ucode'
  - 'arch-install-scripts'
  - 'b43-fwcutter'
  - 'archlinux-keyring'
  - 'base-devel'
  - 'git'
  - 'bash'
  - 'bzip2'
  - 'coreutils'
  - 'file'
  - 'filesystem-blend'
  - 'findutils'
  - 'gawk'
  - 'gcc-libs'
  - 'gettext'
  - 'glibc'
  - 'grep'
  - 'gzip'
  - 'iproute2'
  - 'iputils'
  - 'licenses'
  - 'pacman'
  - 'pciutils'
  - 'procps-ng'
  - 'psmisc'
  - 'sed'
  - 'shadow'
  - 'systemd'
  - 'systemd-sysvcompat'
  - 'tar'
  - 'util-linux'
  - 'xz' 
  - 'bash'
  - 'bash-completion'
  - 'bind'
  - 'blend'
  - 'blend-settings'
  - 'brltty'
  - 'broadcom-wl-dkms'
  - 'btrfs-progs'
  - 'cryptsetup'
  - 'dhclient'
  - 'dmidecode'
  - 'dnsmasq'
  - 'dosfstools'
  - 'e2fsprogs'
  - 'efibootmgr'
  - 'espeakup'
  - 'exfatprogs'
  - 'f2fs-tools'
  - 'fatresize'
  - 'gpart'
  - 'gptfdisk'
  - 'grub'
  - 'hdparm'
  - 'hyperv'
  - 'intel-ucode'
  - 'irssi'
  - 'less'
  - 'libfido2'
  - 'libusb-compat'
  - 'linux-zen'
  - 'linux-zen-headers'
  - 'linux-atm'
  - 'linux-firmware'
  - 'linux-firmware-marvell'
  - 'man-db'
  - 'man-pages'
  - 'mc'
  - 'mdadm'
  - 'memtest86+'
  - 'mkinitcpio'
  - 'mkinitcpio-archiso'
  - 'mkinitcpio-nfs-utils'
  - 'modemmanager'
  - 'mtools'
  - 'nano'
  - 'nbd'
  - 'ndisc6'
  - 'nfs-utils'
  - 'nilfs-utils'
  - 'ntfs-3g'
  - 'openconnect'
  - 'openssh'
  - 'openvpn'
  - 'os-prober'
  - 'parted'
  - 'partimage'
  - 'pcsclite'
  - 'ppp'
  - 'pptpclient'
  - 'pv'
  - 'rsync'
  - 'smartmontools'
  - 'sof-firmware'
  - 'squashfs-tools'
  - 'sudo'
  - 'syslinux'
  - 'tcpdump'
  - 'tpm2-tss'
  - 'udftools'
  - 'usb_modeswitch'
  - 'usbmuxd'
  - 'usbutils'
  - 'vpnc'
  - 'wireless-regdb'
  - 'wireless_tools'
  - 'wpa_supplicant'
  - 'wvdial'
  - 'xfsprogs'
  - 'xl2tpd'
  - 'bluez'
  - 'networkmanager'
  - 'cups'
  - 'ttf-jetbrains-mono'

  - 'cups'
  - 'bluetooth'
  - 'NetworkManager'

  - 'blend-files'

Here, the track value is set to custom (no impl), indicating a fully custom track. This track is setting default values for whomever uses it.

Tracks can also inherit from eachother (see next section).


Inherited tracks are the most common type of track. They can be used to tack on different desktops, additional drivers/programs, to another track.

An example of this is the official plasma track.

impl: ''

track: 'blendos-base'

  - 'kde-system-meta'
  - 'kde-utilities-meta'
  - 'plasma'
  - 'plasma-workspace'
  - 'sddm'
  - 'waydroid'
  - 'waydroid-image'

  - 'sddm'

  - 'rm -f /usr/share/applications/Waydroid.desktop'

All of our desktop tracks inherit blendos-base. If you're creating a new desktop/WM track do this as well.

To inherit a track, simply set an impl and a track value in your track file.


impl: ''

track: blendos-base

  - 'some-desktop'

This track now inherits from blendos-base, and adds a desktop to it.

If you're creating a fully custom track and do not want to inherit, simply set your track to custom with no impl (as mentioned above).


If your track inherits a track that inherits another track (reinheritance), issues may result, like certain sections of the file being ignored. This is due to an akshara bug we are still investigating.

Creating a track repo/webserver#

First, create a repo on your favorite git forge, and put all your track files in the root of it.

If you want to do this quickly, just fork our track repo!

Once that is done, you'll need to make your impl URL.

impl URL structures for common git forges


  • GITLAB-SERVER: Your gitlab server (usually


  • GITEA-SERVER: Your Gitea/Forgejo server ( is a popular one)

  • FULL_COMMIT_HASH: The full hash of the latest commit (you can get this under Commits)
  • USER: Your username
  • REPO: The repo
  • BRANCH: Your branch (usually main or master)

If you're using a webserver, put all the files in one folder. Your impl URL is the URL to that folder.

Custom repositories#

Custom repositories in system.yaml are quite easy.

If we use the arch-mact2 repo as an example, the repo folder structure is like this:
󰉋 /
└── 󰉋 arch-mact2
    └── 󰉋 os
        └── 󰉋 x86_64
            └── <repo files>

We can replace some of these with values.
󰉋 /
└── 󰉋 $repo
    └── 󰉋 os
        └── 󰉋 $arch
            └── <repo files>

In system.yaml, $arch corresponds to your system's architecture (currently x86_64) and $repo corresponds to your name parameter.

These variables are parsed by pacman, so never remove or change them from your mirror URL.

Configuring this mirror in system.yaml would look like this:

  - name: 'arch-mact2'
    repo-url: '$repo/os/$arch/'

Corresponding to this in pacman.conf:

Server =$repo/os/$arch
SigLevel = Never