diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1c42b80
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/usr/share/sofirem/__pycache__/
+__pycache__/
+**.lst
\ No newline at end of file
diff --git a/usr/bin/sofi b/usr/bin/sofi
new file mode 120000
index 0000000..80313c7
--- /dev/null
+++ b/usr/bin/sofi
@@ -0,0 +1 @@
+sofirem
\ No newline at end of file
diff --git a/usr/bin/sofirem b/usr/bin/sofirem
new file mode 100755
index 0000000..44fb7a1
--- /dev/null
+++ b/usr/bin/sofirem
@@ -0,0 +1,51 @@
+#!/usr/bin/env sh
+
+# this script should not be run as root
+# the polkit agent running on the desktop environment should prompt for root password
+
+echo "---------------------------------------------------------------------------"
+echo "[INFO] Checking session"
+test $(whoami) == "root" && echo "[ERROR] Do not run this script as root." && exit 1
+test -z $DISPLAY && echo "[ERROR] DISPLAY variable is not set." && exit 1
+
+# check session is either one of X11, Wayland or TTY
+session=$(loginctl show-session $(loginctl|grep $(whoami) | awk '{print $1}') -p Type | awk -F= '{print $2}' | grep "x11\|wayland\|tty")
+
+test -z "$session" && echo "[ERROR] Failed to verify session for user." && exit 1
+
+xauth_file=$(xauth info | awk -F"Authority file:" '{print $2}' | tr -d ' ')
+test -s "$xauth_file" || touch "$xauth_file"
+
+case "$session" in
+ "wayland")
+ # Wayland session, generate Xauth session cookie for $DISPLAY
+ xauth gen $DISPLAY &> /dev/null
+ echo "[INFO] Display = $DISPLAY"
+ echo "[INFO] Session = $session"
+
+ test -z "$(xauth list)" || echo "[INFO] Xauth session = OK"
+ ;;
+ "x11")
+ # X11 session, don't do anything here
+ echo "[INFO] Display = $DISPLAY"
+ echo "[INFO] Session = $session"
+
+ # just show msg on whether the Xauth session cookie is setup
+ test -z "$(xauth list)" || echo "[INFO] Xauth session = OK"
+ ;;
+ "tty")
+ # TTY session, as user may not use a display manager
+ echo "[INFO] Display = $DISPLAY"
+ echo "[INFO] Session = $session"
+
+ test -z "$(xauth list)" || echo "[INFO] Xauth session = OK"
+ ;;
+ *)
+ # anything here is an unknown session, most likely Sofirem will fail to load
+ echo "[WARN] Cannot verify session for user."
+ ;;
+esac
+echo "---------------------------------------------------------------------------"
+
+echo "[INFO] Starting Sofirem"
+pkexec '/usr/share/sofirem/sofirem.py'
diff --git a/usr/share/applications/sofirem.desktop b/usr/share/applications/sofirem.desktop
new file mode 100644
index 0000000..b6d8334
--- /dev/null
+++ b/usr/share/applications/sofirem.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Name=Sofirem - Software installer/remover for Arch Linux based systems
+GenericName=Sofirem
+X-GNOME-FullName=Sofirem
+Comment=Software installer/remover for Arch Linux based systems
+Exec=/usr/bin/sofirem
+Icon=sofirem
+Terminal=false
+Type=Application
+Categories=GTK;GNOME;Utility;Settings;Security;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-Unity-Settings-Panel;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
+Keywords=application;installer;
+StartupNotify=true
diff --git a/usr/share/icons/hicolor/scalable/apps/sofirem.svg b/usr/share/icons/hicolor/scalable/apps/sofirem.svg
new file mode 100644
index 0000000..42aae40
--- /dev/null
+++ b/usr/share/icons/hicolor/scalable/apps/sofirem.svg
@@ -0,0 +1,69 @@
+
+
diff --git a/usr/share/polkit-1/actions/org.arcolinux.sofirem.policy b/usr/share/polkit-1/actions/org.arcolinux.sofirem.policy
new file mode 100644
index 0000000..2ee0e43
--- /dev/null
+++ b/usr/share/polkit-1/actions/org.arcolinux.sofirem.policy
@@ -0,0 +1,104 @@
+
+
+
+ ArcoLinux
+ http://arcolinux.info/
+ package-x-generic
+
+ Change your own user data
+ 變更您自身的使用者資料
+ 修改您的用户数据
+ Зміна даних вашого користувача
+ Kullanıcı bilgilerinizi değiştirin
+ Ändra ditt egna användardata
+ Измените ваше личне корисничке податке
+ Izmenite vaše lične korisničke podatke
+ Spremenite lastne uporabniške podatke
+ Zmeniť svoje vlastné používateľské údaje
+ Изменить личные пользовательские данные
+ Alterar os seus próprios dados
+ Alterar dados do próprio usuário
+ Zmiana własnych danych
+ ਆਪਣਾ ਯੂਜ਼ਰ ਡਾਟਾ ਬਦਲੋ
+ Modificar sas pròprias donadas
+ Uw eigen gebruikersgegevens bewerken
+ Mainīt pašam savus lietotāja datus
+ Keisti savo naudotojo duomenis
+ 개인 사용자 데이터 변경
+ Өзіңіздің пайдаланушы ақпаратыңызды өзгерту
+ თქვენი პირადი ინფორმაციის შეცვლა
+ 自身のユーザーデータを変更する
+ Cambia i propri dati utente
+ Ubah data penggunamu sendiri
+ Modificar tu proprie datos de usator
+ Saját felhasználói adatainak módosítása
+ Promijenite vlastite korisničke podatke
+ Cambiar os seus propios datos de usuario
+ Cambie i tiei dâts utent
+ Modifier ses propres données
+ Muuta omia käyttäjätietojasi
+ Aldatu zure erabiltzaile-datuak
+ Cambie sus propios datos de usuario
+ Ŝanĝi viajn proprajn uzantodatumojn
+ Change your own user data
+ Change your own user data
+ Αλλάξτε τα δεδομένα χρήστη σας
+ Ändern Sie Ihre eigenen Benutzerdaten
+ Skift data for din egen bruger
+ Změnit své vlastní údaje
+ Canvieu les dades d'usuari pròpies
+ Camudacia de los tos datos d'usuariu
+ غيّر بيانات المستخدم خاصتك
+ Authentication is required to change your own user data
+ 若要變更您自身的使用者資料需要核對身分
+ 需要授权以修改您的用户数据
+ Для зміни даних вашого користувача потрібно пройти розпізнавання
+ Kendi kullanıcı bilginizi değiştirmek için kimlik kanıtlaması gereklidir
+ Autentisering krävs för att ändra ditt egna användardata
+ Потребно је потврђивање идентитета за промену ваших личних корисничких података
+ Potrebno je potvrđivanje identiteta za promenu vaših ličnih korisničkih podataka
+ Za spremembo lastnih podatkov je zahtevana overitev
+ Na zmenu vlastných používateľských údajov je potrebné overenie totožnosti
+ Для изменения личных пользовательских данных требуется аутентификация
+ É necessária autenticação para alterar os seus próprios dados de utilizador
+ Autenticação é necessária para alterar dados do próprio usuário
+ Wymagane jest uwierzytelnienie, aby zmienić własne dane
+ ਤੁਹਾਡਾ ਯੂਜ਼ਰ ਡਾਟਾ ਬਦਲਣ ਲਈ ਪਰਮਾਣਿਤ ਹੋਣ ਦੀ ਲੋੜ ਹੈ
+ Vos cal vos autentificar per modificar vòstras pròprias donadas d'utilizaire
+ Authenticatie vereist om uw eigen gebruikersgegevens te kunnen veranderen
+ Nepieciešama autentifikācija, lai mainītu pats savus lietotāja datus
+ Norint keisti savo naudotojo duomenis, reikia patvirtinti tapatybę
+ 내 사용자 데이터를 변경하려면 인증해야 합니다
+ Өзіңіздің пайдаланушы ақпаратыңызды өзгерту үшін аутентификация керек
+ თქვენი პირადი მონაცემების შესაცვლელად აუცილებელია ავთენტიფიკაციის გავლა.
+ 自分自身のユーザーデータを変更するには認証が必要です
+ È richiesto autenticarsi per cambiare i propri dati utente
+ Otentikasi diperlukan untuk mengubah data pengguna milikmu
+ Authentication es necessari pro modificar tu proprie datos de usator
+ Hitelesítés szükséges a saját felhasználói adatai módosításához
+ Potrebna je ovjera za promjenu vlastitih korisničkih podataka
+ Requírese autenticación para cambiar os seus propios datos de usuario
+ La autenticazion e je necssarie par cambiâ i propris dâts utent
+ Vous devez vous authentifier pour modifier vos propres données utilisateur
+ Omien käyttäjätietojen muuttaminen vaatii tunnistautumisen
+ Derrigorrezkoa da autentifikatzea zure erabiltzaile-datuak aldatzeko
+ Se necesita autenticación para cambiar sus datos de usuario
+ Aŭtentigo bezonatas por ŝanĝi viajn proprajn uzantodatumojn
+ Authentication is required to change your own user data
+ Authentication is required to change your own user data
+ Απαιτείται πιστοποίηση για αλλαγή των δικών σας δεδομένων χρήστη
+ Zur Änderung Ihrer eigenen Benutzerdaten ist eine Authentifizierung erforderlich
+ Der kræves autentifikation for at skifte data for din egen bruger
+ Pro změnu svých vlastních údajů je vyžadována autentizace
+ Es requereix autenticació per canviar les vostres dades d'usuari
+ Ríquese l'autenticación pa camudar los tos datos d'usuairu
+ الاستيثاق مطلوب لتغيير بيانات المستخدم التي تملكها
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/share/sofirem/sofirem.py
+ true
+
+
diff --git a/usr/share/sofirem/Functions.py b/usr/share/sofirem/Functions.py
new file mode 100644
index 0000000..82da3aa
--- /dev/null
+++ b/usr/share/sofirem/Functions.py
@@ -0,0 +1,2789 @@
+# =================================================================
+# = Author: Cameron Percival =
+# =================================================================
+
+import os
+import sys
+import psutil
+import time
+import datetime
+from datetime import datetime, timedelta
+import subprocess
+import threading
+import gi
+import logging
+from logging.handlers import TimedRotatingFileHandler
+import shutil
+from threading import Thread
+from Package import Package
+from Settings import Settings
+from ui.MessageDialog import MessageDialog
+from distro import id
+from os import makedirs
+
+gi.require_version("Gtk", "3.0")
+from gi.repository import GLib, Gtk
+
+# =====================================================
+# Base Directory
+# =====================================================
+
+base_dir = os.path.dirname(os.path.realpath(__file__))
+
+# =====================================================
+# Global Variables
+# =====================================================
+sudo_username = os.getlogin()
+home = "/home/" + str(sudo_username)
+path_dir_cache = base_dir + "/cache/"
+packages = []
+distr = id()
+sofirem_lockfile = "/tmp/sofirem.lock"
+sofirem_pidfile = "/tmp/sofirem.pid"
+# 10m timeout
+process_timeout = 600
+
+arcolinux_mirrorlist = "/etc/pacman.d/arcolinux-mirrorlist"
+pacman_conf = "/etc/pacman.conf"
+pacman_conf_backup = "/etc/pacman.conf.bak"
+pacman_logfile = "/var/log/pacman.log"
+pacman_lockfile = "/var/lib/pacman/db.lck"
+pacman_cache_dir = "/var/cache/pacman/pkg/"
+
+arco_test_repo = [
+ "#[arcolinux_repo_testing]",
+ "#SigLevel = PackageRequired DatabaseNever",
+ "#Include = /etc/pacman.d/arcolinux-mirrorlist",
+]
+
+arco_repo = [
+ "[arcolinux_repo]",
+ "SigLevel = PackageRequired DatabaseNever",
+ "Include = /etc/pacman.d/arcolinux-mirrorlist",
+]
+
+arco_3rd_party_repo = [
+ "[arcolinux_repo_3party]",
+ "SigLevel = PackageRequired DatabaseNever",
+ "Include = /etc/pacman.d/arcolinux-mirrorlist",
+]
+
+arco_xlrepo = [
+ "[arcolinux_repo_xlarge]",
+ "SigLevel = PackageRequired DatabaseNever",
+ "Include = /etc/pacman.d/arcolinux-mirrorlist",
+]
+
+
+log_dir = "/var/log/sofirem/"
+config_dir = "%s/.config/sofirem" % home
+config_file = "%s/sofirem.yaml" % config_dir
+
+
+event_log_file = "%s/event.log" % log_dir
+
+export_dir = "%s/sofirem-exports" % home
+
+
+# =====================================================
+# PERMISSIONS
+# =====================================================
+
+
+def permissions(dst):
+ try:
+ groups = subprocess.run(
+ ["sh", "-c", "id " + sudo_username],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ for x in groups.stdout.decode().split(" "):
+ if "gid" in x:
+ g = x.split("(")[1]
+ group = g.replace(")", "").strip()
+ subprocess.call(["chown", "-R", sudo_username + ":" + group, dst], shell=False)
+
+ except Exception as e:
+ logger.error(e)
+
+
+# Create log, export, conf directory
+try:
+ if not os.path.exists(log_dir):
+ makedirs(log_dir)
+
+ if not os.path.exists(export_dir):
+ makedirs(export_dir)
+
+ if not os.path.exists(config_dir):
+ makedirs(config_dir)
+
+ permissions(export_dir)
+ permissions(config_dir)
+
+ print("[INFO] Log directory = %s" % log_dir)
+ print("[INFO] Export directory = %s" % export_dir)
+ print("[INFO] Config directory = %s" % config_dir)
+
+
+except os.error as oe:
+ print("[ERROR] Exception in setup log/export directory: %s" % oe)
+ sys.exit(1)
+
+# read in conf file from $HOME/.config/sofirem/sofirem.yaml
+# initialize logger
+try:
+ settings = Settings(False, False)
+ settings_config = settings.read_config_file()
+
+ logger = logging.getLogger("logger")
+
+ # create console handler and set level to debug
+ ch = logging.StreamHandler()
+
+ # rotate the events log every Friday
+ tfh = TimedRotatingFileHandler(
+ event_log_file, encoding="utf-8", delay=False, when="W4"
+ )
+
+ if settings_config:
+ debug_logging_enabled = None
+ debug_logging_enabled = settings_config["Debug Logging"]
+
+ if debug_logging_enabled is not None and debug_logging_enabled is True:
+ logger.setLevel(logging.DEBUG)
+ ch.setLevel(logging.DEBUG)
+ tfh.setLevel(level=logging.DEBUG)
+
+ else:
+ logger.setLevel(logging.INFO)
+ ch.setLevel(logging.INFO)
+ tfh.setLevel(level=logging.INFO)
+ else:
+ logger.setLevel(logging.INFO)
+ ch.setLevel(logging.INFO)
+ tfh.setLevel(level=logging.INFO)
+
+ # create formatter
+ formatter = logging.Formatter(
+ "%(asctime)s:%(levelname)s > %(message)s", "%Y-%m-%d %H:%M:%S"
+ )
+ # add formatter to ch
+ ch.setFormatter(formatter)
+ tfh.setFormatter(formatter)
+
+ # add ch to logger
+ logger.addHandler(ch)
+
+ # add fh to logger
+ logger.addHandler(tfh)
+
+except Exception as e:
+ print("[ERROR] Failed to setup logger, exception: %s" % e)
+
+
+# on app close create file of installed packages
+def _on_close_create_packages_file():
+ try:
+ logger.info("App closing saving currently installed packages to file")
+ packages_file = "%s-packages.txt" % datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
+ logger.info("Saving in %s%s" % (log_dir, packages_file))
+ cmd = ["pacman", "-Q"]
+
+ with subprocess.Popen(
+ cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ with open("%s/%s" % (log_dir, packages_file), "w") as f:
+ for line in process.stdout:
+ f.write("%s" % line)
+ except Exception as e:
+ logger.error("Exception in on_close_create_packages_file(): %s" % e)
+
+
+# =====================================================
+# GLOBAL FUNCTIONS
+# =====================================================
+
+
+def _get_position(lists, value):
+ data = [string for string in lists if value in string]
+ position = lists.index(data[0])
+ return position
+
+
+def is_file_stale(filepath, stale_days, stale_hours, stale_minutes):
+ # first, lets obtain the datetime of the day that we determine data to be "stale"
+ now = datetime.now()
+ # For the purposes of this, we are assuming that one would have the app open longer than 5 minutes if installing.
+ stale_datetime = now - timedelta(
+ days=stale_days, hours=stale_hours, minutes=stale_minutes
+ )
+ # Check to see if the file path is in existence.
+ if os.path.exists(filepath):
+ # if the file exists, when was it made?
+ file_created = datetime.fromtimestamp(os.path.getctime(filepath))
+ # file is older than the time delta identified above
+ if file_created < stale_datetime:
+ return True
+ return False
+
+
+# =====================================================
+# PACMAN SYNC PACKAGE DB
+# =====================================================
+def sync_package_db():
+ try:
+ sync_str = ["pacman", "-Sy"]
+ logger.info("Synchronizing pacman package databases")
+ process_sync = subprocess.run(
+ sync_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ )
+
+ if process_sync.returncode == 0:
+ return None
+ else:
+ if process_sync.stdout:
+ out = str(process_sync.stdout.decode("utf-8"))
+ logger.error(out)
+
+ return out
+
+ except Exception as e:
+ logger.error("Exception in sync_package_db(): %s" % e)
+
+
+# =====================================================
+# PACMAN SYNC FILES DB
+# =====================================================
+
+
+def sync_file_db():
+ try:
+ sync_str = ["pacman", "-Fy"]
+ logger.info("Synchronizing pacman file database")
+ process_sync = subprocess.run(
+ sync_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ )
+
+ if process_sync.returncode == 0:
+ return None
+ else:
+ if process_sync.stdout:
+ out = str(process_sync.stdout.decode("utf-8"))
+ logger.error(out)
+
+ return out
+
+ except Exception as e:
+ logger.error("Exception in sync_file_db(): %s" % e)
+
+
+# =====================================================
+# PACMAN INSTALL/UNINSTALL PROCESS
+# =====================================================
+
+
+# this is run inside a separate thread
+def start_subprocess(self, cmd, progress_dialog, action, pkg, widget):
+ try:
+ self.switch_package_version.set_sensitive(False)
+ self.switch_arco_keyring.set_sensitive(False)
+ self.switch_arco_mirrorlist.set_sensitive(False)
+
+ widget.set_sensitive(False)
+
+ # store process std out into a list, if there are errors display to user once the process completes
+ process_stdout_lst = []
+ process_stdout_lst.append("Command = %s\n\n" % " ".join(cmd))
+
+ with subprocess.Popen(
+ cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ if progress_dialog is not None:
+ progress_dialog.pkg_dialog_closed = False
+
+ self.in_progress = True
+
+ if (
+ progress_dialog is not None
+ and progress_dialog.pkg_dialog_closed is False
+ ):
+ line = (
+ "Pacman is processing the %s of package %s \n\nCommand running = %s\n\n"
+ % (action, pkg.name, " ".join(cmd))
+ )
+ GLib.idle_add(
+ update_progress_textview,
+ self,
+ line,
+ progress_dialog,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+
+ logger.debug("Pacman is now processing the request")
+
+ # poll for the process to complete
+ # read stdout as it comes in, update the progress textview
+
+ # poll() Check if child process has terminated.
+ # Set and return returncode attribute. Otherwise, returns None.
+
+ while True:
+ if process.poll() is not None:
+ break
+
+ if (
+ progress_dialog is not None
+ and progress_dialog.pkg_dialog_closed is False
+ ):
+ for line in process.stdout:
+ GLib.idle_add(
+ update_progress_textview,
+ self,
+ line,
+ progress_dialog,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+ process_stdout_lst.append(line)
+
+ time.sleep(0.3)
+ else:
+ # increase wait time to reduce cpu load, no textview updates required since dialog is closed
+ # since the progress dialog window is closed, capture errors and then later display it
+ for line in process.stdout:
+ process_stdout_lst.append(line)
+ time.sleep(1)
+
+ returncode = None
+ returncode = process.poll()
+
+ # logger.debug("Pacman process return code = %s" % returncode)
+
+ if returncode is not None:
+ logger.info("Pacman process completed running = [ %s ]" % " ".join(cmd))
+
+ GLib.idle_add(
+ refresh_ui,
+ self,
+ action,
+ widget,
+ pkg,
+ progress_dialog,
+ process_stdout_lst,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+ else:
+ # an error happened during the pacman transaction
+ logger.error(
+ "Pacman process failed when running = [ %s ]" % " ".join(cmd)
+ )
+
+ except TimeoutError as t:
+ logger.error("TimeoutError in %s start_subprocess(): %s" % (action, t))
+ process.terminate()
+ if progress_dialog is not None:
+ progress_dialog.btn_package_progress_close.set_sensitive(True)
+ self.switch_package_version.set_sensitive(True)
+ self.switch_arco_keyring.set_sensitive(True)
+ self.switch_arco_mirrorlist.set_sensitive(True)
+
+ except SystemError as s:
+ logger.error("SystemError in %s start_subprocess(): %s" % (action, s))
+ process.terminate()
+ if progress_dialog is not None:
+ progress_dialog.btn_package_progress_close.set_sensitive(True)
+ self.switch_package_version.set_sensitive(True)
+ self.switch_arco_keyring.set_sensitive(True)
+ self.switch_arco_mirrorlist.set_sensitive(True)
+
+
+# refresh ui components, once the process completes
+# show notification dialog to user if errors are encountered during package install/uninstall
+def refresh_ui(self, action, switch, pkg, progress_dialog, process_stdout_lst):
+ self.switch_package_version.set_sensitive(True)
+ self.switch_arco_keyring.set_sensitive(True)
+ self.switch_arco_mirrorlist.set_sensitive(True)
+
+ logger.debug("Checking if package %s is installed" % pkg.name)
+ installed = check_package_installed(pkg.name)
+
+ if progress_dialog is not None:
+ progress_dialog.btn_package_progress_close.set_sensitive(True)
+
+ if installed is True and action == "install":
+ logger.debug("Toggle switch state = True")
+ switch.set_sensitive(True)
+ switch.set_state(True)
+ switch.set_active(True)
+
+ if progress_dialog is not None:
+ if progress_dialog.pkg_dialog_closed is False:
+ progress_dialog.set_title("Package install for %s completed" % pkg.name)
+
+ progress_dialog.infobar.set_name("infobar_info")
+
+ content = progress_dialog.infobar.get_content_area()
+ if content is not None:
+ for widget in content.get_children():
+ content.remove(widget)
+
+ lbl_install = Gtk.Label(xalign=0, yalign=0)
+ lbl_install.set_markup("Package %s installed" % pkg.name)
+
+ content.add(lbl_install)
+
+ if self.timeout_id is not None:
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+ self.timeout_id = GLib.timeout_add(
+ 100, reveal_infobar, self, progress_dialog
+ )
+
+ if installed is False and action == "install":
+ logger.debug("Toggle switch state = False")
+
+ if progress_dialog is not None:
+ # install failed/terminated
+ switch.set_sensitive(True)
+ switch.set_state(False)
+ switch.set_active(False)
+
+ if progress_dialog.pkg_dialog_closed is False:
+ progress_dialog.set_title("Package install for %s failed" % pkg.name)
+
+ progress_dialog.infobar.set_name("infobar_error")
+
+ content = progress_dialog.infobar.get_content_area()
+ if content is not None:
+ for widget in content.get_children():
+ content.remove(widget)
+
+ lbl_install = Gtk.Label(xalign=0, yalign=0)
+ lbl_install.set_markup(
+ "Package %s install failed" % pkg.name
+ )
+
+ content.add(lbl_install)
+
+ if self.timeout_id is not None:
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+ self.timeout_id = GLib.timeout_add(
+ 100, reveal_infobar, self, progress_dialog
+ )
+ else:
+ logger.debug(" ".join(process_stdout_lst))
+
+ message_dialog = MessageDialog(
+ "Errors occurred during install",
+ "Errors occurred install for %s failed" % pkg.name,
+ "Pacman failed to install package %s\n" % pkg.name,
+ " ".join(process_stdout_lst),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ result = message_dialog.run()
+ message_dialog.destroy()
+ elif progress_dialog is None or progress_dialog.pkg_dialog_closed is True:
+ # the package progress dialog has been closed, but notify user package failed to install
+
+ if (
+ "error: failed to init transaction (unable to lock database)\n"
+ in process_stdout_lst
+ ):
+ # at this point the package install is stuck behind another pacman transaction so put this onto the holding queue
+
+ # logger.debug(" ".join(process_stdout_lst))
+
+ if progress_dialog is None:
+ logger.debug("Adding package to holding queue")
+ if self.display_package_progress is False:
+ inst_str = [
+ "pacman",
+ "-S",
+ pkg.name,
+ "--needed",
+ "--noconfirm",
+ ]
+ self.pkg_holding_queue.put(
+ (
+ pkg,
+ action,
+ switch,
+ inst_str,
+ progress_dialog,
+ ),
+ )
+ else:
+ logger.debug(" ".join(process_stdout_lst))
+ switch.set_sensitive(True)
+ switch.set_state(False)
+ switch.set_active(False)
+
+ proc = fn.get_pacman_process()
+
+ message_dialog = MessageDialog(
+ "Warning",
+ "Sofirem cannot proceed pacman lockfile found",
+ "Pacman cannot lock the db, a lockfile is found inside %s"
+ % fn.pacman_lockfile,
+ "Pacman is running: %s" % proc,
+ "warning",
+ False,
+ )
+
+ message_dialog.show_all()
+ result = message_dialog.run()
+ message_dialog.destroy()
+
+ # progress dialog is closed show message dialog with error
+ elif "error: target not found: %s\n" % pkg.name in process_stdout_lst:
+ switch.set_sensitive(True)
+ switch.set_state(False)
+ switch.set_active(False)
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Pacman repository error: package '%s' was not found" % pkg.name,
+ "Sofirem cannot process the request",
+ "Are the correct pacman mirrorlists configured ?",
+ "error",
+ False,
+ )
+
+ message_dialog.show_all()
+ result = message_dialog.run()
+ message_dialog.destroy()
+
+ else:
+ # logger.debug(" ".join(process_stdout_lst))
+
+ switch.set_sensitive(True)
+ switch.set_state(False)
+ switch.set_active(False)
+
+ message_dialog = MessageDialog(
+ "Errors occurred during install",
+ "Errors occurred install for %s failed" % pkg.name,
+ "Pacman failed to install package %s\n" % pkg.name,
+ " ".join(process_stdout_lst),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ result = message_dialog.run()
+ message_dialog.destroy()
+
+ if installed is False and action == "uninstall":
+ logger.debug("Toggle switch state = False")
+ switch.set_sensitive(True)
+ switch.set_state(False)
+ switch.set_active(False)
+
+ if progress_dialog is not None:
+ if progress_dialog.pkg_dialog_closed is False:
+ progress_dialog.set_title(
+ "Package uninstall for %s completed" % pkg.name
+ )
+ progress_dialog.infobar.set_name("infobar_info")
+ content = progress_dialog.infobar.get_content_area()
+ if content is not None:
+ for widget in content.get_children():
+ content.remove(widget)
+
+ lbl_install = Gtk.Label(xalign=0, yalign=0)
+ lbl_install.set_markup("Package %s uninstalled" % pkg.name)
+
+ content.add(lbl_install)
+
+ if self.timeout_id is not None:
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+ self.timeout_id = GLib.timeout_add(
+ 100, reveal_infobar, self, progress_dialog
+ )
+
+ if installed is True and action == "uninstall":
+ # uninstall failed/terminated
+ switch.set_sensitive(True)
+ switch.set_state(True)
+ switch.set_active(True)
+
+ if progress_dialog is not None:
+ if progress_dialog.pkg_dialog_closed is False:
+ progress_dialog.set_title("Package uninstall for %s failed" % pkg.name)
+ progress_dialog.infobar.set_name("infobar_error")
+
+ content = progress_dialog.infobar.get_content_area()
+ if content is not None:
+ for widget in content.get_children():
+ content.remove(widget)
+
+ lbl_install = Gtk.Label(xalign=0, yalign=0)
+ lbl_install.set_markup(
+ "Package %s uninstall failed" % pkg.name
+ )
+
+ content.add(lbl_install)
+
+ if self.timeout_id is not None:
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+ self.timeout_id = GLib.timeout_add(
+ 100, reveal_infobar, self, progress_dialog
+ )
+
+ elif progress_dialog is None or progress_dialog.pkg_dialog_closed is True:
+ # the package progress dialog has been closed, but notify user package failed to uninstall
+
+ if (
+ "error: failed to init transaction (unable to lock database)\n"
+ in process_stdout_lst
+ ):
+ logger.error(" ".join(process_stdout_lst))
+
+ else:
+ message_dialog = MessageDialog(
+ "Errors occurred during uninstall",
+ "Errors occurred uninstall of %s failed" % pkg.name,
+ "Pacman failed to uninstall package %s\n" % pkg.name,
+ " ".join(process_stdout_lst),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ result = message_dialog.run()
+ message_dialog.destroy()
+
+
+# update progress textview using stdout from the pacman process running
+
+
+def update_progress_textview(self, line, progress_dialog):
+ if (
+ progress_dialog is not None
+ and progress_dialog.pkg_dialog_closed is False
+ and self.in_progress is True
+ ):
+ buffer = progress_dialog.package_progress_textview.get_buffer()
+ if len(line) > 0 or buffer is None:
+ buffer.insert(buffer.get_end_iter(), "%s" % line, len("%s" % line))
+
+ text_mark_end = buffer.create_mark("\nend", buffer.get_end_iter(), False)
+
+ # scroll to the end of the textview
+ progress_dialog.package_progress_textview.scroll_mark_onscreen(
+ text_mark_end
+ )
+ else:
+ # dialog window is closed
+ line = None
+ return False
+
+
+# =====================================================
+# APP INSTALLATION
+# =====================================================
+def install(self):
+ pkg, action, widget, inst_str, progress_dialog = self.pkg_queue.get()
+
+ try:
+ if action == "install":
+ # path = base_dir + "/cache/installed.lst"
+ logger.debug("Running inside install thread")
+ logger.info("Installing package %s" % pkg.name)
+ logger.debug(inst_str)
+
+ # run pacman process inside a thread
+
+ th_subprocess_install = Thread(
+ name="thread_subprocess",
+ target=start_subprocess,
+ args=(
+ self,
+ inst_str,
+ progress_dialog,
+ action,
+ pkg,
+ widget,
+ ),
+ daemon=True,
+ )
+
+ th_subprocess_install.start()
+
+ logger.debug("Thread: subprocess install started")
+
+ except Exception as e:
+ # deactivate switch widget, install failed
+ widget.set_state(False)
+ if progress_dialog is not None:
+ progress_dialog.btn_package_progress_close.set_sensitive(True)
+ logger.error("Exception in install(): %s" % e)
+ finally:
+ # task completed
+ self.pkg_queue.task_done()
+
+
+# =====================================================
+# APP UNINSTALLATION
+# =====================================================
+def uninstall(self):
+ pkg, action, widget, uninst_str, progress_dialog = self.pkg_queue.get()
+
+ try:
+ if action == "uninstall":
+ # path = base_dir + "/cache/installed.lst"
+ logger.debug("Running inside uninstall thread")
+ logger.info("Uninstalling package %s" % pkg.name)
+ logger.debug(uninst_str)
+
+ # run pacman process inside a thread
+
+ th_subprocess_uninstall = Thread(
+ name="thread_subprocess",
+ target=start_subprocess,
+ args=(
+ self,
+ uninst_str,
+ progress_dialog,
+ action,
+ pkg,
+ widget,
+ ),
+ daemon=True,
+ )
+
+ # is there a pacman lockfile, wait for it before uninstalling
+ # while check_pacman_lockfile():
+ # time.sleep(0.2)
+
+ th_subprocess_uninstall.start()
+
+ logger.debug("Thread: subprocess uninstall started")
+
+ except Exception as e:
+ widget.set_state(True)
+ if progress_dialog is not None:
+ progress_dialog.btn_package_progress_close.set_sensitive(True)
+ logger.error("Exception in uninstall(): %s" % e)
+ finally:
+ self.pkg_queue.task_done()
+
+
+# =====================================================
+# SEARCH INDEXING
+# =====================================================
+
+
+# store a list of package metadata into memory for fast retrieval
+def store_packages():
+ path = base_dir + "/yaml/"
+ cache = base_dir + "/cache/yaml-packages.lst"
+ yaml_files = []
+ packages = []
+
+ category_dict = {}
+
+ try:
+ # get latest package version info
+
+ package_metadata = get_all_package_info()
+
+ # get a list of yaml files
+ for file in os.listdir(path):
+ if file.endswith(".yaml"):
+ yaml_files.append(file)
+
+ if len(yaml_files) > 0:
+ for yaml_file in yaml_files:
+ cat_desc = ""
+ package_name = ""
+ package_cat = ""
+
+ category_name = yaml_file[11:-5].strip().capitalize()
+
+ # read contents of each yaml file
+
+ with open(path + yaml_file, "r") as yaml:
+ content = yaml.readlines()
+ for line in content:
+ if line.startswith(" packages:"):
+ continue
+ elif line.startswith(" description: "):
+ # Set the label text for the description line
+ subcat_desc = (
+ line.strip(" description: ")
+ .strip()
+ .strip('"')
+ .strip("\n")
+ .strip()
+ )
+ elif line.startswith("- name:"):
+ # category
+
+ subcat_name = (
+ line.strip("- name: ")
+ .strip()
+ .strip('"')
+ .strip("\n")
+ .strip()
+ )
+ elif line.startswith(" - "):
+ # add the package to the packages list
+
+ package_name = line.strip(" - ").strip()
+
+ # get the package description
+ # package_desc = obtain_pkg_description(package_name)
+
+ package_version = "Unknown"
+ package_description = "Unknown"
+
+ for data in package_metadata:
+ if data["name"] == package_name:
+ package_version = data["version"]
+ package_description = data["description"]
+
+ break
+
+ if package_description == "Unknown":
+ package_description = obtain_pkg_description(package_name)
+
+ package = Package(
+ package_name,
+ package_description,
+ category_name,
+ subcat_name,
+ subcat_desc,
+ package_version,
+ )
+
+ packages.append(package)
+
+ # filter the results so that each category holds a list of package
+
+ category_name = None
+ packages_cat_lst = []
+ for pkg in packages:
+ if category_name == pkg.category:
+ packages_cat_lst.append(pkg)
+ category_dict[category_name] = packages_cat_lst
+ elif category_name is None:
+ packages_cat_lst.append(pkg)
+ category_dict[pkg.category] = packages_cat_lst
+ else:
+ # reset packages, new category
+ packages_cat_lst = []
+
+ packages_cat_lst.append(pkg)
+
+ category_dict[pkg.category] = packages_cat_lst
+
+ category_name = pkg.category
+
+ # Print dictionary for debugging
+
+ # for key in category_dict.keys():
+ # print("Category = %s" % key)
+ # pkg_list = category_dict[key]
+ #
+ # for pkg in pkg_list:
+ # print("%s" % pkg.name)
+
+ sorted_dict = None
+
+ sorted_dict = dict(sorted(category_dict.items()))
+
+ if sorted_dict is None:
+ logger.error(
+ "An error occurred during sort of stored packages in store_packages()"
+ )
+ else:
+ with open(cache, "w", encoding="UTF-8") as f:
+ for key in category_dict.keys():
+ pkg_list = category_dict[key]
+
+ for pkg in pkg_list:
+ f.write("%s\n" % pkg.name)
+
+ return sorted_dict
+ except Exception as e:
+ logger.error("Exception in store_packages() : %s" % e)
+ sys.exit(1)
+
+
+def get_package_description(package):
+ query_str = ["pacman", "-Si", package]
+
+ try:
+ with subprocess.Popen(
+ query_str,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ while True:
+ if process.poll() is not None:
+ break
+
+ returncode = None
+ returncode = process.poll()
+
+ if returncode is not None:
+ for line in process.stdout:
+ if "Description :" in line.strip():
+ return line.replace(" ", "").split("Description:")[1].strip()
+
+ except Exception as e:
+ logger.error("Exception in get_package_description(): %s" % e)
+
+
+# =====================================================
+# PACKAGE VERSIONS
+# =====================================================
+
+
+# get live package name, version info and repo name
+# used in store_packages() and get_installed_package_data()
+def get_all_package_info():
+ query_str = ["pacman", "-Si"]
+
+ try:
+ process_pkg_query = subprocess.Popen(
+ query_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE
+ )
+
+ out, err = process_pkg_query.communicate(timeout=process_timeout)
+
+ if process_pkg_query.returncode == 0:
+ if out:
+ package_data = []
+ package_name = "Unknown"
+ package_version = "Unknown"
+ package_description = "Unknown"
+ package_repository = "Unknown"
+
+ for line in out.decode("utf-8").splitlines():
+ package_dict = {}
+ if "Name :" in line.strip():
+ package_name = line.replace(" ", "").split("Name:")[1].strip()
+
+ if "Version :" in line.strip():
+ package_version = (
+ line.replace(" ", "").split("Version:")[1].strip()
+ )
+
+ if "Description :" in line.strip():
+ package_description = line.split("Description :")[1].strip()
+
+ if "Repository :" in line.strip():
+ package_repository = line.split("Repository :")[1].strip()
+
+ package_dict["name"] = package_name
+ package_dict["version"] = package_version
+ package_dict["description"] = package_description
+ package_dict["repository"] = package_repository
+
+ package_data.append(package_dict)
+
+ return package_data
+ else:
+ logger.error("Failed to extract package version information.")
+
+ except Exception as e:
+ logger.error("Exception in get_all_package_info() : %s" % e)
+
+
+# get installed package version, installed date, name to be displayed inside PackageListDialog
+# for export and later import
+def get_installed_package_data(self):
+ # to capture the latest package version
+ latest_package_data = get_all_package_info()
+
+ # query_str = ["pacman", "-Qi"]
+ # query_str = ["pacman", "-Qien"]
+
+ try:
+ installed_packages_list = []
+ pkg_name = None
+ pkg_version = None
+ pkg_install_date = None
+ pkg_installed_size = None
+ pkg_latest_version = None
+
+ with subprocess.Popen(
+ self.pacman_export_cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ for line in process.stdout:
+ if "Name :" in line.strip():
+ pkg_name = line.replace(" ", "").split("Name:")[1].strip()
+
+ if "Version :" in line.strip():
+ pkg_version = line.replace(" ", "").split("Version:")[1].strip()
+
+ if "Installed Size :" in line.strip():
+ pkg_installed_size = line.split("Installed Size :")[1].strip()
+
+ if "Install Date :" in line.strip():
+ pkg_install_date = line.split("Install Date :")[1].strip()
+
+ # get the latest version lookup dictionary
+
+ found = False
+ pkg_latest_version = None
+
+ for i in latest_package_data:
+ if i["name"] == pkg_name:
+ pkg_latest_version = i["version"]
+ break
+
+ installed_packages_list.append(
+ (
+ pkg_name,
+ pkg_version,
+ pkg_latest_version,
+ pkg_installed_size,
+ pkg_install_date,
+ )
+ )
+
+ self.pkg_export_queue.put(installed_packages_list)
+
+ # return installed_packages_list
+
+ except Exception as e:
+ logger.error("Exception in get_installed_package_data() : %s" % e)
+
+
+# get list of files installed by a package
+def get_package_files(package_name):
+ try:
+ query_str = ["pacman", "-Fl", package_name]
+ process = subprocess.run(
+ query_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ )
+
+ if process.returncode == 0:
+ package_files = []
+ for line in process.stdout.decode("utf-8").splitlines():
+ package_files.append((line.split(" ")[1], None))
+
+ return package_files
+ else:
+ return None
+ except Exception as e:
+ logger.error("Exception in get_package_files(): %s" % e)
+
+
+# get key package information which is to be shown inside ProgressDialog
+
+
+def get_package_information(package_name):
+ logger.info("Fetching package information for %s" % package_name)
+
+ try:
+ pkg_name = "Unknown"
+ pkg_version = "Unknown"
+ pkg_repository = "Unknown / pacman mirrorlist not configured"
+ pkg_description = "Unknown"
+ pkg_arch = "Unknown"
+ pkg_url = "Unknown"
+ pkg_depends_on = []
+ pkg_conflicts_with = []
+ pkg_download_size = "Unknown"
+ pkg_installed_size = "Unknown"
+ pkg_build_date = "Unknown"
+ pkg_packager = "Unknown"
+ package_metadata = {}
+
+ query_local_cmd = ["pacman", "-Qi", package_name]
+ query_remote_cmd = ["pacman", "-Si", package_name]
+
+ process_query_remote = subprocess.run(
+ query_remote_cmd,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ )
+
+ # added validation on process result
+ if process_query_remote.returncode == 0:
+ for line in process_query_remote.stdout.decode("utf-8").splitlines():
+ if "Name :" in line.strip():
+ pkg_name = line.replace(" ", "").split("Name:")[1].strip()
+
+ if "Version :" in line.strip():
+ pkg_version = line.replace(" ", "").split("Version:")[1].strip()
+
+ if "Repository :" in line.strip():
+ pkg_repository = line.split("Repository :")[1].strip()
+
+ if "Description :" in line.strip():
+ pkg_description = line.split("Description :")[1].strip()
+
+ if "Architecture :" in line.strip():
+ pkg_arch = line.split("Architecture :")[1].strip()
+
+ if "URL :" in line.strip():
+ pkg_url = line.split("URL :")[1].strip()
+
+ if "Depends On :" in line.strip():
+ if line.split("Depends On :")[1].strip() != "None":
+ pkg_depends_on_str = line.split("Depends On :")[1].strip()
+
+ for pkg_dep in pkg_depends_on_str.split(" "):
+ pkg_depends_on.append((pkg_dep, None))
+ else:
+ pkg_depends_on = []
+
+ if "Conflicts With :" in line.strip():
+ if line.split("Conflicts With :")[1].strip() != "None":
+ pkg_conflicts_with_str = line.split("Conflicts With :")[
+ 1
+ ].strip()
+
+ for pkg_con in pkg_conflicts_with_str.split(" "):
+ pkg_conflicts_with.append((pkg_con, None))
+ else:
+ pkg_conflicts_with = []
+
+ if "Download Size :" in line.strip():
+ pkg_download_size = line.split("Download Size :")[1].strip()
+
+ if "Installed Size :" in line.strip():
+ pkg_installed_size = line.split("Installed Size :")[1].strip()
+
+ if "Build Date :" in line.strip():
+ pkg_build_date = line.split("Build Date :")[1].strip()
+
+ if "Packager :" in line.strip():
+ pkg_packager = line.split("Packager :")[1].strip()
+
+ package_metadata["name"] = pkg_name
+ package_metadata["version"] = pkg_version
+ package_metadata["repository"] = pkg_repository
+ package_metadata["description"] = pkg_description
+ package_metadata["arch"] = pkg_arch
+ package_metadata["url"] = pkg_url
+ package_metadata["depends_on"] = pkg_depends_on
+ package_metadata["conflicts_with"] = pkg_conflicts_with
+ package_metadata["download_size"] = pkg_download_size
+ package_metadata["installed_size"] = pkg_installed_size
+ package_metadata["build_date"] = pkg_build_date
+ package_metadata["packager"] = pkg_packager
+
+ return package_metadata
+
+ elif (
+ "error: package '%s' was not found\n" % package_name
+ in process_query_remote.stdout.decode("utf-8")
+ ):
+ return "error: package '%s' was not found" % package_name
+ else:
+ process_query_local = subprocess.run(
+ query_local_cmd,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ )
+
+ # added validation on process result
+ if process_query_local.returncode == 0:
+ for line in process_query_local.stdout.decode("utf-8").splitlines():
+ if "Name :" in line.strip():
+ pkg_name = line.replace(" ", "").split("Name:")[1].strip()
+
+ if "Version :" in line.strip():
+ pkg_version = line.replace(" ", "").split("Version:")[1].strip()
+
+ if "Repository :" in line.strip():
+ pkg_repository = line.split("Repository :")[1].strip()
+
+ if "Description :" in line.strip():
+ pkg_description = line.split("Description :")[1].strip()
+
+ if "Architecture :" in line.strip():
+ pkg_arch = line.split("Architecture :")[1].strip()
+
+ if "URL :" in line.strip():
+ pkg_url = line.split("URL :")[1].strip()
+
+ if "Depends On :" in line.strip():
+ if line.split("Depends On :")[1].strip() != "None":
+ pkg_depends_on_str = line.split("Depends On :")[
+ 1
+ ].strip()
+
+ for pkg_dep in pkg_depends_on_str.split(" "):
+ pkg_depends_on.append((pkg_dep, None))
+ else:
+ pkg_depends_on = []
+
+ if "Conflicts With :" in line.strip():
+ if line.split("Conflicts With :")[1].strip() != "None":
+ pkg_conflicts_with_str = line.split("Conflicts With :")[
+ 1
+ ].strip()
+
+ for pkg_con in pkg_conflicts_with_str.split(" "):
+ pkg_conflicts_with.append((pkg_con, None))
+ else:
+ pkg_conflicts_with = []
+
+ if "Download Size :" in line.strip():
+ pkg_download_size = line.split("Download Size :")[1].strip()
+
+ if "Installed Size :" in line.strip():
+ pkg_installed_size = line.split("Installed Size :")[1].strip()
+
+ if "Build Date :" in line.strip():
+ pkg_build_date = line.split("Build Date :")[1].strip()
+
+ if "Packager :" in line.strip():
+ pkg_packager = line.split("Packager :")[1].strip()
+
+ package_metadata["name"] = pkg_name
+ package_metadata["version"] = pkg_version
+ package_metadata["repository"] = pkg_repository
+ package_metadata["description"] = pkg_description
+ package_metadata["arch"] = pkg_arch
+ package_metadata["url"] = pkg_url
+ package_metadata["depends_on"] = pkg_depends_on
+ package_metadata["conflicts_with"] = pkg_conflicts_with
+ package_metadata["download_size"] = pkg_download_size
+ package_metadata["installed_size"] = pkg_installed_size
+ package_metadata["build_date"] = pkg_build_date
+ package_metadata["packager"] = pkg_packager
+
+ return package_metadata
+ else:
+ return None
+ except Exception as e:
+ logger.error("Exception in get_package_information(): %s" % e)
+
+
+# =====================================================
+# APP QUERY
+# =====================================================
+
+
+def get_current_installed():
+ logger.debug("Get currently installed packages")
+ path = base_dir + "/cache/installed.lst"
+
+ # query_str = "pacman -Q > " + path
+ query_str = ["pacman", "-Q"]
+
+ # run the query - using Popen because it actually suits this use case a bit better.
+
+ subprocess_query = subprocess.Popen(
+ query_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ )
+
+ out, err = subprocess_query.communicate(timeout=process_timeout)
+
+ # added validation on process result
+ if subprocess_query.returncode == 0:
+ file = open(path, "w")
+ for line in out.decode("utf-8"):
+ file.write(line)
+ file.close()
+ else:
+ logger.warning("Failed to run %s" % query_str)
+
+
+def query_pkg(package):
+ try:
+ package = package.strip()
+ path = base_dir + "/cache/installed.lst"
+
+ pacman_localdb = base_dir + "/cache/pacman-localdb"
+
+ if os.path.exists(path):
+ if is_file_stale(path, 0, 0, 30):
+ get_current_installed()
+ # file does NOT exist;
+ else:
+ get_current_installed()
+ # then, open the resulting list in read mode
+ with open(path, "r") as f:
+ # first we need to strip the new line escape sequence to ensure we don't get incorrect outcome
+ pkg = package.strip("\n")
+
+ # If the pkg name appears in the list, then it is installed
+ for line in f:
+ installed = line.split(" ")
+ # We only compare against the name of the package, NOT the version number.
+ if pkg == installed[0]:
+ # file.close()
+ return True
+ # We will only hit here, if the pkg does not match anything in the file.
+ # file.close()
+
+ return False
+ except Exception as e:
+ logger.error("Exception in query_pkg(): %s " % e)
+
+
+# =====================================================
+# PACKAGE DESCRIPTION CACHE AND SEARCH
+# =====================================================
+
+
+def cache(package, path_dir_cache):
+ try:
+ # first we need to strip the new line escape sequence to ensure we don't get incorrect outcome
+ pkg = package.strip()
+ # create the query
+ query_str = ["pacman", "-Si", pkg, " --noconfirm"]
+
+ # run the query - using Popen because it actually suits this use case a bit better.
+
+ process = subprocess.Popen(
+ query_str, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE
+ )
+ out, err = process.communicate()
+
+ # validate the process result
+ if process.returncode == 0:
+ # out, err = process.communicate()
+
+ output = out.decode("utf-8")
+
+ if len(output) > 0:
+ split = output.splitlines()
+
+ # Currently the output of the pacman command above always puts the description on the 4th line.
+ desc = str(split[3])
+ # Ok, so this is a little fancy: there is formatting from the output which we wish to ignore (ends at 19th character)
+ # and there is a remenant of it as the last character - usually a single or double quotation mark, which we also need to ignore
+ description = desc[18:]
+ # writing to a caching file with filename matching the package name
+ filename = path_dir_cache + pkg
+
+ file = open(filename, "w")
+ file.write(description)
+ file.close()
+
+ return description
+ # There are several packages that do not return a valid process return code
+ # Cathing those manually via corrections folder
+ if process.returncode != 0:
+ exceptions = [
+ "florence",
+ "mintstick-bin",
+ "arcolinux-conky-collection-plasma-git",
+ "arcolinux-desktop-trasher-git",
+ "arcolinux-pamac-all",
+ "arcolinux-sddm-simplicity-git",
+ "ttf-hack",
+ "ttf-roboto-mono",
+ "aisleriot",
+ "mailspring",
+ "linux-rt",
+ "linux-rt-headers",
+ "linux-rt-lts",
+ "linux-rt-lts-headers",
+ "arcolinux-sddm-simplicity-git",
+ "kodi-x11",
+ "kodi-addons",
+ "sardi-icons",
+ ]
+ if pkg in exceptions:
+ description = file_lookup(pkg, path_dir_cache + "corrections/")
+ return description
+ return "No Description Found"
+
+ except Exception as e:
+ logger.error("Exception in cache(): %s " % e)
+
+
+# Creating an over-load so that we can use the same function, with slightly different code to get the results we need
+def cache_btn():
+ # fraction = 1 / len(packages)
+ # Non Multithreaded version.
+ packages.sort()
+ number = 1
+ for pkg in packages:
+ logger.debug(str(number) + "/" + str(len(packages)) + ": Caching " + pkg)
+ cache(pkg, path_dir_cache)
+ number = number + 1
+ # progressbar.timeout_id = GLib.timeout_add(50, progressbar.update, fraction)
+
+ logger.debug("Caching applications finished")
+
+ # This will need to be coded to be running multiple processes eventually, since it will be manually invoked.
+ # process the file list
+ # for each file in the list, open the file
+ # process the file ignoring what is not what we need
+ # for each file line processed, we need to invoke the cache function that is not over-ridden.
+
+
+def file_lookup(package, path):
+ # first we need to strip the new line escape sequence to ensure we don't get incorrect outcome
+ pkg = package.strip("\n")
+ output = ""
+ if os.path.exists(path + "corrections/" + pkg):
+ filename = path + "corrections/" + pkg
+ else:
+ filename = path + pkg
+ file = open(filename, "r")
+ output = file.read()
+ file.close()
+ if len(output) > 0:
+ return output
+ return "No Description Found"
+
+
+def obtain_pkg_description(package):
+ # This is a pretty simple function now, decide how to get the information, then get it.
+ # processing variables.
+ output = ""
+ path = base_dir + "/cache/"
+
+ # First we need to determine whether to pull from cache or pacman.
+ if os.path.exists(path + package.strip("\n")):
+ output = file_lookup(package, path)
+
+ # file doesn't exist, so create a blank copy
+ else:
+ output = cache(package, path)
+ # Add the package in question to the global variable, in case recache is needed
+ packages.append(package)
+ return output
+
+
+def restart_program():
+ os.unlink("/tmp/sofirem.lock")
+ python = sys.executable
+ os.execl(python, python, *sys.argv)
+
+
+# =====================================================
+# MONITOR PACMAN LOG FILE
+# =====================================================
+
+
+# write lines from the pacman log onto a queue, this is called from a non-blocking thread
+def add_pacmanlog_queue(self):
+ try:
+ lines = []
+ with open(pacman_logfile, "r", encoding="utf-8") as f:
+ while True:
+ line = f.readline()
+ if line:
+ lines.append(line.encode("utf-8"))
+ self.pacmanlog_queue.put(lines)
+ else:
+ time.sleep(0.5)
+
+ except Exception as e:
+ logger.error("Exception in add_pacmanlog_queue() : %s" % e)
+ finally:
+ logger.debug("No new lines found inside the pacman log file")
+
+
+# start log timer to update the textview called from a non-blocking thread
+def start_log_timer(self, window_pacmanlog):
+ while True:
+ if window_pacmanlog.start_logtimer is False:
+ logger.debug("Stopping Pacman log monitoring timer")
+ return False
+
+ GLib.idle_add(update_textview_pacmanlog, self, priority=GLib.PRIORITY_DEFAULT)
+ time.sleep(2)
+
+
+# update the textview component with new lines from the pacman log file
+
+
+# To fix: Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
+# Make sure the line read from the pacman log file is encoded in utf-8
+# Then decode the line when inserting inside the buffer
+
+
+def update_textview_pacmanlog(self):
+ lines = self.pacmanlog_queue.get()
+
+ try:
+ buffer = self.textbuffer_pacmanlog
+ if len(lines) > 0:
+ end_iter = buffer.get_end_iter()
+ for line in lines:
+ if len(line) > 0:
+ buffer.insert(
+ end_iter,
+ line.decode("utf-8"),
+ len(line),
+ )
+
+ except Exception as e:
+ logger.error("Exception in update_textview_pacmanlog() : %s" % e)
+ finally:
+ self.pacmanlog_queue.task_done()
+
+ if len(lines) > 0:
+ text_mark_end = buffer.create_mark("end", buffer.get_end_iter(), False)
+ # auto-scroll the textview to the bottom as new content is added
+
+ self.textview_pacmanlog.scroll_mark_onscreen(text_mark_end)
+
+ lines.clear()
+
+
+# =====================================================
+# USER SEARCH
+# =====================================================
+
+
+def search(self, term):
+ try:
+ logger.info('Searching for: "%s"' % term)
+
+ pkg_matches = []
+
+ category_dict = {}
+
+ whitespace = False
+
+ if term.strip():
+ whitespace = True
+
+ for pkg_list in self.packages.values():
+ for pkg in pkg_list:
+ if whitespace:
+ for te in term.split(" "):
+ if (
+ te.lower() in pkg.name.lower()
+ or te.lower() in pkg.description.lower()
+ ):
+ # only unique name matches
+ if pkg not in pkg_matches:
+ pkg_matches.append(
+ pkg,
+ )
+ else:
+ if (
+ term.lower() in pkg.name.lower()
+ or term.lower() in pkg.description.lower()
+ ):
+ pkg_matches.append(
+ pkg,
+ )
+
+ # filter the results so that each category holds a list of package
+
+ category_name = None
+ packages_cat = []
+ for pkg_match in pkg_matches:
+ if category_name == pkg_match.category:
+ packages_cat.append(pkg_match)
+ category_dict[category_name] = packages_cat
+ elif category_name is None:
+ packages_cat.append(pkg_match)
+ category_dict[pkg_match.category] = packages_cat
+ else:
+ # reset packages, new category
+ packages_cat = []
+
+ packages_cat.append(pkg_match)
+
+ category_dict[pkg_match.category] = packages_cat
+
+ category_name = pkg_match.category
+
+ # debug console output to display package info
+ """
+ # print out number of results found from each category
+ print("[DEBUG] %s Search results.." % datetime.now().strftime("%H:%M:%S"))
+
+ for category in sorted(category_dict):
+ category_res_len = len(category_dict[category])
+ print("[DEBUG] %s %s = %s" %(
+ datetime.now().strftime("%H:%M:%S"),
+ category,
+ category_res_len,
+ )
+ )
+ """
+
+ # sort dictionary so the category names are displayed in alphabetical order
+ sorted_dict = None
+
+ if len(category_dict) > 0:
+ sorted_dict = dict(sorted(category_dict.items()))
+ self.search_queue.put(
+ sorted_dict,
+ )
+ else:
+ self.search_queue.put(
+ None,
+ )
+
+ except Exception as e:
+ logger.error("Exception in search(): %s", e)
+
+
+# =====================================================
+# ARCOLINUX REPOS, KEYS AND MIRRORS
+# =====================================================
+
+
+def append_repo(text):
+ """Append a new repo"""
+ try:
+ with open(pacman_conf, "a", encoding="utf-8") as f:
+ f.write("\n\n")
+ f.write(text)
+ except Exception as e:
+ logger.error("Exception in append_repo(): %s" % e)
+
+
+def repo_exist(value):
+ """check repo_exists"""
+ with open(pacman_conf, "r", encoding="utf-8") as f:
+ lines = f.readlines()
+ f.close()
+
+ for line in lines:
+ if value in line:
+ return True
+ return False
+
+
+def install_arco_keyring():
+ try:
+ keyring = base_dir + "/packages/arcolinux-keyring/"
+ file = os.listdir(keyring)
+ cmd_str = [
+ "pacman",
+ "-U",
+ keyring + str(file).strip("[]'"),
+ "--noconfirm",
+ ]
+
+ logger.debug("%s" % " ".join(cmd_str))
+
+ with subprocess.Popen(
+ cmd_str,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ process.wait(process_timeout)
+
+ output = []
+
+ for line in process.stdout:
+ output.append(line)
+
+ if process.returncode == 0:
+ return 0
+
+ else:
+ if len(output) == 0:
+ output.append("Error: install of ArcoLinux keyring failed")
+
+ logger.error(" ".join(output))
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = output
+
+ return result_err
+ except Exception as e:
+ logger.error("Exception in install_arco_keyring(): %s" % e)
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = e
+
+ return result_err
+
+
+def remove_arco_keyring():
+ try:
+ cmd_str = ["pacman", "-Rdd", "arcolinux-keyring", "--noconfirm"]
+ with subprocess.Popen(
+ cmd_str,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ process.wait(process_timeout)
+
+ output = []
+
+ for line in process.stdout:
+ output.append(line)
+
+ if process.returncode == 0:
+ return 0
+
+ else:
+ if len(output) == 0:
+ output.append("Error: removal of ArcoLinux keyring failed")
+
+ logger.error(" ".join(output))
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = output
+
+ return result_err
+
+ except Exception as e:
+ logger.error("Exception in remove_arco_keyring(): %s" % e)
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = e
+
+ return result_err
+
+
+def install_arco_mirrorlist():
+ try:
+ mirrorlist = base_dir + "/packages/arcolinux-mirrorlist/"
+ file = os.listdir(mirrorlist)
+ cmd_str = [
+ "pacman",
+ "-U",
+ mirrorlist + str(file).strip("[]'"),
+ "--noconfirm",
+ ]
+
+ logger.debug("%s" % " ".join(cmd_str))
+ with subprocess.Popen(
+ cmd_str,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ process.wait(process_timeout)
+
+ output = []
+
+ for line in process.stdout:
+ output.append(line)
+
+ if process.returncode == 0:
+ return 0
+
+ else:
+ if len(output) == 0:
+ output.append("Error: install of ArcoLinux mirrorlist failed")
+
+ logger.error(" ".join(output))
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = output
+
+ return result_err
+ except Exception as e:
+ logger.error("Exception in install_arco_mirrorlist(): %s" % e)
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = output
+
+ return result_err
+
+
+def remove_arco_mirrorlist():
+ try:
+ cmd_str = ["pacman", "-Rdd", "arcolinux-mirrorlist-git", "--noconfirm"]
+ logger.debug("%s" % " ".join(cmd_str))
+ with subprocess.Popen(
+ cmd_str,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ process.wait(process_timeout)
+
+ output = []
+
+ for line in process.stdout:
+ output.append(line)
+
+ if process.returncode == 0:
+ return 0
+
+ else:
+ if len(output) == 0:
+ output.append("Error: removal of ArcoLinux mirrorlist failed")
+
+ logger.error(" ".join(output))
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = output
+
+ return result_err
+
+ except Exception as e:
+ logger.error("Exception in remove_arco_mirrorlist(): %s" % e)
+
+ result_err = {}
+
+ result_err["cmd_str"] = cmd_str
+ result_err["output"] = e
+
+ return result_err
+
+
+def add_arco_repos():
+ logger.info("Adding ArcoLinux repos on %s" % distr)
+ try:
+ # first check if arco repos are already inside pacman conf file
+
+ if verify_arco_pacman_conf() is False:
+ # take backup of existing pacman.conf file
+
+ if os.path.exists(pacman_conf):
+ shutil.copy(pacman_conf, pacman_conf_backup)
+
+ # read existing contents from pacman.conf file
+
+ logger.info("Reading from %s" % pacman_conf)
+
+ lines = []
+
+ with open(pacman_conf, "r", encoding="utf-8") as r:
+ lines = r.readlines()
+
+ # check for existing ArcoLinux entries
+ if len(lines) > 0:
+ arco_test_repo_found = False
+ arco_repo_found = False
+ arco_3rd_party_repo_found = False
+ arco_xlrepo_found = False
+
+ for line in lines:
+ if "#" in line.strip():
+ if arco_test_repo[0].replace("#", "") in line.strip():
+ arco_test_repo_found = True
+
+ if arco_repo[0].replace("#", "") in line.strip():
+ arco_repo_found = True
+ index = lines.index(line)
+
+ del lines[index]
+ lines.insert(index, arco_repo[0])
+
+ index += 1
+
+ del lines[index]
+ lines.insert(index, arco_repo[1])
+
+ index += 1
+
+ del lines[index]
+ lines.insert(index, arco_repo[2])
+
+ if arco_3rd_party_repo[0].replace("#", "") in line.strip():
+ arco_3rd_party_repo_found = True
+ index = lines.index(line)
+
+ del lines[index]
+ lines.insert(index, arco_3rd_party_repo[0])
+
+ index += 1
+
+ del lines[index]
+ lines.insert(index, arco_3rd_party_repo[1])
+
+ index += 1
+
+ del lines[index]
+ lines.insert(index, arco_3rd_party_repo[2])
+
+ if arco_xlrepo[0].replace("#", "") in line.strip():
+ arco_xlrepo_found = True
+ index = lines.index(line)
+
+ del lines[index]
+ lines.insert(index, arco_xlrepo[0])
+
+ index += 1
+
+ del lines[index]
+ lines.insert(index, arco_xlrepo[1])
+
+ index += 1
+
+ del lines[index]
+ lines.insert(index, arco_xlrepo[2])
+
+ if line.strip() == arco_test_repo[0]:
+ arco_test_repo_found = True
+
+ if line.strip() == arco_repo[0]:
+ arco_repo_found = True
+
+ if line.strip() == arco_3rd_party_repo[0]:
+ arco_3rd_party_repo_found = True
+
+ if line.strip() == arco_xlrepo[0]:
+ arco_xlrepo_found = True
+
+ if arco_test_repo_found is False:
+ lines.append("\n")
+
+ for arco_test_repo_line in arco_test_repo:
+ lines.append(arco_test_repo_line)
+
+ if arco_repo_found is False:
+ lines.append("\n")
+
+ for arco_repo_line in arco_repo:
+ lines.append(arco_repo_line)
+
+ if arco_3rd_party_repo_found is False:
+ lines.append("\n")
+
+ for arco_3rd_party_repo_line in arco_3rd_party_repo:
+ lines.append(arco_3rd_party_repo_line)
+
+ if arco_xlrepo_found is False:
+ lines.append("\n")
+
+ for arco_xlrepo_line in arco_xlrepo:
+ lines.append(arco_xlrepo_line)
+
+ logger.info("[Add ArcoLinux repos] Writing to %s" % pacman_conf)
+
+ if len(lines) > 0:
+ with open(pacman_conf, "w", encoding="utf-8") as w:
+ for l in lines:
+ w.write(l.strip() + "\n")
+
+ w.flush()
+
+ return 0
+
+ else:
+ logger.error("Failed to process %s" % pacman_conf)
+
+ else:
+ logger.error("Failed to read %s" % pacman_conf)
+ else:
+ logger.info("ArcoLinux repos already setup inside pacman conf file")
+ return 0
+
+ except Exception as e:
+ logger.error("Exception in add_arco_repos(): %s" % e)
+ return e
+
+
+def remove_arco_repos():
+ # remove the ArcoLinux repos in /etc/pacman.conf
+ try:
+ # check for existing ArcoLinux entries and remove
+ if verify_arco_pacman_conf() is True:
+ if os.path.exists(pacman_conf):
+ shutil.copy(pacman_conf, pacman_conf_backup)
+
+ logger.info("Reading from %s" % pacman_conf)
+
+ lines = []
+
+ with open(pacman_conf, "r", encoding="utf-8") as r:
+ lines = r.readlines()
+
+ if len(lines) > 0:
+ index = 0
+
+ for line in lines:
+ if arco_test_repo[0] == line.strip().replace(" ", ""):
+ index = lines.index(line)
+
+ if index > 0:
+ if distr != "arcolinux":
+ del lines[index]
+ del lines[index]
+ del lines[index]
+
+ # make sure the arco testing repo is disabled, if absolutely required update the pacman conf file manually and enable them
+
+ if "%s" % arco_test_repo[0].replace("#", "") == line.strip():
+ index = lines.index(
+ "%s\n" % arco_test_repo[0].replace("#", "")
+ )
+ if distr != "arcolinux":
+ del lines[index]
+ del lines[index]
+ del lines[index]
+ else:
+ # comment out the testing repo
+
+ lines[index] = "%s\n" % arco_test_repo[0]
+ lines[index + 1] = "%s\n" % arco_test_repo[1]
+ lines[index + 2] = "%s\n" % arco_test_repo[2]
+
+ if "%s\n" % arco_repo[0] == line:
+ index = lines.index("%s\n" % arco_repo[0])
+
+ if index > 0:
+ if distr != "arcolinux":
+ del lines[index]
+ del lines[index]
+ del lines[index]
+ else:
+ lines[index] = "#%s\n" % arco_repo[0]
+ lines[index + 1] = "#%s\n" % arco_repo[1]
+ lines[index + 2] = "#%s\n" % arco_repo[2]
+ elif (
+ "#" in line.strip()
+ and arco_repo[0] == line.replace("#", "").strip()
+ and distr != "arcolinux"
+ ):
+ # check if already commented
+
+ index = lines.index(line)
+ del lines[index]
+ del lines[index]
+ del lines[index]
+
+ if "%s\n" % arco_3rd_party_repo[0] == line:
+ index = lines.index("%s\n" % arco_3rd_party_repo[0])
+
+ if index > 0:
+ if distr != "arcolinux":
+ del lines[index]
+ del lines[index]
+ del lines[index]
+ else:
+ lines[index] = "#%s\n" % arco_3rd_party_repo[0]
+ lines[index + 1] = "#%s\n" % arco_3rd_party_repo[1]
+ lines[index + 2] = "#%s\n" % arco_3rd_party_repo[2]
+ elif (
+ "#" in line.strip()
+ and arco_3rd_party_repo[0] == line.replace("#", "").strip()
+ and distr != "arcolinux"
+ ):
+ # check if already commented
+
+ index = lines.index(line)
+ del lines[index]
+ del lines[index]
+ del lines[index]
+
+ if "%s\n" % arco_xlrepo[0] == line:
+ index = lines.index("%s\n" % arco_xlrepo[0])
+
+ if index > 0:
+ if distr != "arcolinux":
+ del lines[index]
+ del lines[index]
+ del lines[index]
+ else:
+ lines[index] = "#%s\n" % arco_xlrepo[0]
+ lines[index + 1] = "#%s\n" % arco_xlrepo[1]
+ lines[index + 2] = "#%s\n" % arco_xlrepo[2]
+ elif (
+ "#" in line.strip()
+ and arco_xlrepo[0] == line.replace("#", "").strip()
+ and distr != "arcolinux"
+ ):
+ # check if already commented
+
+ index = lines.index(line)
+ del lines[index]
+ del lines[index]
+ del lines[index]
+
+ # remove any white spaces from end of the file only if on non arcolinux system
+ # on any non arcolinux distro lines are deleted which leaves empty lines in the file
+ # causing the file to grow in size
+ if distr != "arcolinux":
+ if lines[-1] == "\n":
+ del lines[-1]
+
+ if lines[-2] == "\n":
+ del lines[-2]
+
+ if lines[-3] == "\n":
+ del lines[-3]
+
+ if lines[-4] == "\n":
+ del lines[-4]
+
+ logger.info("[Remove ArcoLinux Repos] Writing to %s" % pacman_conf)
+
+ if len(lines) > 0:
+ with open(pacman_conf, "w") as w:
+ w.writelines(lines)
+
+ w.flush()
+
+ return 0
+
+ else:
+ logger.error("Failed to process %s" % pacman_conf)
+
+ else:
+ logger.error("Failed to read %s" % pacman_conf)
+ else:
+ logger.info("No ArcoLinux repos setup inside pacman conf file")
+ return 0
+
+ except Exception as e:
+ logger.error("Exception in remove_arco_repos(): %s" % e)
+ return e
+
+
+# check if pacman.conf has arco repos setup
+
+
+def verify_arco_pacman_conf():
+ try:
+ lines = None
+ arco_repo_setup = False
+ arco_3rd_party_repo_setup = False
+ arco_xlrepo_setup = False
+ with open(pacman_conf, "r") as r:
+ lines = r.readlines()
+
+ if lines is not None:
+ for line in lines:
+ if arco_repo[0] in line.strip():
+ if "#" not in line.strip():
+ arco_repo_setup = True
+ else:
+ return False
+
+ if arco_3rd_party_repo[0] in line.strip():
+ if "#" not in line.strip():
+ arco_3rd_party_repo_setup = True
+ else:
+ return False
+
+ if arco_xlrepo[0] in line.strip():
+ if "#" not in line.strip():
+ arco_xlrepo_setup = True
+ else:
+ return False
+
+ if (
+ arco_repo_setup is True
+ and arco_3rd_party_repo_setup is True
+ and arco_xlrepo_setup is True
+ ):
+ return True
+ else:
+ return False
+ except Exception as e:
+ logger.error("Exception in check_arco_pacman(): %s" % e)
+
+
+# =====================================================
+# CHECK IF PACKAGE IS INSTALLED
+# =====================================================
+
+
+# check if package is installed or not
+def check_package_installed(package_name):
+ # query_str = ["pacman", "-Qi", package]
+ query_str = ["pacman", "-Qq"]
+ try:
+ process_pkg_installed = subprocess.run(
+ query_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ universal_newlines=True,
+ )
+
+ if package_name in process_pkg_installed.stdout.splitlines():
+ return True
+ else:
+ # check if the package is in the local pacman db
+ if check_pacman_localdb(package_name):
+ return True
+ else:
+ return False
+
+ except subprocess.CalledProcessError:
+ # package is not installed
+ return False
+
+
+# =====================================================
+# QUERY THE LOCAL PACMAN DB FOR PACKAGE
+# =====================================================
+
+# This is used to validate a package install/uninstall
+
+
+# check if package is installed or not
+def check_pacman_localdb(package_name):
+ query_str = ["pacman", "-Qi", package_name]
+
+ try:
+ process_pkg_installed = subprocess.run(
+ query_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ timeout=process_timeout,
+ )
+
+ if process_pkg_installed.returncode == 0:
+ for line in process_pkg_installed.stdout.decode("utf-8").splitlines():
+ if line.startswith("Name :"):
+ if line.replace(" ", "").split("Name:")[1].strip() == package_name:
+ return True
+
+ if line.startswith("Replaces :"):
+ replaces = line.split("Replaces :")[1].strip()
+ if len(replaces) > 0:
+ if package_name in replaces:
+ return True
+
+ else:
+ return False
+
+ except subprocess.CalledProcessError:
+ # package is not installed
+ return False
+
+
+# =====================================================
+# CHECK RUNNING PROCESS
+# =====================================================
+
+
+def check_if_process_running(process_name):
+ for proc in psutil.process_iter():
+ try:
+ pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
+ if process_name == pinfo["pid"]:
+ return True
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
+ pass
+ return False
+
+
+# =====================================================
+# NOTIFICATIONS
+# =====================================================
+
+
+def show_in_app_notification(self, message, err):
+ if self.timeout_id is not None:
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+ if err is True:
+ self.notification_label.set_markup(
+ '' + message + ""
+ )
+ else:
+ self.notification_label.set_markup(
+ '' + message + ""
+ )
+ self.notification_revealer.set_reveal_child(True)
+ self.timeout_id = GLib.timeout_add(3000, timeout, self)
+
+
+def timeout(self):
+ close_in_app_notification(self)
+
+
+def close_in_app_notification(self):
+ self.notification_revealer.set_reveal_child(False)
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+
+def reveal_infobar(self, progress_dialog):
+ progress_dialog.infobar.set_revealed(True)
+ progress_dialog.infobar.show_all()
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+
+"""
+ Since the app could be quit/terminated at any time during a pacman transaction.
+ The pacman process spawned by the install/uninstall threads, needs to be terminated too.
+ Otherwise the app may hang waiting for pacman to complete its transaction.
+"""
+# =====================================================
+# PACMAN
+# =====================================================
+
+
+def terminate_pacman():
+ try:
+ process_found = False
+ for proc in psutil.process_iter():
+ try:
+ pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
+ if pinfo["name"] == "pacman":
+ process_found = True
+ logger.debug("Killing pacman process = %s" % pinfo["name"])
+
+ proc.kill()
+
+ except (psutil.NoSuchProcess, psutil.AccessDenied):
+ continue
+
+ if process_found is True:
+ if check_pacman_lockfile():
+ os.unlink(pacman_lockfile)
+ except Exception as e:
+ logger.error("Exception in terminate_pacman() : %s" % e)
+
+
+def is_thread_alive(thread_name):
+ for thread in threading.enumerate():
+ if thread.name == thread_name and thread.is_alive():
+ return True
+
+ return False
+
+
+def print_running_threads():
+ threads_alive = []
+ for thread in threading.enumerate():
+ if thread.is_alive():
+ threads_alive.append(thread.name)
+
+ for th in threads_alive:
+ logger.debug("Thread = %s status = alive" % th)
+
+
+# this keeps monitoring for items on the package holding queue
+# items are added to the queue if a package install is stuck behind another pacman transaction
+def check_holding_queue(self):
+ while True:
+ (
+ package,
+ action,
+ widget,
+ cmd_str,
+ progress_dialog,
+ ) = self.pkg_holding_queue.get()
+
+ try:
+ # logger.debug("Enqueued package = %s" % package.name)
+
+ while check_pacman_lockfile() is True:
+ # logger.debug("Pacman is processing a transaction")
+ time.sleep(0.2)
+
+ th_subprocess = Thread(
+ name="thread_subprocess",
+ target=start_subprocess,
+ args=(
+ self,
+ cmd_str,
+ progress_dialog,
+ action,
+ package,
+ widget,
+ ),
+ daemon=True,
+ )
+
+ th_subprocess.start()
+
+ finally:
+ self.pkg_holding_queue.task_done()
+
+
+# check if pacman lock file exists
+def check_pacman_lockfile():
+ try:
+ if os.path.exists(pacman_lockfile):
+ # logger.debug("Pacman lockfile found inside %s" % pacman_lockfile)
+ # logger.debug("Another pacman process is running")
+ return True
+ else:
+ # logger.info("No pacman lockfile found, OK to proceed")
+ return False
+ except Exception as e:
+ logger.error("Exception in check_pacman_lockfile() : %s" % e)
+
+
+# this gets info on the pacman process currently running
+def get_pacman_process():
+ try:
+ for proc in psutil.process_iter():
+ try:
+ pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
+ if pinfo["name"] == "pacman":
+ return " ".join(proc.cmdline())
+
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
+ pass
+
+ except Exception as e:
+ logger.error("Exception in get_pacman_process() : %s" % e)
+
+
+# used inside PackageImportDialog to display package installation progress
+def update_package_import_textview(self, line):
+ try:
+ if len(line) > 0:
+ self.msg_buffer.insert(
+ self.msg_buffer.get_end_iter(),
+ " %s" % line,
+ len(" %s" % line),
+ )
+
+ except Exception as e:
+ logger.error("Exception in update_progress_textview(): %s" % e)
+ finally:
+ self.pkg_import_queue.task_done()
+ text_mark_end = self.msg_buffer.create_mark(
+ "end", self.msg_buffer.get_end_iter(), False
+ )
+ # scroll to the end of the textview
+ self.textview.scroll_mark_onscreen(text_mark_end)
+
+
+def monitor_package_import(self):
+ while True:
+ if self.stop_thread is True:
+ break
+ message = self.pkg_import_queue.get()
+ GLib.idle_add(
+ update_package_import_textview,
+ self,
+ message,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+
+ # time.sleep(0.2)
+
+
+# update the package install status label called from outside the main thread
+def update_package_status_label(label, text):
+ label.set_markup(text)
+
+
+def import_packages(self):
+ try:
+ packages_status_list = []
+ package_failed = False
+ package_err = {}
+
+ count = 0
+
+ # clean pacman cache
+
+ if os.path.exists(pacman_cache_dir):
+ query_pacman_clean_cache_str = ["pacman", "-Sc", "--noconfirm"]
+
+ logger.info("Cleaning Pacman cache directory = %s" % pacman_cache_dir)
+
+ event = "%s [INFO]: Cleaning pacman cache\n" % datetime.now().strftime(
+ "%Y-%m-%d-%H-%M-%S"
+ )
+
+ self.pkg_import_queue.put(event)
+
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Status: Cleaning pacman cache",
+ )
+
+ # clean the pacman cache, so we don't run into any invalid/corrupt package errors during install
+ process_pacman_cc = subprocess.Popen(
+ query_pacman_clean_cache_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ universal_newlines=True,
+ )
+
+ out, err = process_pacman_cc.communicate(timeout=process_timeout)
+
+ self.pkg_import_queue.put(out)
+
+ if process_pacman_cc.returncode == 0:
+ logger.info("Pacman cache directory cleaned")
+ else:
+ logger.error("Failed to clean Pacman cache directory")
+
+ logger.info("Running full system upgrade")
+ # run full system upgrade, Arch does not allow partial package updates
+ query_str = ["pacman", "-Syu", "--noconfirm"]
+ # query_str = ["pacman", "-Qqen"]
+ logger.info("Running %s" % " ".join(query_str))
+
+ event = "%s [INFO]:Running full system upgrade\n" % datetime.now().strftime(
+ "%Y-%m-%d-%H-%M-%S"
+ )
+
+ self.pkg_import_queue.put(event)
+
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Status: Performing full system upgrade - do not power off your system",
+ )
+
+ output = []
+
+ with subprocess.Popen(
+ query_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ while True:
+ if process.poll() is not None:
+ break
+
+ for line in process.stdout:
+ # print(line.strip())
+
+ self.pkg_import_queue.put(line)
+
+ output.append(line)
+
+ # time.sleep(0.2)
+
+ if process.returncode == 0:
+ logger.info("Pacman system upgrade completed")
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Status: Full system upgrade - completed",
+ )
+ else:
+ if len(output) > 0:
+ if "there is nothing to do" not in output:
+ logger.error("Pacman system upgrade failed")
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Status: Full system upgrade - failed",
+ )
+
+ print("%s" % " ".join(output))
+
+ event = "%s [ERROR]: Installation of packages aborted due to errors\n" % datetime.now().strftime(
+ "%Y-%m-%d-%H-%M-%S"
+ )
+
+ self.pkg_import_queue.put(event)
+
+ logger.error("Installation of packages aborted due to errors")
+
+ return
+
+ # do not proceed with package installs if system upgrade fails
+ else:
+ return
+
+ # iterate through list of packages, calling pacman -S on each one
+ for package in self.packages_list:
+ process_output = []
+ package = package.strip()
+ if len(package) > 0:
+ if "#" not in package:
+ query_str = ["pacman", "-S", package, "--needed", "--noconfirm"]
+
+ count += 1
+
+ logger.info("Running %s" % " ".join(query_str))
+
+ event = "%s [INFO]: Running %s\n" % (
+ datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
+ " ".join(query_str),
+ )
+
+ self.pkg_import_queue.put(event)
+
+ with subprocess.Popen(
+ query_str,
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ bufsize=1,
+ universal_newlines=True,
+ ) as process:
+ while True:
+ if process.poll() is not None:
+ break
+ for line in process.stdout:
+ process_output.append(line.strip())
+
+ self.pkg_import_queue.put(line)
+
+ # time.sleep(0.2)
+
+ if process.returncode == 0:
+ # since this is being run in another thread outside of main, use GLib to update UI component
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Status: %s -> Installed" % package,
+ )
+
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_count,
+ "Progress: %s/%s"
+ % (count, len(self.packages_list)),
+ )
+
+ packages_status_list.append("%s -> Installed" % package)
+
+ else:
+ logger.error("%s --> Install failed" % package)
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Status: %s -> Install failed" % package,
+ )
+
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_count,
+ "Progress: %s/%s"
+ % (count, len(self.packages_list)),
+ )
+
+ if len(process_output) > 0:
+ if "there is nothing to do" not in process_output:
+ logger.error("%s" % " ".join(process_output))
+ # store package error in dict
+ package_err[package] = " ".join(process_output)
+
+ package_failed = True
+
+ packages_status_list.append("%s -> Failed" % package)
+
+ if len(packages_status_list) > 0:
+ self.pkg_status_queue.put(packages_status_list)
+
+ if package_failed is True:
+ GLib.idle_add(
+ update_package_status_label,
+ self.label_package_status,
+ "Some packages have failed to install see %s" % self.logfile,
+ )
+
+ # end
+ event = "%s [INFO]: Completed, check the logfile for any errors\n" % (
+ datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
+ )
+
+ self.pkg_import_queue.put(event)
+
+ except Exception as e:
+ logger.error("Exception in import_packages(): %s" % e)
+ finally:
+ self.pkg_err_queue.put(package_err)
+
+
+# package install completed now log status to log file
+def log_package_status(self):
+ logger.info("Logging package status")
+ packages_status_list = None
+ package_err = None
+ while True:
+ try:
+ time.sleep(0.2)
+ packages_status_list = self.pkg_status_queue.get()
+ package_err = self.pkg_err_queue.get()
+
+ finally:
+ self.pkg_status_queue.task_done()
+ self.pkg_err_queue.task_done()
+ with open(self.logfile, "w") as f:
+ f.write(
+ "# This file was auto-generated by Sofirem on %s at %s\n"
+ % (
+ datetime.today().date(),
+ datetime.now().strftime("%H:%M:%S"),
+ ),
+ )
+ if packages_status_list is not None:
+ for package in packages_status_list:
+ if package.split("->")[0].strip() in package_err:
+ f.write("%s\n" % package)
+ f.write(
+ "\tERROR: %s\n"
+ % package_err[package.split("->")[0].strip()]
+ )
+ else:
+ f.write("%s\n" % package)
+
+ break
+
+
+# open sofirem log directory
+def open_log_dir():
+ try:
+ subprocess.Popen(
+ ["sudo", "-u", sudo_username, "xdg-open", log_dir],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ except Exception as e:
+ logger.error("Exception in open_log_dir(): %s" % e)
+
+
+# ANYTHING UNDER THIS LINE IS CURRENTLY UNUSED!
diff --git a/usr/share/sofirem/Functions_Ref_DO_NOT_MODIFY.py b/usr/share/sofirem/Functions_Ref_DO_NOT_MODIFY.py
new file mode 100644
index 0000000..b64e4d2
--- /dev/null
+++ b/usr/share/sofirem/Functions_Ref_DO_NOT_MODIFY.py
@@ -0,0 +1,728 @@
+# =================================================================
+# = Author: Cameron Percival =
+# =================================================================
+
+
+import os
+import sys
+import shutil
+import psutil
+import datetime
+
+# import time
+import subprocess
+import threading # noqa
+import gi
+
+# import configparser
+gi.require_version("Gtk", "3.0")
+from gi.repository import GLib, Gtk # noqa
+
+
+# =====================================================
+# Create log file
+# =====================================================
+
+log_dir = "/var/log/arcolinux/"
+aai_log_dir = "/var/log/arcolinux/aai/"
+
+
+def create_log(self):
+ print("Making log in /var/log/arcolinux")
+ now = datetime.datetime.now()
+ time = now.strftime("%Y-%m-%d-%H-%M-%S")
+ destination = aai_log_dir + "aai-log-" + time
+ command = "sudo pacman -Q > " + destination
+ subprocess.call(
+ command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
+ )
+ # GLib.idle_add(show_in_app_notification, self, "Log file created")
+
+
+# =====================================================
+# GLOBAL FUNCTIONS
+# =====================================================
+
+
+def _get_position(lists, value):
+ data = [string for string in lists if value in string]
+ position = lists.index(data[0])
+ return position
+
+
+# =====================================================
+# PERMISSIONS
+# =====================================================
+
+
+def permissions(dst):
+ try:
+ groups = subprocess.run(
+ ["sh", "-c", "id " + sudo_username],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ for x in groups.stdout.decode().split(" "):
+ if "gid" in x:
+ g = x.split("(")[1]
+ group = g.replace(")", "").strip()
+ subprocess.call(["chown", "-R", sudo_username + ":" + group, dst], shell=False)
+
+ except Exception as e:
+ print(e)
+
+
+#######ANYTHING UNDER THIS LINE IS CURRENTLY UNUSED!
+
+sudo_username = os.getlogin()
+home = "/home/" + str(sudo_username)
+
+sddm_default = "/etc/sddm.conf"
+sddm_default_original = "/usr/local/share/arcolinux/sddm/sddm.conf"
+
+sddm_default_d1 = "/etc/sddm.conf"
+sddm_default_d2 = "/etc/sddm.conf.d/kde_settings.conf"
+sddm_default_d2_dir = "/etc/sddm.conf.d/"
+sddm_default_d_sddm_original_1 = "/usr/local/share/arcolinux/sddm.conf.d/sddm.conf"
+sddm_default_d_sddm_original_2 = (
+ "/usr/local/share/arcolinux/sddm.conf.d/kde_settings.conf"
+)
+
+if os.path.exists("/etc/sddm.conf.d/kde_settings.conf"):
+ sddm_conf = "/etc/sddm.conf.d/kde_settings.conf"
+else:
+ sddm_conf = "/etc/sddm.conf"
+
+arcolinux_mirrorlist = "/etc/pacman.d/arcolinux-mirrorlist"
+arcolinux_mirrorlist_original = "/usr/local/share/arcolinux/arcolinux-mirrorlist"
+pacman = "/etc/pacman.conf"
+oblogout_conf = "/etc/oblogout.conf"
+# oblogout_conf = home + "/oblogout.conf"
+gtk3_settings = home + "/.config/gtk-3.0/settings.ini"
+gtk2_settings = home + "/.gtkrc-2.0"
+grub_theme_conf = "/boot/grub/themes/Vimix/theme.txt"
+xfce_config = home + "/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml"
+slimlock_conf = "/etc/slim.conf"
+termite_config = home + "/.config/termite/config"
+neofetch_config = home + "/.config/neofetch/config.conf"
+lightdm_conf = "/etc/lightdm/lightdm.conf"
+bd = ".att_backups"
+config = home + "/.config/archlinux-tweak-tool/settings.ini"
+config_dir = home + "/.config/archlinux-tweak-tool/"
+polybar = home + "/.config/polybar/"
+desktop = ""
+autostart = home + "/.config/autostart/"
+zsh_config = home + "/.zshrc"
+account_list = ["Standard", "Administrator"]
+i3wm_config = home + "/.config/i3/config"
+awesome_config = home + "/.config/awesome/rc.lua"
+qtile_config = home + "/.config/qtile/config.py"
+
+seedhostmirror = "Server = https://ant.seedhost.eu/arcolinux/$repo/$arch"
+
+arepo_test = "[arcolinux_repo_testing]\n\
+SigLevel = Required DatabaseOptional\n\
+Include = /etc/pacman.d/arcolinux-mirrorlist"
+
+arepo = "[arcolinux_repo]\n\
+SigLevel = Required DatabaseOptional\n\
+Include = /etc/pacman.d/arcolinux-mirrorlist"
+
+a3drepo = "[arcolinux_repo_3party]\n\
+SigLevel = Required DatabaseOptional\n\
+Include = /etc/pacman.d/arcolinux-mirrorlist"
+
+axlrepo = "[arcolinux_repo_xlarge]\n\
+SigLevel = Required DatabaseOptional\n\
+Include = /etc/pacman.d/arcolinux-mirrorlist"
+
+hefftor_repo = "[hefftor-repo]\n\
+SigLevel = Optional TrustedOnly\n\
+Include = /etc/pacman.d/arcolinux-mirrorlist-bradheff"
+
+bobo_repo = "[chaotic-aur]\n\
+SigLevel = Required DatabaseOptional\n\
+Include = /etc/pacman.d/chaotic-mirrorlist"
+
+# =====================================================
+# NOTIFICATIONS
+# =====================================================
+
+
+def show_in_app_notification(self, message):
+ if self.timeout_id is not None:
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+ self.notification_label.set_markup(
+ '' + message + ""
+ )
+ self.notification_revealer.set_reveal_child(True)
+ self.timeout_id = GLib.timeout_add(3000, timeOut, self)
+
+
+def timeOut(self):
+ close_in_app_notification(self)
+
+
+def close_in_app_notification(self):
+ self.notification_revealer.set_reveal_child(False)
+ GLib.source_remove(self.timeout_id)
+ self.timeout_id = None
+
+
+# =====================================================
+# PERMISSIONS
+# =====================================================
+
+
+def test(dst):
+ for root, dirs, filesr in os.walk(dst):
+ # print(root)
+ for folder in dirs:
+ pass
+ # print(dst + "/" + folder)
+ for file in filesr:
+ pass
+ # print(dst + "/" + folder + "/" + file)
+ for file in filesr:
+ pass
+ # print(dst + "/" + file)
+
+
+# =====================================================
+# COPY FUNCTION
+# =====================================================
+
+
+def copy_func(src, dst, isdir=False):
+ if isdir:
+ subprocess.run(["cp", "-Rp", src, dst], shell=False)
+ else:
+ subprocess.run(["cp", "-p", src, dst], shell=False)
+ # permissions(dst)
+
+
+# =====================================================
+# SOURCE
+# =====================================================
+
+
+def source_shell(self):
+ process = subprocess.run(["sh", "-c", 'echo "$SHELL"'], stdout=subprocess.PIPE)
+
+ output = process.stdout.decode().strip()
+ print(output)
+ if output == "/bin/bash":
+ subprocess.run(
+ [
+ "bash",
+ "-c",
+ "su - " + sudo_username + ' -c "source ' + home + '/.bashrc"',
+ ],
+ stdout=subprocess.PIPE,
+ )
+ elif output == "/bin/zsh":
+ subprocess.run(
+ ["zsh", "-c", "su - " + sudo_username + ' -c "source ' + home + '/.zshrc"'],
+ stdout=subprocess.PIPE,
+ )
+
+
+def run_as_user(script):
+ subprocess.call(["su - " + sudo_username + " -c " + script], shell=False)
+
+
+# =====================================================
+# MESSAGEBOX
+# =====================================================
+
+
+def MessageBox(self, title, message):
+ md2 = Gtk.MessageDialog(
+ parent=self,
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text=title,
+ )
+ md2.format_secondary_markup(message)
+ md2.run()
+ md2.destroy()
+
+
+# =====================================================
+# CONVERT COLOR
+# =====================================================
+
+
+def rgb_to_hex(rgb):
+ if "rgb" in rgb:
+ rgb = rgb.replace("rgb(", "").replace(")", "")
+ vals = rgb.split(",")
+ return "#{0:02x}{1:02x}{2:02x}".format(
+ clamp(int(vals[0])), clamp(int(vals[1])), clamp(int(vals[2]))
+ )
+ return rgb
+
+
+def clamp(x):
+ return max(0, min(x, 255))
+
+
+# =====================================================
+# GLOBAL FUNCTIONS
+# =====================================================
+
+
+def _get_variable(lists, value):
+ data = [string for string in lists if value in string]
+
+ if len(data) >= 1:
+
+ data1 = [string for string in data if "#" in string]
+
+ for i in data1:
+ if i[:4].find("#") != -1:
+ data.remove(i)
+ if data:
+ data_clean = [data[0].strip("\n").replace(" ", "")][0].split("=")
+ return data_clean
+
+
+# Check value exists
+
+
+def check_value(list, value):
+ data = [string for string in list if value in string]
+ if len(data) >= 1:
+ data1 = [string for string in data if "#" in string]
+ for i in data1:
+ if i[:4].find("#") != -1:
+ data.remove(i)
+ return data
+
+
+def check_backups(now):
+ if not os.path.exists(home + "/" + bd + "/Backup-" + now.strftime("%Y-%m-%d %H")):
+ os.makedirs(home + "/" + bd + "/Backup-" + now.strftime("%Y-%m-%d %H"), 0o777)
+ permissions(home + "/" + bd + "/Backup-" + now.strftime("%Y-%m-%d %H"))
+
+
+# =====================================================
+# Check if File Exists
+# =====================================================
+
+
+def file_check(file):
+ if os.path.isfile(file):
+ return True
+
+ return False
+
+
+def path_check(path):
+ if os.path.isdir(path):
+ return True
+
+ return False
+
+
+# =====================================================
+# GTK3 CONF
+# =====================================================
+
+
+def gtk_check_value(my_list, value):
+ data = [string for string in my_list if value in string]
+ if len(data) >= 1:
+ data1 = [string for string in data if "#" in string]
+ for i in data1:
+ if i[:4].find("#") != -1:
+ data.remove(i)
+ return data
+
+
+def gtk_get_position(my_list, value):
+ data = [string for string in my_list if value in string]
+ position = my_list.index(data[0])
+ return position
+
+
+# =====================================================
+# OBLOGOUT CONF
+# =====================================================
+# Get shortcuts index
+
+
+def get_shortcuts(conflist):
+ sortcuts = _get_variable(conflist, "shortcuts")
+ shortcuts_index = _get_position(conflist, sortcuts[0])
+ return int(shortcuts_index)
+
+
+# Get commands index
+
+
+def get_commands(conflist):
+ commands = _get_variable(conflist, "commands")
+ commands_index = _get_position(conflist, commands[0])
+ return int(commands_index)
+
+
+# =====================================================
+# LIGHTDM CONF
+# =====================================================
+
+
+def check_lightdm_value(list, value):
+ data = [string for string in list if value in string]
+ # if len(data) >= 1:
+ # data1 = [string for string in data if "#" in string]
+
+ return data
+
+
+# =====================================================
+# SDDM CONF
+# =====================================================
+
+
+def check_sddm_value(list, value):
+ data = [string for string in list if value in string]
+ return data
+
+
+# =====================================================
+# HBLOCK CONF
+# =====================================================
+
+
+def hblock_get_state(self):
+ lines = int(
+ subprocess.check_output("wc -l /etc/hosts", shell=True).strip().split()[0]
+ )
+ if os.path.exists("/usr/local/bin/hblock") and lines > 100:
+ return True
+
+ self.firstrun = False
+ return False
+
+
+def do_pulse(data, prog):
+ prog.pulse()
+ return True
+
+
+def set_hblock(self, toggle, state):
+ GLib.idle_add(toggle.set_sensitive, False)
+ GLib.idle_add(self.label7.set_text, "Run..")
+ GLib.idle_add(self.progress.set_fraction, 0.2)
+
+ timeout_id = None
+ timeout_id = GLib.timeout_add(100, do_pulse, None, self.progress)
+
+ try:
+
+ install = "pacman -S arcolinux-hblock-git --needed --noconfirm"
+ enable = "/usr/local/bin/hblock"
+
+ if state:
+ if os.path.exists("/usr/local/bin/hblock"):
+ GLib.idle_add(self.label7.set_text, "Database update...")
+ subprocess.call(
+ [enable],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ else:
+ GLib.idle_add(self.label7.set_text, "Install Hblock......")
+ subprocess.call(
+ install.split(" "),
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ GLib.idle_add(self.label7.set_text, "Database update...")
+ subprocess.call(
+ [enable],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+
+ else:
+ GLib.idle_add(self.label7.set_text, "Remove update...")
+ subprocess.run(
+ ["sh", "-c", "HBLOCK_SOURCES='' /usr/local/bin/hblock"],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+
+ GLib.idle_add(self.label7.set_text, "Complete")
+ GLib.source_remove(timeout_id)
+ timeout_id = None
+ GLib.idle_add(self.progress.set_fraction, 0)
+
+ GLib.idle_add(toggle.set_sensitive, True)
+ if state:
+ GLib.idle_add(self.label7.set_text, "HBlock Active")
+ else:
+ GLib.idle_add(self.label7.set_text, "HBlock Inactive")
+
+ except Exception as e:
+ MessageBox(self, "ERROR!!", str(e))
+ print(e)
+
+
+# =====================================================
+# UBLOCK ORIGIN
+# =====================================================
+
+
+def ublock_get_state(self):
+ if os.path.exists(
+ "/usr/lib/firefox/browser/extensions/uBlock0@raymondhill.net.xpi"
+ ):
+ return True
+ return False
+
+
+def set_firefox_ublock(self, toggle, state):
+ GLib.idle_add(toggle.set_sensitive, False)
+ GLib.idle_add(self.label7.set_text, "Run..")
+ GLib.idle_add(self.progress.set_fraction, 0.2)
+
+ timeout_id = None
+ timeout_id = GLib.timeout_add(100, do_pulse, None, self.progress)
+
+ try:
+
+ install_ublock = "pacman -S firefox-ublock-origin --needed --noconfirm"
+ uninstall_ublock = "pacman -Rs firefox-ublock-origin --noconfirm"
+
+ if state:
+ GLib.idle_add(self.label7.set_text, "Installing ublock Origin...")
+ subprocess.call(
+ install_ublock.split(" "),
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ else:
+ GLib.idle_add(self.label7.set_text, "Removing ublock Origin...")
+ subprocess.call(
+ uninstall_ublock.split(" "),
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+
+ GLib.idle_add(self.label7.set_text, "Complete")
+ GLib.source_remove(timeout_id)
+ timeout_id = None
+ GLib.idle_add(self.progress.set_fraction, 0)
+
+ GLib.idle_add(toggle.set_sensitive, True)
+ if state:
+ GLib.idle_add(self.label7.set_text, "uBlock Origin installed")
+ else:
+ GLib.idle_add(self.label7.set_text, "uBlock Origin removed")
+
+ except Exception as e:
+ MessageBox(self, "ERROR!!", str(e))
+ print(e)
+
+
+# =====================================================
+# ALACRITTY
+# =====================================================
+
+
+def install_alacritty(self):
+ install = "pacman -S alacritty --needed --noconfirm"
+
+ if os.path.exists("/usr/bin/alacritty"):
+ pass
+ else:
+ subprocess.call(
+ install.split(" "),
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+
+
+# =====================================================
+# ARCOLINUX-DESKTOP-TRASHER
+# =====================================================
+
+
+def install_adt(self):
+ install = "pacman -S arcolinux-desktop-trasher-git --noconfirm"
+
+ if os.path.exists("/usr/local/bin/arcolinux-desktop-trasher"):
+ pass
+ else:
+ subprocess.call(
+ install.split(" "),
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+
+
+# =====================================================
+# GRUB CONF
+# =====================================================
+
+
+def get_grub_wallpapers():
+ if os.path.isdir("/boot/grub/themes/Vimix"):
+ lists = os.listdir("/boot/grub/themes/Vimix")
+
+ rems = [
+ "select_e.png",
+ "terminal_box_se.png",
+ "select_c.png",
+ "terminal_box_c.png",
+ "terminal_box_s.png",
+ "select_w.png",
+ "terminal_box_nw.png",
+ "terminal_box_w.png",
+ "terminal_box_ne.png",
+ "terminal_box_sw.png",
+ "terminal_box_n.png",
+ "terminal_box_e.png",
+ ]
+
+ ext = [".png", ".jpeg", ".jpg"]
+
+ new_list = [x for x in lists if x not in rems for y in ext if y in x]
+
+ new_list.sort()
+ return new_list
+
+
+def set_grub_wallpaper(self, image):
+ if os.path.isfile(grub_theme_conf):
+ if not os.path.isfile(grub_theme_conf + ".bak"):
+ shutil.copy(grub_theme_conf, grub_theme_conf + ".bak")
+ try:
+ with open(grub_theme_conf, "r") as f:
+ lists = f.readlines()
+ f.close()
+
+ val = _get_position(lists, "desktop-image: ")
+ lists[val] = 'desktop-image: "' + os.path.basename(image) + '"' + "\n"
+
+ with open(grub_theme_conf, "w") as f:
+ f.writelines(lists)
+ f.close()
+
+ show_in_app_notification(self, "Settings Saved Successfully")
+ # MessageBox(self, "Success!!", "Settings Saved Successfully")
+ except: # noqa
+ pass
+
+
+# =====================================================
+# NEOFETCH CONF
+# =====================================================
+
+
+def neofetch_set_value(lists, pos, text, state):
+ if state:
+ if text in lists[pos]:
+ if "#" in lists[pos]:
+ lists[pos] = lists[pos].replace("#", "")
+ else:
+ if text in lists[pos]:
+ if "#" not in lists[pos]:
+ lists[pos] = "#" + lists[pos]
+
+ return lists
+
+
+def neofetch_set_backend_value(lists, pos, text, value):
+ if text in lists[pos] and "#" not in lists[pos]:
+ lists[pos] = text + value + '"\n'
+
+
+# ====================================================================
+# CUSTOM FUNCTION
+# ====================================================================
+
+
+def get_desktop(self):
+ base_dir = os.path.dirname(os.path.realpath(__file__))
+
+ desktop = subprocess.run(
+ ["sh", base_dir + "/get_desktop.sh", "-n"],
+ shell=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ )
+ dsk = desktop.stdout.decode().strip().split("\n")
+ self.desktop = dsk[-1].strip()
+
+
+def copytree(self, src, dst, symlinks=False, ignore=None): # noqa
+
+ if not os.path.exists(dst):
+ os.makedirs(dst)
+ for item in os.listdir(src):
+ s = os.path.join(src, item)
+ d = os.path.join(dst, item)
+ if os.path.exists(d):
+ try:
+ shutil.rmtree(d)
+ except Exception as e:
+ print(e)
+ os.unlink(d)
+ if os.path.isdir(s):
+ try:
+ shutil.copytree(s, d, symlinks, ignore)
+ except Exception as e:
+ print(e)
+ print("ERROR2")
+ self.ecode = 1
+ else:
+ try:
+ shutil.copy2(s, d)
+ except: # noqa
+ print("ERROR3")
+ self.ecode = 1
+
+
+# =====================================================
+# CHECK RUNNING PROCESS
+# =====================================================
+
+
+def checkIfProcessRunning(processName):
+ for proc in psutil.process_iter():
+ try:
+ pinfo = proc.as_dict(attrs=["pid", "name", "create_time"])
+ if processName == pinfo["pid"]:
+ return True
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
+ pass
+ return False
+
+
+def restart_program():
+ python = sys.executable
+ os.execl(python, python, *sys.argv)
+
+
+# JUNK CODE FOR LEARNING PROGRESS BARS:
+# from tqdm import tqdm
+# loop = tqdm(total = 1000, position = 0, leave = False)
+# for k in range(1001):
+# loop.set_description("Loading...".format(k))
+# loop.update(1)
+# loop.close
diff --git a/usr/share/sofirem/Package.py b/usr/share/sofirem/Package.py
new file mode 100644
index 0000000..67a33cb
--- /dev/null
+++ b/usr/share/sofirem/Package.py
@@ -0,0 +1,19 @@
+# This class is to encapsulate package metadata, taken from the yaml files stored inside the sofirem github repository
+
+
+class Package(object):
+ def __init__(
+ self,
+ name,
+ description,
+ category,
+ subcategory,
+ subcategory_description,
+ version,
+ ):
+ self.name = name
+ self.description = description
+ self.category = category
+ self.subcategory = subcategory
+ self.subcategory_description = subcategory_description
+ self.version = version
diff --git a/usr/share/sofirem/Settings.py b/usr/share/sofirem/Settings.py
new file mode 100644
index 0000000..13992a7
--- /dev/null
+++ b/usr/share/sofirem/Settings.py
@@ -0,0 +1,132 @@
+# This class is used to process configuration data for the app
+
+import os
+import Functions as fn
+from string import Template
+
+base_dir = os.path.dirname(os.path.realpath(__file__))
+# a default configuration file if one doesn't exist is copied over from /usr/share/sofirem/defaults to $HOME/.config
+default_file = "%s/defaults/sofirem.yaml" % base_dir
+
+
+class Settings(object):
+ def __init__(self, display_versions, display_package_progress):
+ self.display_versions = display_versions
+ self.display_package_progress = display_package_progress
+
+ def write_config_file(self):
+ try:
+ content = []
+ with open(fn.config_file, "r", encoding="UTF-8") as f:
+ contents = f.readlines()
+
+ if len(contents) > 0:
+ self.read(contents)
+
+ conf_settings = {}
+
+ conf_settings["Display Package Versions"] = self.display_versions
+
+ conf_settings[
+ "Display Package Progress"
+ ] = self.display_package_progress
+
+ index = 0
+ for line in contents:
+ if line.startswith("- name:"):
+ if (
+ line.strip("- name: ")
+ .strip()
+ .strip('"')
+ .strip("\n")
+ .strip()
+ == "Display Package Versions"
+ ):
+ index = contents.index(line)
+
+ index += 2
+
+ if contents[index].startswith(" enabled: "):
+ del contents[index]
+ contents.insert(
+ index,
+ " enabled: %s\n"
+ % conf_settings["Display Package Versions"],
+ )
+
+ if (
+ line.strip("- name: ")
+ .strip()
+ .strip('"')
+ .strip("\n")
+ .strip()
+ == "Display Package Progress"
+ ):
+ index += 4
+ if contents[index].startswith(" enabled: "):
+ del contents[index]
+ contents.insert(
+ index,
+ " enabled: %s\n"
+ % conf_settings["Display Package Progress"],
+ )
+
+ if len(contents) > 0:
+ with open(fn.config_file, "w", encoding="UTF-8") as f:
+ f.writelines(contents)
+
+ fn.permissions(fn.config_dir)
+
+ except Exception as e:
+ fn.logger.error("Exception in write_config_file(): %s" % e)
+
+ def read_config_file(self):
+ try:
+ if os.path.exists(fn.config_file):
+ contents = []
+ with open(fn.config_file, "r", encoding="UTF-8") as f:
+ contents = f.readlines()
+
+ # file is empty, string replace template file
+ if len(contents) == 0:
+ fn.shutil.copy(default_file, fn.config_file)
+ fn.permissions(fn.config_dir)
+ else:
+ return self.read(contents)
+
+ else:
+ # config file doesn't exist, string replace template file
+ fn.shutil.copy(default_file, fn.config_file)
+ fn.permissions(fn.config_dir)
+
+ with open(fn.config_file, "r", encoding="UTF-8") as f:
+ contents = f.readlines()
+
+ return self.read(contents)
+
+ except Exception as e:
+ print("Exception in read_config_file(): %s" % e)
+
+ def read(self, contents):
+ setting_name = None
+ setting_value_enabled = None
+ conf_settings = {}
+ for line in contents:
+ if line.startswith("- name:"):
+ setting_name = (
+ line.strip("- name: ").strip().strip('"').strip("\n").strip()
+ )
+ elif line.startswith(" enabled: "):
+ setting_value_enabled = (
+ line.strip(" enabled: ").strip().strip('"').strip("\n").strip()
+ )
+
+ if setting_value_enabled == "False":
+ conf_settings[setting_name] = False
+ else:
+ conf_settings[setting_name] = True
+
+ if len(conf_settings) > 0:
+ return conf_settings
+ else:
+ print("[ERROR] Failed to read settings into memory")
diff --git a/usr/share/sofirem/cache/a-candy-beauty-icon-theme-git b/usr/share/sofirem/cache/a-candy-beauty-icon-theme-git
new file mode 100644
index 0000000..4aac38b
--- /dev/null
+++ b/usr/share/sofirem/cache/a-candy-beauty-icon-theme-git
@@ -0,0 +1 @@
+Beautyline icons completed for ArcoLinux + Candy icons
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/abiword b/usr/share/sofirem/cache/abiword
new file mode 100644
index 0000000..8f8d117
--- /dev/null
+++ b/usr/share/sofirem/cache/abiword
@@ -0,0 +1 @@
+Fully-featured word processor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/acpilight b/usr/share/sofirem/cache/acpilight
new file mode 100644
index 0000000..b799eca
--- /dev/null
+++ b/usr/share/sofirem/cache/acpilight
@@ -0,0 +1 @@
+a backward-compatible xbacklight replacement based on ACPI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/adapta-gtk-theme b/usr/share/sofirem/cache/adapta-gtk-theme
new file mode 100644
index 0000000..e73da1e
--- /dev/null
+++ b/usr/share/sofirem/cache/adapta-gtk-theme
@@ -0,0 +1 @@
+An adaptive Gtk+ theme based on Material Design Guidelines
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/adobe-source-code-pro-fonts b/usr/share/sofirem/cache/adobe-source-code-pro-fonts
new file mode 100644
index 0000000..28db9af
--- /dev/null
+++ b/usr/share/sofirem/cache/adobe-source-code-pro-fonts
@@ -0,0 +1 @@
+Monospaced font family for user interface and coding environment
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/adobe-source-sans-fonts b/usr/share/sofirem/cache/adobe-source-sans-fonts
new file mode 100644
index 0000000..8fe16ee
--- /dev/null
+++ b/usr/share/sofirem/cache/adobe-source-sans-fonts
@@ -0,0 +1 @@
+Sans-serif font family for user interface environments
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/adobe-source-serif-fonts b/usr/share/sofirem/cache/adobe-source-serif-fonts
new file mode 100644
index 0000000..56b3a7e
--- /dev/null
+++ b/usr/share/sofirem/cache/adobe-source-serif-fonts
@@ -0,0 +1 @@
+Serif typeface designed to complement Source Sans
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/airdroid-nativefier b/usr/share/sofirem/cache/airdroid-nativefier
new file mode 100644
index 0000000..4701725
--- /dev/null
+++ b/usr/share/sofirem/cache/airdroid-nativefier
@@ -0,0 +1 @@
+An Airdroid client build with nativefier
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/aisleriot b/usr/share/sofirem/cache/aisleriot
new file mode 100644
index 0000000..dda611f
--- /dev/null
+++ b/usr/share/sofirem/cache/aisleriot
@@ -0,0 +1 @@
+A collection of patience games written in guile scheme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/alacritty b/usr/share/sofirem/cache/alacritty
new file mode 100644
index 0000000..b03dccf
--- /dev/null
+++ b/usr/share/sofirem/cache/alacritty
@@ -0,0 +1 @@
+A cross-platform, GPU-accelerated terminal emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/alacritty-themes b/usr/share/sofirem/cache/alacritty-themes
new file mode 100644
index 0000000..2554fb6
--- /dev/null
+++ b/usr/share/sofirem/cache/alacritty-themes
@@ -0,0 +1 @@
+A utility for choosing and applying Alacritty terminal themes.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/albert b/usr/share/sofirem/cache/albert
new file mode 100644
index 0000000..157f5aa
--- /dev/null
+++ b/usr/share/sofirem/cache/albert
@@ -0,0 +1 @@
+A sophisticated standalone keyboard launcher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/alsi b/usr/share/sofirem/cache/alsi
new file mode 100644
index 0000000..d3ede41
--- /dev/null
+++ b/usr/share/sofirem/cache/alsi
@@ -0,0 +1 @@
+ALSI: a configurable system information tool for Arch Linux.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/amberol b/usr/share/sofirem/cache/amberol
new file mode 100644
index 0000000..ed551a8
--- /dev/null
+++ b/usr/share/sofirem/cache/amberol
@@ -0,0 +1 @@
+Plays music, and nothing else
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/amd-ucode b/usr/share/sofirem/cache/amd-ucode
new file mode 100644
index 0000000..07431ab
--- /dev/null
+++ b/usr/share/sofirem/cache/amd-ucode
@@ -0,0 +1 @@
+Microcode update image for AMD CPUs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/android-file-transfer b/usr/share/sofirem/cache/android-file-transfer
new file mode 100644
index 0000000..1eccd8f
--- /dev/null
+++ b/usr/share/sofirem/cache/android-file-transfer
@@ -0,0 +1 @@
+Android MTP client with minimalistic UI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/android-sdk-platform-tools b/usr/share/sofirem/cache/android-sdk-platform-tools
new file mode 100644
index 0000000..6991d62
--- /dev/null
+++ b/usr/share/sofirem/cache/android-sdk-platform-tools
@@ -0,0 +1 @@
+Platform-Tools for Google Android SDK (adb and fastboot)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/android-tools b/usr/share/sofirem/cache/android-tools
new file mode 100644
index 0000000..cc6f778
--- /dev/null
+++ b/usr/share/sofirem/cache/android-tools
@@ -0,0 +1 @@
+Android platform tools
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/anydesk-bin b/usr/share/sofirem/cache/anydesk-bin
new file mode 100644
index 0000000..e18f842
--- /dev/null
+++ b/usr/share/sofirem/cache/anydesk-bin
@@ -0,0 +1 @@
+Fast remote desktop application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/appimagelauncher b/usr/share/sofirem/cache/appimagelauncher
new file mode 100644
index 0000000..85153d4
--- /dev/null
+++ b/usr/share/sofirem/cache/appimagelauncher
@@ -0,0 +1 @@
+A Helper application for running and integrating AppImages.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arc-darkest-theme-git b/usr/share/sofirem/cache/arc-darkest-theme-git
new file mode 100644
index 0000000..81603bd
--- /dev/null
+++ b/usr/share/sofirem/cache/arc-darkest-theme-git
@@ -0,0 +1 @@
+A darker version of famous Arc theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arc-icon-theme b/usr/share/sofirem/cache/arc-icon-theme
new file mode 100644
index 0000000..8eaac3d
--- /dev/null
+++ b/usr/share/sofirem/cache/arc-icon-theme
@@ -0,0 +1 @@
+Arc icon theme. Official releases only.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arc-x-icons-theme b/usr/share/sofirem/cache/arc-x-icons-theme
new file mode 100644
index 0000000..be05047
--- /dev/null
+++ b/usr/share/sofirem/cache/arc-x-icons-theme
@@ -0,0 +1 @@
+Modern free desktop icon theme whose design is based around the use of bold colours and simple geometric shapes to compose icons with pixel perfect rendering.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/archey3 b/usr/share/sofirem/cache/archey3
new file mode 100644
index 0000000..c2c0041
--- /dev/null
+++ b/usr/share/sofirem/cache/archey3
@@ -0,0 +1 @@
+Output a logo and various system information
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/archlinux-login-backgrounds-git b/usr/share/sofirem/cache/archlinux-login-backgrounds-git
new file mode 100644
index 0000000..b755329
--- /dev/null
+++ b/usr/share/sofirem/cache/archlinux-login-backgrounds-git
@@ -0,0 +1 @@
+Backgrounds for any login manager - sddm, lightdm, ...
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/archlinux-logout-git b/usr/share/sofirem/cache/archlinux-logout-git
new file mode 100644
index 0000000..d0ebf44
--- /dev/null
+++ b/usr/share/sofirem/cache/archlinux-logout-git
@@ -0,0 +1 @@
+Arch Linux logout
diff --git a/usr/share/sofirem/cache/archlinux-tweak-tool-git b/usr/share/sofirem/cache/archlinux-tweak-tool-git
new file mode 100644
index 0000000..b3401a4
--- /dev/null
+++ b/usr/share/sofirem/cache/archlinux-tweak-tool-git
@@ -0,0 +1 @@
+Arch Linux Tweak Tool or ATT
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-aqua-git b/usr/share/sofirem/cache/arcolinux-arc-aqua-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-aqua-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-archlinux-blue-git b/usr/share/sofirem/cache/arcolinux-arc-archlinux-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-archlinux-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-arcolinux-blue-git b/usr/share/sofirem/cache/arcolinux-arc-arcolinux-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-arcolinux-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-azul-git b/usr/share/sofirem/cache/arcolinux-arc-azul-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-azul-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-azure-dodger-blue-git b/usr/share/sofirem/cache/arcolinux-arc-azure-dodger-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-azure-dodger-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-azure-git b/usr/share/sofirem/cache/arcolinux-arc-azure-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-azure-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-blood-git b/usr/share/sofirem/cache/arcolinux-arc-blood-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-blood-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-blue-sky-git b/usr/share/sofirem/cache/arcolinux-arc-blue-sky-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-blue-sky-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-botticelli-git b/usr/share/sofirem/cache/arcolinux-arc-botticelli-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-botticelli-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-bright-lilac-git b/usr/share/sofirem/cache/arcolinux-arc-bright-lilac-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-bright-lilac-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-bright-lime-green-git b/usr/share/sofirem/cache/arcolinux-arc-bright-lime-green-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-bright-lime-green-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-carnation-git b/usr/share/sofirem/cache/arcolinux-arc-carnation-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-carnation-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-carolina-blue-git b/usr/share/sofirem/cache/arcolinux-arc-carolina-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-carolina-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-casablanca-git b/usr/share/sofirem/cache/arcolinux-arc-casablanca-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-casablanca-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-crimson-git b/usr/share/sofirem/cache/arcolinux-arc-crimson-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-crimson-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-dawn-git b/usr/share/sofirem/cache/arcolinux-arc-dawn-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-dawn-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-dodger-blue-git b/usr/share/sofirem/cache/arcolinux-arc-dodger-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-dodger-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-emerald-git b/usr/share/sofirem/cache/arcolinux-arc-emerald-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-emerald-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-evopop-git b/usr/share/sofirem/cache/arcolinux-arc-evopop-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-evopop-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-fern-git b/usr/share/sofirem/cache/arcolinux-arc-fern-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-fern-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-fire-git b/usr/share/sofirem/cache/arcolinux-arc-fire-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-fire-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-froly-git b/usr/share/sofirem/cache/arcolinux-arc-froly-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-froly-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-havelock-git b/usr/share/sofirem/cache/arcolinux-arc-havelock-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-havelock-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-hibiscus-git b/usr/share/sofirem/cache/arcolinux-arc-hibiscus-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-hibiscus-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-kde b/usr/share/sofirem/cache/arcolinux-arc-kde
new file mode 100644
index 0000000..862b128
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-kde
@@ -0,0 +1 @@
+Arc theme for KDE Plasma 5
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-light-blue-grey-git b/usr/share/sofirem/cache/arcolinux-arc-light-blue-grey-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-light-blue-grey-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-light-blue-surfn-git b/usr/share/sofirem/cache/arcolinux-arc-light-blue-surfn-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-light-blue-surfn-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-light-salmon-git b/usr/share/sofirem/cache/arcolinux-arc-light-salmon-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-light-salmon-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-mandy-git b/usr/share/sofirem/cache/arcolinux-arc-mandy-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-mandy-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-mantis-git b/usr/share/sofirem/cache/arcolinux-arc-mantis-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-mantis-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-medium-blue-git b/usr/share/sofirem/cache/arcolinux-arc-medium-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-medium-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-niagara-git b/usr/share/sofirem/cache/arcolinux-arc-niagara-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-niagara-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-nice-blue-git b/usr/share/sofirem/cache/arcolinux-arc-nice-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-nice-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-numix-git b/usr/share/sofirem/cache/arcolinux-arc-numix-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-numix-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-orchid-git b/usr/share/sofirem/cache/arcolinux-arc-orchid-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-orchid-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-pale-grey-git b/usr/share/sofirem/cache/arcolinux-arc-pale-grey-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-pale-grey-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-paper-git b/usr/share/sofirem/cache/arcolinux-arc-paper-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-paper-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-pink-git b/usr/share/sofirem/cache/arcolinux-arc-pink-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-pink-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-polo-git b/usr/share/sofirem/cache/arcolinux-arc-polo-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-polo-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-punch-git b/usr/share/sofirem/cache/arcolinux-arc-punch-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-punch-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-red-orange-git b/usr/share/sofirem/cache/arcolinux-arc-red-orange-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-red-orange-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-rusty-orange-git b/usr/share/sofirem/cache/arcolinux-arc-rusty-orange-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-rusty-orange-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-sky-blue-git b/usr/share/sofirem/cache/arcolinux-arc-sky-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-sky-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-slate-grey-git b/usr/share/sofirem/cache/arcolinux-arc-slate-grey-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-slate-grey-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-smoke-git b/usr/share/sofirem/cache/arcolinux-arc-smoke-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-smoke-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-soft-blue-git b/usr/share/sofirem/cache/arcolinux-arc-soft-blue-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-soft-blue-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-tacao-git b/usr/share/sofirem/cache/arcolinux-arc-tacao-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-tacao-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-tangerine-git b/usr/share/sofirem/cache/arcolinux-arc-tangerine-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-tangerine-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-themes-2021-creative-git b/usr/share/sofirem/cache/arcolinux-arc-themes-2021-creative-git
new file mode 100644
index 0000000..139c1ed
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-themes-2021-creative-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux with Arc Colora script
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-themes-2021-git b/usr/share/sofirem/cache/arcolinux-arc-themes-2021-git
new file mode 100644
index 0000000..139c1ed
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-themes-2021-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux with Arc Colora script
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-themes-2021-sky-git b/usr/share/sofirem/cache/arcolinux-arc-themes-2021-sky-git
new file mode 100644
index 0000000..139c1ed
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-themes-2021-sky-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux with Arc Colora script
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-themes-git b/usr/share/sofirem/cache/arcolinux-arc-themes-git
new file mode 100644
index 0000000..4f80141
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-themes-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux with Arc Colora scrip
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-tory-git b/usr/share/sofirem/cache/arcolinux-arc-tory-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-tory-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-arc-warm-pink-git b/usr/share/sofirem/cache/arcolinux-arc-warm-pink-git
new file mode 100644
index 0000000..7f379e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-arc-warm-pink-git
@@ -0,0 +1 @@
+Arc themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-awesome-git b/usr/share/sofirem/cache/arcolinux-awesome-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-awesome-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-berry-git b/usr/share/sofirem/cache/arcolinux-berry-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-berry-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-bspwm-git b/usr/share/sofirem/cache/arcolinux-bspwm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-bspwm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-budgie-dconf-git b/usr/share/sofirem/cache/arcolinux-budgie-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-budgie-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-budgie-git b/usr/share/sofirem/cache/arcolinux-budgie-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-budgie-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-chadwm-git b/usr/share/sofirem/cache/arcolinux-chadwm-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-chadwm-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-cinnamon-dconf-git b/usr/share/sofirem/cache/arcolinux-cinnamon-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-cinnamon-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-cinnamon-git b/usr/share/sofirem/cache/arcolinux-cinnamon-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-cinnamon-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-common-git b/usr/share/sofirem/cache/arcolinux-common-git
new file mode 100644
index 0000000..e0c16e8
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-common-git
@@ -0,0 +1 @@
+ArcoLinux common files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-config-all-desktops-git b/usr/share/sofirem/cache/arcolinux-config-all-desktops-git
new file mode 100644
index 0000000..594dc6a
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-config-all-desktops-git
@@ -0,0 +1 @@
+Configuration files for all desktops from ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-config-plasma-git b/usr/share/sofirem/cache/arcolinux-config-plasma-git
new file mode 100644
index 0000000..cf9a4de
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-config-plasma-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinuxB Plasma
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-conky-collection-git b/usr/share/sofirem/cache/arcolinux-conky-collection-git
new file mode 100644
index 0000000..3eb1ce5
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-conky-collection-git
@@ -0,0 +1 @@
+Conky themes from ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-conky-collection-plasma-git b/usr/share/sofirem/cache/arcolinux-conky-collection-plasma-git
new file mode 100644
index 0000000..3fdd22c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-conky-collection-plasma-git
@@ -0,0 +1 @@
+Conky themes from ArcoLinux for Plasma only
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-cutefish-dconf-git b/usr/share/sofirem/cache/arcolinux-cutefish-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-cutefish-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-cutefish-git b/usr/share/sofirem/cache/arcolinux-cutefish-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-cutefish-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-cwm-git b/usr/share/sofirem/cache/arcolinux-cwm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-cwm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-dconf-all-desktops-git b/usr/share/sofirem/cache/arcolinux-dconf-all-desktops-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-dconf-all-desktops-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-deepin-dconf-git b/usr/share/sofirem/cache/arcolinux-deepin-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-deepin-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-deepin-git b/usr/share/sofirem/cache/arcolinux-deepin-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-deepin-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-desktop-trasher-git b/usr/share/sofirem/cache/arcolinux-desktop-trasher-git
new file mode 100644
index 0000000..8ffdcd2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-desktop-trasher-git
@@ -0,0 +1 @@
+ArcoLinux Desktop Trasher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-docs-git b/usr/share/sofirem/cache/arcolinux-docs-git
new file mode 100644
index 0000000..5dabcb0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-docs-git
@@ -0,0 +1 @@
+Documentation created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-dusk-git b/usr/share/sofirem/cache/arcolinux-dusk-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-dusk-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-dwm-git b/usr/share/sofirem/cache/arcolinux-dwm-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-dwm-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-dwm-slstatus-git b/usr/share/sofirem/cache/arcolinux-dwm-slstatus-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-dwm-slstatus-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-dwm-st-git b/usr/share/sofirem/cache/arcolinux-dwm-st-git
new file mode 100644
index 0000000..e708097
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-dwm-st-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Dwm
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-fvwm3-git b/usr/share/sofirem/cache/arcolinux-fvwm3-git
new file mode 100644
index 0000000..19d76f2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-fvwm3-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Fvwm3
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-geany-git b/usr/share/sofirem/cache/arcolinux-geany-git
new file mode 100644
index 0000000..bf92a0a
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-geany-git
@@ -0,0 +1 @@
+geany config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-gnome-dconf-git b/usr/share/sofirem/cache/arcolinux-gnome-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-gnome-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-gnome-git b/usr/share/sofirem/cache/arcolinux-gnome-git
new file mode 100644
index 0000000..42eb9ea
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-gnome-git
@@ -0,0 +1 @@
+ArcoLinuxB Gnome Desktop Settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-gtk3-arcolinux-candy-beauty-git b/usr/share/sofirem/cache/arcolinux-gtk3-arcolinux-candy-beauty-git
new file mode 100644
index 0000000..5cc608c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-gtk3-arcolinux-candy-beauty-git
@@ -0,0 +1 @@
+Gtk3 config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-gtk3-sardi-arc-git b/usr/share/sofirem/cache/arcolinux-gtk3-sardi-arc-git
new file mode 100644
index 0000000..5cc608c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-gtk3-sardi-arc-git
@@ -0,0 +1 @@
+Gtk3 config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-gtk3-surfn-arc-breeze-git b/usr/share/sofirem/cache/arcolinux-gtk3-surfn-arc-breeze-git
new file mode 100644
index 0000000..5cc608c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-gtk3-surfn-arc-breeze-git
@@ -0,0 +1 @@
+Gtk3 config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-gtk3-surfn-arc-git b/usr/share/sofirem/cache/arcolinux-gtk3-surfn-arc-git
new file mode 100644
index 0000000..5cc608c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-gtk3-surfn-arc-git
@@ -0,0 +1 @@
+Gtk3 config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-guake-autostart-git b/usr/share/sofirem/cache/arcolinux-guake-autostart-git
new file mode 100644
index 0000000..092f3c6
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-guake-autostart-git
@@ -0,0 +1 @@
+guake autostart for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-herbstluftwm-git b/usr/share/sofirem/cache/arcolinux-herbstluftwm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-herbstluftwm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-hypr-git b/usr/share/sofirem/cache/arcolinux-hypr-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-hypr-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-hyprland-git b/usr/share/sofirem/cache/arcolinux-hyprland-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-hyprland-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-hyprland-profile-git b/usr/share/sofirem/cache/arcolinux-hyprland-profile-git
new file mode 100644
index 0000000..d13f730
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-hyprland-profile-git
@@ -0,0 +1 @@
+Profile for ArcoLinux Hyprland
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-i3wm-git b/usr/share/sofirem/cache/arcolinux-i3wm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-i3wm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-icewm-git b/usr/share/sofirem/cache/arcolinux-icewm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-icewm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-jwm-git b/usr/share/sofirem/cache/arcolinux-jwm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-jwm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-leftwm-git b/usr/share/sofirem/cache/arcolinux-leftwm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-leftwm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-local-xfce4-git b/usr/share/sofirem/cache/arcolinux-local-xfce4-git
new file mode 100644
index 0000000..41194b8
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-local-xfce4-git
@@ -0,0 +1 @@
+Configuration for .local folder
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-lxqt-git b/usr/share/sofirem/cache/arcolinux-lxqt-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-lxqt-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-mate-dconf-git b/usr/share/sofirem/cache/arcolinux-mate-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-mate-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-mate-git b/usr/share/sofirem/cache/arcolinux-mate-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-mate-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-arc-theme b/usr/share/sofirem/cache/arcolinux-meta-arc-theme
new file mode 100644
index 0000000..19fcb5e
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-arc-theme
@@ -0,0 +1 @@
+Installs all ArcoLinux Arc Themes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-asian-fonts b/usr/share/sofirem/cache/arcolinux-meta-asian-fonts
new file mode 100644
index 0000000..8629a05
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-asian-fonts
@@ -0,0 +1 @@
+Installs asian fonts on ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-fun b/usr/share/sofirem/cache/arcolinux-meta-fun
new file mode 100644
index 0000000..65625f5
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-fun
@@ -0,0 +1 @@
+Installs fun applications on ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-log b/usr/share/sofirem/cache/arcolinux-meta-log
new file mode 100644
index 0000000..baf936f
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-log
@@ -0,0 +1 @@
+Installs logging utilities on ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-samba b/usr/share/sofirem/cache/arcolinux-meta-samba
new file mode 100644
index 0000000..23d401b
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-samba
@@ -0,0 +1 @@
+Meta package for samba support.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-sddm-themes b/usr/share/sofirem/cache/arcolinux-meta-sddm-themes
new file mode 100644
index 0000000..ced89e0
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-sddm-themes
@@ -0,0 +1 @@
+ArcoLinux Sddm themes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-steam-amd b/usr/share/sofirem/cache/arcolinux-meta-steam-amd
new file mode 100644
index 0000000..60b2c99
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-steam-amd
@@ -0,0 +1 @@
+Installs steam on ArcoLinux for amd
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-steam-intel b/usr/share/sofirem/cache/arcolinux-meta-steam-intel
new file mode 100644
index 0000000..c93f929
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-steam-intel
@@ -0,0 +1 @@
+Installs steam on ArcoLinux for intel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-steam-nvidia b/usr/share/sofirem/cache/arcolinux-meta-steam-nvidia
new file mode 100644
index 0000000..edd4835
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-steam-nvidia
@@ -0,0 +1 @@
+Installs steam on ArcoLinux for nvidia
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-utilities b/usr/share/sofirem/cache/arcolinux-meta-utilities
new file mode 100644
index 0000000..b4d0ab2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-utilities
@@ -0,0 +1 @@
+Installs utilities on ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-meta-wine b/usr/share/sofirem/cache/arcolinux-meta-wine
new file mode 100644
index 0000000..4099747
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-meta-wine
@@ -0,0 +1 @@
+Installs utilities for Wine on ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-mint-y-icons-git b/usr/share/sofirem/cache/arcolinux-mint-y-icons-git
new file mode 100644
index 0000000..158076d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-mint-y-icons-git
@@ -0,0 +1 @@
+Icon theme built for Linux Mint. Uses elements of Vibrancy and Moka.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-nitrogen-git b/usr/share/sofirem/cache/arcolinux-nitrogen-git
new file mode 100644
index 0000000..ea60cc8
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-nitrogen-git
@@ -0,0 +1 @@
+nitrogen config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-obmenu-generator-git b/usr/share/sofirem/cache/arcolinux-obmenu-generator-git
new file mode 100644
index 0000000..84db5ac
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-obmenu-generator-git
@@ -0,0 +1 @@
+obmenu-generator configs from ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-openbox-git b/usr/share/sofirem/cache/arcolinux-openbox-git
new file mode 100644
index 0000000..f822a0c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-openbox-git
@@ -0,0 +1 @@
+Openbox configs from ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-openbox-themes-git b/usr/share/sofirem/cache/arcolinux-openbox-themes-git
new file mode 100644
index 0000000..e795924
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-openbox-themes-git
@@ -0,0 +1 @@
+Openbox themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-paleofetch-git b/usr/share/sofirem/cache/arcolinux-paleofetch-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-paleofetch-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-pamac-all b/usr/share/sofirem/cache/arcolinux-pamac-all
new file mode 100644
index 0000000..a7927a2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-pamac-all
@@ -0,0 +1 @@
+Pamac from Manjaro - packaged for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-pipemenus-git b/usr/share/sofirem/cache/arcolinux-pipemenus-git
new file mode 100644
index 0000000..26e4ac2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-pipemenus-git
@@ -0,0 +1 @@
+Pipemenu's for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plank-git b/usr/share/sofirem/cache/arcolinux-plank-git
new file mode 100644
index 0000000..f8f295e
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plank-git
@@ -0,0 +1 @@
+Plank config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plank-themes-git b/usr/share/sofirem/cache/arcolinux-plank-themes-git
new file mode 100644
index 0000000..e16e061
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plank-themes-git
@@ -0,0 +1 @@
+Plank themes for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-dconf-git b/usr/share/sofirem/cache/arcolinux-plasma-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-git b/usr/share/sofirem/cache/arcolinux-plasma-git
new file mode 100644
index 0000000..4d9900a
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Desktop Settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-keybindings-git b/usr/share/sofirem/cache/arcolinux-plasma-keybindings-git
new file mode 100644
index 0000000..4d9900a
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-keybindings-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Desktop Settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-kservices-git b/usr/share/sofirem/cache/arcolinux-plasma-kservices-git
new file mode 100644
index 0000000..771ebe2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-kservices-git
@@ -0,0 +1 @@
+Kservice files for ArcoLinuxB Plasma
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-servicemenus-git b/usr/share/sofirem/cache/arcolinux-plasma-servicemenus-git
new file mode 100644
index 0000000..4d9900a
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-servicemenus-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Desktop Settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-theme-candy-beauty-arc-dark-git b/usr/share/sofirem/cache/arcolinux-plasma-theme-candy-beauty-arc-dark-git
new file mode 100644
index 0000000..3401b22
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-theme-candy-beauty-arc-dark-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Theme settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-theme-candy-beauty-nordic-git b/usr/share/sofirem/cache/arcolinux-plasma-theme-candy-beauty-nordic-git
new file mode 100644
index 0000000..3401b22
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-theme-candy-beauty-nordic-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Theme settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-theme-surfn-arc-dark-git b/usr/share/sofirem/cache/arcolinux-plasma-theme-surfn-arc-dark-git
new file mode 100644
index 0000000..3401b22
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-theme-surfn-arc-dark-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Theme settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-plasma-theme-surfn-nordic-git b/usr/share/sofirem/cache/arcolinux-plasma-theme-surfn-nordic-git
new file mode 100644
index 0000000..3401b22
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-plasma-theme-surfn-nordic-git
@@ -0,0 +1 @@
+ArcoLinuxB Plasma Theme settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-polybar-git b/usr/share/sofirem/cache/arcolinux-polybar-git
new file mode 100644
index 0000000..4bd2555
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-polybar-git
@@ -0,0 +1 @@
+polybar config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-powermenu-git b/usr/share/sofirem/cache/arcolinux-powermenu-git
new file mode 100644
index 0000000..21ebd0f
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-powermenu-git
@@ -0,0 +1 @@
+Powermenu to logout, exit etc...
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-qt5-git b/usr/share/sofirem/cache/arcolinux-qt5-git
new file mode 100644
index 0000000..36d67a2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-qt5-git
@@ -0,0 +1 @@
+configuration files for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-qtile-git b/usr/share/sofirem/cache/arcolinux-qtile-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-qtile-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-reflector-simple-git b/usr/share/sofirem/cache/arcolinux-reflector-simple-git
new file mode 100644
index 0000000..84597b2
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-reflector-simple-git
@@ -0,0 +1 @@
+Simple GUI wrapper for 'reflector'
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-rofi-git b/usr/share/sofirem/cache/arcolinux-rofi-git
new file mode 100644
index 0000000..0266875
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-rofi-git
@@ -0,0 +1 @@
+rofi config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-rofi-themes-git b/usr/share/sofirem/cache/arcolinux-rofi-themes-git
new file mode 100644
index 0000000..f53197e
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-rofi-themes-git
@@ -0,0 +1 @@
+Rofi themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-root-git b/usr/share/sofirem/cache/arcolinux-root-git
new file mode 100644
index 0000000..8e1aee5
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-root-git
@@ -0,0 +1 @@
+root configs from ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-backgrounds-git b/usr/share/sofirem/cache/arcolinux-sddm-backgrounds-git
new file mode 100644
index 0000000..4e33b27
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-backgrounds-git
@@ -0,0 +1 @@
+Backgrounds for Sddm and Wallpaper
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-breeze-git b/usr/share/sofirem/cache/arcolinux-sddm-breeze-git
new file mode 100644
index 0000000..8369834
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-breeze-git
@@ -0,0 +1 @@
+Breeze adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-breeze-minimal-git b/usr/share/sofirem/cache/arcolinux-sddm-breeze-minimal-git
new file mode 100644
index 0000000..8369834
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-breeze-minimal-git
@@ -0,0 +1 @@
+Breeze adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-chili-git b/usr/share/sofirem/cache/arcolinux-sddm-chili-git
new file mode 100644
index 0000000..eba8371
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-chili-git
@@ -0,0 +1 @@
+Chili adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-fralonra-git b/usr/share/sofirem/cache/arcolinux-sddm-fralonra-git
new file mode 100644
index 0000000..37d8632
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-fralonra-git
@@ -0,0 +1 @@
+Chinese Painting SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-futuristic-git b/usr/share/sofirem/cache/arcolinux-sddm-futuristic-git
new file mode 100644
index 0000000..50f0ba9
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-futuristic-git
@@ -0,0 +1 @@
+Futuristic SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-materia-git b/usr/share/sofirem/cache/arcolinux-sddm-materia-git
new file mode 100644
index 0000000..5592900
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-materia-git
@@ -0,0 +1 @@
+Materia SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-redrock-git b/usr/share/sofirem/cache/arcolinux-sddm-redrock-git
new file mode 100644
index 0000000..2ccaf0c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-redrock-git
@@ -0,0 +1 @@
+Redrock SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-simplicity-git b/usr/share/sofirem/cache/arcolinux-sddm-simplicity-git
new file mode 100644
index 0000000..9a06b46
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-simplicity-git
@@ -0,0 +1 @@
+Simplicity theme from isseigx on gitlab
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-slice-git b/usr/share/sofirem/cache/arcolinux-sddm-slice-git
new file mode 100644
index 0000000..4a6e7e7
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-slice-git
@@ -0,0 +1 @@
+Slice SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-sugar-candy-git b/usr/share/sofirem/cache/arcolinux-sddm-sugar-candy-git
new file mode 100644
index 0000000..91312fc
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-sugar-candy-git
@@ -0,0 +1 @@
+Sugar Candy SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sddm-urbanlifestyle-git b/usr/share/sofirem/cache/arcolinux-sddm-urbanlifestyle-git
new file mode 100644
index 0000000..05ba08c
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sddm-urbanlifestyle-git
@@ -0,0 +1 @@
+Urbanlifestyle SDDM theme adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-spectrwm-git b/usr/share/sofirem/cache/arcolinux-spectrwm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-spectrwm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sway-git b/usr/share/sofirem/cache/arcolinux-sway-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sway-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sway-profile-git b/usr/share/sofirem/cache/arcolinux-sway-profile-git
new file mode 100644
index 0000000..071053a
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sway-profile-git
@@ -0,0 +1 @@
+Profile for ArcoLinux Sway
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-sweet-mars-git b/usr/share/sofirem/cache/arcolinux-sweet-mars-git
new file mode 100644
index 0000000..6872b52
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-sweet-mars-git
@@ -0,0 +1 @@
+Sweet mars themes adapted for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-teamviewer b/usr/share/sofirem/cache/arcolinux-teamviewer
new file mode 100644
index 0000000..e2f33ed
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-teamviewer
@@ -0,0 +1 @@
+All-In-One Software for Remote Support and Online Meetings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-tellme-git b/usr/share/sofirem/cache/arcolinux-tellme-git
new file mode 100644
index 0000000..344018e
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-tellme-git
@@ -0,0 +1 @@
+ArcoLinux package for cowsay and cowfortune
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-tint2-git b/usr/share/sofirem/cache/arcolinux-tint2-git
new file mode 100644
index 0000000..39a51f3
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-tint2-git
@@ -0,0 +1 @@
+tint2 config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-tint2-themes-git b/usr/share/sofirem/cache/arcolinux-tint2-themes-git
new file mode 100644
index 0000000..6279165
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-tint2-themes-git
@@ -0,0 +1 @@
+Tint2 Themes created for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-ukui-dconf-git b/usr/share/sofirem/cache/arcolinux-ukui-dconf-git
new file mode 100644
index 0000000..737cb00
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-ukui-dconf-git
@@ -0,0 +1 @@
+Configuration files for ArcoLinux Iso
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-ukui-git b/usr/share/sofirem/cache/arcolinux-ukui-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-ukui-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-volumeicon-git b/usr/share/sofirem/cache/arcolinux-volumeicon-git
new file mode 100644
index 0000000..c9e09b6
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-volumeicon-git
@@ -0,0 +1 @@
+volumeicon config for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-wallpapers-candy-git b/usr/share/sofirem/cache/arcolinux-wallpapers-candy-git
new file mode 100644
index 0000000..dff848e
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-wallpapers-candy-git
@@ -0,0 +1 @@
+Wallpapers for ArcoLinux candy
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-wallpapers-dual-git b/usr/share/sofirem/cache/arcolinux-wallpapers-dual-git
new file mode 100644
index 0000000..971bfbf
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-wallpapers-dual-git
@@ -0,0 +1 @@
+Wallpapers for ArcoLinux - dual screen
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-wallpapers-git b/usr/share/sofirem/cache/arcolinux-wallpapers-git
new file mode 100644
index 0000000..c95dc12
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-wallpapers-git
@@ -0,0 +1 @@
+Wallpapers for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-wayland-profile-git b/usr/share/sofirem/cache/arcolinux-wayland-profile-git
new file mode 100644
index 0000000..7a3e786
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-wayland-profile-git
@@ -0,0 +1 @@
+Profile for ArcoLinux Wayland
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-wmderland-git b/usr/share/sofirem/cache/arcolinux-wmderland-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-wmderland-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-worm-git b/usr/share/sofirem/cache/arcolinux-worm-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-worm-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-xfce-git b/usr/share/sofirem/cache/arcolinux-xfce-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-xfce-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-xlunch-git b/usr/share/sofirem/cache/arcolinux-xlunch-git
new file mode 100644
index 0000000..d2fab2b
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-xlunch-git
@@ -0,0 +1 @@
+Xlunch configuration for ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-xmonad-polybar-git b/usr/share/sofirem/cache/arcolinux-xmonad-polybar-git
new file mode 100644
index 0000000..f2c635d
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-xmonad-polybar-git
@@ -0,0 +1 @@
+Desktop configuration for ArcoLinux -D -B
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arcolinux-zsh-git b/usr/share/sofirem/cache/arcolinux-zsh-git
new file mode 100644
index 0000000..2f9a31f
--- /dev/null
+++ b/usr/share/sofirem/cache/arcolinux-zsh-git
@@ -0,0 +1 @@
+zsh configs from ArcoLinux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ardour b/usr/share/sofirem/cache/ardour
new file mode 100644
index 0000000..f47ab15
--- /dev/null
+++ b/usr/share/sofirem/cache/ardour
@@ -0,0 +1 @@
+Professional-grade digital audio workstation
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/arduino b/usr/share/sofirem/cache/arduino
new file mode 100644
index 0000000..535c123
--- /dev/null
+++ b/usr/share/sofirem/cache/arduino
@@ -0,0 +1 @@
+Arduino prototyping platform SDK
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/aria2 b/usr/share/sofirem/cache/aria2
new file mode 100644
index 0000000..31ccfd5
--- /dev/null
+++ b/usr/share/sofirem/cache/aria2
@@ -0,0 +1 @@
+Download utility that supports HTTP(S), FTP, BitTorrent, and Metalink
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ark b/usr/share/sofirem/cache/ark
new file mode 100644
index 0000000..b2d223d
--- /dev/null
+++ b/usr/share/sofirem/cache/ark
@@ -0,0 +1 @@
+Archiving Tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/armagetronad b/usr/share/sofirem/cache/armagetronad
new file mode 100644
index 0000000..0feb497
--- /dev/null
+++ b/usr/share/sofirem/cache/armagetronad
@@ -0,0 +1 @@
+A Tron Clone in 3D.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/asciiquarium b/usr/share/sofirem/cache/asciiquarium
new file mode 100644
index 0000000..72327a5
--- /dev/null
+++ b/usr/share/sofirem/cache/asciiquarium
@@ -0,0 +1 @@
+An aquarium/sea animation in ASCII art
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/astromenace b/usr/share/sofirem/cache/astromenace
new file mode 100644
index 0000000..ff09aad
--- /dev/null
+++ b/usr/share/sofirem/cache/astromenace
@@ -0,0 +1 @@
+Hardcore 3D space shooter with spaceship upgrade possibilities
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/atom b/usr/share/sofirem/cache/atom
new file mode 100644
index 0000000..dfce8bb
--- /dev/null
+++ b/usr/share/sofirem/cache/atom
@@ -0,0 +1 @@
+A hackable text editor for the 21st Century
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/atril b/usr/share/sofirem/cache/atril
new file mode 100644
index 0000000..88baab4
--- /dev/null
+++ b/usr/share/sofirem/cache/atril
@@ -0,0 +1 @@
+MATE document viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/audacious b/usr/share/sofirem/cache/audacious
new file mode 100644
index 0000000..bae87d6
--- /dev/null
+++ b/usr/share/sofirem/cache/audacious
@@ -0,0 +1 @@
+Lightweight, advanced audio player focused on audio quality
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/audacious-plugins b/usr/share/sofirem/cache/audacious-plugins
new file mode 100644
index 0000000..81d5b48
--- /dev/null
+++ b/usr/share/sofirem/cache/audacious-plugins
@@ -0,0 +1 @@
+Plugins for Audacious
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/audacity b/usr/share/sofirem/cache/audacity
new file mode 100644
index 0000000..a04dd5a
--- /dev/null
+++ b/usr/share/sofirem/cache/audacity
@@ -0,0 +1 @@
+A program that lets you manipulate digital audio waveforms
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/aura-bin b/usr/share/sofirem/cache/aura-bin
new file mode 100644
index 0000000..9d20e90
--- /dev/null
+++ b/usr/share/sofirem/cache/aura-bin
@@ -0,0 +1 @@
+A secure package manager for Arch Linux and the AUR - Prebuilt binary
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/auto-cpufreq b/usr/share/sofirem/cache/auto-cpufreq
new file mode 100644
index 0000000..fee862d
--- /dev/null
+++ b/usr/share/sofirem/cache/auto-cpufreq
@@ -0,0 +1 @@
+Automatic CPU speed & power optimizer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/autorandr b/usr/share/sofirem/cache/autorandr
new file mode 100644
index 0000000..7b3f26d
--- /dev/null
+++ b/usr/share/sofirem/cache/autorandr
@@ -0,0 +1 @@
+Auto-detect connected display hardware and load appropiate X11 setup using xrandr
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/autotiling b/usr/share/sofirem/cache/autotiling
new file mode 100644
index 0000000..fdc26fc
--- /dev/null
+++ b/usr/share/sofirem/cache/autotiling
@@ -0,0 +1 @@
+Script for sway and i3 to automatically switch the horizontal / vertical window split orientation
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/awesome b/usr/share/sofirem/cache/awesome
new file mode 100644
index 0000000..ff9e912
--- /dev/null
+++ b/usr/share/sofirem/cache/awesome
@@ -0,0 +1 @@
+Highly configurable framework window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/awesome-terminal-fonts b/usr/share/sofirem/cache/awesome-terminal-fonts
new file mode 100644
index 0000000..4699114
--- /dev/null
+++ b/usr/share/sofirem/cache/awesome-terminal-fonts
@@ -0,0 +1 @@
+fonts/icons for powerlines
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ayu-theme b/usr/share/sofirem/cache/ayu-theme
new file mode 100644
index 0000000..f98ecef
--- /dev/null
+++ b/usr/share/sofirem/cache/ayu-theme
@@ -0,0 +1 @@
+Ayu themes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/baobab b/usr/share/sofirem/cache/baobab
new file mode 100644
index 0000000..86752c0
--- /dev/null
+++ b/usr/share/sofirem/cache/baobab
@@ -0,0 +1 @@
+A graphical directory tree analyzer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/base16-alacritty-git b/usr/share/sofirem/cache/base16-alacritty-git
new file mode 100644
index 0000000..e5850ec
--- /dev/null
+++ b/usr/share/sofirem/cache/base16-alacritty-git
@@ -0,0 +1 @@
+Base16 templates for the alacritty terminal emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bash-pipes b/usr/share/sofirem/cache/bash-pipes
new file mode 100644
index 0000000..fddadce
--- /dev/null
+++ b/usr/share/sofirem/cache/bash-pipes
@@ -0,0 +1 @@
+pipes.sh (animated pipes terminal screensaver) with additional better names (soft links)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bauh b/usr/share/sofirem/cache/bauh
new file mode 100644
index 0000000..026cab6
--- /dev/null
+++ b/usr/share/sofirem/cache/bauh
@@ -0,0 +1 @@
+Graphical interface for managing your applications (AppImage, Flatpak, Snap, Arch/AUR, Web)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/berry-dev-git b/usr/share/sofirem/cache/berry-dev-git
new file mode 100644
index 0000000..a6d38a8
--- /dev/null
+++ b/usr/share/sofirem/cache/berry-dev-git
@@ -0,0 +1 @@
+A healthy, bite-sized window manager written over the XLib Library
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/betterlockscreen b/usr/share/sofirem/cache/betterlockscreen
new file mode 100644
index 0000000..758275a
--- /dev/null
+++ b/usr/share/sofirem/cache/betterlockscreen
@@ -0,0 +1 @@
+A simple, minimal lockscreen
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/betterlockscreen-git b/usr/share/sofirem/cache/betterlockscreen-git
new file mode 100644
index 0000000..f704900
--- /dev/null
+++ b/usr/share/sofirem/cache/betterlockscreen-git
@@ -0,0 +1 @@
+A simple lock script for i3lock-color
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bibata-cursor-theme-bin b/usr/share/sofirem/cache/bibata-cursor-theme-bin
new file mode 100644
index 0000000..b0f660f
--- /dev/null
+++ b/usr/share/sofirem/cache/bibata-cursor-theme-bin
@@ -0,0 +1 @@
+Material Based Cursor Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bibata-cursor-translucent b/usr/share/sofirem/cache/bibata-cursor-translucent
new file mode 100644
index 0000000..78ec2be
--- /dev/null
+++ b/usr/share/sofirem/cache/bibata-cursor-translucent
@@ -0,0 +1 @@
+Translucent Material Based Cursor Theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bibata-extra-cursor-theme b/usr/share/sofirem/cache/bibata-extra-cursor-theme
new file mode 100644
index 0000000..4ffb1c0
--- /dev/null
+++ b/usr/share/sofirem/cache/bibata-extra-cursor-theme
@@ -0,0 +1 @@
+Material Based Cursor Theme: More Bibata!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bibata-rainbow-cursor-theme b/usr/share/sofirem/cache/bibata-rainbow-cursor-theme
new file mode 100644
index 0000000..aada770
--- /dev/null
+++ b/usr/share/sofirem/cache/bibata-rainbow-cursor-theme
@@ -0,0 +1 @@
+Material Based Cursor Theme: Rainbow
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bitwarden b/usr/share/sofirem/cache/bitwarden
new file mode 100644
index 0000000..4268470
--- /dev/null
+++ b/usr/share/sofirem/cache/bitwarden
@@ -0,0 +1 @@
+A secure and free password manager for all of your devices
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bleachbit b/usr/share/sofirem/cache/bleachbit
new file mode 100644
index 0000000..f87c801
--- /dev/null
+++ b/usr/share/sofirem/cache/bleachbit
@@ -0,0 +1 @@
+Deletes unneeded files to free disk space and maintain privacy
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/blender b/usr/share/sofirem/cache/blender
new file mode 100644
index 0000000..4c80d7d
--- /dev/null
+++ b/usr/share/sofirem/cache/blender
@@ -0,0 +1 @@
+A fully integrated 3D graphics creation suite
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/blender-benchmark b/usr/share/sofirem/cache/blender-benchmark
new file mode 100644
index 0000000..1639b7c
--- /dev/null
+++ b/usr/share/sofirem/cache/blender-benchmark
@@ -0,0 +1 @@
+Benchmark based on Blender to perform hardware and software performance tests
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bluefish b/usr/share/sofirem/cache/bluefish
new file mode 100644
index 0000000..5b0f80f
--- /dev/null
+++ b/usr/share/sofirem/cache/bluefish
@@ -0,0 +1 @@
+A powerful HTML editor for experienced web designers and programmers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bottom b/usr/share/sofirem/cache/bottom
new file mode 100644
index 0000000..5bfb40d
--- /dev/null
+++ b/usr/share/sofirem/cache/bottom
@@ -0,0 +1 @@
+A graphical process/system monitor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/boxes b/usr/share/sofirem/cache/boxes
new file mode 100644
index 0000000..bb6a756
--- /dev/null
+++ b/usr/share/sofirem/cache/boxes
@@ -0,0 +1 @@
+Text mode box and comment drawing filter
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bpytop b/usr/share/sofirem/cache/bpytop
new file mode 100644
index 0000000..a6adf72
--- /dev/null
+++ b/usr/share/sofirem/cache/bpytop
@@ -0,0 +1 @@
+Resource monitor that shows usage and stats for processor, memory, disks, network and processes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/brackets-bin b/usr/share/sofirem/cache/brackets-bin
new file mode 100644
index 0000000..af10ccb
--- /dev/null
+++ b/usr/share/sofirem/cache/brackets-bin
@@ -0,0 +1 @@
+A code editor for HTML, CSS and JavaScript.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/brasero b/usr/share/sofirem/cache/brasero
new file mode 100644
index 0000000..dc25f97
--- /dev/null
+++ b/usr/share/sofirem/cache/brasero
@@ -0,0 +1 @@
+CD/DVD mastering tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/brave-bin b/usr/share/sofirem/cache/brave-bin
new file mode 100644
index 0000000..12548dc
--- /dev/null
+++ b/usr/share/sofirem/cache/brave-bin
@@ -0,0 +1 @@
+Web browser that blocks ads and trackers by default (binary release)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/breeze b/usr/share/sofirem/cache/breeze
new file mode 100644
index 0000000..596e967
--- /dev/null
+++ b/usr/share/sofirem/cache/breeze
@@ -0,0 +1 @@
+Artwork, styles and assets for the Breeze visual style for the Plasma Desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/breeze-icons b/usr/share/sofirem/cache/breeze-icons
new file mode 100644
index 0000000..cffdc27
--- /dev/null
+++ b/usr/share/sofirem/cache/breeze-icons
@@ -0,0 +1 @@
+Breeze icon themes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/brightnessctl b/usr/share/sofirem/cache/brightnessctl
new file mode 100644
index 0000000..ab4cec5
--- /dev/null
+++ b/usr/share/sofirem/cache/brightnessctl
@@ -0,0 +1 @@
+Lightweight brightness control tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/brillo b/usr/share/sofirem/cache/brillo
new file mode 100644
index 0000000..498503c
--- /dev/null
+++ b/usr/share/sofirem/cache/brillo
@@ -0,0 +1 @@
+Control the brightness of backlight and keyboard LED devices
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/brltty b/usr/share/sofirem/cache/brltty
new file mode 100644
index 0000000..810d433
--- /dev/null
+++ b/usr/share/sofirem/cache/brltty
@@ -0,0 +1 @@
+Braille display driver for Linux/Unix
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bspwm b/usr/share/sofirem/cache/bspwm
new file mode 100644
index 0000000..e65ac5d
--- /dev/null
+++ b/usr/share/sofirem/cache/bspwm
@@ -0,0 +1 @@
+Tiling window manager based on binary space partitioning
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/btop b/usr/share/sofirem/cache/btop
new file mode 100644
index 0000000..e8150d0
--- /dev/null
+++ b/usr/share/sofirem/cache/btop
@@ -0,0 +1 @@
+A monitor of system resources, bpytop ported to C++
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/btrbk b/usr/share/sofirem/cache/btrbk
new file mode 100644
index 0000000..df11c73
--- /dev/null
+++ b/usr/share/sofirem/cache/btrbk
@@ -0,0 +1 @@
+Backup tool for btrfs subvolumes, taking advantage of btrfs specific capabilities to create atomic snapshots and transfer them incrementally to your backup locations
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/btrfs-assistant b/usr/share/sofirem/cache/btrfs-assistant
new file mode 100644
index 0000000..1ede31b
--- /dev/null
+++ b/usr/share/sofirem/cache/btrfs-assistant
@@ -0,0 +1 @@
+An application for managing BTRFS subvolumes and Snapper snapshots
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/btrfsmaintenance b/usr/share/sofirem/cache/btrfsmaintenance
new file mode 100644
index 0000000..1342779
--- /dev/null
+++ b/usr/share/sofirem/cache/btrfsmaintenance
@@ -0,0 +1 @@
+btrfs maintenance scripts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/budgie-desktop b/usr/share/sofirem/cache/budgie-desktop
new file mode 100644
index 0000000..de0860f
--- /dev/null
+++ b/usr/share/sofirem/cache/budgie-desktop
@@ -0,0 +1 @@
+Modern desktop environment from the Solus Project
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/budgie-extras b/usr/share/sofirem/cache/budgie-extras
new file mode 100644
index 0000000..f97c3ba
--- /dev/null
+++ b/usr/share/sofirem/cache/budgie-extras
@@ -0,0 +1 @@
+Additional Budgie Desktop enhancements for the user experience
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bumblebee b/usr/share/sofirem/cache/bumblebee
new file mode 100644
index 0000000..1d1188e
--- /dev/null
+++ b/usr/share/sofirem/cache/bumblebee
@@ -0,0 +1 @@
+NVIDIA Optimus support for Linux through VirtualGL
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bumblebee-status b/usr/share/sofirem/cache/bumblebee-status
new file mode 100644
index 0000000..7ef5094
--- /dev/null
+++ b/usr/share/sofirem/cache/bumblebee-status
@@ -0,0 +1 @@
+Modular, theme-able status line generator for the i3 window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/bumblebee-status-git b/usr/share/sofirem/cache/bumblebee-status-git
new file mode 100644
index 0000000..7ef5094
--- /dev/null
+++ b/usr/share/sofirem/cache/bumblebee-status-git
@@ -0,0 +1 @@
+Modular, theme-able status line generator for the i3 window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/byte b/usr/share/sofirem/cache/byte
new file mode 100644
index 0000000..c6f3b6f
--- /dev/null
+++ b/usr/share/sofirem/cache/byte
@@ -0,0 +1 @@
+A Music Player designed for elementary OS
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/c-lolcat b/usr/share/sofirem/cache/c-lolcat
new file mode 100644
index 0000000..e96bc17
--- /dev/null
+++ b/usr/share/sofirem/cache/c-lolcat
@@ -0,0 +1 @@
+High-performance implementation of lolcat
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/caffeine b/usr/share/sofirem/cache/caffeine
new file mode 100644
index 0000000..6976131
--- /dev/null
+++ b/usr/share/sofirem/cache/caffeine
@@ -0,0 +1 @@
+Keep your computer awake.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/caffeine-ng b/usr/share/sofirem/cache/caffeine-ng
new file mode 100644
index 0000000..638f1ce
--- /dev/null
+++ b/usr/share/sofirem/cache/caffeine-ng
@@ -0,0 +1 @@
+Status bar application able to temporarily inhibit the screensaver and sleep mode.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/caja b/usr/share/sofirem/cache/caja
new file mode 100644
index 0000000..efc5001
--- /dev/null
+++ b/usr/share/sofirem/cache/caja
@@ -0,0 +1 @@
+File manager for the MATE desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/calibre b/usr/share/sofirem/cache/calibre
new file mode 100644
index 0000000..a25e58b
--- /dev/null
+++ b/usr/share/sofirem/cache/calibre
@@ -0,0 +1 @@
+Ebook management application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/calligra b/usr/share/sofirem/cache/calligra
new file mode 100644
index 0000000..957ae8d
--- /dev/null
+++ b/usr/share/sofirem/cache/calligra
@@ -0,0 +1 @@
+A set of applications for productivity and creative usage
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/calligra-plan b/usr/share/sofirem/cache/calligra-plan
new file mode 100644
index 0000000..a3f6bfd
--- /dev/null
+++ b/usr/share/sofirem/cache/calligra-plan
@@ -0,0 +1 @@
+A project management application intended for managing moderately large projects with multiple resources
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/capitaine-cursors b/usr/share/sofirem/cache/capitaine-cursors
new file mode 100644
index 0000000..c71c2bf
--- /dev/null
+++ b/usr/share/sofirem/cache/capitaine-cursors
@@ -0,0 +1 @@
+An x-cursor theme inspired by macOS and based on KDE Breeze
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/catfish b/usr/share/sofirem/cache/catfish
new file mode 100644
index 0000000..5ab398b
--- /dev/null
+++ b/usr/share/sofirem/cache/catfish
@@ -0,0 +1 @@
+Versatile file searching tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/catppuccin-cursors-git b/usr/share/sofirem/cache/catppuccin-cursors-git
new file mode 100644
index 0000000..9175541
--- /dev/null
+++ b/usr/share/sofirem/cache/catppuccin-cursors-git
@@ -0,0 +1 @@
+Cursor-Theme for amos
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cava b/usr/share/sofirem/cache/cava
new file mode 100644
index 0000000..9fd0733
--- /dev/null
+++ b/usr/share/sofirem/cache/cava
@@ -0,0 +1 @@
+Console-based Audio Visualizer for Alsa
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/celluloid b/usr/share/sofirem/cache/celluloid
new file mode 100644
index 0000000..f23966f
--- /dev/null
+++ b/usr/share/sofirem/cache/celluloid
@@ -0,0 +1 @@
+Simple GTK+ frontend for mpv
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cheese b/usr/share/sofirem/cache/cheese
new file mode 100644
index 0000000..f633376
--- /dev/null
+++ b/usr/share/sofirem/cache/cheese
@@ -0,0 +1 @@
+Take photos and videos with your webcam, with fun graphical effects
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/chrome-gnome-shell b/usr/share/sofirem/cache/chrome-gnome-shell
new file mode 100644
index 0000000..6925076
--- /dev/null
+++ b/usr/share/sofirem/cache/chrome-gnome-shell
@@ -0,0 +1 @@
+Native browser connector for integration with extensions.gnome.org
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/chromium b/usr/share/sofirem/cache/chromium
new file mode 100644
index 0000000..daa9844
--- /dev/null
+++ b/usr/share/sofirem/cache/chromium
@@ -0,0 +1 @@
+A web browser built for speed, simplicity, and security
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/chromium-bsu b/usr/share/sofirem/cache/chromium-bsu
new file mode 100644
index 0000000..491e093
--- /dev/null
+++ b/usr/share/sofirem/cache/chromium-bsu
@@ -0,0 +1 @@
+A fast paced top scrolling shooter
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/chromium-widevine b/usr/share/sofirem/cache/chromium-widevine
new file mode 100644
index 0000000..250539d
--- /dev/null
+++ b/usr/share/sofirem/cache/chromium-widevine
@@ -0,0 +1 @@
+A browser plugin designed for the viewing of premium video content
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cinnamon b/usr/share/sofirem/cache/cinnamon
new file mode 100644
index 0000000..c5acf1c
--- /dev/null
+++ b/usr/share/sofirem/cache/cinnamon
@@ -0,0 +1 @@
+Linux desktop which provides advanced innovative features and a traditional user experience
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cinnamon-translations b/usr/share/sofirem/cache/cinnamon-translations
new file mode 100644
index 0000000..98ce8fe
--- /dev/null
+++ b/usr/share/sofirem/cache/cinnamon-translations
@@ -0,0 +1 @@
+Translations for Cinnamon and Nemo
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ckb-next-git b/usr/share/sofirem/cache/ckb-next-git
new file mode 100644
index 0000000..172c82e
--- /dev/null
+++ b/usr/share/sofirem/cache/ckb-next-git
@@ -0,0 +1 @@
+Corsair Keyboard and Mouse Input Driver, git master branch
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/clapper b/usr/share/sofirem/cache/clapper
new file mode 100644
index 0000000..f3b138a
--- /dev/null
+++ b/usr/share/sofirem/cache/clapper
@@ -0,0 +1 @@
+A GNOME media player built using GJS with GTK4 toolkit and powered by GStreamer with OpenGL rendering.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/clementine b/usr/share/sofirem/cache/clementine
new file mode 100644
index 0000000..1795ae2
--- /dev/null
+++ b/usr/share/sofirem/cache/clementine
@@ -0,0 +1 @@
+A modern music player and library organizer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cmatrix-git b/usr/share/sofirem/cache/cmatrix-git
new file mode 100644
index 0000000..0b0a85e
--- /dev/null
+++ b/usr/share/sofirem/cache/cmatrix-git
@@ -0,0 +1 @@
+A curses-based scrolling 'Matrix'-like screen
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/code b/usr/share/sofirem/cache/code
new file mode 100644
index 0000000..502c806
--- /dev/null
+++ b/usr/share/sofirem/cache/code
@@ -0,0 +1 @@
+The Open Source build of Visual Studio Code (vscode) editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/codeblocks b/usr/share/sofirem/cache/codeblocks
new file mode 100644
index 0000000..2c6def0
--- /dev/null
+++ b/usr/share/sofirem/cache/codeblocks
@@ -0,0 +1 @@
+Cross-platform C/C++ IDE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/conky-lua-archers b/usr/share/sofirem/cache/conky-lua-archers
new file mode 100644
index 0000000..ff3cfa6
--- /dev/null
+++ b/usr/share/sofirem/cache/conky-lua-archers
@@ -0,0 +1 @@
+A free, light-weight system monitor for X with lua enabled for Arch based distros
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cool-retro-term b/usr/share/sofirem/cache/cool-retro-term
new file mode 100644
index 0000000..3a68d4e
--- /dev/null
+++ b/usr/share/sofirem/cache/cool-retro-term
@@ -0,0 +1 @@
+A good looking terminal emulator which mimics the old cathode display
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/acpilight b/usr/share/sofirem/cache/corrections/acpilight
new file mode 100644
index 0000000..3ba67f1
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/acpilight
@@ -0,0 +1 @@
+A backward-compatible xbacklight replacement based on ACPI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/aisleriot b/usr/share/sofirem/cache/corrections/aisleriot
new file mode 100644
index 0000000..bb2e80d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/aisleriot
@@ -0,0 +1 @@
+Play many different solitaire games
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/arc-x-icons-theme b/usr/share/sofirem/cache/corrections/arc-x-icons-theme
new file mode 100644
index 0000000..a6d1da0
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/arc-x-icons-theme
@@ -0,0 +1 @@
+Modern free desktop icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/arcolinux-conky-collection-plasma-git b/usr/share/sofirem/cache/corrections/arcolinux-conky-collection-plasma-git
new file mode 100644
index 0000000..74fb57f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/arcolinux-conky-collection-plasma-git
@@ -0,0 +1 @@
+Conky collection for ArcoLinuxB Plasma
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/arcolinux-desktop-trasher-git b/usr/share/sofirem/cache/corrections/arcolinux-desktop-trasher-git
new file mode 100644
index 0000000..8ffdcd2
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/arcolinux-desktop-trasher-git
@@ -0,0 +1 @@
+ArcoLinux Desktop Trasher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/arcolinux-pamac-all b/usr/share/sofirem/cache/corrections/arcolinux-pamac-all
new file mode 100644
index 0000000..1df0262
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/arcolinux-pamac-all
@@ -0,0 +1 @@
+A gtk3 frontend for Libalpm - Manjaro software installer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/arcolinux-sddm-simplicity-git b/usr/share/sofirem/cache/corrections/arcolinux-sddm-simplicity-git
new file mode 100644
index 0000000..4d8dc80
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/arcolinux-sddm-simplicity-git
@@ -0,0 +1 @@
+Simplicity theme from Isseigx on Gitlab
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/aura-bin b/usr/share/sofirem/cache/corrections/aura-bin
new file mode 100644
index 0000000..aace8a5
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/aura-bin
@@ -0,0 +1 @@
+A secure package manager for Arch Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/bauh b/usr/share/sofirem/cache/corrections/bauh
new file mode 100644
index 0000000..b33f5f4
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/bauh
@@ -0,0 +1 @@
+Graphical interface for managing your applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/blender-benchmark b/usr/share/sofirem/cache/corrections/blender-benchmark
new file mode 100644
index 0000000..4fc2cac
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/blender-benchmark
@@ -0,0 +1 @@
+Benchmark based on Blender
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/bpytop b/usr/share/sofirem/cache/corrections/bpytop
new file mode 100644
index 0000000..6be5c5a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/bpytop
@@ -0,0 +1 @@
+Resource monitor that shows hardware info
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/breeze b/usr/share/sofirem/cache/corrections/breeze
new file mode 100644
index 0000000..953273d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/breeze
@@ -0,0 +1 @@
+Breeze visual style for the Plasma Desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/btrbk b/usr/share/sofirem/cache/corrections/btrbk
new file mode 100644
index 0000000..90ffc10
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/btrbk
@@ -0,0 +1 @@
+Backup tool for btrfs subvolumes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/caffeine-ng b/usr/share/sofirem/cache/corrections/caffeine-ng
new file mode 100644
index 0000000..4c35f5a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/caffeine-ng
@@ -0,0 +1 @@
+Inhibit the screensaver and sleep mode.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/calligra-plan b/usr/share/sofirem/cache/corrections/calligra-plan
new file mode 100644
index 0000000..fd4087f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/calligra-plan
@@ -0,0 +1 @@
+A project management application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/clapper b/usr/share/sofirem/cache/corrections/clapper
new file mode 100644
index 0000000..5608a2a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/clapper
@@ -0,0 +1 @@
+A GTK4 GNOME media player
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/conky-lua-archers b/usr/share/sofirem/cache/corrections/conky-lua-archers
new file mode 100644
index 0000000..2965ea1
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/conky-lua-archers
@@ -0,0 +1 @@
+A free, light-weight system monitor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/cpu-x b/usr/share/sofirem/cache/corrections/cpu-x
new file mode 100644
index 0000000..8dbbfb3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/cpu-x
@@ -0,0 +1 @@
+Information on CPU, motherboard and more
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/debtap b/usr/share/sofirem/cache/corrections/debtap
new file mode 100644
index 0000000..f7e1487
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/debtap
@@ -0,0 +1 @@
+A script to convert .deb packages to Arch Linux packages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/deja-dup b/usr/share/sofirem/cache/corrections/deja-dup
new file mode 100644
index 0000000..95285f8
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/deja-dup
@@ -0,0 +1 @@
+Backup tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/discord_arch_electron b/usr/share/sofirem/cache/corrections/discord_arch_electron
new file mode 100644
index 0000000..f1bf48a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/discord_arch_electron
@@ -0,0 +1 @@
+Discord (popular voice + video app)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/disper b/usr/share/sofirem/cache/corrections/disper
new file mode 100644
index 0000000..de74946
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/disper
@@ -0,0 +1 @@
+An on-the-fly display switch utility (Nvidia laptops)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/doublecmd-qt5 b/usr/share/sofirem/cache/corrections/doublecmd-qt5
new file mode 100644
index 0000000..625a500
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/doublecmd-qt5
@@ -0,0 +1 @@
+Twin-panel (commander-style) file manager (Qt5)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/downgrade b/usr/share/sofirem/cache/corrections/downgrade
new file mode 100644
index 0000000..855be9f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/downgrade
@@ -0,0 +1 @@
+Bash script for downgrading one or more packages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/dropbox b/usr/share/sofirem/cache/corrections/dropbox
new file mode 100644
index 0000000..2a7bb18
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/dropbox
@@ -0,0 +1 @@
+Dropbox lets you bring your photos, docs, and videos anywhere
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/faba-icon-theme-git b/usr/share/sofirem/cache/corrections/faba-icon-theme-git
new file mode 100644
index 0000000..8fd14b3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/faba-icon-theme-git
@@ -0,0 +1 @@
+A sexy and modern FreeDesktop icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/faba-mono-icons-git b/usr/share/sofirem/cache/corrections/faba-mono-icons-git
new file mode 100644
index 0000000..550f78c
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/faba-mono-icons-git
@@ -0,0 +1 @@
+Supplementary theme to Faba Icon Theme - monochrome
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/find-the-command-git b/usr/share/sofirem/cache/corrections/find-the-command-git
new file mode 100644
index 0000000..7ed1c18
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/find-the-command-git
@@ -0,0 +1 @@
+Advanced command-not-found hook
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/fingerprint-gui b/usr/share/sofirem/cache/corrections/fingerprint-gui
new file mode 100644
index 0000000..761929c
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/fingerprint-gui
@@ -0,0 +1 @@
+Fingerprint-based authentication
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/flatpak b/usr/share/sofirem/cache/corrections/flatpak
new file mode 100644
index 0000000..d08ed51
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/flatpak
@@ -0,0 +1 @@
+Linux application sandboxing
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/florence b/usr/share/sofirem/cache/corrections/florence
new file mode 100644
index 0000000..d86b850
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/florence
@@ -0,0 +1 @@
+A configurable on-screen virtual keyboard
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/freeoffice b/usr/share/sofirem/cache/corrections/freeoffice
new file mode 100644
index 0000000..847d335
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/freeoffice
@@ -0,0 +1 @@
+Microsoft Office-compatible office suite (word - excel - powerpoint alternative)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/gamemode b/usr/share/sofirem/cache/corrections/gamemode
new file mode 100644
index 0000000..026a732
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/gamemode
@@ -0,0 +1 @@
+A daemon/lib combo to set optimisations for gaming
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/geekbench b/usr/share/sofirem/cache/corrections/geekbench
new file mode 100644
index 0000000..93da03a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/geekbench
@@ -0,0 +1 @@
+A cross-platform benchmark
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/google-earth-pro b/usr/share/sofirem/cache/corrections/google-earth-pro
new file mode 100644
index 0000000..be8875b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/google-earth-pro
@@ -0,0 +1 @@
+3D interface to explore the globe
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/gputest b/usr/share/sofirem/cache/corrections/gputest
new file mode 100644
index 0000000..538e066
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/gputest
@@ -0,0 +1 @@
+Cross-platform GPU stress test and OpenGL benchmark
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/gsmartcontrol b/usr/share/sofirem/cache/corrections/gsmartcontrol
new file mode 100644
index 0000000..2825f4e
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/gsmartcontrol
@@ -0,0 +1 @@
+GUI for smartctl hard disk drive health inspection tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/halo-icons-git b/usr/share/sofirem/cache/corrections/halo-icons-git
new file mode 100644
index 0000000..5d57139
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/halo-icons-git
@@ -0,0 +1 @@
+Halo is an icon theme for Linux desktops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/hddtemp b/usr/share/sofirem/cache/corrections/hddtemp
new file mode 100644
index 0000000..5c30888
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/hddtemp
@@ -0,0 +1 @@
+Gives you the temperature of your hard drive
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/hw-probe b/usr/share/sofirem/cache/corrections/hw-probe
new file mode 100644
index 0000000..30c0a8b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/hw-probe
@@ -0,0 +1 @@
+Tool to probe for hardware
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/insync b/usr/share/sofirem/cache/corrections/insync
new file mode 100644
index 0000000..0ae829b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/insync
@@ -0,0 +1 @@
+An unofficial Google Drive and OneDrive client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/intellij-idea-community-edition b/usr/share/sofirem/cache/corrections/intellij-idea-community-edition
new file mode 100644
index 0000000..b0c2a5a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/intellij-idea-community-edition
@@ -0,0 +1 @@
+IDE for Java, Groovy and other programming languages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/jdownloader2 b/usr/share/sofirem/cache/corrections/jdownloader2
new file mode 100644
index 0000000..4515246
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/jdownloader2
@@ -0,0 +1 @@
+Download manager, written in Java
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/kodi-addons b/usr/share/sofirem/cache/corrections/kodi-addons
new file mode 100644
index 0000000..42e6b02
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/kodi-addons
@@ -0,0 +1 @@
+Group package for all kodi-addons
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/kodi-x11 b/usr/share/sofirem/cache/corrections/kodi-x11
new file mode 100644
index 0000000..a4c967c
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/kodi-x11
@@ -0,0 +1 @@
+Group package for Kodi X11
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/layan-cursor-theme-git b/usr/share/sofirem/cache/corrections/layan-cursor-theme-git
new file mode 100644
index 0000000..dcc8205
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/layan-cursor-theme-git
@@ -0,0 +1 @@
+A x-cursor theme based on Capitaine Cursors.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-rt b/usr/share/sofirem/cache/corrections/linux-rt
new file mode 100644
index 0000000..967e01f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-rt
@@ -0,0 +1 @@
+The Linux RT kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-rt-headers b/usr/share/sofirem/cache/corrections/linux-rt-headers
new file mode 100644
index 0000000..dbd2d13
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-rt-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for Linux RT kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-rt-lts b/usr/share/sofirem/cache/corrections/linux-rt-lts
new file mode 100644
index 0000000..d2f4a1f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-rt-lts
@@ -0,0 +1 @@
+The Linux RT LTS kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-rt-lts-headers b/usr/share/sofirem/cache/corrections/linux-rt-lts-headers
new file mode 100644
index 0000000..cc1cd4d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-rt-lts-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for Linux RT LTS kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-xanmod-anbox b/usr/share/sofirem/cache/corrections/linux-xanmod-anbox
new file mode 100644
index 0000000..3d6cbfb
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-xanmod-anbox
@@ -0,0 +1 @@
+The Linux kernel and modules with Xanmod patches
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-xanmod-anbox-headers b/usr/share/sofirem/cache/corrections/linux-xanmod-anbox-headers
new file mode 100644
index 0000000..6caf2c3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-xanmod-anbox-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod Anbox
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-xanmod-headers b/usr/share/sofirem/cache/corrections/linux-xanmod-headers
new file mode 100644
index 0000000..0414b8c
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-xanmod-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for Linux Xanmod
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-xanmod-lts-headers b/usr/share/sofirem/cache/corrections/linux-xanmod-lts-headers
new file mode 100644
index 0000000..5a21521
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-xanmod-lts-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for Linux Xanmod LTS
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-xanmod-rt-headers b/usr/share/sofirem/cache/corrections/linux-xanmod-rt-headers
new file mode 100644
index 0000000..cf9a4ce
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-xanmod-rt-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod RT
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/linux-xanmod-tt-headers b/usr/share/sofirem/cache/corrections/linux-xanmod-tt-headers
new file mode 100644
index 0000000..55797f3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/linux-xanmod-tt-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod TT
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/lm_sensors b/usr/share/sofirem/cache/corrections/lm_sensors
new file mode 100644
index 0000000..819f69d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/lm_sensors
@@ -0,0 +1 @@
+Hardware monitoring - sensors
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/lshw b/usr/share/sofirem/cache/corrections/lshw
new file mode 100644
index 0000000..a86970d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/lshw
@@ -0,0 +1 @@
+Provide detailed information on the hardware configuration
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/mailspring b/usr/share/sofirem/cache/corrections/mailspring
new file mode 100644
index 0000000..0bed720
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/mailspring
@@ -0,0 +1 @@
+The best email app for people and teams at work
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/materia-gtk-theme b/usr/share/sofirem/cache/corrections/materia-gtk-theme
new file mode 100644
index 0000000..63f1206
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/materia-gtk-theme
@@ -0,0 +1 @@
+A Material Design theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/mcomix b/usr/share/sofirem/cache/corrections/mcomix
new file mode 100644
index 0000000..ecd057e
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/mcomix
@@ -0,0 +1 @@
+Viewer specifically designed to handle comic books
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/mintstick-bin b/usr/share/sofirem/cache/corrections/mintstick-bin
new file mode 100644
index 0000000..6689e00
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/mintstick-bin
@@ -0,0 +1 @@
+A GUI to write .iso files to a usb or format the usb
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/moka-icon-theme-git b/usr/share/sofirem/cache/corrections/moka-icon-theme-git
new file mode 100644
index 0000000..a3a451b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/moka-icon-theme-git
@@ -0,0 +1 @@
+An icon theme designed with a minimal and flat style
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/multimc-git b/usr/share/sofirem/cache/corrections/multimc-git
new file mode 100644
index 0000000..f89d332
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/multimc-git
@@ -0,0 +1 @@
+Minecraft launcher with ability to manage multiple instances
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/neofetch b/usr/share/sofirem/cache/corrections/neofetch
new file mode 100644
index 0000000..2a1c7de
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/neofetch
@@ -0,0 +1 @@
+A CLI system information tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/nordzy-icon-theme-git b/usr/share/sofirem/cache/corrections/nordzy-icon-theme-git
new file mode 100644
index 0000000..5b34d6d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/nordzy-icon-theme-git
@@ -0,0 +1 @@
+Icon theme using the Nord color palette and based on WhiteSur and Numix Icon Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/numix-gtk-theme-git b/usr/share/sofirem/cache/corrections/numix-gtk-theme-git
new file mode 100644
index 0000000..caa1589
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/numix-gtk-theme-git
@@ -0,0 +1 @@
+A flat and light theme with a modern look
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/oh-my-zsh-git b/usr/share/sofirem/cache/corrections/oh-my-zsh-git
new file mode 100644
index 0000000..72960b4
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/oh-my-zsh-git
@@ -0,0 +1 @@
+A community-driven framework for managing your zsh configuration
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/open-vm-tools b/usr/share/sofirem/cache/corrections/open-vm-tools
new file mode 100644
index 0000000..d1f4028
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/open-vm-tools
@@ -0,0 +1 @@
+The Open Virtual Machine Tools
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/optimus-manager-qt b/usr/share/sofirem/cache/corrections/optimus-manager-qt
new file mode 100644
index 0000000..254f84e
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/optimus-manager-qt
@@ -0,0 +1 @@
+A Qt interface for Optimus Manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/oranchelo-icon-theme-git b/usr/share/sofirem/cache/corrections/oranchelo-icon-theme-git
new file mode 100644
index 0000000..fed416f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/oranchelo-icon-theme-git
@@ -0,0 +1 @@
+Oranchelo is a flat-design icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/orchis-theme-git b/usr/share/sofirem/cache/corrections/orchis-theme-git
new file mode 100644
index 0000000..63f1206
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/orchis-theme-git
@@ -0,0 +1 @@
+A Material Design theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/oxy-neon b/usr/share/sofirem/cache/corrections/oxy-neon
new file mode 100644
index 0000000..f59123d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/oxy-neon
@@ -0,0 +1 @@
+Stylized oxygen mouse theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/pacseek-bin b/usr/share/sofirem/cache/corrections/pacseek-bin
new file mode 100644
index 0000000..dd5544c
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/pacseek-bin
@@ -0,0 +1 @@
+Cli for searching and installing Arch Linux packages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/pacui b/usr/share/sofirem/cache/corrections/pacui
new file mode 100644
index 0000000..7065b41
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/pacui
@@ -0,0 +1 @@
+Bash script providing advanced Pacman and Yay/Paru functionality
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/pacui-git b/usr/share/sofirem/cache/corrections/pacui-git
new file mode 100644
index 0000000..7065b41
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/pacui-git
@@ -0,0 +1 @@
+Bash script providing advanced Pacman and Yay/Paru functionality
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/papirus-linux-universe b/usr/share/sofirem/cache/corrections/papirus-linux-universe
new file mode 100644
index 0000000..447ae61
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/papirus-linux-universe
@@ -0,0 +1 @@
+Papirus Linux universe icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/phoronix-test-suite b/usr/share/sofirem/cache/corrections/phoronix-test-suite
new file mode 100644
index 0000000..11afc72
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/phoronix-test-suite
@@ -0,0 +1 @@
+The most comprehensive testing and benchmarking platform
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/picom-ibhagwan-git b/usr/share/sofirem/cache/corrections/picom-ibhagwan-git
new file mode 100644
index 0000000..5c3732f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/picom-ibhagwan-git
@@ -0,0 +1 @@
+iBhagwan's picom fork (dual_kawase blur and rounded corners)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/picom-jonaburg-git b/usr/share/sofirem/cache/corrections/picom-jonaburg-git
new file mode 100644
index 0000000..2e0a35b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/picom-jonaburg-git
@@ -0,0 +1 @@
+Jonaburg's picom fork (dual_kawase blur - rounded corners)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/pikaur-git b/usr/share/sofirem/cache/corrections/pikaur-git
new file mode 100644
index 0000000..c1432f6
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/pikaur-git
@@ -0,0 +1 @@
+AUR helper which asks all questions before installing/building
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/protonup-qt-bin b/usr/share/sofirem/cache/corrections/protonup-qt-bin
new file mode 100644
index 0000000..2b53be4
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/protonup-qt-bin
@@ -0,0 +1 @@
+GUI to install and manage Proton-GE for Steam,...
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/qbittorrent b/usr/share/sofirem/cache/corrections/qbittorrent
new file mode 100644
index 0000000..d1d23d3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/qbittorrent
@@ -0,0 +1 @@
+BitTorrent client programmed in C++ (Qt - libtorrent-rasterbar)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/qtox b/usr/share/sofirem/cache/corrections/qtox
new file mode 100644
index 0000000..043a260
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/qtox
@@ -0,0 +1 @@
+A chat, voice, video, and file transfer IM client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/qtwebflix-git b/usr/share/sofirem/cache/corrections/qtwebflix-git
new file mode 100644
index 0000000..ef06692
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/qtwebflix-git
@@ -0,0 +1 @@
+Standalone HD Netflix Browser using qt5-webengine
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/remmina b/usr/share/sofirem/cache/corrections/remmina
new file mode 100644
index 0000000..7517a4e
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/remmina
@@ -0,0 +1 @@
+Remote desktop client written in GTK+
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ripgrep b/usr/share/sofirem/cache/corrections/ripgrep
new file mode 100644
index 0000000..522fe4f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ripgrep
@@ -0,0 +1 @@
+A search tool that combines the usability of ag
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ripgrep-all b/usr/share/sofirem/cache/corrections/ripgrep-all
new file mode 100644
index 0000000..62196a3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ripgrep-all
@@ -0,0 +1 @@
+rga: ripgrep, but also search in zip, tar.gz, etc.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flat-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-flat-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flat-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flat-mint-y-icons-git b/usr/share/sofirem/cache/corrections/sardi-flat-mint-y-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flat-mint-y-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flat-mixing-icons-git b/usr/share/sofirem/cache/corrections/sardi-flat-mixing-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flat-mixing-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flexible-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-flexible-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flexible-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flexible-luv-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-flexible-luv-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flexible-luv-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flexible-mint-y-icons-git b/usr/share/sofirem/cache/corrections/sardi-flexible-mint-y-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flexible-mint-y-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flexible-mixing-icons-git b/usr/share/sofirem/cache/corrections/sardi-flexible-mixing-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flexible-mixing-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-flexible-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-flexible-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-flexible-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-mint-y-icons-git b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-mint-y-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-mint-y-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-mixing-icons-git b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-mixing-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-mixing-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-ghost-flexible-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-icons b/usr/share/sofirem/cache/corrections/sardi-icons
new file mode 100644
index 0000000..4a20578
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-icons
@@ -0,0 +1 @@
+Sardi icons is an icon collection for any linux distro
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mint-y-icons-git b/usr/share/sofirem/cache/corrections/sardi-mint-y-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mint-y-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mixing-icons-git b/usr/share/sofirem/cache/corrections/sardi-mixing-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mixing-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mono-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-mono-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mono-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mono-mint-y-icons-git b/usr/share/sofirem/cache/corrections/sardi-mono-mint-y-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mono-mint-y-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mono-mixing-icons-git b/usr/share/sofirem/cache/corrections/sardi-mono-mixing-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mono-mixing-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mono-numix-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-mono-numix-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mono-numix-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-mono-papirus-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-mono-papirus-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-mono-papirus-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-orb-colora-mint-y-icons-git b/usr/share/sofirem/cache/corrections/sardi-orb-colora-mint-y-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-orb-colora-mint-y-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-orb-colora-mixing-icons-git b/usr/share/sofirem/cache/corrections/sardi-orb-colora-mixing-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-orb-colora-mixing-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sardi-orb-colora-variations-icons-git b/usr/share/sofirem/cache/corrections/sardi-orb-colora-variations-icons-git
new file mode 100644
index 0000000..0a81f3d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sardi-orb-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon is a circular icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/sayonara-player b/usr/share/sofirem/cache/corrections/sayonara-player
new file mode 100644
index 0000000..5b352a0
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/sayonara-player
@@ -0,0 +1 @@
+Small audio player for Linux written in C++ for Qt
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/screenkey-git b/usr/share/sofirem/cache/corrections/screenkey-git
new file mode 100644
index 0000000..75e6760
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/screenkey-git
@@ -0,0 +1 @@
+Screencast tool to show your keys
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/shairport-sync b/usr/share/sofirem/cache/corrections/shairport-sync
new file mode 100644
index 0000000..8d583a7
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/shairport-sync
@@ -0,0 +1 @@
+AirPort Express - streaming music Apple
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/snap-pac b/usr/share/sofirem/cache/corrections/snap-pac
new file mode 100644
index 0000000..5cf52e5
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/snap-pac
@@ -0,0 +1 @@
+Pacman hooks that use snapper to create pre/post btrfs snapshots
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/snapper b/usr/share/sofirem/cache/corrections/snapper
new file mode 100644
index 0000000..6e1d098
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/snapper
@@ -0,0 +1 @@
+A tool for managing BTRFS and LVM snapshots.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/spotifywm-git b/usr/share/sofirem/cache/corrections/spotifywm-git
new file mode 100644
index 0000000..583f4ba
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/spotifywm-git
@@ -0,0 +1 @@
+Creates a class name for Spotify (TWMs)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/surfn-mint-y-icons-git b/usr/share/sofirem/cache/corrections/surfn-mint-y-icons-git
new file mode 100644
index 0000000..9ee8b25
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/surfn-mint-y-icons-git
@@ -0,0 +1 @@
+Surfn icons with Linux Mint folders
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/systemd-manager-git b/usr/share/sofirem/cache/corrections/systemd-manager-git
new file mode 100644
index 0000000..f4d69ae
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/systemd-manager-git
@@ -0,0 +1 @@
+A systemd service manager written in Rust
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/tabby-bin b/usr/share/sofirem/cache/corrections/tabby-bin
new file mode 100644
index 0000000..53716d8
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/tabby-bin
@@ -0,0 +1 @@
+Tabby is a highly configurable terminal emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/tor-browser b/usr/share/sofirem/cache/corrections/tor-browser
new file mode 100644
index 0000000..7057183
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/tor-browser
@@ -0,0 +1 @@
+Tor Browser Bundle: anonymous browsing using Firefox and Tor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-dejavu b/usr/share/sofirem/cache/corrections/ttf-dejavu
new file mode 100644
index 0000000..511e2ed
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-dejavu
@@ -0,0 +1 @@
+Font family based on the Bitstream Vera Fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-eurof b/usr/share/sofirem/cache/corrections/ttf-eurof
new file mode 100644
index 0000000..faca990
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-eurof
@@ -0,0 +1 @@
+The original eurofurence font
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-hack b/usr/share/sofirem/cache/corrections/ttf-hack
new file mode 100644
index 0000000..67488de
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-hack
@@ -0,0 +1 @@
+A hand groomed and optically balanced typeface
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-hactor b/usr/share/sofirem/cache/corrections/ttf-hactor
new file mode 100644
index 0000000..abb5303
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-hactor
@@ -0,0 +1 @@
+A font alternative to Operator Mono
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-liberation b/usr/share/sofirem/cache/corrections/ttf-liberation
new file mode 100644
index 0000000..535b198
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-liberation
@@ -0,0 +1 @@
+Font compatible with Arial, Times New Roman and Courier New
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-linux-libertine b/usr/share/sofirem/cache/corrections/ttf-linux-libertine
new file mode 100644
index 0000000..9e6e930
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-linux-libertine
@@ -0,0 +1 @@
+Serif (Libertine) and Sans Serif (Biolinum) OpenType fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-mac-fonts b/usr/share/sofirem/cache/corrections/ttf-mac-fonts
new file mode 100644
index 0000000..1066a29
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-mac-fonts
@@ -0,0 +1 @@
+Mac fonts including Lucida Grande, Apple Garamond, ...
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-nerd-fonts-symbols-1000-em b/usr/share/sofirem/cache/corrections/ttf-nerd-fonts-symbols-1000-em
new file mode 100644
index 0000000..82be977
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-nerd-fonts-symbols-1000-em
@@ -0,0 +1 @@
+High number of extra glyphs from popular 'iconic fonts'
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-nerd-fonts-symbols-1000-em-mono b/usr/share/sofirem/cache/corrections/ttf-nerd-fonts-symbols-1000-em-mono
new file mode 100644
index 0000000..82be977
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-nerd-fonts-symbols-1000-em-mono
@@ -0,0 +1 @@
+High number of extra glyphs from popular 'iconic fonts'
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/ttf-roboto-mono b/usr/share/sofirem/cache/corrections/ttf-roboto-mono
new file mode 100644
index 0000000..6499ae3
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/ttf-roboto-mono
@@ -0,0 +1 @@
+A monospaced addition to the Roboto type family
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/tuxboot b/usr/share/sofirem/cache/corrections/tuxboot
new file mode 100644
index 0000000..39f8c29
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/tuxboot
@@ -0,0 +1 @@
+Create a bootable Live USB drive
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/tuxboot-git b/usr/share/sofirem/cache/corrections/tuxboot-git
new file mode 100644
index 0000000..39f8c29
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/tuxboot-git
@@ -0,0 +1 @@
+Create a bootable Live USB drive
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/unimatrix-git b/usr/share/sofirem/cache/corrections/unimatrix-git
new file mode 100644
index 0000000..f4f1aa2
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/unimatrix-git
@@ -0,0 +1 @@
+Python script to simulate the display from "The Matrix" in terminal.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/upower b/usr/share/sofirem/cache/corrections/upower
new file mode 100644
index 0000000..d5c4040
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/upower
@@ -0,0 +1 @@
+Abstraction for enumerating power devices
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/variety b/usr/share/sofirem/cache/corrections/variety
new file mode 100644
index 0000000..26bebda
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/variety
@@ -0,0 +1 @@
+Changes the wallpaper on a regular interval
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/vim-runtime b/usr/share/sofirem/cache/corrections/vim-runtime
new file mode 100644
index 0000000..18e9e5b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/vim-runtime
@@ -0,0 +1 @@
+Vi Improved, a highly configurable, improved version of vi
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/vimix-cursors b/usr/share/sofirem/cache/corrections/vimix-cursors
new file mode 100644
index 0000000..2b75421
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/vimix-cursors
@@ -0,0 +1 @@
+An X Cursor theme inspired by Material design
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/visual-studio-code-bin b/usr/share/sofirem/cache/corrections/visual-studio-code-bin
new file mode 100644
index 0000000..2d1f242
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/visual-studio-code-bin
@@ -0,0 +1 @@
+Visual Studio Code (official binary version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/vivaldi-widevine b/usr/share/sofirem/cache/corrections/vivaldi-widevine
new file mode 100644
index 0000000..250539d
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/vivaldi-widevine
@@ -0,0 +1 @@
+A browser plugin designed for the viewing of premium video content
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/vmware-workstation b/usr/share/sofirem/cache/corrections/vmware-workstation
new file mode 100644
index 0000000..8842739
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/vmware-workstation
@@ -0,0 +1 @@
+Vmware - virtual machines on a PC
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/waydroid b/usr/share/sofirem/cache/corrections/waydroid
new file mode 100644
index 0000000..bb7c05f
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/waydroid
@@ -0,0 +1 @@
+Boot a full Android system on a regular Linux system
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/woeusb b/usr/share/sofirem/cache/corrections/woeusb
new file mode 100644
index 0000000..66310ed
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/woeusb
@@ -0,0 +1 @@
+Create Windows USB stick
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/wttr b/usr/share/sofirem/cache/corrections/wttr
new file mode 100644
index 0000000..4d5956a
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/wttr
@@ -0,0 +1 @@
+A simple script that helps you check the weather condition
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/xcursor-arch-cursor-complete b/usr/share/sofirem/cache/corrections/xcursor-arch-cursor-complete
new file mode 100644
index 0000000..886aa0b
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/xcursor-arch-cursor-complete
@@ -0,0 +1 @@
+Expansion of Arch Cursor Simple theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/xcursor-breeze b/usr/share/sofirem/cache/corrections/xcursor-breeze
new file mode 100644
index 0000000..d4a5420
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/xcursor-breeze
@@ -0,0 +1 @@
+KDE Plasma 5 'Breeze' cursor theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/xdman b/usr/share/sofirem/cache/corrections/xdman
new file mode 100644
index 0000000..7f8bf54
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/xdman
@@ -0,0 +1 @@
+Xtreme Download Manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/yad b/usr/share/sofirem/cache/corrections/yad
new file mode 100644
index 0000000..8496f24
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/yad
@@ -0,0 +1 @@
+A fork of zenity - display graphical dialogs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/yay b/usr/share/sofirem/cache/corrections/yay
new file mode 100644
index 0000000..379b6d9
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/yay
@@ -0,0 +1 @@
+Yet another yogurt. Pacman wrapper and AUR helper written in go.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/yay-bin b/usr/share/sofirem/cache/corrections/yay-bin
new file mode 100644
index 0000000..ec03903
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/yay-bin
@@ -0,0 +1 @@
+Yet another yogurt. Pacman wrapper and AUR helper
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/yay-git b/usr/share/sofirem/cache/corrections/yay-git
new file mode 100644
index 0000000..ec03903
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/yay-git
@@ -0,0 +1 @@
+Yet another yogurt. Pacman wrapper and AUR helper
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/zsh-history-substring-search-git b/usr/share/sofirem/cache/corrections/zsh-history-substring-search-git
new file mode 100644
index 0000000..3a34cc6
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/zsh-history-substring-search-git
@@ -0,0 +1 @@
+A ZSH plugin to search history
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/corrections/zsh-theme-powerlevel10k-git b/usr/share/sofirem/cache/corrections/zsh-theme-powerlevel10k-git
new file mode 100644
index 0000000..546d80c
--- /dev/null
+++ b/usr/share/sofirem/cache/corrections/zsh-theme-powerlevel10k-git
@@ -0,0 +1 @@
+Powerlevel10k is a theme for Zsh
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cowfortune b/usr/share/sofirem/cache/cowfortune
new file mode 100644
index 0000000..a721596
--- /dev/null
+++ b/usr/share/sofirem/cache/cowfortune
@@ -0,0 +1 @@
+Configurable fortune cookie proclaiming cow (and a few other creatures)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cpu-x b/usr/share/sofirem/cache/cpu-x
new file mode 100644
index 0000000..661418b
--- /dev/null
+++ b/usr/share/sofirem/cache/cpu-x
@@ -0,0 +1 @@
+A Free software that gathers information on CPU, motherboard and more
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cpufetch-git b/usr/share/sofirem/cache/cpufetch-git
new file mode 100644
index 0000000..512e717
--- /dev/null
+++ b/usr/share/sofirem/cache/cpufetch-git
@@ -0,0 +1 @@
+Simple yet fancy CPU architecture fetching tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cpuid b/usr/share/sofirem/cache/cpuid
new file mode 100644
index 0000000..d27a0ec
--- /dev/null
+++ b/usr/share/sofirem/cache/cpuid
@@ -0,0 +1 @@
+Linux tool to dump x86 CPUID information about the CPU(s)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cryfs b/usr/share/sofirem/cache/cryfs
new file mode 100644
index 0000000..4385867
--- /dev/null
+++ b/usr/share/sofirem/cache/cryfs
@@ -0,0 +1 @@
+Cryptographic filesystem for the cloud
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cuda b/usr/share/sofirem/cache/cuda
new file mode 100644
index 0000000..33f8220
--- /dev/null
+++ b/usr/share/sofirem/cache/cuda
@@ -0,0 +1 @@
+NVIDIA's GPU programming toolkit
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/curseradio-git b/usr/share/sofirem/cache/curseradio-git
new file mode 100644
index 0000000..f6d2a8a
--- /dev/null
+++ b/usr/share/sofirem/cache/curseradio-git
@@ -0,0 +1 @@
+Command line radio player
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cwm b/usr/share/sofirem/cache/cwm
new file mode 100644
index 0000000..bfa1002
--- /dev/null
+++ b/usr/share/sofirem/cache/cwm
@@ -0,0 +1 @@
+OpenBSD fork of calmwm, a clean and lightweight window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/cxxmatrix-git b/usr/share/sofirem/cache/cxxmatrix-git
new file mode 100644
index 0000000..c5437dd
--- /dev/null
+++ b/usr/share/sofirem/cache/cxxmatrix-git
@@ -0,0 +1 @@
+A C++ based scrolling Matrix digital rain along with other scenes.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/darktable b/usr/share/sofirem/cache/darktable
new file mode 100644
index 0000000..b671629
--- /dev/null
+++ b/usr/share/sofirem/cache/darktable
@@ -0,0 +1 @@
+Utility to organize and develop raw images
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/deadbeef b/usr/share/sofirem/cache/deadbeef
new file mode 100644
index 0000000..d7708fb
--- /dev/null
+++ b/usr/share/sofirem/cache/deadbeef
@@ -0,0 +1 @@
+Modular GTK audio player for GNU/Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/debtap b/usr/share/sofirem/cache/debtap
new file mode 100644
index 0000000..16f191b
--- /dev/null
+++ b/usr/share/sofirem/cache/debtap
@@ -0,0 +1 @@
+A script to convert .deb packages to Arch Linux packages, focused on accuracy. Do not use it to convert packages that already exist on official repositories or can be built from AUR!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/deezer b/usr/share/sofirem/cache/deezer
new file mode 100644
index 0000000..a1acc5f
--- /dev/null
+++ b/usr/share/sofirem/cache/deezer
@@ -0,0 +1 @@
+A proprietary music streaming service
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/deja-dup b/usr/share/sofirem/cache/deja-dup
new file mode 100644
index 0000000..17f0175
--- /dev/null
+++ b/usr/share/sofirem/cache/deja-dup
@@ -0,0 +1 @@
+A trivial-to-use personal backup tool to protect against accidental data loss
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/deluge b/usr/share/sofirem/cache/deluge
new file mode 100644
index 0000000..0b8c9be
--- /dev/null
+++ b/usr/share/sofirem/cache/deluge
@@ -0,0 +1 @@
+BitTorrent client with multiple user interfaces in a client/server model
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/digikam b/usr/share/sofirem/cache/digikam
new file mode 100644
index 0000000..59d872e
--- /dev/null
+++ b/usr/share/sofirem/cache/digikam
@@ -0,0 +1 @@
+An advanced digital photo management application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/discord b/usr/share/sofirem/cache/discord
new file mode 100644
index 0000000..e4c9893
--- /dev/null
+++ b/usr/share/sofirem/cache/discord
@@ -0,0 +1 @@
+All-in-one voice and text chat for gamers that's free and secure.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/discord_arch_electron b/usr/share/sofirem/cache/discord_arch_electron
new file mode 100644
index 0000000..6d22c12
--- /dev/null
+++ b/usr/share/sofirem/cache/discord_arch_electron
@@ -0,0 +1 @@
+Discord (popular voice + video app) using the system provided electron for increased security and performance
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/discover b/usr/share/sofirem/cache/discover
new file mode 100644
index 0000000..247dbce
--- /dev/null
+++ b/usr/share/sofirem/cache/discover
@@ -0,0 +1 @@
+KDE and Plasma resources management GUI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/disper b/usr/share/sofirem/cache/disper
new file mode 100644
index 0000000..b4f09f5
--- /dev/null
+++ b/usr/share/sofirem/cache/disper
@@ -0,0 +1 @@
+An on-the-fly display switch utility, intended to be used on laptops, especially with nVidia cards.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dmenu b/usr/share/sofirem/cache/dmenu
new file mode 100644
index 0000000..c3b0f0b
--- /dev/null
+++ b/usr/share/sofirem/cache/dmenu
@@ -0,0 +1 @@
+Generic menu for X
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dmidecode b/usr/share/sofirem/cache/dmidecode
new file mode 100644
index 0000000..f98e726
--- /dev/null
+++ b/usr/share/sofirem/cache/dmidecode
@@ -0,0 +1 @@
+Desktop Management Interface table related utilities
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dolphin b/usr/share/sofirem/cache/dolphin
new file mode 100644
index 0000000..95f7549
--- /dev/null
+++ b/usr/share/sofirem/cache/dolphin
@@ -0,0 +1 @@
+KDE File Manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dolphin-plugins b/usr/share/sofirem/cache/dolphin-plugins
new file mode 100644
index 0000000..2b0ecd3
--- /dev/null
+++ b/usr/share/sofirem/cache/dolphin-plugins
@@ -0,0 +1 @@
+Extra Dolphin plugins
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/doublecmd-qt5 b/usr/share/sofirem/cache/doublecmd-qt5
new file mode 100644
index 0000000..48ab248
--- /dev/null
+++ b/usr/share/sofirem/cache/doublecmd-qt5
@@ -0,0 +1 @@
+twin-panel (commander-style) file manager (Qt5)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/downgrade b/usr/share/sofirem/cache/downgrade
new file mode 100644
index 0000000..3574b20
--- /dev/null
+++ b/usr/share/sofirem/cache/downgrade
@@ -0,0 +1 @@
+Bash script for downgrading one or more packages to a version in your cache or the A.L.A.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dracula-cursors-git b/usr/share/sofirem/cache/dracula-cursors-git
new file mode 100644
index 0000000..16895da
--- /dev/null
+++ b/usr/share/sofirem/cache/dracula-cursors-git
@@ -0,0 +1 @@
+Dracula theme cursors
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dracula-gtk-theme b/usr/share/sofirem/cache/dracula-gtk-theme
new file mode 100644
index 0000000..5be85a9
--- /dev/null
+++ b/usr/share/sofirem/cache/dracula-gtk-theme
@@ -0,0 +1 @@
+Dark theme for GTK
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dracula-icons-git b/usr/share/sofirem/cache/dracula-icons-git
new file mode 100644
index 0000000..5aff350
--- /dev/null
+++ b/usr/share/sofirem/cache/dracula-icons-git
@@ -0,0 +1 @@
+Dark Icons Theme for Linux Desktops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/droidcam b/usr/share/sofirem/cache/droidcam
new file mode 100644
index 0000000..b7b4ea6
--- /dev/null
+++ b/usr/share/sofirem/cache/droidcam
@@ -0,0 +1 @@
+A tool for using your android device as a wireless/usb webcam
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/dropbox b/usr/share/sofirem/cache/dropbox
new file mode 100644
index 0000000..8fee612
--- /dev/null
+++ b/usr/share/sofirem/cache/dropbox
@@ -0,0 +1 @@
+A free service that lets you bring your photos, docs, and videos anywhere and share them easily.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/duf b/usr/share/sofirem/cache/duf
new file mode 100644
index 0000000..4710f52
--- /dev/null
+++ b/usr/share/sofirem/cache/duf
@@ -0,0 +1 @@
+Disk Usage/Free Utility
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/duf-bin b/usr/share/sofirem/cache/duf-bin
new file mode 100644
index 0000000..4710f52
--- /dev/null
+++ b/usr/share/sofirem/cache/duf-bin
@@ -0,0 +1 @@
+Disk Usage/Free Utility
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/edid-decode-git b/usr/share/sofirem/cache/edid-decode-git
new file mode 100644
index 0000000..531149c
--- /dev/null
+++ b/usr/share/sofirem/cache/edid-decode-git
@@ -0,0 +1 @@
+EDID decoder and conformance tester
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/element-desktop b/usr/share/sofirem/cache/element-desktop
new file mode 100644
index 0000000..f2c3760
--- /dev/null
+++ b/usr/share/sofirem/cache/element-desktop
@@ -0,0 +1 @@
+Glossy Matrix collaboration client — desktop version.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/elisa b/usr/share/sofirem/cache/elisa
new file mode 100644
index 0000000..398e03f
--- /dev/null
+++ b/usr/share/sofirem/cache/elisa
@@ -0,0 +1 @@
+A simple music player aiming to provide a nice experience for its users
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/emacs b/usr/share/sofirem/cache/emacs
new file mode 100644
index 0000000..ae440e3
--- /dev/null
+++ b/usr/share/sofirem/cache/emacs
@@ -0,0 +1 @@
+The extensible, customizable, self-documenting real-time display editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/encfs b/usr/share/sofirem/cache/encfs
new file mode 100644
index 0000000..8d31cb2
--- /dev/null
+++ b/usr/share/sofirem/cache/encfs
@@ -0,0 +1 @@
+Encrypted filesystem in user-space
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/enlightenment b/usr/share/sofirem/cache/enlightenment
new file mode 100644
index 0000000..62d4b63
--- /dev/null
+++ b/usr/share/sofirem/cache/enlightenment
@@ -0,0 +1 @@
+Enlightenment window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/enpass-bin b/usr/share/sofirem/cache/enpass-bin
new file mode 100644
index 0000000..3f42d59
--- /dev/null
+++ b/usr/share/sofirem/cache/enpass-bin
@@ -0,0 +1 @@
+A multiplatform password manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/envycontrol b/usr/share/sofirem/cache/envycontrol
new file mode 100644
index 0000000..477c297
--- /dev/null
+++ b/usr/share/sofirem/cache/envycontrol
@@ -0,0 +1 @@
+Easy GPU switching for Nvidia Optimus laptops under Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/epdfview b/usr/share/sofirem/cache/epdfview
new file mode 100644
index 0000000..8d6bc84
--- /dev/null
+++ b/usr/share/sofirem/cache/epdfview
@@ -0,0 +1 @@
+Lightweight PDF document viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/espeak-ng b/usr/share/sofirem/cache/espeak-ng
new file mode 100644
index 0000000..1af1bfc
--- /dev/null
+++ b/usr/share/sofirem/cache/espeak-ng
@@ -0,0 +1 @@
+Multi-lingual software speech synthesizer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/etcher-bin b/usr/share/sofirem/cache/etcher-bin
new file mode 100644
index 0000000..89d5a6e
--- /dev/null
+++ b/usr/share/sofirem/cache/etcher-bin
@@ -0,0 +1 @@
+Flash OS images to SD cards & USB drives, safely and easily
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/evince b/usr/share/sofirem/cache/evince
new file mode 100644
index 0000000..e3a4f0c
--- /dev/null
+++ b/usr/share/sofirem/cache/evince
@@ -0,0 +1 @@
+Document viewer (PDF, PostScript, XPS, djvu, dvi, tiff, cbr, cbz, cb7, cbt)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/evolution b/usr/share/sofirem/cache/evolution
new file mode 100644
index 0000000..69a297d
--- /dev/null
+++ b/usr/share/sofirem/cache/evolution
@@ -0,0 +1 @@
+Manage your email, contacts and schedule
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/extremetuxracer b/usr/share/sofirem/cache/extremetuxracer
new file mode 100644
index 0000000..62b21b0
--- /dev/null
+++ b/usr/share/sofirem/cache/extremetuxracer
@@ -0,0 +1 @@
+Downhill racing game starring Tux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/faba-icon-theme-git b/usr/share/sofirem/cache/faba-icon-theme-git
new file mode 100644
index 0000000..66873d1
--- /dev/null
+++ b/usr/share/sofirem/cache/faba-icon-theme-git
@@ -0,0 +1 @@
+A sexy and modern FreeDesktop icon set with Tango and elementary influences
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/faba-mono-icons-git b/usr/share/sofirem/cache/faba-mono-icons-git
new file mode 100644
index 0000000..53cf6fa
--- /dev/null
+++ b/usr/share/sofirem/cache/faba-mono-icons-git
@@ -0,0 +1 @@
+Supplementary theme to Faba Icon Theme - consists only of monochrome panel icons
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/falkon b/usr/share/sofirem/cache/falkon
new file mode 100644
index 0000000..7cb142c
--- /dev/null
+++ b/usr/share/sofirem/cache/falkon
@@ -0,0 +1 @@
+Cross-platform QtWebEngine browser
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fancontrol-gui-git b/usr/share/sofirem/cache/fancontrol-gui-git
new file mode 100644
index 0000000..c796499
--- /dev/null
+++ b/usr/share/sofirem/cache/fancontrol-gui-git
@@ -0,0 +1 @@
+GUI for the fancontrol script and systemd service
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fastfetch b/usr/share/sofirem/cache/fastfetch
new file mode 100644
index 0000000..39b89e5
--- /dev/null
+++ b/usr/share/sofirem/cache/fastfetch
@@ -0,0 +1 @@
+ Like neofetch, but much faster because written in c
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fastfetch-git b/usr/share/sofirem/cache/fastfetch-git
new file mode 100644
index 0000000..39b89e5
--- /dev/null
+++ b/usr/share/sofirem/cache/fastfetch-git
@@ -0,0 +1 @@
+ Like neofetch, but much faster because written in c
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/feh b/usr/share/sofirem/cache/feh
new file mode 100644
index 0000000..738e234
--- /dev/null
+++ b/usr/share/sofirem/cache/feh
@@ -0,0 +1 @@
+Fast and light imlib2-based image viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ffmpegthumbs b/usr/share/sofirem/cache/ffmpegthumbs
new file mode 100644
index 0000000..9425f11
--- /dev/null
+++ b/usr/share/sofirem/cache/ffmpegthumbs
@@ -0,0 +1 @@
+FFmpeg-based thumbnail creator for video files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/figlet b/usr/share/sofirem/cache/figlet
new file mode 100644
index 0000000..a22f0b6
--- /dev/null
+++ b/usr/share/sofirem/cache/figlet
@@ -0,0 +1 @@
+A program for making large letters out of ordinary text
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/filebot b/usr/share/sofirem/cache/filebot
new file mode 100644
index 0000000..7ee1dd2
--- /dev/null
+++ b/usr/share/sofirem/cache/filebot
@@ -0,0 +1 @@
+The ultimate TV and Movie Renamer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/filezilla b/usr/share/sofirem/cache/filezilla
new file mode 100644
index 0000000..4afc94d
--- /dev/null
+++ b/usr/share/sofirem/cache/filezilla
@@ -0,0 +1 @@
+Fast and reliable FTP, FTPS and SFTP client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/find-the-command-git b/usr/share/sofirem/cache/find-the-command-git
new file mode 100644
index 0000000..7b082fb
--- /dev/null
+++ b/usr/share/sofirem/cache/find-the-command-git
@@ -0,0 +1 @@
+Advanced command-not-found hook for bash, fish and zsh using the power of pacman
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fingerprint-gui b/usr/share/sofirem/cache/fingerprint-gui
new file mode 100644
index 0000000..72a3388
--- /dev/null
+++ b/usr/share/sofirem/cache/fingerprint-gui
@@ -0,0 +1 @@
+Fingerprint-based authentication, supports UPEK readers with non-free library
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/firefox b/usr/share/sofirem/cache/firefox
new file mode 100644
index 0000000..3498a87
--- /dev/null
+++ b/usr/share/sofirem/cache/firefox
@@ -0,0 +1 @@
+Standalone web browser from mozilla.org
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/firefox-adblock-plus b/usr/share/sofirem/cache/firefox-adblock-plus
new file mode 100644
index 0000000..3ccdb47
--- /dev/null
+++ b/usr/share/sofirem/cache/firefox-adblock-plus
@@ -0,0 +1 @@
+Extension for firefox which block ads and banners
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/firefox-ublock-origin b/usr/share/sofirem/cache/firefox-ublock-origin
new file mode 100644
index 0000000..50e441c
--- /dev/null
+++ b/usr/share/sofirem/cache/firefox-ublock-origin
@@ -0,0 +1 @@
+Efficient blocker add-on for various browsers. Fast, potent, and lean
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/flameshot-git b/usr/share/sofirem/cache/flameshot-git
new file mode 100644
index 0000000..e9f5a88
--- /dev/null
+++ b/usr/share/sofirem/cache/flameshot-git
@@ -0,0 +1 @@
+Powerful yet simple to use screenshot software
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/flat-remix-git b/usr/share/sofirem/cache/flat-remix-git
new file mode 100644
index 0000000..739e292
--- /dev/null
+++ b/usr/share/sofirem/cache/flat-remix-git
@@ -0,0 +1 @@
+An icon theme inspired by material design.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/flatpak b/usr/share/sofirem/cache/flatpak
new file mode 100644
index 0000000..580db7e
--- /dev/null
+++ b/usr/share/sofirem/cache/flatpak
@@ -0,0 +1 @@
+Linux application sandboxing and distribution framework (formerly xdg-app)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/flavours b/usr/share/sofirem/cache/flavours
new file mode 100644
index 0000000..ed6d713
--- /dev/null
+++ b/usr/share/sofirem/cache/flavours
@@ -0,0 +1 @@
+A simple and easy cli to build and use base16 schemes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/florence b/usr/share/sofirem/cache/florence
new file mode 100644
index 0000000..d86b850
--- /dev/null
+++ b/usr/share/sofirem/cache/florence
@@ -0,0 +1 @@
+A configurable on-screen virtual keyboard
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fluent-gtk-theme b/usr/share/sofirem/cache/fluent-gtk-theme
new file mode 100644
index 0000000..e40d88f
--- /dev/null
+++ b/usr/share/sofirem/cache/fluent-gtk-theme
@@ -0,0 +1 @@
+Fluent design GTK theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fluent-icon-theme-git b/usr/share/sofirem/cache/fluent-icon-theme-git
new file mode 100644
index 0000000..680cbe4
--- /dev/null
+++ b/usr/share/sofirem/cache/fluent-icon-theme-git
@@ -0,0 +1 @@
+A Fluent design icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fluent-kde-theme-git b/usr/share/sofirem/cache/fluent-kde-theme-git
new file mode 100644
index 0000000..6a2ba6a
--- /dev/null
+++ b/usr/share/sofirem/cache/fluent-kde-theme-git
@@ -0,0 +1 @@
+Fluent design theme for kde plasma
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/focuswriter b/usr/share/sofirem/cache/focuswriter
new file mode 100644
index 0000000..f268545
--- /dev/null
+++ b/usr/share/sofirem/cache/focuswriter
@@ -0,0 +1 @@
+Simple, distraction-free word processor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/font-manager b/usr/share/sofirem/cache/font-manager
new file mode 100644
index 0000000..a62f2ac
--- /dev/null
+++ b/usr/share/sofirem/cache/font-manager
@@ -0,0 +1 @@
+A simple font management application for GTK+ Desktop Environments
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/font-manager-git b/usr/share/sofirem/cache/font-manager-git
new file mode 100644
index 0000000..a62f2ac
--- /dev/null
+++ b/usr/share/sofirem/cache/font-manager-git
@@ -0,0 +1 @@
+A simple font management application for GTK+ Desktop Environments
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fragments b/usr/share/sofirem/cache/fragments
new file mode 100644
index 0000000..ba27852
--- /dev/null
+++ b/usr/share/sofirem/cache/fragments
@@ -0,0 +1 @@
+BitTorrent client for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/freeciv b/usr/share/sofirem/cache/freeciv
new file mode 100644
index 0000000..4a35632
--- /dev/null
+++ b/usr/share/sofirem/cache/freeciv
@@ -0,0 +1 @@
+A multiuser clone of the famous Microprose game of Civilization
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/freedownloadmanager b/usr/share/sofirem/cache/freedownloadmanager
new file mode 100644
index 0000000..267bff3
--- /dev/null
+++ b/usr/share/sofirem/cache/freedownloadmanager
@@ -0,0 +1 @@
+FDM is a powerful modern download accelerator and organizer.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/freeoffice b/usr/share/sofirem/cache/freeoffice
new file mode 100644
index 0000000..88b9620
--- /dev/null
+++ b/usr/share/sofirem/cache/freeoffice
@@ -0,0 +1 @@
+A complete, reliable, lightning-fast and Microsoft Office-compatible office suite with a word processor, spreadsheet, and presentation graphics software.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/freetube-bin b/usr/share/sofirem/cache/freetube-bin
new file mode 100644
index 0000000..9cade67
--- /dev/null
+++ b/usr/share/sofirem/cache/freetube-bin
@@ -0,0 +1 @@
+An open source desktop YouTube player built with privacy in mind.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/fvwm3-git b/usr/share/sofirem/cache/fvwm3-git
new file mode 100644
index 0000000..13304ee
--- /dev/null
+++ b/usr/share/sofirem/cache/fvwm3-git
@@ -0,0 +1 @@
+A powerful ICCCM2 compliant multiple virtual desktop window manager for X11
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/g4music b/usr/share/sofirem/cache/g4music
new file mode 100644
index 0000000..724004e
--- /dev/null
+++ b/usr/share/sofirem/cache/g4music
@@ -0,0 +1 @@
+Play your music
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/galculator b/usr/share/sofirem/cache/galculator
new file mode 100644
index 0000000..e8964e7
--- /dev/null
+++ b/usr/share/sofirem/cache/galculator
@@ -0,0 +1 @@
+GTK+ based scientific calculator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/game-devices-udev b/usr/share/sofirem/cache/game-devices-udev
new file mode 100644
index 0000000..2e8eabe
--- /dev/null
+++ b/usr/share/sofirem/cache/game-devices-udev
@@ -0,0 +1 @@
+Udev rules for controllers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gamehub-bin b/usr/share/sofirem/cache/gamehub-bin
new file mode 100644
index 0000000..f57c7fa
--- /dev/null
+++ b/usr/share/sofirem/cache/gamehub-bin
@@ -0,0 +1 @@
+Games manager, downloader, library that supports GOG, Steam and Humble Bundle
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gamemode b/usr/share/sofirem/cache/gamemode
new file mode 100644
index 0000000..f34ae63
--- /dev/null
+++ b/usr/share/sofirem/cache/gamemode
@@ -0,0 +1 @@
+A daemon/lib combo that allows games to request a set of optimisations be temporarily applied to the host OS
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gammy b/usr/share/sofirem/cache/gammy
new file mode 100644
index 0000000..5d9e77e
--- /dev/null
+++ b/usr/share/sofirem/cache/gammy
@@ -0,0 +1 @@
+Adaptive screen brightness/temperature tool.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gdm b/usr/share/sofirem/cache/gdm
new file mode 100644
index 0000000..c2b13f0
--- /dev/null
+++ b/usr/share/sofirem/cache/gdm
@@ -0,0 +1 @@
+Display manager and login screen
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gdown b/usr/share/sofirem/cache/gdown
new file mode 100644
index 0000000..d1e4582
--- /dev/null
+++ b/usr/share/sofirem/cache/gdown
@@ -0,0 +1 @@
+Download a large file from Google Drive
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/geany b/usr/share/sofirem/cache/geany
new file mode 100644
index 0000000..ceca5de
--- /dev/null
+++ b/usr/share/sofirem/cache/geany
@@ -0,0 +1 @@
+Fast and lightweight IDE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/geany-plugins b/usr/share/sofirem/cache/geany-plugins
new file mode 100644
index 0000000..8c4bb24
--- /dev/null
+++ b/usr/share/sofirem/cache/geany-plugins
@@ -0,0 +1 @@
+Plugins for Geany
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/geary b/usr/share/sofirem/cache/geary
new file mode 100644
index 0000000..dbce1cb
--- /dev/null
+++ b/usr/share/sofirem/cache/geary
@@ -0,0 +1 @@
+A lightweight email client for the GNOME desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/geekbench b/usr/share/sofirem/cache/geekbench
new file mode 100644
index 0000000..ea7e1ee
--- /dev/null
+++ b/usr/share/sofirem/cache/geekbench
@@ -0,0 +1 @@
+A cross-platform benchmark that measures processor and memory performance
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ghostwriter b/usr/share/sofirem/cache/ghostwriter
new file mode 100644
index 0000000..a839e18
--- /dev/null
+++ b/usr/share/sofirem/cache/ghostwriter
@@ -0,0 +1 @@
+Aesthetic, distraction-free Markdown editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gimp b/usr/share/sofirem/cache/gimp
new file mode 100644
index 0000000..6f4f19c
--- /dev/null
+++ b/usr/share/sofirem/cache/gimp
@@ -0,0 +1 @@
+GNU Image Manipulation Program
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gitahead b/usr/share/sofirem/cache/gitahead
new file mode 100644
index 0000000..d3e8991
--- /dev/null
+++ b/usr/share/sofirem/cache/gitahead
@@ -0,0 +1 @@
+Understand your Git history!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gitahead-bin b/usr/share/sofirem/cache/gitahead-bin
new file mode 100644
index 0000000..d3e8991
--- /dev/null
+++ b/usr/share/sofirem/cache/gitahead-bin
@@ -0,0 +1 @@
+Understand your Git history!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gitfiend b/usr/share/sofirem/cache/gitfiend
new file mode 100644
index 0000000..a4d50d4
--- /dev/null
+++ b/usr/share/sofirem/cache/gitfiend
@@ -0,0 +1 @@
+A Git client designed for humans
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gitg b/usr/share/sofirem/cache/gitg
new file mode 100644
index 0000000..22fa627
--- /dev/null
+++ b/usr/share/sofirem/cache/gitg
@@ -0,0 +1 @@
+GNOME GUI client to view git repositories
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/github-desktop-bin b/usr/share/sofirem/cache/github-desktop-bin
new file mode 100644
index 0000000..fd0e04d
--- /dev/null
+++ b/usr/share/sofirem/cache/github-desktop-bin
@@ -0,0 +1 @@
+GUI for managing Git and GitHub.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gitkraken b/usr/share/sofirem/cache/gitkraken
new file mode 100644
index 0000000..ec0c93c
--- /dev/null
+++ b/usr/share/sofirem/cache/gitkraken
@@ -0,0 +1 @@
+The intuitive, fast, and beautiful cross-platform Git client.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gksu b/usr/share/sofirem/cache/gksu
new file mode 100644
index 0000000..c19cb4c
--- /dev/null
+++ b/usr/share/sofirem/cache/gksu
@@ -0,0 +1 @@
+A graphical frontend for su
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/glade b/usr/share/sofirem/cache/glade
new file mode 100644
index 0000000..d3eb2ac
--- /dev/null
+++ b/usr/share/sofirem/cache/glade
@@ -0,0 +1 @@
+User Interface Builder for GTK+ applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/glances b/usr/share/sofirem/cache/glances
new file mode 100644
index 0000000..803240f
--- /dev/null
+++ b/usr/share/sofirem/cache/glances
@@ -0,0 +1 @@
+CLI curses-based monitoring tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gmusicbrowser b/usr/share/sofirem/cache/gmusicbrowser
new file mode 100644
index 0000000..710b7ce
--- /dev/null
+++ b/usr/share/sofirem/cache/gmusicbrowser
@@ -0,0 +1 @@
+Open-source jukebox for large collections of mp3/ogg/flac files, written in perl.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-chess b/usr/share/sofirem/cache/gnome-chess
new file mode 100644
index 0000000..4b7c56e
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-chess
@@ -0,0 +1 @@
+Play the classic two-player boardgame of chess
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-disk-utility b/usr/share/sofirem/cache/gnome-disk-utility
new file mode 100644
index 0000000..fc662f9
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-disk-utility
@@ -0,0 +1 @@
+Disk Management Utility for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-screenshot b/usr/share/sofirem/cache/gnome-screenshot
new file mode 100644
index 0000000..9395ab2
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-screenshot
@@ -0,0 +1 @@
+Take pictures of your screen
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-shell-extension-appindicator-git b/usr/share/sofirem/cache/gnome-shell-extension-appindicator-git
new file mode 100644
index 0000000..3f26ecd
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-shell-extension-appindicator-git
@@ -0,0 +1 @@
+AppIndicator/KStatusNotifierItem support for GNOME Shell
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-shell-extension-dash-to-dock b/usr/share/sofirem/cache/gnome-shell-extension-dash-to-dock
new file mode 100644
index 0000000..face16a
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-shell-extension-dash-to-dock
@@ -0,0 +1 @@
+Move the dash out of the overview transforming it in a dock
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-shell-extension-pop-shell-git b/usr/share/sofirem/cache/gnome-shell-extension-pop-shell-git
new file mode 100644
index 0000000..0b0bb37
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-shell-extension-pop-shell-git
@@ -0,0 +1 @@
+Pop Shell - Tiling window management in Gnome (WIP)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-software b/usr/share/sofirem/cache/gnome-software
new file mode 100644
index 0000000..c607ec4
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-software
@@ -0,0 +1 @@
+GNOME Software Tools
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-software-packagekit-plugin b/usr/share/sofirem/cache/gnome-software-packagekit-plugin
new file mode 100644
index 0000000..2203708
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-software-packagekit-plugin
@@ -0,0 +1 @@
+PackageKit support plugin for GNOME Software
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-system-monitor b/usr/share/sofirem/cache/gnome-system-monitor
new file mode 100644
index 0000000..1dcb406
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-system-monitor
@@ -0,0 +1 @@
+View current processes and monitor system state
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-system-tools b/usr/share/sofirem/cache/gnome-system-tools
new file mode 100644
index 0000000..08e2262
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-system-tools
@@ -0,0 +1 @@
+Cross-platform configuration utilities for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-terminal b/usr/share/sofirem/cache/gnome-terminal
new file mode 100644
index 0000000..173c75e
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-terminal
@@ -0,0 +1 @@
+The GNOME Terminal Emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnome-terminal-transparency b/usr/share/sofirem/cache/gnome-terminal-transparency
new file mode 100644
index 0000000..b5986b3
--- /dev/null
+++ b/usr/share/sofirem/cache/gnome-terminal-transparency
@@ -0,0 +1 @@
+The GNOME Terminal Emulator with background transparency
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnuchess b/usr/share/sofirem/cache/gnuchess
new file mode 100644
index 0000000..0a6e1e8
--- /dev/null
+++ b/usr/share/sofirem/cache/gnuchess
@@ -0,0 +1 @@
+Play chess against the computer on a terminal and an engine for graphical chess frontends
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gnumeric b/usr/share/sofirem/cache/gnumeric
new file mode 100644
index 0000000..7856f8d
--- /dev/null
+++ b/usr/share/sofirem/cache/gnumeric
@@ -0,0 +1 @@
+A GNOME Spreadsheet Program
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gocryptfs b/usr/share/sofirem/cache/gocryptfs
new file mode 100644
index 0000000..1a3a8a9
--- /dev/null
+++ b/usr/share/sofirem/cache/gocryptfs
@@ -0,0 +1 @@
+Encrypted overlay filesystem written in Go.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/google-chat-linux-bin b/usr/share/sofirem/cache/google-chat-linux-bin
new file mode 100644
index 0000000..fd68245
--- /dev/null
+++ b/usr/share/sofirem/cache/google-chat-linux-bin
@@ -0,0 +1 @@
+Unofficial electron-based desktop client for Google Chat, electron included
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/google-chrome b/usr/share/sofirem/cache/google-chrome
new file mode 100644
index 0000000..c3fa77b
--- /dev/null
+++ b/usr/share/sofirem/cache/google-chrome
@@ -0,0 +1 @@
+The popular and trusted web browser by Google (Stable Channel)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/google-earth-pro b/usr/share/sofirem/cache/google-earth-pro
new file mode 100644
index 0000000..8a0819d
--- /dev/null
+++ b/usr/share/sofirem/cache/google-earth-pro
@@ -0,0 +1 @@
+3D interface to explore the globe, terrain, streets, buildings and other planets (Pro version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gotop-bin b/usr/share/sofirem/cache/gotop-bin
new file mode 100644
index 0000000..46f77b6
--- /dev/null
+++ b/usr/share/sofirem/cache/gotop-bin
@@ -0,0 +1 @@
+A terminal based graphical activity monitor inspired by gtop and vtop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/goverlay-bin b/usr/share/sofirem/cache/goverlay-bin
new file mode 100644
index 0000000..9c017ce
--- /dev/null
+++ b/usr/share/sofirem/cache/goverlay-bin
@@ -0,0 +1 @@
+A GUI to help manage Vulkan/OpenGL overlays
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gpick b/usr/share/sofirem/cache/gpick
new file mode 100644
index 0000000..3753235
--- /dev/null
+++ b/usr/share/sofirem/cache/gpick
@@ -0,0 +1 @@
+Advanced color picker written in C++ using GTK+ toolkit
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gputest b/usr/share/sofirem/cache/gputest
new file mode 100644
index 0000000..f41d522
--- /dev/null
+++ b/usr/share/sofirem/cache/gputest
@@ -0,0 +1 @@
+cross-platform GPU stress test and OpenGL benchmark. Contains FurMark, TessMark
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/graphite-gtk-theme-git b/usr/share/sofirem/cache/graphite-gtk-theme-git
new file mode 100644
index 0000000..736a6c7
--- /dev/null
+++ b/usr/share/sofirem/cache/graphite-gtk-theme-git
@@ -0,0 +1 @@
+Graphite gtk theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/grsync b/usr/share/sofirem/cache/grsync
new file mode 100644
index 0000000..ff6ade3
--- /dev/null
+++ b/usr/share/sofirem/cache/grsync
@@ -0,0 +1 @@
+GTK+ GUI for rsync to synchronize folders, files and make backups
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/grub-btrfs b/usr/share/sofirem/cache/grub-btrfs
new file mode 100644
index 0000000..0980fc5
--- /dev/null
+++ b/usr/share/sofirem/cache/grub-btrfs
@@ -0,0 +1 @@
+Include btrfs snapshots in GRUB boot options
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/grub-customizer b/usr/share/sofirem/cache/grub-customizer
new file mode 100644
index 0000000..4c03e3e
--- /dev/null
+++ b/usr/share/sofirem/cache/grub-customizer
@@ -0,0 +1 @@
+A graphical grub2 settings manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gsimplecal b/usr/share/sofirem/cache/gsimplecal
new file mode 100644
index 0000000..217316f
--- /dev/null
+++ b/usr/share/sofirem/cache/gsimplecal
@@ -0,0 +1 @@
+Simple and lightweight GTK calendar
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gsmartcontrol b/usr/share/sofirem/cache/gsmartcontrol
new file mode 100644
index 0000000..0cc7c50
--- /dev/null
+++ b/usr/share/sofirem/cache/gsmartcontrol
@@ -0,0 +1 @@
+A graphical user interface for the smartctl hard disk drive health inspection tool.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gtk2-perl b/usr/share/sofirem/cache/gtk2-perl
new file mode 100644
index 0000000..bfc92ec
--- /dev/null
+++ b/usr/share/sofirem/cache/gtk2-perl
@@ -0,0 +1 @@
+Perl bindings for GTK+ 2.x
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gtop b/usr/share/sofirem/cache/gtop
new file mode 100644
index 0000000..07e21b4
--- /dev/null
+++ b/usr/share/sofirem/cache/gtop
@@ -0,0 +1 @@
+System monitoring dashboard for terminal
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/guake b/usr/share/sofirem/cache/guake
new file mode 100644
index 0000000..a341e22
--- /dev/null
+++ b/usr/share/sofirem/cache/guake
@@ -0,0 +1 @@
+Drop-down terminal for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gufw b/usr/share/sofirem/cache/gufw
new file mode 100644
index 0000000..d1af6cb
--- /dev/null
+++ b/usr/share/sofirem/cache/gufw
@@ -0,0 +1 @@
+Uncomplicated way to manage your Linux firewall
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gummy b/usr/share/sofirem/cache/gummy
new file mode 100644
index 0000000..ae6acf3
--- /dev/null
+++ b/usr/share/sofirem/cache/gummy
@@ -0,0 +1 @@
+Linux brightness/temperature manager for X11
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/guvcview b/usr/share/sofirem/cache/guvcview
new file mode 100644
index 0000000..d380ccb
--- /dev/null
+++ b/usr/share/sofirem/cache/guvcview
@@ -0,0 +1 @@
+Simple GTK+ interface for capturing and viewing video from v4l2 devices
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gvfs b/usr/share/sofirem/cache/gvfs
new file mode 100644
index 0000000..682f14c
--- /dev/null
+++ b/usr/share/sofirem/cache/gvfs
@@ -0,0 +1 @@
+Virtual filesystem implementation for GIO
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gwe b/usr/share/sofirem/cache/gwe
new file mode 100644
index 0000000..abcb678
--- /dev/null
+++ b/usr/share/sofirem/cache/gwe
@@ -0,0 +1 @@
+A system utility for controlling NVIDIA GPUs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/gwenview b/usr/share/sofirem/cache/gwenview
new file mode 100644
index 0000000..a79cb8a
--- /dev/null
+++ b/usr/share/sofirem/cache/gwenview
@@ -0,0 +1 @@
+A fast and easy to use image viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/halo-icons-git b/usr/share/sofirem/cache/halo-icons-git
new file mode 100644
index 0000000..1c9f7dd
--- /dev/null
+++ b/usr/share/sofirem/cache/halo-icons-git
@@ -0,0 +1 @@
+Halo is an icon theme for Linux desktops, the set is inspired by the latest flat design trend from Alejandro Camarena
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/handbrake b/usr/share/sofirem/cache/handbrake
new file mode 100644
index 0000000..ff69b62
--- /dev/null
+++ b/usr/share/sofirem/cache/handbrake
@@ -0,0 +1 @@
+Multithreaded video transcoder
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hardcode-fixer-git b/usr/share/sofirem/cache/hardcode-fixer-git
new file mode 100644
index 0000000..c75c2f0
--- /dev/null
+++ b/usr/share/sofirem/cache/hardcode-fixer-git
@@ -0,0 +1 @@
+Fixes Hardcoded Icons
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hardinfo-gtk3 b/usr/share/sofirem/cache/hardinfo-gtk3
new file mode 100644
index 0000000..04da148
--- /dev/null
+++ b/usr/share/sofirem/cache/hardinfo-gtk3
@@ -0,0 +1 @@
+A system information and benchmark tool. (GTK3 version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/haskell-dbus b/usr/share/sofirem/cache/haskell-dbus
new file mode 100644
index 0000000..41287e5
--- /dev/null
+++ b/usr/share/sofirem/cache/haskell-dbus
@@ -0,0 +1 @@
+A client library for the D-Bus IPC system
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hddtemp b/usr/share/sofirem/cache/hddtemp
new file mode 100644
index 0000000..0844531
--- /dev/null
+++ b/usr/share/sofirem/cache/hddtemp
@@ -0,0 +1 @@
+Gives you the temperature of your hard drive by reading S.M.A.R.T. information
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hedgewars b/usr/share/sofirem/cache/hedgewars
new file mode 100644
index 0000000..0090be0
--- /dev/null
+++ b/usr/share/sofirem/cache/hedgewars
@@ -0,0 +1 @@
+Turn-based strategy artillery game similiar to Worms
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/herbstluftwm b/usr/share/sofirem/cache/herbstluftwm
new file mode 100644
index 0000000..28c0acb
--- /dev/null
+++ b/usr/share/sofirem/cache/herbstluftwm
@@ -0,0 +1 @@
+Manual tiling window manager for X
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/heroic-games-launcher-bin b/usr/share/sofirem/cache/heroic-games-launcher-bin
new file mode 100644
index 0000000..e13e271
--- /dev/null
+++ b/usr/share/sofirem/cache/heroic-games-launcher-bin
@@ -0,0 +1 @@
+HGL, a Native alternative Linux Launcher for Epic Games
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hexchat b/usr/share/sofirem/cache/hexchat
new file mode 100644
index 0000000..6621707
--- /dev/null
+++ b/usr/share/sofirem/cache/hexchat
@@ -0,0 +1 @@
+A popular and easy to use graphical IRC (chat) client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hplip b/usr/share/sofirem/cache/hplip
new file mode 100644
index 0000000..ebf0cdd
--- /dev/null
+++ b/usr/share/sofirem/cache/hplip
@@ -0,0 +1 @@
+Drivers for HP DeskJet, OfficeJet, Photosmart, Business Inkjet and some LaserJet
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/htop b/usr/share/sofirem/cache/htop
new file mode 100644
index 0000000..72e2fe5
--- /dev/null
+++ b/usr/share/sofirem/cache/htop
@@ -0,0 +1 @@
+Interactive process viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hunspell b/usr/share/sofirem/cache/hunspell
new file mode 100644
index 0000000..70ea18f
--- /dev/null
+++ b/usr/share/sofirem/cache/hunspell
@@ -0,0 +1 @@
+Spell checker and morphological analyzer library and program
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hw-probe b/usr/share/sofirem/cache/hw-probe
new file mode 100644
index 0000000..832fa06
--- /dev/null
+++ b/usr/share/sofirem/cache/hw-probe
@@ -0,0 +1 @@
+Tool to probe for hardware, check its operability and upload result to the Linux hardware DB: http://linux-hardware.org
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hypnotix b/usr/share/sofirem/cache/hypnotix
new file mode 100644
index 0000000..a56420d
--- /dev/null
+++ b/usr/share/sofirem/cache/hypnotix
@@ -0,0 +1 @@
+An IPTV streaming application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/hypr-dev-git b/usr/share/sofirem/cache/hypr-dev-git
new file mode 100644
index 0000000..9a2b70c
--- /dev/null
+++ b/usr/share/sofirem/cache/hypr-dev-git
@@ -0,0 +1 @@
+Hypr is a Linux tiling window manager for Xorg. It's written in XCB with modern C++ and aims to provide easily readable and expandable code.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/i3-gaps b/usr/share/sofirem/cache/i3-gaps
new file mode 100644
index 0000000..66690dc
--- /dev/null
+++ b/usr/share/sofirem/cache/i3-gaps
@@ -0,0 +1 @@
+A fork of i3wm tiling window manager with more features, including gaps
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/i3-wm b/usr/share/sofirem/cache/i3-wm
new file mode 100644
index 0000000..ce7fa94
--- /dev/null
+++ b/usr/share/sofirem/cache/i3-wm
@@ -0,0 +1 @@
+Improved dynamic tiling window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/i3blocks b/usr/share/sofirem/cache/i3blocks
new file mode 100644
index 0000000..381140a
--- /dev/null
+++ b/usr/share/sofirem/cache/i3blocks
@@ -0,0 +1 @@
+Define blocks for your i3bar status line
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/i3status b/usr/share/sofirem/cache/i3status
new file mode 100644
index 0000000..ab59532
--- /dev/null
+++ b/usr/share/sofirem/cache/i3status
@@ -0,0 +1 @@
+Generates status bar to use with i3bar, dzen2 or xmobar
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/icecat b/usr/share/sofirem/cache/icecat
new file mode 100644
index 0000000..c7a1d8c
--- /dev/null
+++ b/usr/share/sofirem/cache/icecat
@@ -0,0 +1 @@
+GNU version of the Firefox browser.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/icewm b/usr/share/sofirem/cache/icewm
new file mode 100644
index 0000000..614df5d
--- /dev/null
+++ b/usr/share/sofirem/cache/icewm
@@ -0,0 +1 @@
+Window Manager designed for speed, usability, and consistency
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ifuse b/usr/share/sofirem/cache/ifuse
new file mode 100644
index 0000000..b066566
--- /dev/null
+++ b/usr/share/sofirem/cache/ifuse
@@ -0,0 +1 @@
+A fuse filesystem to access the contents of an iPhone or iPod Touch
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/imagewriter b/usr/share/sofirem/cache/imagewriter
new file mode 100644
index 0000000..df17309
--- /dev/null
+++ b/usr/share/sofirem/cache/imagewriter
@@ -0,0 +1 @@
+A graphical utility for writing raw disk images & hybrid isos to USB keys
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/inetutils b/usr/share/sofirem/cache/inetutils
new file mode 100644
index 0000000..dfe137a
--- /dev/null
+++ b/usr/share/sofirem/cache/inetutils
@@ -0,0 +1 @@
+A collection of common network programs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/inkscape b/usr/share/sofirem/cache/inkscape
new file mode 100644
index 0000000..fbb637a
--- /dev/null
+++ b/usr/share/sofirem/cache/inkscape
@@ -0,0 +1 @@
+Professional vector graphics editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/insync b/usr/share/sofirem/cache/insync
new file mode 100644
index 0000000..d532133
--- /dev/null
+++ b/usr/share/sofirem/cache/insync
@@ -0,0 +1 @@
+An unofficial Google Drive and OneDrive client that runs on Linux, with support for various desktops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/intel-ucode b/usr/share/sofirem/cache/intel-ucode
new file mode 100644
index 0000000..3c445c3
--- /dev/null
+++ b/usr/share/sofirem/cache/intel-ucode
@@ -0,0 +1 @@
+Microcode update files for Intel CPUs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/intellij-idea-community-edition b/usr/share/sofirem/cache/intellij-idea-community-edition
new file mode 100644
index 0000000..d805754
--- /dev/null
+++ b/usr/share/sofirem/cache/intellij-idea-community-edition
@@ -0,0 +1 @@
+IDE for Java, Groovy and other programming languages with advanced refactoring features
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/inxi b/usr/share/sofirem/cache/inxi
new file mode 100644
index 0000000..aaee222
--- /dev/null
+++ b/usr/share/sofirem/cache/inxi
@@ -0,0 +1 @@
+Full featured CLI system information tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/iso-flag-png b/usr/share/sofirem/cache/iso-flag-png
new file mode 100644
index 0000000..4e75689
--- /dev/null
+++ b/usr/share/sofirem/cache/iso-flag-png
@@ -0,0 +1 @@
+ISO country flags in PNG format
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/itch b/usr/share/sofirem/cache/itch
new file mode 100644
index 0000000..3a8931f
--- /dev/null
+++ b/usr/share/sofirem/cache/itch
@@ -0,0 +1 @@
+The best way to play itch.io games.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/jdownloader2 b/usr/share/sofirem/cache/jdownloader2
new file mode 100644
index 0000000..b897513
--- /dev/null
+++ b/usr/share/sofirem/cache/jdownloader2
@@ -0,0 +1 @@
+Download manager, written in Java, for one-click hosting sites like Rapidshare and Megaupload. Uses its own updater.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/jitsi-meet-desktop-bin b/usr/share/sofirem/cache/jitsi-meet-desktop-bin
new file mode 100644
index 0000000..37ce363
--- /dev/null
+++ b/usr/share/sofirem/cache/jitsi-meet-desktop-bin
@@ -0,0 +1 @@
+Jitsi Meet desktop application powered by Electron
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/joshuto b/usr/share/sofirem/cache/joshuto
new file mode 100644
index 0000000..6f8c700
--- /dev/null
+++ b/usr/share/sofirem/cache/joshuto
@@ -0,0 +1 @@
+ranger-like terminal file manager written in Rust
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/juk b/usr/share/sofirem/cache/juk
new file mode 100644
index 0000000..c540a72
--- /dev/null
+++ b/usr/share/sofirem/cache/juk
@@ -0,0 +1 @@
+A jukebox, tagger and music collection manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/jwm b/usr/share/sofirem/cache/jwm
new file mode 100644
index 0000000..83866bc
--- /dev/null
+++ b/usr/share/sofirem/cache/jwm
@@ -0,0 +1 @@
+A lightweight window manager for the X11 Window System
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kate b/usr/share/sofirem/cache/kate
new file mode 100644
index 0000000..216b957
--- /dev/null
+++ b/usr/share/sofirem/cache/kate
@@ -0,0 +1 @@
+Advanced Text Editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kazam b/usr/share/sofirem/cache/kazam
new file mode 100644
index 0000000..15b8a0c
--- /dev/null
+++ b/usr/share/sofirem/cache/kazam
@@ -0,0 +1 @@
+Screencast and screenshot application created with design in mind
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kbackup b/usr/share/sofirem/cache/kbackup
new file mode 100644
index 0000000..a03d2f6
--- /dev/null
+++ b/usr/share/sofirem/cache/kbackup
@@ -0,0 +1 @@
+A program that lets you back up any directories or files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kbreakout b/usr/share/sofirem/cache/kbreakout
new file mode 100644
index 0000000..62b9642
--- /dev/null
+++ b/usr/share/sofirem/cache/kbreakout
@@ -0,0 +1 @@
+A Breakout-like game
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-accessibility-meta b/usr/share/sofirem/cache/kde-accessibility-meta
new file mode 100644
index 0000000..9ccdb0e
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-accessibility-meta
@@ -0,0 +1 @@
+Meta package for KDE accessibility applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-applications-meta b/usr/share/sofirem/cache/kde-applications-meta
new file mode 100644
index 0000000..720f8e9
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-applications-meta
@@ -0,0 +1 @@
+Meta package for KDE Applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-dev-utils b/usr/share/sofirem/cache/kde-dev-utils
new file mode 100644
index 0000000..6fcf670
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-dev-utils
@@ -0,0 +1 @@
+Small utilities for developers using KDE/Qt libs/frameworks
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-education-meta b/usr/share/sofirem/cache/kde-education-meta
new file mode 100644
index 0000000..9ef061b
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-education-meta
@@ -0,0 +1 @@
+Meta package for KDE education applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-games-meta b/usr/share/sofirem/cache/kde-games-meta
new file mode 100644
index 0000000..72a7595
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-games-meta
@@ -0,0 +1 @@
+Meta package for KDE games
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-graphics-meta b/usr/share/sofirem/cache/kde-graphics-meta
new file mode 100644
index 0000000..f5b76b7
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-graphics-meta
@@ -0,0 +1 @@
+Meta package for KDE graphics applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-gtk-config b/usr/share/sofirem/cache/kde-gtk-config
new file mode 100644
index 0000000..b12a9db
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-gtk-config
@@ -0,0 +1 @@
+GTK2 and GTK3 Configurator for KDE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-multimedia-meta b/usr/share/sofirem/cache/kde-multimedia-meta
new file mode 100644
index 0000000..51d507a
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-multimedia-meta
@@ -0,0 +1 @@
+Meta package for KDE multimedia applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-network-meta b/usr/share/sofirem/cache/kde-network-meta
new file mode 100644
index 0000000..0580575
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-network-meta
@@ -0,0 +1 @@
+Meta package for KDE network applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-pim-meta b/usr/share/sofirem/cache/kde-pim-meta
new file mode 100644
index 0000000..48241b9
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-pim-meta
@@ -0,0 +1 @@
+Meta package for KDE PIM applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-sdk-meta b/usr/share/sofirem/cache/kde-sdk-meta
new file mode 100644
index 0000000..dc13210
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-sdk-meta
@@ -0,0 +1 @@
+Meta package for KDE SDK applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-system-meta b/usr/share/sofirem/cache/kde-system-meta
new file mode 100644
index 0000000..3e39892
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-system-meta
@@ -0,0 +1 @@
+Meta package for KDE system applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kde-utilities-meta b/usr/share/sofirem/cache/kde-utilities-meta
new file mode 100644
index 0000000..93ee2d0
--- /dev/null
+++ b/usr/share/sofirem/cache/kde-utilities-meta
@@ -0,0 +1 @@
+Meta package for KDE utilities applications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kdeconnect b/usr/share/sofirem/cache/kdeconnect
new file mode 100644
index 0000000..7cf2f33
--- /dev/null
+++ b/usr/share/sofirem/cache/kdeconnect
@@ -0,0 +1 @@
+Adds communication between KDE and your smartphone
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kdenetwork-filesharing b/usr/share/sofirem/cache/kdenetwork-filesharing
new file mode 100644
index 0000000..61bd807
--- /dev/null
+++ b/usr/share/sofirem/cache/kdenetwork-filesharing
@@ -0,0 +1 @@
+Properties dialog plugin to share a directory with the local network
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kdenlive b/usr/share/sofirem/cache/kdenlive
new file mode 100644
index 0000000..ff1c61e
--- /dev/null
+++ b/usr/share/sofirem/cache/kdenlive
@@ -0,0 +1 @@
+A non-linear video editor for Linux using the MLT video framework
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kdevelop b/usr/share/sofirem/cache/kdevelop
new file mode 100644
index 0000000..482660c
--- /dev/null
+++ b/usr/share/sofirem/cache/kdevelop
@@ -0,0 +1 @@
+C++ IDE using KDE technologies
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/keepassxc b/usr/share/sofirem/cache/keepassxc
new file mode 100644
index 0000000..3f5af83
--- /dev/null
+++ b/usr/share/sofirem/cache/keepassxc
@@ -0,0 +1 @@
+Cross-platform community-driven port of Keepass password manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kitty b/usr/share/sofirem/cache/kitty
new file mode 100644
index 0000000..d55f503
--- /dev/null
+++ b/usr/share/sofirem/cache/kitty
@@ -0,0 +1 @@
+A modern, hackable, featureful, OpenGL-based terminal emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/knights b/usr/share/sofirem/cache/knights
new file mode 100644
index 0000000..b803388
--- /dev/null
+++ b/usr/share/sofirem/cache/knights
@@ -0,0 +1 @@
+Chess board by KDE with XBoard protocol support
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kodi b/usr/share/sofirem/cache/kodi
new file mode 100644
index 0000000..a94e5b3
--- /dev/null
+++ b/usr/share/sofirem/cache/kodi
@@ -0,0 +1 @@
+A software media player and entertainment hub for digital media
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/konsave b/usr/share/sofirem/cache/konsave
new file mode 100644
index 0000000..9b4ce34
--- /dev/null
+++ b/usr/share/sofirem/cache/konsave
@@ -0,0 +1 @@
+Save and apply your KDE Plasma customizations with just one command!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/konsole b/usr/share/sofirem/cache/konsole
new file mode 100644
index 0000000..2c8b96f
--- /dev/null
+++ b/usr/share/sofirem/cache/konsole
@@ -0,0 +1 @@
+KDE terminal emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/krdc b/usr/share/sofirem/cache/krdc
new file mode 100644
index 0000000..def1600
--- /dev/null
+++ b/usr/share/sofirem/cache/krdc
@@ -0,0 +1 @@
+Remote Desktop Client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kripton-theme-git b/usr/share/sofirem/cache/kripton-theme-git
new file mode 100644
index 0000000..7cc4f23
--- /dev/null
+++ b/usr/share/sofirem/cache/kripton-theme-git
@@ -0,0 +1 @@
+A dark theme with flat style for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/krita b/usr/share/sofirem/cache/krita
new file mode 100644
index 0000000..4c130f5
--- /dev/null
+++ b/usr/share/sofirem/cache/krita
@@ -0,0 +1 @@
+Edit and paint images
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ktorrent b/usr/share/sofirem/cache/ktorrent
new file mode 100644
index 0000000..e9021c0
--- /dev/null
+++ b/usr/share/sofirem/cache/ktorrent
@@ -0,0 +1 @@
+A powerful BitTorrent client for KDE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kvantum b/usr/share/sofirem/cache/kvantum
new file mode 100644
index 0000000..0cb1a9f
--- /dev/null
+++ b/usr/share/sofirem/cache/kvantum
@@ -0,0 +1 @@
+SVG-based theme engine for Qt5/6 (including config tool and extra themes)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kvantum-qt5-git b/usr/share/sofirem/cache/kvantum-qt5-git
new file mode 100644
index 0000000..b035d79
--- /dev/null
+++ b/usr/share/sofirem/cache/kvantum-qt5-git
@@ -0,0 +1 @@
+SVG-based Qt5 theme engine plus a config tool and extra themes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kvantum-qt6-git b/usr/share/sofirem/cache/kvantum-qt6-git
new file mode 100644
index 0000000..90b8438
--- /dev/null
+++ b/usr/share/sofirem/cache/kvantum-qt6-git
@@ -0,0 +1 @@
+Qt6 component of the Kvantum theme engine
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kvantum-theme-materia b/usr/share/sofirem/cache/kvantum-theme-materia
new file mode 100644
index 0000000..57aaa48
--- /dev/null
+++ b/usr/share/sofirem/cache/kvantum-theme-materia
@@ -0,0 +1 @@
+Materia theme for KDE Plasma 5
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kvantum-theme-qogir-git b/usr/share/sofirem/cache/kvantum-theme-qogir-git
new file mode 100644
index 0000000..57132f6
--- /dev/null
+++ b/usr/share/sofirem/cache/kvantum-theme-qogir-git
@@ -0,0 +1 @@
+Qogir theme for Kvantum
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/kwave b/usr/share/sofirem/cache/kwave
new file mode 100644
index 0000000..21f3e5d
--- /dev/null
+++ b/usr/share/sofirem/cache/kwave
@@ -0,0 +1 @@
+A sound editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/la-capitaine-icon-theme-git b/usr/share/sofirem/cache/la-capitaine-icon-theme-git
new file mode 100644
index 0000000..8768fdf
--- /dev/null
+++ b/usr/share/sofirem/cache/la-capitaine-icon-theme-git
@@ -0,0 +1 @@
+An icon pack designed to integrate with most desktop environments
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lastpass b/usr/share/sofirem/cache/lastpass
new file mode 100644
index 0000000..5b6e507
--- /dev/null
+++ b/usr/share/sofirem/cache/lastpass
@@ -0,0 +1 @@
+The Universal LastPass installer for Firefox, Chrome, and Opera
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/layan-cursor-theme-git b/usr/share/sofirem/cache/layan-cursor-theme-git
new file mode 100644
index 0000000..834ec16
--- /dev/null
+++ b/usr/share/sofirem/cache/layan-cursor-theme-git
@@ -0,0 +1 @@
+A x-cursor theme inspired by the Layan GTK Theme and based on Capitaine Cursors.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/layan-gtk-theme-git b/usr/share/sofirem/cache/layan-gtk-theme-git
new file mode 100644
index 0000000..56dbd9d
--- /dev/null
+++ b/usr/share/sofirem/cache/layan-gtk-theme-git
@@ -0,0 +1 @@
+An Flat Gtk+ theme based on Material Design
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/layan-kde-git b/usr/share/sofirem/cache/layan-kde-git
new file mode 100644
index 0000000..8f279ef
--- /dev/null
+++ b/usr/share/sofirem/cache/layan-kde-git
@@ -0,0 +1 @@
+A flat Design theme for KDE Plasma desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/leafpad b/usr/share/sofirem/cache/leafpad
new file mode 100644
index 0000000..7a07995
--- /dev/null
+++ b/usr/share/sofirem/cache/leafpad
@@ -0,0 +1 @@
+A notepad clone for GTK+ 2.0
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/leftwm-dev-git b/usr/share/sofirem/cache/leftwm-dev-git
new file mode 100644
index 0000000..876a845
--- /dev/null
+++ b/usr/share/sofirem/cache/leftwm-dev-git
@@ -0,0 +1 @@
+Leftwm - A tiling window manager for the adventurer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/leftwm-theme-git b/usr/share/sofirem/cache/leftwm-theme-git
new file mode 100644
index 0000000..5feb078
--- /dev/null
+++ b/usr/share/sofirem/cache/leftwm-theme-git
@@ -0,0 +1 @@
+Theme manager for LeftWM
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/legendary b/usr/share/sofirem/cache/legendary
new file mode 100644
index 0000000..adfef39
--- /dev/null
+++ b/usr/share/sofirem/cache/legendary
@@ -0,0 +1 @@
+A free and open-source replacement for the Epic Games Launcher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lf b/usr/share/sofirem/cache/lf
new file mode 100644
index 0000000..84c747c
--- /dev/null
+++ b/usr/share/sofirem/cache/lf
@@ -0,0 +1 @@
+A terminal file manager inspired by ranger
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/libertinus-font b/usr/share/sofirem/cache/libertinus-font
new file mode 100644
index 0000000..e147e83
--- /dev/null
+++ b/usr/share/sofirem/cache/libertinus-font
@@ -0,0 +1 @@
+Fonts based on Linux Libertine/Biolinum, with extended math support
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/libreoffice-fresh b/usr/share/sofirem/cache/libreoffice-fresh
new file mode 100644
index 0000000..b9ab4af
--- /dev/null
+++ b/usr/share/sofirem/cache/libreoffice-fresh
@@ -0,0 +1 @@
+LibreOffice branch which contains new features and program enhancements
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/libreoffice-still b/usr/share/sofirem/cache/libreoffice-still
new file mode 100644
index 0000000..89ef654
--- /dev/null
+++ b/usr/share/sofirem/cache/libreoffice-still
@@ -0,0 +1 @@
+LibreOffice maintenance branch
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/librewolf-bin b/usr/share/sofirem/cache/librewolf-bin
new file mode 100644
index 0000000..408f62f
--- /dev/null
+++ b/usr/share/sofirem/cache/librewolf-bin
@@ -0,0 +1 @@
+Community-maintained fork of Firefox, focused on privacy, security and freedom.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/liferea b/usr/share/sofirem/cache/liferea
new file mode 100644
index 0000000..b99389d
--- /dev/null
+++ b/usr/share/sofirem/cache/liferea
@@ -0,0 +1 @@
+A desktop news aggregator for online news feeds and weblogs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/light b/usr/share/sofirem/cache/light
new file mode 100644
index 0000000..b4b9330
--- /dev/null
+++ b/usr/share/sofirem/cache/light
@@ -0,0 +1 @@
+Program to easily change brightness on backlight-controllers.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lightdm b/usr/share/sofirem/cache/lightdm
new file mode 100644
index 0000000..bbfaf50
--- /dev/null
+++ b/usr/share/sofirem/cache/lightdm
@@ -0,0 +1 @@
+A lightweight display manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lightdm-gtk-greeter b/usr/share/sofirem/cache/lightdm-gtk-greeter
new file mode 100644
index 0000000..0f87125
--- /dev/null
+++ b/usr/share/sofirem/cache/lightdm-gtk-greeter
@@ -0,0 +1 @@
+GTK+ greeter for LightDM
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lightdm-gtk-greeter-settings b/usr/share/sofirem/cache/lightdm-gtk-greeter-settings
new file mode 100644
index 0000000..45ca438
--- /dev/null
+++ b/usr/share/sofirem/cache/lightdm-gtk-greeter-settings
@@ -0,0 +1 @@
+Settings editor for the LightDM GTK+ Greeter
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lightdm-slick-greeter b/usr/share/sofirem/cache/lightdm-slick-greeter
new file mode 100644
index 0000000..bdde780
--- /dev/null
+++ b/usr/share/sofirem/cache/lightdm-slick-greeter
@@ -0,0 +1 @@
+A slick-looking LightDM greeter
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lightdm-webkit-theme-aether b/usr/share/sofirem/cache/lightdm-webkit-theme-aether
new file mode 100644
index 0000000..81f0ba4
--- /dev/null
+++ b/usr/share/sofirem/cache/lightdm-webkit-theme-aether
@@ -0,0 +1 @@
+A sleek, customizable Archlinux theme for lightdm.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lightdm-webkit2-theme-reactive b/usr/share/sofirem/cache/lightdm-webkit2-theme-reactive
new file mode 100644
index 0000000..6fcee66
--- /dev/null
+++ b/usr/share/sofirem/cache/lightdm-webkit2-theme-reactive
@@ -0,0 +1 @@
+Reactive, A Simple and fast lightdm webkit2 theme for linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux b/usr/share/sofirem/cache/linux
new file mode 100644
index 0000000..1c0f6ea
--- /dev/null
+++ b/usr/share/sofirem/cache/linux
@@ -0,0 +1 @@
+The Linux kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-hardened b/usr/share/sofirem/cache/linux-hardened
new file mode 100644
index 0000000..98f0b81
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-hardened
@@ -0,0 +1 @@
+The Security-Hardened Linux kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-hardened-headers b/usr/share/sofirem/cache/linux-hardened-headers
new file mode 100644
index 0000000..da9df14
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-hardened-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Security-Hardened Linux kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-headers b/usr/share/sofirem/cache/linux-headers
new file mode 100644
index 0000000..4064a2b
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-lts b/usr/share/sofirem/cache/linux-lts
new file mode 100644
index 0000000..e423cba
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-lts
@@ -0,0 +1 @@
+The LTS Linux kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-lts-headers b/usr/share/sofirem/cache/linux-lts-headers
new file mode 100644
index 0000000..09ed7f4
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-lts-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the LTS Linux kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-rt b/usr/share/sofirem/cache/linux-rt
new file mode 100644
index 0000000..967e01f
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-rt
@@ -0,0 +1 @@
+The Linux RT kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-rt-headers b/usr/share/sofirem/cache/linux-rt-headers
new file mode 100644
index 0000000..cbeade6
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-rt-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux RT kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-rt-lts b/usr/share/sofirem/cache/linux-rt-lts
new file mode 100644
index 0000000..d2f4a1f
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-rt-lts
@@ -0,0 +1 @@
+The Linux RT LTS kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-rt-lts-headers b/usr/share/sofirem/cache/linux-rt-lts-headers
new file mode 100644
index 0000000..5bd9be8
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-rt-lts-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux RT LTS kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-wifi-hotspot b/usr/share/sofirem/cache/linux-wifi-hotspot
new file mode 100644
index 0000000..1d42f23
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-wifi-hotspot
@@ -0,0 +1 @@
+Feature-rich wifi hotspot creator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod b/usr/share/sofirem/cache/linux-xanmod
new file mode 100644
index 0000000..3d6cbfb
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod
@@ -0,0 +1 @@
+The Linux kernel and modules with Xanmod patches
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-anbox b/usr/share/sofirem/cache/linux-xanmod-anbox
new file mode 100644
index 0000000..e8df66c
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-anbox
@@ -0,0 +1 @@
+The Linux kernel and modules with Xanmod patches and ashmem and binder enabled
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-anbox-headers b/usr/share/sofirem/cache/linux-xanmod-anbox-headers
new file mode 100644
index 0000000..c4390f7
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-anbox-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod with ashmem and binder enabled for Anbox - Current Stable (CURRENT) kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-headers b/usr/share/sofirem/cache/linux-xanmod-headers
new file mode 100644
index 0000000..20e98c1
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod - Current Stable (CURRENT) kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-lts b/usr/share/sofirem/cache/linux-xanmod-lts
new file mode 100644
index 0000000..3d6cbfb
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-lts
@@ -0,0 +1 @@
+The Linux kernel and modules with Xanmod patches
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-lts-headers b/usr/share/sofirem/cache/linux-xanmod-lts-headers
new file mode 100644
index 0000000..3c201e9
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-lts-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod LTS kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-rt b/usr/share/sofirem/cache/linux-xanmod-rt
new file mode 100644
index 0000000..3d6cbfb
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-rt
@@ -0,0 +1 @@
+The Linux kernel and modules with Xanmod patches
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-rt-headers b/usr/share/sofirem/cache/linux-xanmod-rt-headers
new file mode 100644
index 0000000..6423e36
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-rt-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod real-time version kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-tt b/usr/share/sofirem/cache/linux-xanmod-tt
new file mode 100644
index 0000000..3d6cbfb
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-tt
@@ -0,0 +1 @@
+The Linux kernel and modules with Xanmod patches
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-xanmod-tt-headers b/usr/share/sofirem/cache/linux-xanmod-tt-headers
new file mode 100644
index 0000000..18fb1cc
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-xanmod-tt-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux Xanmod. Development branch with the Task Type CPU Scheduler by Hamad Al Marri kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-zen b/usr/share/sofirem/cache/linux-zen
new file mode 100644
index 0000000..c530b6c
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-zen
@@ -0,0 +1 @@
+The Linux ZEN kernel and modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/linux-zen-headers b/usr/share/sofirem/cache/linux-zen-headers
new file mode 100644
index 0000000..4228aa9
--- /dev/null
+++ b/usr/share/sofirem/cache/linux-zen-headers
@@ -0,0 +1 @@
+Headers and scripts for building modules for the Linux ZEN kernel
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lm_sensors b/usr/share/sofirem/cache/lm_sensors
new file mode 100644
index 0000000..253ea66
--- /dev/null
+++ b/usr/share/sofirem/cache/lm_sensors
@@ -0,0 +1 @@
+Collection of user space tools for general SMBus access and hardware monitoring
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lmms b/usr/share/sofirem/cache/lmms
new file mode 100644
index 0000000..1657618
--- /dev/null
+++ b/usr/share/sofirem/cache/lmms
@@ -0,0 +1 @@
+The Linux MultiMedia Studio
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lohit-fonts b/usr/share/sofirem/cache/lohit-fonts
new file mode 100644
index 0000000..f58085c
--- /dev/null
+++ b/usr/share/sofirem/cache/lohit-fonts
@@ -0,0 +1 @@
+Indic TrueType fonts from Fedora Project
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lolcat b/usr/share/sofirem/cache/lolcat
new file mode 100644
index 0000000..16d0486
--- /dev/null
+++ b/usr/share/sofirem/cache/lolcat
@@ -0,0 +1 @@
+Okay, no unicorns. But rainbows!!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lollypop b/usr/share/sofirem/cache/lollypop
new file mode 100644
index 0000000..4213dfe
--- /dev/null
+++ b/usr/share/sofirem/cache/lollypop
@@ -0,0 +1 @@
+Music player for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/losslesscut-bin b/usr/share/sofirem/cache/losslesscut-bin
new file mode 100644
index 0000000..69a3115
--- /dev/null
+++ b/usr/share/sofirem/cache/losslesscut-bin
@@ -0,0 +1 @@
+Crossplatform GUI tool for lossless trimming/cutting of video/audio files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lshw b/usr/share/sofirem/cache/lshw
new file mode 100644
index 0000000..1f47800
--- /dev/null
+++ b/usr/share/sofirem/cache/lshw
@@ -0,0 +1 @@
+A small tool to provide detailed information on the hardware configuration of the machine.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/luna-icon-theme-git b/usr/share/sofirem/cache/luna-icon-theme-git
new file mode 100644
index 0000000..8aea893
--- /dev/null
+++ b/usr/share/sofirem/cache/luna-icon-theme-git
@@ -0,0 +1 @@
+Icon pack based on marwaita and papirus icons.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lutris b/usr/share/sofirem/cache/lutris
new file mode 100644
index 0000000..d0860cb
--- /dev/null
+++ b/usr/share/sofirem/cache/lutris
@@ -0,0 +1 @@
+Open Gaming Platform
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxappearance b/usr/share/sofirem/cache/lxappearance
new file mode 100644
index 0000000..3b203b3
--- /dev/null
+++ b/usr/share/sofirem/cache/lxappearance
@@ -0,0 +1 @@
+Feature-rich GTK+ theme switcher of the LXDE Desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxappearance-obconf b/usr/share/sofirem/cache/lxappearance-obconf
new file mode 100644
index 0000000..710faf2
--- /dev/null
+++ b/usr/share/sofirem/cache/lxappearance-obconf
@@ -0,0 +1 @@
+Plugin for LXAppearance to configure Openbox
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxdm b/usr/share/sofirem/cache/lxdm
new file mode 100644
index 0000000..62e0e11
--- /dev/null
+++ b/usr/share/sofirem/cache/lxdm
@@ -0,0 +1 @@
+Lightweight X11 Display Manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxmusic b/usr/share/sofirem/cache/lxmusic
new file mode 100644
index 0000000..01cfce7
--- /dev/null
+++ b/usr/share/sofirem/cache/lxmusic
@@ -0,0 +1 @@
+Lightweight music player (XMMS2 client)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxqt-arc-dark-theme-git b/usr/share/sofirem/cache/lxqt-arc-dark-theme-git
new file mode 100644
index 0000000..9fe90cc
--- /dev/null
+++ b/usr/share/sofirem/cache/lxqt-arc-dark-theme-git
@@ -0,0 +1 @@
+A dark theme for LXQt based on Arc
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxrandr b/usr/share/sofirem/cache/lxrandr
new file mode 100644
index 0000000..dbeab43
--- /dev/null
+++ b/usr/share/sofirem/cache/lxrandr
@@ -0,0 +1 @@
+Monitor configuration tool (part of LXDE)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/lxterminal b/usr/share/sofirem/cache/lxterminal
new file mode 100644
index 0000000..e625a92
--- /dev/null
+++ b/usr/share/sofirem/cache/lxterminal
@@ -0,0 +1 @@
+VTE-based terminal emulator (part of LXDE)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ly b/usr/share/sofirem/cache/ly
new file mode 100644
index 0000000..594eb76
--- /dev/null
+++ b/usr/share/sofirem/cache/ly
@@ -0,0 +1 @@
+TUI display manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mailspring b/usr/share/sofirem/cache/mailspring
new file mode 100644
index 0000000..744d358
--- /dev/null
+++ b/usr/share/sofirem/cache/mailspring
@@ -0,0 +1 @@
+A beautiful, fast and maintained fork of Nylas Mail by one of the original authors.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/makemkv b/usr/share/sofirem/cache/makemkv
new file mode 100644
index 0000000..f4769c1
--- /dev/null
+++ b/usr/share/sofirem/cache/makemkv
@@ -0,0 +1 @@
+DVD and Blu-ray to MKV converter
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mangohud b/usr/share/sofirem/cache/mangohud
new file mode 100644
index 0000000..0b9467d
--- /dev/null
+++ b/usr/share/sofirem/cache/mangohud
@@ -0,0 +1 @@
+A Vulkan overlay layer for monitoring FPS, temperatures, CPU/GPU load and more.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mari0 b/usr/share/sofirem/cache/mari0
new file mode 100644
index 0000000..0de3981
--- /dev/null
+++ b/usr/share/sofirem/cache/mari0
@@ -0,0 +1 @@
+The Mario game with Portal gun mechanics
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mate-control-center b/usr/share/sofirem/cache/mate-control-center
new file mode 100644
index 0000000..25aa221
--- /dev/null
+++ b/usr/share/sofirem/cache/mate-control-center
@@ -0,0 +1 @@
+The Control Center for MATE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mate-desktop b/usr/share/sofirem/cache/mate-desktop
new file mode 100644
index 0000000..f20c0da
--- /dev/null
+++ b/usr/share/sofirem/cache/mate-desktop
@@ -0,0 +1 @@
+Library with common API for various MATE modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mate-menus b/usr/share/sofirem/cache/mate-menus
new file mode 100644
index 0000000..4f8f302
--- /dev/null
+++ b/usr/share/sofirem/cache/mate-menus
@@ -0,0 +1 @@
+MATE menu specifications
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mate-system-monitor b/usr/share/sofirem/cache/mate-system-monitor
new file mode 100644
index 0000000..c24772e
--- /dev/null
+++ b/usr/share/sofirem/cache/mate-system-monitor
@@ -0,0 +1 @@
+A system monitor for MATE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mate-terminal b/usr/share/sofirem/cache/mate-terminal
new file mode 100644
index 0000000..8035e95
--- /dev/null
+++ b/usr/share/sofirem/cache/mate-terminal
@@ -0,0 +1 @@
+The MATE Terminal Emulator
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mate-tweak b/usr/share/sofirem/cache/mate-tweak
new file mode 100644
index 0000000..4ce6be0
--- /dev/null
+++ b/usr/share/sofirem/cache/mate-tweak
@@ -0,0 +1 @@
+Tweak tool for MATE (fork of MintDesktop)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/materia-gtk-theme b/usr/share/sofirem/cache/materia-gtk-theme
new file mode 100644
index 0000000..11b7623
--- /dev/null
+++ b/usr/share/sofirem/cache/materia-gtk-theme
@@ -0,0 +1 @@
+A Material Design theme for GNOME/GTK+ based desktop environments
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/materia-kde b/usr/share/sofirem/cache/materia-kde
new file mode 100644
index 0000000..57aaa48
--- /dev/null
+++ b/usr/share/sofirem/cache/materia-kde
@@ -0,0 +1 @@
+Materia theme for KDE Plasma 5
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mc b/usr/share/sofirem/cache/mc
new file mode 100644
index 0000000..29d490d
--- /dev/null
+++ b/usr/share/sofirem/cache/mc
@@ -0,0 +1 @@
+A file manager that emulates Norton Commander
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mcomix b/usr/share/sofirem/cache/mcomix
new file mode 100644
index 0000000..e74800d
--- /dev/null
+++ b/usr/share/sofirem/cache/mcomix
@@ -0,0 +1 @@
+A user-friendly, customizable image viewer specifically designed to handle comic books
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mediainfo-gui b/usr/share/sofirem/cache/mediainfo-gui
new file mode 100644
index 0000000..9f930d1
--- /dev/null
+++ b/usr/share/sofirem/cache/mediainfo-gui
@@ -0,0 +1 @@
+Supplies technical and tag information about a video or audio file (GUI interface)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/megasync-bin b/usr/share/sofirem/cache/megasync-bin
new file mode 100644
index 0000000..f3b7478
--- /dev/null
+++ b/usr/share/sofirem/cache/megasync-bin
@@ -0,0 +1 @@
+Easy automated syncing between your computers and your MEGA cloud drive
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/meld b/usr/share/sofirem/cache/meld
new file mode 100644
index 0000000..dce58bb
--- /dev/null
+++ b/usr/share/sofirem/cache/meld
@@ -0,0 +1 @@
+Compare files, directories and working copies
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/micro b/usr/share/sofirem/cache/micro
new file mode 100644
index 0000000..8209845
--- /dev/null
+++ b/usr/share/sofirem/cache/micro
@@ -0,0 +1 @@
+Modern and intuitive terminal-based text editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/midori b/usr/share/sofirem/cache/midori
new file mode 100644
index 0000000..19a04c1
--- /dev/null
+++ b/usr/share/sofirem/cache/midori
@@ -0,0 +1 @@
+Lightweight web browser
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/min b/usr/share/sofirem/cache/min
new file mode 100644
index 0000000..1e7ffcc
--- /dev/null
+++ b/usr/share/sofirem/cache/min
@@ -0,0 +1 @@
+A fast, minimal browser that protects your privacy
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/minecraft-launcher b/usr/share/sofirem/cache/minecraft-launcher
new file mode 100644
index 0000000..7805086
--- /dev/null
+++ b/usr/share/sofirem/cache/minecraft-launcher
@@ -0,0 +1 @@
+Official Minecraft Launcher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/minigalaxy b/usr/share/sofirem/cache/minigalaxy
new file mode 100644
index 0000000..9fc01c1
--- /dev/null
+++ b/usr/share/sofirem/cache/minigalaxy
@@ -0,0 +1 @@
+A simple GOG client for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mintlocale b/usr/share/sofirem/cache/mintlocale
new file mode 100644
index 0000000..dd7ac77
--- /dev/null
+++ b/usr/share/sofirem/cache/mintlocale
@@ -0,0 +1 @@
+Language and locale selection tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mintstick-git b/usr/share/sofirem/cache/mintstick-git
new file mode 100644
index 0000000..c84820a
--- /dev/null
+++ b/usr/share/sofirem/cache/mintstick-git
@@ -0,0 +1 @@
+Format or write images to USB sticks (Linux Mint tool)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mkinitcpio-firmware b/usr/share/sofirem/cache/mkinitcpio-firmware
new file mode 100644
index 0000000..5e54b86
--- /dev/null
+++ b/usr/share/sofirem/cache/mkinitcpio-firmware
@@ -0,0 +1 @@
+Optional firmware for the default linux kernel to get rid of the annoying 'WARNING: Possibly missing firmware for module:' messages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mkvtoolnix-gui b/usr/share/sofirem/cache/mkvtoolnix-gui
new file mode 100644
index 0000000..3f6b0fb
--- /dev/null
+++ b/usr/share/sofirem/cache/mkvtoolnix-gui
@@ -0,0 +1 @@
+Set of tools to create, edit and inspect Matroska files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/modprobed-db b/usr/share/sofirem/cache/modprobed-db
new file mode 100644
index 0000000..4665948
--- /dev/null
+++ b/usr/share/sofirem/cache/modprobed-db
@@ -0,0 +1 @@
+Keeps track of EVERY kernel module ever used - useful for make localmodconfig
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/modprobed-db-git b/usr/share/sofirem/cache/modprobed-db-git
new file mode 100644
index 0000000..6c11e64
--- /dev/null
+++ b/usr/share/sofirem/cache/modprobed-db-git
@@ -0,0 +1 @@
+Keeps track of EVERY kernel module ever used - useful for those of us who make localmodconfig :)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/moka-icon-theme-git b/usr/share/sofirem/cache/moka-icon-theme-git
new file mode 100644
index 0000000..979e900
--- /dev/null
+++ b/usr/share/sofirem/cache/moka-icon-theme-git
@@ -0,0 +1 @@
+An icon theme designed with a minimal, flat style, using simple geometry & colours.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/moneydance b/usr/share/sofirem/cache/moneydance
new file mode 100644
index 0000000..9d4f609
--- /dev/null
+++ b/usr/share/sofirem/cache/moneydance
@@ -0,0 +1 @@
+A personal finance manager for Mac, Windows and Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mousetweaks b/usr/share/sofirem/cache/mousetweaks
new file mode 100644
index 0000000..7ccee4f
--- /dev/null
+++ b/usr/share/sofirem/cache/mousetweaks
@@ -0,0 +1 @@
+Mouse accessibility enhancements
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mpc b/usr/share/sofirem/cache/mpc
new file mode 100644
index 0000000..7f23e45
--- /dev/null
+++ b/usr/share/sofirem/cache/mpc
@@ -0,0 +1 @@
+Minimalist command line interface to MPD
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mpd b/usr/share/sofirem/cache/mpd
new file mode 100644
index 0000000..cc6473f
--- /dev/null
+++ b/usr/share/sofirem/cache/mpd
@@ -0,0 +1 @@
+Flexible, powerful, server-side application for playing music
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mpv b/usr/share/sofirem/cache/mpv
new file mode 100644
index 0000000..50c1cc9
--- /dev/null
+++ b/usr/share/sofirem/cache/mpv
@@ -0,0 +1 @@
+a free, open source, and cross-platform media player
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ms-office-online b/usr/share/sofirem/cache/ms-office-online
new file mode 100644
index 0000000..0d3851c
--- /dev/null
+++ b/usr/share/sofirem/cache/ms-office-online
@@ -0,0 +1 @@
+Microsoft Office Suite Online as a native application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mullvad-vpn-bin b/usr/share/sofirem/cache/mullvad-vpn-bin
new file mode 100644
index 0000000..3e76e55
--- /dev/null
+++ b/usr/share/sofirem/cache/mullvad-vpn-bin
@@ -0,0 +1 @@
+The Mullvad VPN client app for desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/multimc-git b/usr/share/sofirem/cache/multimc-git
new file mode 100644
index 0000000..de61a38
--- /dev/null
+++ b/usr/share/sofirem/cache/multimc-git
@@ -0,0 +1 @@
+Minecraft launcher with ability to manage multiple instances. Includes old name/icons and ability to sign in with a Microsoft account.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/mumble b/usr/share/sofirem/cache/mumble
new file mode 100644
index 0000000..ed28a3e
--- /dev/null
+++ b/usr/share/sofirem/cache/mumble
@@ -0,0 +1 @@
+An Open Source, low-latency, high quality voice chat software (client)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nautilus b/usr/share/sofirem/cache/nautilus
new file mode 100644
index 0000000..de633d5
--- /dev/null
+++ b/usr/share/sofirem/cache/nautilus
@@ -0,0 +1 @@
+Default file manager for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nautilus-open-any-terminal b/usr/share/sofirem/cache/nautilus-open-any-terminal
new file mode 100644
index 0000000..9ba2348
--- /dev/null
+++ b/usr/share/sofirem/cache/nautilus-open-any-terminal
@@ -0,0 +1 @@
+context-menu entry for opening other terminal in nautilus
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ncmpcpp b/usr/share/sofirem/cache/ncmpcpp
new file mode 100644
index 0000000..a2b7802
--- /dev/null
+++ b/usr/share/sofirem/cache/ncmpcpp
@@ -0,0 +1 @@
+Almost exact clone of ncmpc with some new features
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nemo b/usr/share/sofirem/cache/nemo
new file mode 100644
index 0000000..c4c9f82
--- /dev/null
+++ b/usr/share/sofirem/cache/nemo
@@ -0,0 +1 @@
+Cinnamon file manager (Nautilus fork)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nemo-fileroller b/usr/share/sofirem/cache/nemo-fileroller
new file mode 100644
index 0000000..d0f4690
--- /dev/null
+++ b/usr/share/sofirem/cache/nemo-fileroller
@@ -0,0 +1 @@
+File archiver extension for Nemo
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/neochat b/usr/share/sofirem/cache/neochat
new file mode 100644
index 0000000..3a5cd3a
--- /dev/null
+++ b/usr/share/sofirem/cache/neochat
@@ -0,0 +1 @@
+A client for matrix, the decentralized communication protocol
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/neofetch b/usr/share/sofirem/cache/neofetch
new file mode 100644
index 0000000..23e398b
--- /dev/null
+++ b/usr/share/sofirem/cache/neofetch
@@ -0,0 +1 @@
+A CLI system information tool written in BASH that supports displaying images.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nerd-fonts-source-code-pro b/usr/share/sofirem/cache/nerd-fonts-source-code-pro
new file mode 100644
index 0000000..da84305
--- /dev/null
+++ b/usr/share/sofirem/cache/nerd-fonts-source-code-pro
@@ -0,0 +1 @@
+Patched font SourceCodePro from nerd-fonts library
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/netbeans b/usr/share/sofirem/cache/netbeans
new file mode 100644
index 0000000..0329882
--- /dev/null
+++ b/usr/share/sofirem/cache/netbeans
@@ -0,0 +1 @@
+IDE for Java, HTML5, PHP, Groovy, C and C++
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/netsurf b/usr/share/sofirem/cache/netsurf
new file mode 100644
index 0000000..7eba4de
--- /dev/null
+++ b/usr/share/sofirem/cache/netsurf
@@ -0,0 +1 @@
+Lightweight and fast web browser
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/neverball b/usr/share/sofirem/cache/neverball
new file mode 100644
index 0000000..b0188d1
--- /dev/null
+++ b/usr/share/sofirem/cache/neverball
@@ -0,0 +1 @@
+3D game similar to Super Monkey Ball or Marble Madness
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nextcloud-client b/usr/share/sofirem/cache/nextcloud-client
new file mode 100644
index 0000000..9d2683a
--- /dev/null
+++ b/usr/share/sofirem/cache/nextcloud-client
@@ -0,0 +1 @@
+Nextcloud desktop client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nitrogen b/usr/share/sofirem/cache/nitrogen
new file mode 100644
index 0000000..3ab70b6
--- /dev/null
+++ b/usr/share/sofirem/cache/nitrogen
@@ -0,0 +1 @@
+Background browser and setter for X windows
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nixieclock b/usr/share/sofirem/cache/nixieclock
new file mode 100644
index 0000000..4184961
--- /dev/null
+++ b/usr/share/sofirem/cache/nixieclock
@@ -0,0 +1 @@
+Simple little desktop clock that displays date and time using nixie tube digits
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nnn b/usr/share/sofirem/cache/nnn
new file mode 100644
index 0000000..0af4d3f
--- /dev/null
+++ b/usr/share/sofirem/cache/nnn
@@ -0,0 +1 @@
+The fastest terminal file manager ever written
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/noisetorch b/usr/share/sofirem/cache/noisetorch
new file mode 100644
index 0000000..d7ef8a6
--- /dev/null
+++ b/usr/share/sofirem/cache/noisetorch
@@ -0,0 +1 @@
+Real-time microphone noise suppression on Linux.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nomachine b/usr/share/sofirem/cache/nomachine
new file mode 100644
index 0000000..164d8cd
--- /dev/null
+++ b/usr/share/sofirem/cache/nomachine
@@ -0,0 +1 @@
+Remote desktop application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nomacs b/usr/share/sofirem/cache/nomacs
new file mode 100644
index 0000000..80077cb
--- /dev/null
+++ b/usr/share/sofirem/cache/nomacs
@@ -0,0 +1 @@
+A Qt image viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nomacs-git b/usr/share/sofirem/cache/nomacs-git
new file mode 100644
index 0000000..80077cb
--- /dev/null
+++ b/usr/share/sofirem/cache/nomacs-git
@@ -0,0 +1 @@
+A Qt image viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nomacs-qt6-git b/usr/share/sofirem/cache/nomacs-qt6-git
new file mode 100644
index 0000000..80077cb
--- /dev/null
+++ b/usr/share/sofirem/cache/nomacs-qt6-git
@@ -0,0 +1 @@
+A Qt image viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nordic-kde-git b/usr/share/sofirem/cache/nordic-kde-git
new file mode 100644
index 0000000..8e456e6
--- /dev/null
+++ b/usr/share/sofirem/cache/nordic-kde-git
@@ -0,0 +1 @@
+Theme for KDE Plasma 5 using the awesome Nord color pallete
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nordpass-bin b/usr/share/sofirem/cache/nordpass-bin
new file mode 100644
index 0000000..fff2813
--- /dev/null
+++ b/usr/share/sofirem/cache/nordpass-bin
@@ -0,0 +1 @@
+Secure and intuitive password manager (snap release)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nordtray-bin b/usr/share/sofirem/cache/nordtray-bin
new file mode 100644
index 0000000..a35a5b7
--- /dev/null
+++ b/usr/share/sofirem/cache/nordtray-bin
@@ -0,0 +1 @@
+Nordvpn tray icon
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nordvpn-bin b/usr/share/sofirem/cache/nordvpn-bin
new file mode 100644
index 0000000..cffb8ea
--- /dev/null
+++ b/usr/share/sofirem/cache/nordvpn-bin
@@ -0,0 +1 @@
+NordVPN CLI tool for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nordzy-icon-theme-git b/usr/share/sofirem/cache/nordzy-icon-theme-git
new file mode 100644
index 0000000..208ffad
--- /dev/null
+++ b/usr/share/sofirem/cache/nordzy-icon-theme-git
@@ -0,0 +1 @@
+Nordzy is a free and open source icon theme for Linux desktops using the Nord color palette from Arctic Ice Studio and based on WhiteSur and Numix Icon Theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/notepadqq b/usr/share/sofirem/cache/notepadqq
new file mode 100644
index 0000000..5cd259a
--- /dev/null
+++ b/usr/share/sofirem/cache/notepadqq
@@ -0,0 +1 @@
+Notepad++-like text editor for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/noto-fonts b/usr/share/sofirem/cache/noto-fonts
new file mode 100644
index 0000000..2fe743d
--- /dev/null
+++ b/usr/share/sofirem/cache/noto-fonts
@@ -0,0 +1 @@
+Google Noto TTF fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/noto-fonts-emoji b/usr/share/sofirem/cache/noto-fonts-emoji
new file mode 100644
index 0000000..ecc0922
--- /dev/null
+++ b/usr/share/sofirem/cache/noto-fonts-emoji
@@ -0,0 +1 @@
+Google Noto emoji fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/numix-circle-arc-icons-git b/usr/share/sofirem/cache/numix-circle-arc-icons-git
new file mode 100644
index 0000000..b9a01a6
--- /dev/null
+++ b/usr/share/sofirem/cache/numix-circle-arc-icons-git
@@ -0,0 +1 @@
+Install Numix and Numix Circle. Numix icons combined with the Arc folders
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/numix-circle-icon-theme-git b/usr/share/sofirem/cache/numix-circle-icon-theme-git
new file mode 100644
index 0000000..a02b385
--- /dev/null
+++ b/usr/share/sofirem/cache/numix-circle-icon-theme-git
@@ -0,0 +1 @@
+Circle icon theme from the Numix project
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/numix-gtk-theme-git b/usr/share/sofirem/cache/numix-gtk-theme-git
new file mode 100644
index 0000000..0354e66
--- /dev/null
+++ b/usr/share/sofirem/cache/numix-gtk-theme-git
@@ -0,0 +1 @@
+A flat and light theme with a modern look (GNOME, Openbox, Unity, Xfce)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/numix-icon-theme-git b/usr/share/sofirem/cache/numix-icon-theme-git
new file mode 100644
index 0000000..a546693
--- /dev/null
+++ b/usr/share/sofirem/cache/numix-icon-theme-git
@@ -0,0 +1 @@
+Base icon theme from the Numix project
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/numix-kde-theme-git b/usr/share/sofirem/cache/numix-kde-theme-git
new file mode 100644
index 0000000..614297c
--- /dev/null
+++ b/usr/share/sofirem/cache/numix-kde-theme-git
@@ -0,0 +1 @@
+Numix pack for KDE Plasma5 - Git version
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvflash b/usr/share/sofirem/cache/nvflash
new file mode 100644
index 0000000..223e6b6
--- /dev/null
+++ b/usr/share/sofirem/cache/nvflash
@@ -0,0 +1 @@
+A tool to update the the firmware of Nvidia display adapters.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia b/usr/share/sofirem/cache/nvidia
new file mode 100644
index 0000000..a9bce0d
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia
@@ -0,0 +1 @@
+NVIDIA drivers for linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-dkms b/usr/share/sofirem/cache/nvidia-dkms
new file mode 100644
index 0000000..1525959
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-dkms
@@ -0,0 +1 @@
+NVIDIA drivers - module sources
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-lts b/usr/share/sofirem/cache/nvidia-lts
new file mode 100644
index 0000000..871f432
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-lts
@@ -0,0 +1 @@
+NVIDIA drivers for linux-lts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-open b/usr/share/sofirem/cache/nvidia-open
new file mode 100644
index 0000000..21c373b
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-open
@@ -0,0 +1 @@
+NVIDIA open kernel modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-open-dkms b/usr/share/sofirem/cache/nvidia-open-dkms
new file mode 100644
index 0000000..21c373b
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-open-dkms
@@ -0,0 +1 @@
+NVIDIA open kernel modules
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-prime b/usr/share/sofirem/cache/nvidia-prime
new file mode 100644
index 0000000..4de0c38
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-prime
@@ -0,0 +1 @@
+NVIDIA Prime Render Offload configuration and utilities
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-settings b/usr/share/sofirem/cache/nvidia-settings
new file mode 100644
index 0000000..b42c5f2
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-settings
@@ -0,0 +1 @@
+Tool for configuring the NVIDIA graphics driver
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-utils b/usr/share/sofirem/cache/nvidia-utils
new file mode 100644
index 0000000..10a4833
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-utils
@@ -0,0 +1 @@
+NVIDIA drivers utilities
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvidia-xrun b/usr/share/sofirem/cache/nvidia-xrun
new file mode 100644
index 0000000..7fab681
--- /dev/null
+++ b/usr/share/sofirem/cache/nvidia-xrun
@@ -0,0 +1 @@
+Script to run dedicated X server with discrete nvidia graphics
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvtop b/usr/share/sofirem/cache/nvtop
new file mode 100644
index 0000000..afe94e6
--- /dev/null
+++ b/usr/share/sofirem/cache/nvtop
@@ -0,0 +1 @@
+An htop like monitoring tool for AMD and NVIDIA GPUs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/nvtop-git b/usr/share/sofirem/cache/nvtop-git
new file mode 100644
index 0000000..7ed2e46
--- /dev/null
+++ b/usr/share/sofirem/cache/nvtop-git
@@ -0,0 +1 @@
+A (h)top like task monitor for NVIDIA GPUs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obconf b/usr/share/sofirem/cache/obconf
new file mode 100644
index 0000000..d7d6f42
--- /dev/null
+++ b/usr/share/sofirem/cache/obconf
@@ -0,0 +1 @@
+A GTK+ based configuration tool for the Openbox windowmanager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obconf-qt b/usr/share/sofirem/cache/obconf-qt
new file mode 100644
index 0000000..6e412f8
--- /dev/null
+++ b/usr/share/sofirem/cache/obconf-qt
@@ -0,0 +1 @@
+Openbox configuration tool. Qt port of ObConf
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obkey b/usr/share/sofirem/cache/obkey
new file mode 100644
index 0000000..6b3ee52
--- /dev/null
+++ b/usr/share/sofirem/cache/obkey
@@ -0,0 +1 @@
+Openbox Key Editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obmenu-generator b/usr/share/sofirem/cache/obmenu-generator
new file mode 100644
index 0000000..9a81e6c
--- /dev/null
+++ b/usr/share/sofirem/cache/obmenu-generator
@@ -0,0 +1 @@
+A fast pipe/static menu generator for the Openbox Window Manager (with icons support).
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obmenu3 b/usr/share/sofirem/cache/obmenu3
new file mode 100644
index 0000000..1f17296
--- /dev/null
+++ b/usr/share/sofirem/cache/obmenu3
@@ -0,0 +1 @@
+Openbox menu editor - replacement of obmenu
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obs-studio b/usr/share/sofirem/cache/obs-studio
new file mode 100644
index 0000000..2129790
--- /dev/null
+++ b/usr/share/sofirem/cache/obs-studio
@@ -0,0 +1 @@
+Free, open source software for live streaming and recording
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/obsidian-icon-theme b/usr/share/sofirem/cache/obsidian-icon-theme
new file mode 100644
index 0000000..eea27f2
--- /dev/null
+++ b/usr/share/sofirem/cache/obsidian-icon-theme
@@ -0,0 +1 @@
+Obsidian Icon Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ocs-url b/usr/share/sofirem/cache/ocs-url
new file mode 100644
index 0000000..a127a82
--- /dev/null
+++ b/usr/share/sofirem/cache/ocs-url
@@ -0,0 +1 @@
+An install helper program for items served via OpenCollaborationServices (ocs://).
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/octopi b/usr/share/sofirem/cache/octopi
new file mode 100644
index 0000000..8161b18
--- /dev/null
+++ b/usr/share/sofirem/cache/octopi
@@ -0,0 +1 @@
+This is Octopi, a powerful Pacman frontend using Qt libs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/octopi-notifier-qt5 b/usr/share/sofirem/cache/octopi-notifier-qt5
new file mode 100644
index 0000000..4422268
--- /dev/null
+++ b/usr/share/sofirem/cache/octopi-notifier-qt5
@@ -0,0 +1 @@
+Notifier for Octopi using Qt5 libs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/oh-my-zsh-git b/usr/share/sofirem/cache/oh-my-zsh-git
new file mode 100644
index 0000000..22be9ad
--- /dev/null
+++ b/usr/share/sofirem/cache/oh-my-zsh-git
@@ -0,0 +1 @@
+A community-driven framework for managing your zsh configuration.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/oh-my-zsh-powerline-theme-git b/usr/share/sofirem/cache/oh-my-zsh-powerline-theme-git
new file mode 100644
index 0000000..9039dbb
--- /dev/null
+++ b/usr/share/sofirem/cache/oh-my-zsh-powerline-theme-git
@@ -0,0 +1 @@
+oh-my-zsh Powerline style theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/okular b/usr/share/sofirem/cache/okular
new file mode 100644
index 0000000..bcb0852
--- /dev/null
+++ b/usr/share/sofirem/cache/okular
@@ -0,0 +1 @@
+Document Viewer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/olivia b/usr/share/sofirem/cache/olivia
new file mode 100644
index 0000000..31c7fb1
--- /dev/null
+++ b/usr/share/sofirem/cache/olivia
@@ -0,0 +1 @@
+Elegant Cloud Music Player for Linux Desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/onboard b/usr/share/sofirem/cache/onboard
new file mode 100644
index 0000000..b7496a2
--- /dev/null
+++ b/usr/share/sofirem/cache/onboard
@@ -0,0 +1 @@
+On-screen keyboard useful on tablet PCs or for mobility impaired users
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/onlyoffice-bin b/usr/share/sofirem/cache/onlyoffice-bin
new file mode 100644
index 0000000..c415804
--- /dev/null
+++ b/usr/share/sofirem/cache/onlyoffice-bin
@@ -0,0 +1 @@
+An office suite that combines text, spreadsheet and presentation editors
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ookla-speedtest-bin b/usr/share/sofirem/cache/ookla-speedtest-bin
new file mode 100644
index 0000000..c293aab
--- /dev/null
+++ b/usr/share/sofirem/cache/ookla-speedtest-bin
@@ -0,0 +1 @@
+Speedtest CLI by Ookla
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/open-vm-tools b/usr/share/sofirem/cache/open-vm-tools
new file mode 100644
index 0000000..1c550ca
--- /dev/null
+++ b/usr/share/sofirem/cache/open-vm-tools
@@ -0,0 +1 @@
+The Open Virtual Machine Tools (open-vm-tools) are the open source implementation of VMware Tools
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/openbox b/usr/share/sofirem/cache/openbox
new file mode 100644
index 0000000..07f776c
--- /dev/null
+++ b/usr/share/sofirem/cache/openbox
@@ -0,0 +1 @@
+Highly configurable and lightweight X11 window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/openbox-arc-git b/usr/share/sofirem/cache/openbox-arc-git
new file mode 100644
index 0000000..f074d77
--- /dev/null
+++ b/usr/share/sofirem/cache/openbox-arc-git
@@ -0,0 +1 @@
+An attempt to create Openbox themes to fit with the rest of the Arc theme. (git)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/openbox-themes-pambudi-git b/usr/share/sofirem/cache/openbox-themes-pambudi-git
new file mode 100644
index 0000000..f050184
--- /dev/null
+++ b/usr/share/sofirem/cache/openbox-themes-pambudi-git
@@ -0,0 +1 @@
+Openbox themes from Adhi Pambudi
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/openoffice-bin b/usr/share/sofirem/cache/openoffice-bin
new file mode 100644
index 0000000..895ca90
--- /dev/null
+++ b/usr/share/sofirem/cache/openoffice-bin
@@ -0,0 +1 @@
+The Free and Open Productivity Suite
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/openscad b/usr/share/sofirem/cache/openscad
new file mode 100644
index 0000000..6d875b8
--- /dev/null
+++ b/usr/share/sofirem/cache/openscad
@@ -0,0 +1 @@
+The programmers solid 3D CAD modeller
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/openshot b/usr/share/sofirem/cache/openshot
new file mode 100644
index 0000000..234fd23
--- /dev/null
+++ b/usr/share/sofirem/cache/openshot
@@ -0,0 +1 @@
+An award-winning free and open-source video editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/opera b/usr/share/sofirem/cache/opera
new file mode 100644
index 0000000..9148fa8
--- /dev/null
+++ b/usr/share/sofirem/cache/opera
@@ -0,0 +1 @@
+A fast and secure web browser
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/optimus-manager b/usr/share/sofirem/cache/optimus-manager
new file mode 100644
index 0000000..a43b30c
--- /dev/null
+++ b/usr/share/sofirem/cache/optimus-manager
@@ -0,0 +1 @@
+Management utility to handle GPU switching for Optimus laptops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/optimus-manager-qt b/usr/share/sofirem/cache/optimus-manager-qt
new file mode 100644
index 0000000..41fda66
--- /dev/null
+++ b/usr/share/sofirem/cache/optimus-manager-qt
@@ -0,0 +1 @@
+A Qt interface for Optimus Manager that allows to configure and switch GPUs on Optimus laptops using the tray menu
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/oranchelo-icon-theme-git b/usr/share/sofirem/cache/oranchelo-icon-theme-git
new file mode 100644
index 0000000..c933845
--- /dev/null
+++ b/usr/share/sofirem/cache/oranchelo-icon-theme-git
@@ -0,0 +1 @@
+Oranchelo is a flat-design icon theme for XFCE4 based on Super Flat Remix and inspired by "Corny icons" by Patryk Goworowski. (git version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/orca b/usr/share/sofirem/cache/orca
new file mode 100644
index 0000000..3a3c9e4
--- /dev/null
+++ b/usr/share/sofirem/cache/orca
@@ -0,0 +1 @@
+Screen reader for individuals who are blind or visually impaired
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/orchis-kde-theme-git b/usr/share/sofirem/cache/orchis-kde-theme-git
new file mode 100644
index 0000000..f1b8aaa
--- /dev/null
+++ b/usr/share/sofirem/cache/orchis-kde-theme-git
@@ -0,0 +1 @@
+A materia Design theme for KDE Plasma desktop.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/orchis-theme-git b/usr/share/sofirem/cache/orchis-theme-git
new file mode 100644
index 0000000..94241b8
--- /dev/null
+++ b/usr/share/sofirem/cache/orchis-theme-git
@@ -0,0 +1 @@
+A Material Design theme for GNOME/GTK based desktop environments.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/oxy-neon b/usr/share/sofirem/cache/oxy-neon
new file mode 100644
index 0000000..8d7fd7d
--- /dev/null
+++ b/usr/share/sofirem/cache/oxy-neon
@@ -0,0 +1 @@
+Stylized oxygen mouse theme created for use with dark desktop and especially for FRUiT's Neon suite.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pacback b/usr/share/sofirem/cache/pacback
new file mode 100644
index 0000000..6e8913d
--- /dev/null
+++ b/usr/share/sofirem/cache/pacback
@@ -0,0 +1 @@
+Advanced Version Control for Arch Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pace b/usr/share/sofirem/cache/pace
new file mode 100644
index 0000000..5de7ea5
--- /dev/null
+++ b/usr/share/sofirem/cache/pace
@@ -0,0 +1 @@
+A simple pacman.conf editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pace-git b/usr/share/sofirem/cache/pace-git
new file mode 100644
index 0000000..5de7ea5
--- /dev/null
+++ b/usr/share/sofirem/cache/pace-git
@@ -0,0 +1 @@
+A simple pacman.conf editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/packagekit-qt5 b/usr/share/sofirem/cache/packagekit-qt5
new file mode 100644
index 0000000..b2c43ea
--- /dev/null
+++ b/usr/share/sofirem/cache/packagekit-qt5
@@ -0,0 +1 @@
+Qt5 bindings for PackageKit
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pacseek-bin b/usr/share/sofirem/cache/pacseek-bin
new file mode 100644
index 0000000..2cdd991
--- /dev/null
+++ b/usr/share/sofirem/cache/pacseek-bin
@@ -0,0 +1 @@
+A terminal user interface for searching and installing Arch Linux packages (binary version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pacui b/usr/share/sofirem/cache/pacui
new file mode 100644
index 0000000..f6df09b
--- /dev/null
+++ b/usr/share/sofirem/cache/pacui
@@ -0,0 +1 @@
+Bash script providing advanced Pacman and Yay/Pikaur/Aurman/Pakku/Trizen/Paru/Pacaur/Pamac-cli functionality in a simple UI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pacui-git b/usr/share/sofirem/cache/pacui-git
new file mode 100644
index 0000000..f6df09b
--- /dev/null
+++ b/usr/share/sofirem/cache/pacui-git
@@ -0,0 +1 @@
+Bash script providing advanced Pacman and Yay/Pikaur/Aurman/Pakku/Trizen/Paru/Pacaur/Pamac-cli functionality in a simple UI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/paper-icon-theme b/usr/share/sofirem/cache/paper-icon-theme
new file mode 100644
index 0000000..73a7fa8
--- /dev/null
+++ b/usr/share/sofirem/cache/paper-icon-theme
@@ -0,0 +1 @@
+Paper is an open source desktop theme and icon project by Sam Hewitt
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/papirus-folders-git b/usr/share/sofirem/cache/papirus-folders-git
new file mode 100644
index 0000000..ebbacfe
--- /dev/null
+++ b/usr/share/sofirem/cache/papirus-folders-git
@@ -0,0 +1 @@
+Allows to change the color of folders (git version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/papirus-folders-gui-bin b/usr/share/sofirem/cache/papirus-folders-gui-bin
new file mode 100644
index 0000000..277d4ef
--- /dev/null
+++ b/usr/share/sofirem/cache/papirus-folders-gui-bin
@@ -0,0 +1 @@
+A graphical user interface for papirus-folders
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/papirus-folders-nordic b/usr/share/sofirem/cache/papirus-folders-nordic
new file mode 100644
index 0000000..25429f6
--- /dev/null
+++ b/usr/share/sofirem/cache/papirus-folders-nordic
@@ -0,0 +1 @@
+Icons themes papirus color folder nordic
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/papirus-icon-theme b/usr/share/sofirem/cache/papirus-icon-theme
new file mode 100644
index 0000000..af303fe
--- /dev/null
+++ b/usr/share/sofirem/cache/papirus-icon-theme
@@ -0,0 +1 @@
+Papirus icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/papirus-linux-universe b/usr/share/sofirem/cache/papirus-linux-universe
new file mode 100644
index 0000000..fc85de9
--- /dev/null
+++ b/usr/share/sofirem/cache/papirus-linux-universe
@@ -0,0 +1 @@
+Papirus folder icon set based on distros and the most famous icon themes in the Linux world!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/papirus-nord b/usr/share/sofirem/cache/papirus-nord
new file mode 100644
index 0000000..085dd27
--- /dev/null
+++ b/usr/share/sofirem/cache/papirus-nord
@@ -0,0 +1 @@
+Custom colors for folder icons for Papirus Icon Theme!
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/parcellite b/usr/share/sofirem/cache/parcellite
new file mode 100644
index 0000000..214bfb9
--- /dev/null
+++ b/usr/share/sofirem/cache/parcellite
@@ -0,0 +1 @@
+Lightweight GTK+ clipboard manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/partitionmanager b/usr/share/sofirem/cache/partitionmanager
new file mode 100644
index 0000000..51bf8a1
--- /dev/null
+++ b/usr/share/sofirem/cache/partitionmanager
@@ -0,0 +1 @@
+A KDE utility that allows you to manage disks, partitions, and file systems
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/paru b/usr/share/sofirem/cache/paru
new file mode 100644
index 0000000..4a82294
--- /dev/null
+++ b/usr/share/sofirem/cache/paru
@@ -0,0 +1 @@
+Feature packed AUR helper
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/paru-bin b/usr/share/sofirem/cache/paru-bin
new file mode 100644
index 0000000..4a82294
--- /dev/null
+++ b/usr/share/sofirem/cache/paru-bin
@@ -0,0 +1 @@
+Feature packed AUR helper
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/paru-git b/usr/share/sofirem/cache/paru-git
new file mode 100644
index 0000000..4a82294
--- /dev/null
+++ b/usr/share/sofirem/cache/paru-git
@@ -0,0 +1 @@
+Feature packed AUR helper
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pavucontrol-qt b/usr/share/sofirem/cache/pavucontrol-qt
new file mode 100644
index 0000000..4e71860
--- /dev/null
+++ b/usr/share/sofirem/cache/pavucontrol-qt
@@ -0,0 +1 @@
+A Pulseaudio mixer in Qt (port of pavucontrol)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pcmanfm b/usr/share/sofirem/cache/pcmanfm
new file mode 100644
index 0000000..c5fcc45
--- /dev/null
+++ b/usr/share/sofirem/cache/pcmanfm
@@ -0,0 +1 @@
+Extremely fast and lightweight file manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pdfarranger b/usr/share/sofirem/cache/pdfarranger
new file mode 100644
index 0000000..2c24a9e
--- /dev/null
+++ b/usr/share/sofirem/cache/pdfarranger
@@ -0,0 +1 @@
+Helps merge or split PDF documents and rotate, crop and rearrange pages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/peek b/usr/share/sofirem/cache/peek
new file mode 100644
index 0000000..f14e914
--- /dev/null
+++ b/usr/share/sofirem/cache/peek
@@ -0,0 +1 @@
+Simple screen recorder with an easy to use interface
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/perl-checkupdates-aur b/usr/share/sofirem/cache/perl-checkupdates-aur
new file mode 100644
index 0000000..5cff60d
--- /dev/null
+++ b/usr/share/sofirem/cache/perl-checkupdates-aur
@@ -0,0 +1 @@
+checkupdates for aur
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/perl-linux-desktopfiles b/usr/share/sofirem/cache/perl-linux-desktopfiles
new file mode 100644
index 0000000..dc33f19
--- /dev/null
+++ b/usr/share/sofirem/cache/perl-linux-desktopfiles
@@ -0,0 +1 @@
+Linux::DesktopFiles - a very fast Perl module for parsing the Linux desktop files.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/perl-www-aur b/usr/share/sofirem/cache/perl-www-aur
new file mode 100644
index 0000000..7a5cc5a
--- /dev/null
+++ b/usr/share/sofirem/cache/perl-www-aur
@@ -0,0 +1 @@
+API for the Archlinux User Repository website.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/persepolis b/usr/share/sofirem/cache/persepolis
new file mode 100644
index 0000000..2b7ea35
--- /dev/null
+++ b/usr/share/sofirem/cache/persepolis
@@ -0,0 +1 @@
+Qt front-end for aria2 download manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pfetch b/usr/share/sofirem/cache/pfetch
new file mode 100644
index 0000000..33c4f94
--- /dev/null
+++ b/usr/share/sofirem/cache/pfetch
@@ -0,0 +1 @@
+A pretty system information tool written in POSIX sh.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/phinger-cursors b/usr/share/sofirem/cache/phinger-cursors
new file mode 100644
index 0000000..1515ae3
--- /dev/null
+++ b/usr/share/sofirem/cache/phinger-cursors
@@ -0,0 +1 @@
+Most likely the most over-engineered cursor theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/phoronix-test-suite b/usr/share/sofirem/cache/phoronix-test-suite
new file mode 100644
index 0000000..24673c2
--- /dev/null
+++ b/usr/share/sofirem/cache/phoronix-test-suite
@@ -0,0 +1 @@
+The most comprehensive testing and benchmarking platform available for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/picom b/usr/share/sofirem/cache/picom
new file mode 100644
index 0000000..3223e7e
--- /dev/null
+++ b/usr/share/sofirem/cache/picom
@@ -0,0 +1 @@
+X compositor that may fix tearing issues
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/picom-git b/usr/share/sofirem/cache/picom-git
new file mode 100644
index 0000000..5ccc18a
--- /dev/null
+++ b/usr/share/sofirem/cache/picom-git
@@ -0,0 +1 @@
+X compositor (fork of compton) (git-version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/picom-ibhagwan-git b/usr/share/sofirem/cache/picom-ibhagwan-git
new file mode 100644
index 0000000..199254f
--- /dev/null
+++ b/usr/share/sofirem/cache/picom-ibhagwan-git
@@ -0,0 +1 @@
+iBhagwan's compton|picom fork (X compositor) with dual_kawase blur and rounded corners
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/picom-jonaburg-git b/usr/share/sofirem/cache/picom-jonaburg-git
new file mode 100644
index 0000000..48de4d1
--- /dev/null
+++ b/usr/share/sofirem/cache/picom-jonaburg-git
@@ -0,0 +1 @@
+jonaburg's picom fork with tryone144's dual_kawase blur and ibhagwan's rounded corners, an X compositor (compton's fork)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pidgin b/usr/share/sofirem/cache/pidgin
new file mode 100644
index 0000000..e939457
--- /dev/null
+++ b/usr/share/sofirem/cache/pidgin
@@ -0,0 +1 @@
+Multi-protocol instant messaging client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pikaur-git b/usr/share/sofirem/cache/pikaur-git
new file mode 100644
index 0000000..fe26649
--- /dev/null
+++ b/usr/share/sofirem/cache/pikaur-git
@@ -0,0 +1 @@
+AUR helper which asks all questions before installing/building. Inspired by pacaur, yaourt and yay.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/piper b/usr/share/sofirem/cache/piper
new file mode 100644
index 0000000..4d0753d
--- /dev/null
+++ b/usr/share/sofirem/cache/piper
@@ -0,0 +1 @@
+GTK application to configure gaming mice
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pipes.sh b/usr/share/sofirem/cache/pipes.sh
new file mode 100644
index 0000000..a2bc846
--- /dev/null
+++ b/usr/share/sofirem/cache/pipes.sh
@@ -0,0 +1 @@
+Animated pipes terminal screensaver
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pitivi b/usr/share/sofirem/cache/pitivi
new file mode 100644
index 0000000..27dd5e9
--- /dev/null
+++ b/usr/share/sofirem/cache/pitivi
@@ -0,0 +1 @@
+Editor for audio/video projects using the GStreamer framework
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/plank b/usr/share/sofirem/cache/plank
new file mode 100644
index 0000000..709881c
--- /dev/null
+++ b/usr/share/sofirem/cache/plank
@@ -0,0 +1 @@
+Elegant, simple, clean dock
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/plata-theme b/usr/share/sofirem/cache/plata-theme
new file mode 100644
index 0000000..e96d3f9
--- /dev/null
+++ b/usr/share/sofirem/cache/plata-theme
@@ -0,0 +1 @@
+A Gtk+ theme based on Material Design Refresh
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/playonlinux b/usr/share/sofirem/cache/playonlinux
new file mode 100644
index 0000000..f1e220a
--- /dev/null
+++ b/usr/share/sofirem/cache/playonlinux
@@ -0,0 +1 @@
+GUI for managing Windows programs under linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/plex-media-player b/usr/share/sofirem/cache/plex-media-player
new file mode 100644
index 0000000..13dc428
--- /dev/null
+++ b/usr/share/sofirem/cache/plex-media-player
@@ -0,0 +1 @@
+Next generation Plex Desktop Client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/plex-media-server b/usr/share/sofirem/cache/plex-media-server
new file mode 100644
index 0000000..a23ce73
--- /dev/null
+++ b/usr/share/sofirem/cache/plex-media-server
@@ -0,0 +1 @@
+The back-end media server component of Plex.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/polkit-gnome b/usr/share/sofirem/cache/polkit-gnome
new file mode 100644
index 0000000..4dde4bb
--- /dev/null
+++ b/usr/share/sofirem/cache/polkit-gnome
@@ -0,0 +1 @@
+Legacy polkit authentication agent for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/polybar b/usr/share/sofirem/cache/polybar
new file mode 100644
index 0000000..f95d9a9
--- /dev/null
+++ b/usr/share/sofirem/cache/polybar
@@ -0,0 +1 @@
+A fast and easy-to-use status bar
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/power-profiles-daemon b/usr/share/sofirem/cache/power-profiles-daemon
new file mode 100644
index 0000000..00c63a6
--- /dev/null
+++ b/usr/share/sofirem/cache/power-profiles-daemon
@@ -0,0 +1 @@
+Makes power profiles handling available over D-Bus
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/powerpill b/usr/share/sofirem/cache/powerpill
new file mode 100644
index 0000000..b01f935
--- /dev/null
+++ b/usr/share/sofirem/cache/powerpill
@@ -0,0 +1 @@
+Pacman wrapper for faster downloads.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/powertop b/usr/share/sofirem/cache/powertop
new file mode 100644
index 0000000..61f729d
--- /dev/null
+++ b/usr/share/sofirem/cache/powertop
@@ -0,0 +1 @@
+A tool to diagnose issues with power consumption and power management
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pragha b/usr/share/sofirem/cache/pragha
new file mode 100644
index 0000000..947338f
--- /dev/null
+++ b/usr/share/sofirem/cache/pragha
@@ -0,0 +1 @@
+Lightweight GTK music player and manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/privoxy b/usr/share/sofirem/cache/privoxy
new file mode 100644
index 0000000..f50dedb
--- /dev/null
+++ b/usr/share/sofirem/cache/privoxy
@@ -0,0 +1 @@
+A web proxy with advanced filtering capabilities.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/prot16-xfce4-terminal b/usr/share/sofirem/cache/prot16-xfce4-terminal
new file mode 100644
index 0000000..bd0781e
--- /dev/null
+++ b/usr/share/sofirem/cache/prot16-xfce4-terminal
@@ -0,0 +1 @@
+Prot16 collection of themes for Xfce4 terminal
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/proton-community-updater b/usr/share/sofirem/cache/proton-community-updater
new file mode 100644
index 0000000..381be37
--- /dev/null
+++ b/usr/share/sofirem/cache/proton-community-updater
@@ -0,0 +1 @@
+Script to download and manage Community Proton builds
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/proton-ge-custom-bin b/usr/share/sofirem/cache/proton-ge-custom-bin
new file mode 100644
index 0000000..fb0b48f
--- /dev/null
+++ b/usr/share/sofirem/cache/proton-ge-custom-bin
@@ -0,0 +1 @@
+A fancy custom distribution of Valves Proton with various patches
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/protontricks b/usr/share/sofirem/cache/protontricks
new file mode 100644
index 0000000..c881670
--- /dev/null
+++ b/usr/share/sofirem/cache/protontricks
@@ -0,0 +1 @@
+A wrapper that does winetricks things for Proton enabled games.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/protontricks-git b/usr/share/sofirem/cache/protontricks-git
new file mode 100644
index 0000000..c881670
--- /dev/null
+++ b/usr/share/sofirem/cache/protontricks-git
@@ -0,0 +1 @@
+A wrapper that does winetricks things for Proton enabled games.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/protonup-git b/usr/share/sofirem/cache/protonup-git
new file mode 100644
index 0000000..9288833
--- /dev/null
+++ b/usr/share/sofirem/cache/protonup-git
@@ -0,0 +1 @@
+Install and Update Proton-GE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/protonup-qt-bin b/usr/share/sofirem/cache/protonup-qt-bin
new file mode 100644
index 0000000..6ddf5a1
--- /dev/null
+++ b/usr/share/sofirem/cache/protonup-qt-bin
@@ -0,0 +1 @@
+Install and manage Proton-GE for Steam and Wine-GE for Lutris with this graphical user interface.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pulsar-bin b/usr/share/sofirem/cache/pulsar-bin
new file mode 100644
index 0000000..924d224
--- /dev/null
+++ b/usr/share/sofirem/cache/pulsar-bin
@@ -0,0 +1 @@
+A community-led hyper-hackable text editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/putty b/usr/share/sofirem/cache/putty
new file mode 100644
index 0000000..6575668
--- /dev/null
+++ b/usr/share/sofirem/cache/putty
@@ -0,0 +1 @@
+A terminal integrated SSH/Telnet client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/pycharm-community-edition b/usr/share/sofirem/cache/pycharm-community-edition
new file mode 100644
index 0000000..de61791
--- /dev/null
+++ b/usr/share/sofirem/cache/pycharm-community-edition
@@ -0,0 +1 @@
+Python IDE for Professional Developers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/python-psutil b/usr/share/sofirem/cache/python-psutil
new file mode 100644
index 0000000..f7a1a4b
--- /dev/null
+++ b/usr/share/sofirem/cache/python-psutil
@@ -0,0 +1 @@
+A cross-platform process and system utilities module for Python
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/python-pywal b/usr/share/sofirem/cache/python-pywal
new file mode 100644
index 0000000..40484c6
--- /dev/null
+++ b/usr/share/sofirem/cache/python-pywal
@@ -0,0 +1 @@
+Generate and change colorschemes on the fly
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/python-setuptools b/usr/share/sofirem/cache/python-setuptools
new file mode 100644
index 0000000..3761bfb
--- /dev/null
+++ b/usr/share/sofirem/cache/python-setuptools
@@ -0,0 +1 @@
+Easily download, build, install, upgrade, and uninstall Python packages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qbittorrent b/usr/share/sofirem/cache/qbittorrent
new file mode 100644
index 0000000..1304125
--- /dev/null
+++ b/usr/share/sofirem/cache/qbittorrent
@@ -0,0 +1 @@
+An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qemu-base b/usr/share/sofirem/cache/qemu-base
new file mode 100644
index 0000000..0f838f7
--- /dev/null
+++ b/usr/share/sofirem/cache/qemu-base
@@ -0,0 +1 @@
+A basic QEMU setup for headless environments
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qemu-full b/usr/share/sofirem/cache/qemu-full
new file mode 100644
index 0000000..f2783e8
--- /dev/null
+++ b/usr/share/sofirem/cache/qemu-full
@@ -0,0 +1 @@
+A full QEMU setup
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qogir-gtk-theme-git b/usr/share/sofirem/cache/qogir-gtk-theme-git
new file mode 100644
index 0000000..b5996e0
--- /dev/null
+++ b/usr/share/sofirem/cache/qogir-gtk-theme-git
@@ -0,0 +1 @@
+Qogir is a flat Design theme for GTK
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qogir-icon-theme b/usr/share/sofirem/cache/qogir-icon-theme
new file mode 100644
index 0000000..38b6c74
--- /dev/null
+++ b/usr/share/sofirem/cache/qogir-icon-theme
@@ -0,0 +1 @@
+A colorful design icon theme for linux desktops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qogir-kde-theme-git b/usr/share/sofirem/cache/qogir-kde-theme-git
new file mode 100644
index 0000000..6dc1b9f
--- /dev/null
+++ b/usr/share/sofirem/cache/qogir-kde-theme-git
@@ -0,0 +1 @@
+Qogir kde is a flat Design theme for KDE Plasma desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qt5-quickcontrols b/usr/share/sofirem/cache/qt5-quickcontrols
new file mode 100644
index 0000000..f10ec78
--- /dev/null
+++ b/usr/share/sofirem/cache/qt5-quickcontrols
@@ -0,0 +1 @@
+Reusable Qt Quick based UI controls to create classic desktop-style user interfaces
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qt5-tools b/usr/share/sofirem/cache/qt5-tools
new file mode 100644
index 0000000..2364e43
--- /dev/null
+++ b/usr/share/sofirem/cache/qt5-tools
@@ -0,0 +1 @@
+A cross-platform application and UI framework (Development Tools, QtHelp)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qtcreator b/usr/share/sofirem/cache/qtcreator
new file mode 100644
index 0000000..e91281a
--- /dev/null
+++ b/usr/share/sofirem/cache/qtcreator
@@ -0,0 +1 @@
+Lightweight, cross-platform integrated development environment
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qtile b/usr/share/sofirem/cache/qtile
new file mode 100644
index 0000000..62a7b7a
--- /dev/null
+++ b/usr/share/sofirem/cache/qtile
@@ -0,0 +1 @@
+A full-featured, pure-Python tiling window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qtox b/usr/share/sofirem/cache/qtox
new file mode 100644
index 0000000..45041d9
--- /dev/null
+++ b/usr/share/sofirem/cache/qtox
@@ -0,0 +1 @@
+a chat, voice, video, and file transfer IM client using the encrypted peer-to-peer Tox protocol
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qtscrcpy b/usr/share/sofirem/cache/qtscrcpy
new file mode 100644
index 0000000..09b4131
--- /dev/null
+++ b/usr/share/sofirem/cache/qtscrcpy
@@ -0,0 +1 @@
+Android real-time screencast control tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qtwebflix-git b/usr/share/sofirem/cache/qtwebflix-git
new file mode 100644
index 0000000..f8db4bb
--- /dev/null
+++ b/usr/share/sofirem/cache/qtwebflix-git
@@ -0,0 +1 @@
+Standalone HD Netflix Browser using qt5-webengine (also supports Amazon prime, HBO Go, Hulu, Crunchy Roll)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/quickemu b/usr/share/sofirem/cache/quickemu
new file mode 100644
index 0000000..64ff198
--- /dev/null
+++ b/usr/share/sofirem/cache/quickemu
@@ -0,0 +1 @@
+Quickly create and run optimised Windows, macOS and Linux desktop virtual machines.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/quickemu-git b/usr/share/sofirem/cache/quickemu-git
new file mode 100644
index 0000000..f7d044d
--- /dev/null
+++ b/usr/share/sofirem/cache/quickemu-git
@@ -0,0 +1 @@
+Simple shell script to "manage" Qemu virtual machines.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/quickgui-bin b/usr/share/sofirem/cache/quickgui-bin
new file mode 100644
index 0000000..62fa656
--- /dev/null
+++ b/usr/share/sofirem/cache/quickgui-bin
@@ -0,0 +1 @@
+A Flutter frontend for quickget and quickemu
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/qutebrowser b/usr/share/sofirem/cache/qutebrowser
new file mode 100644
index 0000000..e1ef447
--- /dev/null
+++ b/usr/share/sofirem/cache/qutebrowser
@@ -0,0 +1 @@
+A keyboard-driven, vim-like browser based on PyQt5
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/radiotray b/usr/share/sofirem/cache/radiotray
new file mode 100644
index 0000000..cd4beb4
--- /dev/null
+++ b/usr/share/sofirem/cache/radiotray
@@ -0,0 +1 @@
+An online radio streaming player that runs on a Linux system tray.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ranger b/usr/share/sofirem/cache/ranger
new file mode 100644
index 0000000..78d9eca
--- /dev/null
+++ b/usr/share/sofirem/cache/ranger
@@ -0,0 +1 @@
+Simple, vim-like file manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rare b/usr/share/sofirem/cache/rare
new file mode 100644
index 0000000..422bcc0
--- /dev/null
+++ b/usr/share/sofirem/cache/rare
@@ -0,0 +1 @@
+A GUI for legendary, an open source replacement for Epic Games Launcher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rate-mirrors b/usr/share/sofirem/cache/rate-mirrors
new file mode 100644
index 0000000..c53e807
--- /dev/null
+++ b/usr/share/sofirem/cache/rate-mirrors
@@ -0,0 +1 @@
+Everyday-use client-side map-aware mirror ranking tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rate-mirrors-bin b/usr/share/sofirem/cache/rate-mirrors-bin
new file mode 100644
index 0000000..8dcb10a
--- /dev/null
+++ b/usr/share/sofirem/cache/rate-mirrors-bin
@@ -0,0 +1 @@
+Everyday-use client-side map-aware mirror ranking tool - pre-built with musl
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/realvnc-vnc-server b/usr/share/sofirem/cache/realvnc-vnc-server
new file mode 100644
index 0000000..9f78c0b
--- /dev/null
+++ b/usr/share/sofirem/cache/realvnc-vnc-server
@@ -0,0 +1 @@
+VNC remote desktop server software by RealVNC
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/realvnc-vnc-viewer b/usr/share/sofirem/cache/realvnc-vnc-viewer
new file mode 100644
index 0000000..086ec28
--- /dev/null
+++ b/usr/share/sofirem/cache/realvnc-vnc-viewer
@@ -0,0 +1 @@
+VNC remote desktop client software by RealVNC
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/redshift b/usr/share/sofirem/cache/redshift
new file mode 100644
index 0000000..823c4d0
--- /dev/null
+++ b/usr/share/sofirem/cache/redshift
@@ -0,0 +1 @@
+Adjusts the color temperature of your screen according to your surroundings.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/remmina b/usr/share/sofirem/cache/remmina
new file mode 100644
index 0000000..deaef32
--- /dev/null
+++ b/usr/share/sofirem/cache/remmina
@@ -0,0 +1 @@
+remote desktop client written in GTK+
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/replay-sorcery b/usr/share/sofirem/cache/replay-sorcery
new file mode 100644
index 0000000..4842684
--- /dev/null
+++ b/usr/share/sofirem/cache/replay-sorcery
@@ -0,0 +1 @@
+An open-source, instant-replay screen recorder for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rhythmbox b/usr/share/sofirem/cache/rhythmbox
new file mode 100644
index 0000000..fe99613
--- /dev/null
+++ b/usr/share/sofirem/cache/rhythmbox
@@ -0,0 +1 @@
+Music playback and management application
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ripgrep b/usr/share/sofirem/cache/ripgrep
new file mode 100644
index 0000000..1a9d7d6
--- /dev/null
+++ b/usr/share/sofirem/cache/ripgrep
@@ -0,0 +1 @@
+A search tool that combines the usability of ag with the raw speed of grep
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ripgrep-all b/usr/share/sofirem/cache/ripgrep-all
new file mode 100644
index 0000000..119ac78
--- /dev/null
+++ b/usr/share/sofirem/cache/ripgrep-all
@@ -0,0 +1 @@
+rga: ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rofi b/usr/share/sofirem/cache/rofi
new file mode 100644
index 0000000..26e242f
--- /dev/null
+++ b/usr/share/sofirem/cache/rofi
@@ -0,0 +1 @@
+A window switcher, application launcher and dmenu replacement
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rofi-theme-fonts b/usr/share/sofirem/cache/rofi-theme-fonts
new file mode 100644
index 0000000..cc6c921
--- /dev/null
+++ b/usr/share/sofirem/cache/rofi-theme-fonts
@@ -0,0 +1 @@
+A large collection of Rofi based custom Menu, Applets, Launchers & Powermenus
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/rxvt-unicode b/usr/share/sofirem/cache/rxvt-unicode
new file mode 100644
index 0000000..852fd28
--- /dev/null
+++ b/usr/share/sofirem/cache/rxvt-unicode
@@ -0,0 +1 @@
+Unicode enabled rxvt-clone terminal emulator (urxvt)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/s-tui b/usr/share/sofirem/cache/s-tui
new file mode 100644
index 0000000..6eeb77c
--- /dev/null
+++ b/usr/share/sofirem/cache/s-tui
@@ -0,0 +1 @@
+Terminal UI stress test and monitoring tool
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sakura b/usr/share/sofirem/cache/sakura
new file mode 100644
index 0000000..addd2b9
--- /dev/null
+++ b/usr/share/sofirem/cache/sakura
@@ -0,0 +1 @@
+A terminal emulator based on GTK and VTE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flat-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-flat-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flat-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flat-mint-y-icons-git b/usr/share/sofirem/cache/sardi-flat-mint-y-icons-git
new file mode 100644
index 0000000..e842208
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flat-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Sardi {indexname} as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flat-mixing-icons-git b/usr/share/sofirem/cache/sardi-flat-mixing-icons-git
new file mode 100644
index 0000000..f341db5
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flat-mixing-icons-git
@@ -0,0 +1 @@
+Based on Sardi Flat you can use the modularity to combine elements and create a new icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flexible-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-flexible-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flexible-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flexible-luv-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-flexible-luv-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flexible-luv-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flexible-mint-y-icons-git b/usr/share/sofirem/cache/sardi-flexible-mint-y-icons-git
new file mode 100644
index 0000000..e842208
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flexible-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Sardi {indexname} as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flexible-mixing-icons-git b/usr/share/sofirem/cache/sardi-flexible-mixing-icons-git
new file mode 100644
index 0000000..28d3a8b
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flexible-mixing-icons-git
@@ -0,0 +1 @@
+Based on Sardi Flexible you can use the modularity to combine elements and create a new icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-flexible-variations-icons-git b/usr/share/sofirem/cache/sardi-flexible-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-flexible-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-ghost-flexible-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-ghost-flexible-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-ghost-flexible-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-ghost-flexible-mint-y-icons-git b/usr/share/sofirem/cache/sardi-ghost-flexible-mint-y-icons-git
new file mode 100644
index 0000000..e842208
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-ghost-flexible-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Sardi {indexname} as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-ghost-flexible-mixing-icons-git b/usr/share/sofirem/cache/sardi-ghost-flexible-mixing-icons-git
new file mode 100644
index 0000000..b7917ef
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-ghost-flexible-mixing-icons-git
@@ -0,0 +1 @@
+Based on Sardi Ghost Flexible you can use the modularity to combine elements and create a new icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-ghost-flexible-variations-icons-git b/usr/share/sofirem/cache/sardi-ghost-flexible-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-ghost-flexible-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-icons b/usr/share/sofirem/cache/sardi-icons
new file mode 100644
index 0000000..a8c610b
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-icons
@@ -0,0 +1 @@
+Sardi is an icon collection for any linux distro with 6 different circular icons and 10 different kind of folders.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mint-y-icons-git b/usr/share/sofirem/cache/sardi-mint-y-icons-git
new file mode 100644
index 0000000..624ab68
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Sardi as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mixing-icons-git b/usr/share/sofirem/cache/sardi-mixing-icons-git
new file mode 100644
index 0000000..1e85655
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mixing-icons-git
@@ -0,0 +1 @@
+Based on Sardi you can use the modularity to combine elements and create a new icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mono-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-mono-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mono-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mono-mint-y-icons-git b/usr/share/sofirem/cache/sardi-mono-mint-y-icons-git
new file mode 100644
index 0000000..e842208
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mono-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Sardi {indexname} as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mono-mixing-icons-git b/usr/share/sofirem/cache/sardi-mono-mixing-icons-git
new file mode 100644
index 0000000..ecb2f51
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mono-mixing-icons-git
@@ -0,0 +1 @@
+Based on Sardi Mono you can use the modularity to combine elements and create a new icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mono-numix-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-mono-numix-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mono-numix-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-mono-papirus-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-mono-papirus-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-mono-papirus-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-orb-colora-mint-y-icons-git b/usr/share/sofirem/cache/sardi-orb-colora-mint-y-icons-git
new file mode 100644
index 0000000..e842208
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-orb-colora-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Sardi {indexname} as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-orb-colora-mixing-icons-git b/usr/share/sofirem/cache/sardi-orb-colora-mixing-icons-git
new file mode 100644
index 0000000..27dbb84
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-orb-colora-mixing-icons-git
@@ -0,0 +1 @@
+Based on Sardi Orb Colora you can use the modularity to combine elements and create a new icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sardi-orb-colora-variations-icons-git b/usr/share/sofirem/cache/sardi-orb-colora-variations-icons-git
new file mode 100644
index 0000000..5300b80
--- /dev/null
+++ b/usr/share/sofirem/cache/sardi-orb-colora-variations-icons-git
@@ -0,0 +1 @@
+The Sardi icon set contains 80+ scripts to change from colour. Change it yourself with these scripts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sauerbraten b/usr/share/sofirem/cache/sauerbraten
new file mode 100644
index 0000000..e44b3e6
--- /dev/null
+++ b/usr/share/sofirem/cache/sauerbraten
@@ -0,0 +1 @@
+FPS that uses an improved version of the Cube engine
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sauerbraten-data b/usr/share/sofirem/cache/sauerbraten-data
new file mode 100644
index 0000000..3ef2d31
--- /dev/null
+++ b/usr/share/sofirem/cache/sauerbraten-data
@@ -0,0 +1 @@
+Improved version of the Cube engine - datas files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sayonara-player b/usr/share/sofirem/cache/sayonara-player
new file mode 100644
index 0000000..75c6f1e
--- /dev/null
+++ b/usr/share/sofirem/cache/sayonara-player
@@ -0,0 +1 @@
+Small, clear and fast audio player for Linux written in C++, supported by the Qt framework. It uses Gstreamer as audio backend.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/scrcpy b/usr/share/sofirem/cache/scrcpy
new file mode 100644
index 0000000..796abe5
--- /dev/null
+++ b/usr/share/sofirem/cache/scrcpy
@@ -0,0 +1 @@
+Display and control your Android device
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/screenfetch b/usr/share/sofirem/cache/screenfetch
new file mode 100644
index 0000000..4a98c26
--- /dev/null
+++ b/usr/share/sofirem/cache/screenfetch
@@ -0,0 +1 @@
+CLI Bash script to show system/theme info in screenshots
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/screenkey-git b/usr/share/sofirem/cache/screenkey-git
new file mode 100644
index 0000000..33afb82
--- /dev/null
+++ b/usr/share/sofirem/cache/screenkey-git
@@ -0,0 +1 @@
+Screencast tool to show your keys inspired by Screenflick, based on key-mon. Active fork with new features.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/scribus b/usr/share/sofirem/cache/scribus
new file mode 100644
index 0000000..ac9dac9
--- /dev/null
+++ b/usr/share/sofirem/cache/scribus
@@ -0,0 +1 @@
+Desktop publishing software
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/scrot b/usr/share/sofirem/cache/scrot
new file mode 100644
index 0000000..59cc463
--- /dev/null
+++ b/usr/share/sofirem/cache/scrot
@@ -0,0 +1 @@
+Simple command-line screenshot utility for X
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sddm b/usr/share/sofirem/cache/sddm
new file mode 100644
index 0000000..e81f257
--- /dev/null
+++ b/usr/share/sofirem/cache/sddm
@@ -0,0 +1 @@
+QML based X11 and Wayland display manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sddm-kcm b/usr/share/sofirem/cache/sddm-kcm
new file mode 100644
index 0000000..7f92e83
--- /dev/null
+++ b/usr/share/sofirem/cache/sddm-kcm
@@ -0,0 +1 @@
+KDE Config Module for SDDM
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/shairport-sync b/usr/share/sofirem/cache/shairport-sync
new file mode 100644
index 0000000..87d19f2
--- /dev/null
+++ b/usr/share/sofirem/cache/shairport-sync
@@ -0,0 +1 @@
+Emulates an AirPort Express for the purpose of streaming music from iTunes and compatible iPods and iPhones
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/shortwave b/usr/share/sofirem/cache/shortwave
new file mode 100644
index 0000000..08204a9
--- /dev/null
+++ b/usr/share/sofirem/cache/shortwave
@@ -0,0 +1 @@
+Find and listen to internet radio stations
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sigil b/usr/share/sofirem/cache/sigil
new file mode 100644
index 0000000..7bd0540
--- /dev/null
+++ b/usr/share/sofirem/cache/sigil
@@ -0,0 +1 @@
+multi-platform EPUB2/EPUB3 ebook editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/signal-desktop b/usr/share/sofirem/cache/signal-desktop
new file mode 100644
index 0000000..8de8aba
--- /dev/null
+++ b/usr/share/sofirem/cache/signal-desktop
@@ -0,0 +1 @@
+Signal Private Messenger for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/signal-desktop-beta-bin b/usr/share/sofirem/cache/signal-desktop-beta-bin
new file mode 100644
index 0000000..8de8aba
--- /dev/null
+++ b/usr/share/sofirem/cache/signal-desktop-beta-bin
@@ -0,0 +1 @@
+Signal Private Messenger for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/signal-desktop-git b/usr/share/sofirem/cache/signal-desktop-git
new file mode 100644
index 0000000..8de8aba
--- /dev/null
+++ b/usr/share/sofirem/cache/signal-desktop-git
@@ -0,0 +1 @@
+Signal Private Messenger for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/simple-scan b/usr/share/sofirem/cache/simple-scan
new file mode 100644
index 0000000..1841755
--- /dev/null
+++ b/usr/share/sofirem/cache/simple-scan
@@ -0,0 +1 @@
+Simple scanning utility
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/simplescreenrecorder b/usr/share/sofirem/cache/simplescreenrecorder
new file mode 100644
index 0000000..6605197
--- /dev/null
+++ b/usr/share/sofirem/cache/simplescreenrecorder
@@ -0,0 +1 @@
+A feature-rich screen recorder that supports X11 and OpenGL.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/simplescreenrecorder-git b/usr/share/sofirem/cache/simplescreenrecorder-git
new file mode 100644
index 0000000..6605197
--- /dev/null
+++ b/usr/share/sofirem/cache/simplescreenrecorder-git
@@ -0,0 +1 @@
+A feature-rich screen recorder that supports X11 and OpenGL.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/simplicity-sddm-theme-git b/usr/share/sofirem/cache/simplicity-sddm-theme-git
new file mode 100644
index 0000000..61772c1
--- /dev/null
+++ b/usr/share/sofirem/cache/simplicity-sddm-theme-git
@@ -0,0 +1 @@
+Simple SDDM Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/skippy-xd-git b/usr/share/sofirem/cache/skippy-xd-git
new file mode 100644
index 0000000..0a7a736
--- /dev/null
+++ b/usr/share/sofirem/cache/skippy-xd-git
@@ -0,0 +1 @@
+A full-screen task-switcher for X11, similar to Apple's Expose
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/skypeforlinux-stable-bin b/usr/share/sofirem/cache/skypeforlinux-stable-bin
new file mode 100644
index 0000000..96c2e64
--- /dev/null
+++ b/usr/share/sofirem/cache/skypeforlinux-stable-bin
@@ -0,0 +1 @@
+Skype for Linux - Stable/Release Version
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sl b/usr/share/sofirem/cache/sl
new file mode 100644
index 0000000..f6684f9
--- /dev/null
+++ b/usr/share/sofirem/cache/sl
@@ -0,0 +1 @@
+Steam Locomotive runs across your terminal when you type "sl" as you meant to type "ls"
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/slack-desktop b/usr/share/sofirem/cache/slack-desktop
new file mode 100644
index 0000000..efbf1fd
--- /dev/null
+++ b/usr/share/sofirem/cache/slack-desktop
@@ -0,0 +1 @@
+Slack Desktop (Beta) for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/slimbookbattery b/usr/share/sofirem/cache/slimbookbattery
new file mode 100644
index 0000000..e946021
--- /dev/null
+++ b/usr/share/sofirem/cache/slimbookbattery
@@ -0,0 +1 @@
+Battery optimization application for portable devices.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/slurm b/usr/share/sofirem/cache/slurm
new file mode 100644
index 0000000..367d518
--- /dev/null
+++ b/usr/share/sofirem/cache/slurm
@@ -0,0 +1 @@
+Monitoring traffic statistics in realtime
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/smplayer b/usr/share/sofirem/cache/smplayer
new file mode 100644
index 0000000..c933fb4
--- /dev/null
+++ b/usr/share/sofirem/cache/smplayer
@@ -0,0 +1 @@
+Media player with built-in codecs that can play virtually all video and audio formats
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/snap-pac b/usr/share/sofirem/cache/snap-pac
new file mode 100644
index 0000000..8311ddf
--- /dev/null
+++ b/usr/share/sofirem/cache/snap-pac
@@ -0,0 +1 @@
+Pacman hooks that use snapper to create pre/post btrfs snapshots like openSUSE's YaST
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/snapd b/usr/share/sofirem/cache/snapd
new file mode 100644
index 0000000..257e3a2
--- /dev/null
+++ b/usr/share/sofirem/cache/snapd
@@ -0,0 +1 @@
+Service and tools for management of snap packages.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/snapper b/usr/share/sofirem/cache/snapper
new file mode 100644
index 0000000..7511a0c
--- /dev/null
+++ b/usr/share/sofirem/cache/snapper
@@ -0,0 +1 @@
+A tool for managing BTRFS and LVM snapshots. It can create, diff and restore snapshots and provides timelined auto-snapping.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/snapper-gui-git b/usr/share/sofirem/cache/snapper-gui-git
new file mode 100644
index 0000000..a11fca5
--- /dev/null
+++ b/usr/share/sofirem/cache/snapper-gui-git
@@ -0,0 +1 @@
+Gui for snapper, a tool of managing snapshots of Btrfs subvolumes and LVM volumes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/snapper-support b/usr/share/sofirem/cache/snapper-support
new file mode 100644
index 0000000..34df2ac
--- /dev/null
+++ b/usr/share/sofirem/cache/snapper-support
@@ -0,0 +1 @@
+Support package for enabling Snapper with snap-pac and grub-btrfs support
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/snapper-tools b/usr/share/sofirem/cache/snapper-tools
new file mode 100644
index 0000000..cf54581
--- /dev/null
+++ b/usr/share/sofirem/cache/snapper-tools
@@ -0,0 +1 @@
+A highly opinionated Snapper GUI and CLI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/solaar b/usr/share/sofirem/cache/solaar
new file mode 100644
index 0000000..8622261
--- /dev/null
+++ b/usr/share/sofirem/cache/solaar
@@ -0,0 +1 @@
+Linux device manager for a wide range of Logitech devices
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/soundconverter b/usr/share/sofirem/cache/soundconverter
new file mode 100644
index 0000000..8c0ebfd
--- /dev/null
+++ b/usr/share/sofirem/cache/soundconverter
@@ -0,0 +1 @@
+A simple sound converter application for GNOME
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sparklines-git b/usr/share/sofirem/cache/sparklines-git
new file mode 100644
index 0000000..b58ae47
--- /dev/null
+++ b/usr/share/sofirem/cache/sparklines-git
@@ -0,0 +1 @@
+Spark: Sparklines for your shell
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/spectacle b/usr/share/sofirem/cache/spectacle
new file mode 100644
index 0000000..ca94050
--- /dev/null
+++ b/usr/share/sofirem/cache/spectacle
@@ -0,0 +1 @@
+KDE screenshot capture utility
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/spectrwm b/usr/share/sofirem/cache/spectrwm
new file mode 100644
index 0000000..2fc9056
--- /dev/null
+++ b/usr/share/sofirem/cache/spectrwm
@@ -0,0 +1 @@
+A minimalistic automatic tiling window manager that tries to stay out of the way.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/speedtest-cli-git b/usr/share/sofirem/cache/speedtest-cli-git
new file mode 100644
index 0000000..68a9331
--- /dev/null
+++ b/usr/share/sofirem/cache/speedtest-cli-git
@@ -0,0 +1 @@
+Command line interface for testing internet bandwidth using speedtest.net
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/spotify b/usr/share/sofirem/cache/spotify
new file mode 100644
index 0000000..a1acc5f
--- /dev/null
+++ b/usr/share/sofirem/cache/spotify
@@ -0,0 +1 @@
+A proprietary music streaming service
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/spotify-adblock-git b/usr/share/sofirem/cache/spotify-adblock-git
new file mode 100644
index 0000000..df62933
--- /dev/null
+++ b/usr/share/sofirem/cache/spotify-adblock-git
@@ -0,0 +1 @@
+Adblocker for Spotify
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/spotifywm-git b/usr/share/sofirem/cache/spotifywm-git
new file mode 100644
index 0000000..1a34747
--- /dev/null
+++ b/usr/share/sofirem/cache/spotifywm-git
@@ -0,0 +1 @@
+Makes Spotify more friendly to window managers by settings a class name before opening the window.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/stacer b/usr/share/sofirem/cache/stacer
new file mode 100644
index 0000000..c534da8
--- /dev/null
+++ b/usr/share/sofirem/cache/stacer
@@ -0,0 +1 @@
+Ubuntu System Optimizer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/stacer-bin b/usr/share/sofirem/cache/stacer-bin
new file mode 100644
index 0000000..b6e7b19
--- /dev/null
+++ b/usr/share/sofirem/cache/stacer-bin
@@ -0,0 +1 @@
+Linux System Optimizer and Monitoring
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/steam-buddy b/usr/share/sofirem/cache/steam-buddy
new file mode 100644
index 0000000..5547213
--- /dev/null
+++ b/usr/share/sofirem/cache/steam-buddy
@@ -0,0 +1 @@
+Configure and manage games in Steam
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/steam-tweaks b/usr/share/sofirem/cache/steam-tweaks
new file mode 100644
index 0000000..eeb92a4
--- /dev/null
+++ b/usr/share/sofirem/cache/steam-tweaks
@@ -0,0 +1 @@
+Various tools for tweaking Steam/game settings
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/steamtinkerlaunch b/usr/share/sofirem/cache/steamtinkerlaunch
new file mode 100644
index 0000000..7f8a97a
--- /dev/null
+++ b/usr/share/sofirem/cache/steamtinkerlaunch
@@ -0,0 +1 @@
+Wrapper script for Steam custom launch options
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sublime-text-4 b/usr/share/sofirem/cache/sublime-text-4
new file mode 100644
index 0000000..5091aa7
--- /dev/null
+++ b/usr/share/sofirem/cache/sublime-text-4
@@ -0,0 +1 @@
+Sophisticated text editor for code, html and prose - stable build
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/supertux b/usr/share/sofirem/cache/supertux
new file mode 100644
index 0000000..802285e
--- /dev/null
+++ b/usr/share/sofirem/cache/supertux
@@ -0,0 +1 @@
+A classic 2D jump'n'run sidescroller game in a style similar to the original SuperMario games
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/supertuxkart b/usr/share/sofirem/cache/supertuxkart
new file mode 100644
index 0000000..8c58455
--- /dev/null
+++ b/usr/share/sofirem/cache/supertuxkart
@@ -0,0 +1 @@
+Kart racing game featuring Tux and his friends
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/surfn-arc-breeze-icons-git b/usr/share/sofirem/cache/surfn-arc-breeze-icons-git
new file mode 100644
index 0000000..724af4a
--- /dev/null
+++ b/usr/share/sofirem/cache/surfn-arc-breeze-icons-git
@@ -0,0 +1 @@
+Surfn Arc Breeze icons are created to be used on Plasma with dark toolbar
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/surfn-icons-git b/usr/share/sofirem/cache/surfn-icons-git
new file mode 100644
index 0000000..93451da
--- /dev/null
+++ b/usr/share/sofirem/cache/surfn-icons-git
@@ -0,0 +1 @@
+Surfn is a colourful icon theme.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/surfn-mint-y-icons-git b/usr/share/sofirem/cache/surfn-mint-y-icons-git
new file mode 100644
index 0000000..57b3879
--- /dev/null
+++ b/usr/share/sofirem/cache/surfn-mint-y-icons-git
@@ -0,0 +1 @@
+New icons from LinuxMint 18 inspired by the Moka icon set with Surfn as main icon set
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/surfn-plasma-dark-icons-git b/usr/share/sofirem/cache/surfn-plasma-dark-icons-git
new file mode 100644
index 0000000..99088a8
--- /dev/null
+++ b/usr/share/sofirem/cache/surfn-plasma-dark-icons-git
@@ -0,0 +1 @@
+Surfn Plasma Dark is created to go with Plasma
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/surfn-plasma-dark-tela-icons-git b/usr/share/sofirem/cache/surfn-plasma-dark-tela-icons-git
new file mode 100644
index 0000000..5edd3dc
--- /dev/null
+++ b/usr/share/sofirem/cache/surfn-plasma-dark-tela-icons-git
@@ -0,0 +1 @@
+Surfn Plasma Dark Tela is created to go with Plasma
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/surfn-plasma-light-icons-git b/usr/share/sofirem/cache/surfn-plasma-light-icons-git
new file mode 100644
index 0000000..e32d4fc
--- /dev/null
+++ b/usr/share/sofirem/cache/surfn-plasma-light-icons-git
@@ -0,0 +1 @@
+Surfn Plasma Light is created to go with Breeze
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sutils-git b/usr/share/sofirem/cache/sutils-git
new file mode 100644
index 0000000..191ac2a
--- /dev/null
+++ b/usr/share/sofirem/cache/sutils-git
@@ -0,0 +1 @@
+Small command-line utilities
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sweet-cursor-theme-git b/usr/share/sofirem/cache/sweet-cursor-theme-git
new file mode 100644
index 0000000..2a6369a
--- /dev/null
+++ b/usr/share/sofirem/cache/sweet-cursor-theme-git
@@ -0,0 +1 @@
+Sweet cursor theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sweet-gtk-theme-dark b/usr/share/sofirem/cache/sweet-gtk-theme-dark
new file mode 100644
index 0000000..63bc0fc
--- /dev/null
+++ b/usr/share/sofirem/cache/sweet-gtk-theme-dark
@@ -0,0 +1 @@
+Light and dark colorful Gtk3.20+ theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sweet-kde-theme-mars-git b/usr/share/sofirem/cache/sweet-kde-theme-mars-git
new file mode 100644
index 0000000..567b686
--- /dev/null
+++ b/usr/share/sofirem/cache/sweet-kde-theme-mars-git
@@ -0,0 +1 @@
+Dark colorful KDE theme (Sweet Mars)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sweet-theme-git b/usr/share/sofirem/cache/sweet-theme-git
new file mode 100644
index 0000000..63bc0fc
--- /dev/null
+++ b/usr/share/sofirem/cache/sweet-theme-git
@@ -0,0 +1 @@
+Light and dark colorful Gtk3.20+ theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sxhkd b/usr/share/sofirem/cache/sxhkd
new file mode 100644
index 0000000..efca9ce
--- /dev/null
+++ b/usr/share/sofirem/cache/sxhkd
@@ -0,0 +1 @@
+Simple X hotkey daemon
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/synapse b/usr/share/sofirem/cache/synapse
new file mode 100644
index 0000000..7257aa9
--- /dev/null
+++ b/usr/share/sofirem/cache/synapse
@@ -0,0 +1 @@
+A semantic file launcher
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/sysprof b/usr/share/sofirem/cache/sysprof
new file mode 100644
index 0000000..ab062a7
--- /dev/null
+++ b/usr/share/sofirem/cache/sysprof
@@ -0,0 +1 @@
+Kernel based performance profiler
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/system76-power b/usr/share/sofirem/cache/system76-power
new file mode 100644
index 0000000..138bd33
--- /dev/null
+++ b/usr/share/sofirem/cache/system76-power
@@ -0,0 +1 @@
+System76 Power Management
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/systemd-kcm b/usr/share/sofirem/cache/systemd-kcm
new file mode 100644
index 0000000..dc882cf
--- /dev/null
+++ b/usr/share/sofirem/cache/systemd-kcm
@@ -0,0 +1 @@
+Systemd control module for KDE
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/systemd-manager b/usr/share/sofirem/cache/systemd-manager
new file mode 100644
index 0000000..b77f2eb
--- /dev/null
+++ b/usr/share/sofirem/cache/systemd-manager
@@ -0,0 +1 @@
+GUI manager for systemd services, using GTK+3
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/systemd-manager-git b/usr/share/sofirem/cache/systemd-manager-git
new file mode 100644
index 0000000..2d05d9e
--- /dev/null
+++ b/usr/share/sofirem/cache/systemd-manager-git
@@ -0,0 +1 @@
+A systemd service manager written in Rust with the GTK-rs wrapper and direct integration with dbus
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tabby-bin b/usr/share/sofirem/cache/tabby-bin
new file mode 100644
index 0000000..3315463
--- /dev/null
+++ b/usr/share/sofirem/cache/tabby-bin
@@ -0,0 +1 @@
+Tabby (formerly Terminus) is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tauon-music-box b/usr/share/sofirem/cache/tauon-music-box
new file mode 100644
index 0000000..2f2f3c7
--- /dev/null
+++ b/usr/share/sofirem/cache/tauon-music-box
@@ -0,0 +1 @@
+A modern streamlined music player
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/teams b/usr/share/sofirem/cache/teams
new file mode 100644
index 0000000..fe42592
--- /dev/null
+++ b/usr/share/sofirem/cache/teams
@@ -0,0 +1 @@
+Microsoft Teams for Linux is your chat-centered workspace in Office 365
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tela-circle-icon-theme-git b/usr/share/sofirem/cache/tela-circle-icon-theme-git
new file mode 100644
index 0000000..0836a96
--- /dev/null
+++ b/usr/share/sofirem/cache/tela-circle-icon-theme-git
@@ -0,0 +1 @@
+A flat colorful design icon theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/telegram-desktop b/usr/share/sofirem/cache/telegram-desktop
new file mode 100644
index 0000000..dfc31db
--- /dev/null
+++ b/usr/share/sofirem/cache/telegram-desktop
@@ -0,0 +1 @@
+Official Telegram Desktop client
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/telegram-desktop-bin b/usr/share/sofirem/cache/telegram-desktop-bin
new file mode 100644
index 0000000..b762bd4
--- /dev/null
+++ b/usr/share/sofirem/cache/telegram-desktop-bin
@@ -0,0 +1 @@
+Official desktop version of Telegram messaging app - Static binaries
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tempus-themes-xfce4-terminal-git b/usr/share/sofirem/cache/tempus-themes-xfce4-terminal-git
new file mode 100644
index 0000000..355fbcf
--- /dev/null
+++ b/usr/share/sofirem/cache/tempus-themes-xfce4-terminal-git
@@ -0,0 +1 @@
+Tempus themes for Xfce4 Terminal
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/terminator b/usr/share/sofirem/cache/terminator
new file mode 100644
index 0000000..ea53636
--- /dev/null
+++ b/usr/share/sofirem/cache/terminator
@@ -0,0 +1 @@
+Terminal emulator that supports tabs and grids
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/termite b/usr/share/sofirem/cache/termite
new file mode 100644
index 0000000..402e69b
--- /dev/null
+++ b/usr/share/sofirem/cache/termite
@@ -0,0 +1 @@
+A simple VTE-based terminal
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/the_platinum_searcher-bin b/usr/share/sofirem/cache/the_platinum_searcher-bin
new file mode 100644
index 0000000..70fd696
--- /dev/null
+++ b/usr/share/sofirem/cache/the_platinum_searcher-bin
@@ -0,0 +1 @@
+A code search tool similar to ack, the_silver_searcher (ag) and ripgrep (rg).
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/the_silver_searcher b/usr/share/sofirem/cache/the_silver_searcher
new file mode 100644
index 0000000..b0ca0b5
--- /dev/null
+++ b/usr/share/sofirem/cache/the_silver_searcher
@@ -0,0 +1 @@
+Code searching tool similar to Ack, but faster
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunar b/usr/share/sofirem/cache/thunar
new file mode 100644
index 0000000..0c8c670
--- /dev/null
+++ b/usr/share/sofirem/cache/thunar
@@ -0,0 +1 @@
+Modern file manager for Xfce
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunar-archive-plugin b/usr/share/sofirem/cache/thunar-archive-plugin
new file mode 100644
index 0000000..1963f1e
--- /dev/null
+++ b/usr/share/sofirem/cache/thunar-archive-plugin
@@ -0,0 +1 @@
+Adds archive operations to the Thunar file context menus
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunar-extended b/usr/share/sofirem/cache/thunar-extended
new file mode 100644
index 0000000..5cef923
--- /dev/null
+++ b/usr/share/sofirem/cache/thunar-extended
@@ -0,0 +1 @@
+Thunar with more options
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunar-media-tags-plugin b/usr/share/sofirem/cache/thunar-media-tags-plugin
new file mode 100644
index 0000000..874b655
--- /dev/null
+++ b/usr/share/sofirem/cache/thunar-media-tags-plugin
@@ -0,0 +1 @@
+Adds special features for media files to the Thunar File Manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunar-shares-plugin b/usr/share/sofirem/cache/thunar-shares-plugin
new file mode 100644
index 0000000..8a8b30a
--- /dev/null
+++ b/usr/share/sofirem/cache/thunar-shares-plugin
@@ -0,0 +1 @@
+Thunar plugin to quickly share a folder using Samba without requiring root access
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunar-volman b/usr/share/sofirem/cache/thunar-volman
new file mode 100644
index 0000000..545f93a
--- /dev/null
+++ b/usr/share/sofirem/cache/thunar-volman
@@ -0,0 +1 @@
+Automatic management of removeable devices in Thunar
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/thunderbird b/usr/share/sofirem/cache/thunderbird
new file mode 100644
index 0000000..11ee42c
--- /dev/null
+++ b/usr/share/sofirem/cache/thunderbird
@@ -0,0 +1 @@
+Standalone mail and news reader from mozilla.org
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tigervnc b/usr/share/sofirem/cache/tigervnc
new file mode 100644
index 0000000..23f86b8
--- /dev/null
+++ b/usr/share/sofirem/cache/tigervnc
@@ -0,0 +1 @@
+Suite of VNC servers and clients. Based on the VNC 4 branch of TightVNC.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tilda b/usr/share/sofirem/cache/tilda
new file mode 100644
index 0000000..0adb8f6
--- /dev/null
+++ b/usr/share/sofirem/cache/tilda
@@ -0,0 +1 @@
+A Gtk based drop down terminal for Linux and Unix
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tilix b/usr/share/sofirem/cache/tilix
new file mode 100644
index 0000000..14df233
--- /dev/null
+++ b/usr/share/sofirem/cache/tilix
@@ -0,0 +1 @@
+A tiling terminal emulator for Linux using GTK+ 3
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/timeshift b/usr/share/sofirem/cache/timeshift
new file mode 100644
index 0000000..505cc34
--- /dev/null
+++ b/usr/share/sofirem/cache/timeshift
@@ -0,0 +1 @@
+A system restore utility for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/timeshift-autosnap b/usr/share/sofirem/cache/timeshift-autosnap
new file mode 100644
index 0000000..9285e70
--- /dev/null
+++ b/usr/share/sofirem/cache/timeshift-autosnap
@@ -0,0 +1 @@
+Timeshift auto-snapshot script which runs before package upgrade using Pacman hook.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tint2 b/usr/share/sofirem/cache/tint2
new file mode 100644
index 0000000..791f960
--- /dev/null
+++ b/usr/share/sofirem/cache/tint2
@@ -0,0 +1 @@
+Basic, good-looking task manager for WMs
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tlp b/usr/share/sofirem/cache/tlp
new file mode 100644
index 0000000..18f232a
--- /dev/null
+++ b/usr/share/sofirem/cache/tlp
@@ -0,0 +1 @@
+Linux Advanced Power Management
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tmux b/usr/share/sofirem/cache/tmux
new file mode 100644
index 0000000..52c28c9
--- /dev/null
+++ b/usr/share/sofirem/cache/tmux
@@ -0,0 +1 @@
+A terminal multiplexer
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/toilet b/usr/share/sofirem/cache/toilet
new file mode 100644
index 0000000..d539ba2
--- /dev/null
+++ b/usr/share/sofirem/cache/toilet
@@ -0,0 +1 @@
+free replacement for the FIGlet utility.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/topgrade b/usr/share/sofirem/cache/topgrade
new file mode 100644
index 0000000..3ddbaca
--- /dev/null
+++ b/usr/share/sofirem/cache/topgrade
@@ -0,0 +1 @@
+Invoke the upgrade procedure of multiple package managers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/topgrade-bin b/usr/share/sofirem/cache/topgrade-bin
new file mode 100644
index 0000000..3ddbaca
--- /dev/null
+++ b/usr/share/sofirem/cache/topgrade-bin
@@ -0,0 +1 @@
+Invoke the upgrade procedure of multiple package managers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/topgrade-git b/usr/share/sofirem/cache/topgrade-git
new file mode 100644
index 0000000..3ddbaca
--- /dev/null
+++ b/usr/share/sofirem/cache/topgrade-git
@@ -0,0 +1 @@
+Invoke the upgrade procedure of multiple package managers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tor b/usr/share/sofirem/cache/tor
new file mode 100644
index 0000000..5dea13f
--- /dev/null
+++ b/usr/share/sofirem/cache/tor
@@ -0,0 +1 @@
+Anonymizing overlay network.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tor-browser b/usr/share/sofirem/cache/tor-browser
new file mode 100644
index 0000000..a7dfc20
--- /dev/null
+++ b/usr/share/sofirem/cache/tor-browser
@@ -0,0 +1 @@
+Tor Browser Bundle: anonymous browsing using Firefox and Tor (international PKGBUILD)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/torbrowser-launcher b/usr/share/sofirem/cache/torbrowser-launcher
new file mode 100644
index 0000000..ce7add7
--- /dev/null
+++ b/usr/share/sofirem/cache/torbrowser-launcher
@@ -0,0 +1 @@
+Securely and easily download, verify, install, and launch Tor Browser in Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/transmission-gtk b/usr/share/sofirem/cache/transmission-gtk
new file mode 100644
index 0000000..23e6ebf
--- /dev/null
+++ b/usr/share/sofirem/cache/transmission-gtk
@@ -0,0 +1 @@
+Fast, easy, and free BitTorrent client (GTK+ GUI)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/trizen b/usr/share/sofirem/cache/trizen
new file mode 100644
index 0000000..b06e7d2
--- /dev/null
+++ b/usr/share/sofirem/cache/trizen
@@ -0,0 +1 @@
+Trizen AUR Package Manager: lightweight pacman wrapper and AUR helper.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-anonymous-pro b/usr/share/sofirem/cache/ttf-anonymous-pro
new file mode 100644
index 0000000..0de4e60
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-anonymous-pro
@@ -0,0 +1 @@
+A family of four fixed-width fonts designed especially with coding in mind
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-bitstream-vera b/usr/share/sofirem/cache/ttf-bitstream-vera
new file mode 100644
index 0000000..cfaf01e
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-bitstream-vera
@@ -0,0 +1 @@
+Bitstream Vera fonts.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-caladea b/usr/share/sofirem/cache/ttf-caladea
new file mode 100644
index 0000000..fa69f39
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-caladea
@@ -0,0 +1 @@
+A serif font family metric-compatible with Cambria font family
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-carlito b/usr/share/sofirem/cache/ttf-carlito
new file mode 100644
index 0000000..ddc5de1
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-carlito
@@ -0,0 +1 @@
+Google's Carlito font
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-cascadia-code b/usr/share/sofirem/cache/ttf-cascadia-code
new file mode 100644
index 0000000..158ec81
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-cascadia-code
@@ -0,0 +1 @@
+A monospaced font by Microsoft that includes programming ligatures
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-cormorant b/usr/share/sofirem/cache/ttf-cormorant
new file mode 100644
index 0000000..ebae8e0
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-cormorant
@@ -0,0 +1 @@
+Open-source display font family
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-croscore b/usr/share/sofirem/cache/ttf-croscore
new file mode 100644
index 0000000..f4ccd9a
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-croscore
@@ -0,0 +1 @@
+Chrome OS core fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-dejavu b/usr/share/sofirem/cache/ttf-dejavu
new file mode 100644
index 0000000..7ac54cd
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-dejavu
@@ -0,0 +1 @@
+Font family based on the Bitstream Vera Fonts with a wider range of characters
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-droid b/usr/share/sofirem/cache/ttf-droid
new file mode 100644
index 0000000..44cc5dc
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-droid
@@ -0,0 +1 @@
+General-purpose fonts released by Google as part of Android
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-eurof b/usr/share/sofirem/cache/ttf-eurof
new file mode 100644
index 0000000..154e576
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-eurof
@@ -0,0 +1 @@
+The original eurofurence font designed for headlines, signs, badges, inscriptions, et al.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-fantasque-sans-mono b/usr/share/sofirem/cache/ttf-fantasque-sans-mono
new file mode 100644
index 0000000..fa6c7f7
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-fantasque-sans-mono
@@ -0,0 +1 @@
+Font family with a great monospaced variant for programmers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-fira-code b/usr/share/sofirem/cache/ttf-fira-code
new file mode 100644
index 0000000..d100a47
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-fira-code
@@ -0,0 +1 @@
+Monospaced font with programming ligatures
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-fira-mono b/usr/share/sofirem/cache/ttf-fira-mono
new file mode 100644
index 0000000..5f37357
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-fira-mono
@@ -0,0 +1 @@
+Mozilla's monospace typeface designed for Firefox OS
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-fira-sans b/usr/share/sofirem/cache/ttf-fira-sans
new file mode 100644
index 0000000..1587ddb
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-fira-sans
@@ -0,0 +1 @@
+Mozilla's sans-serif typeface designed for Firefox OS
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-font-awesome b/usr/share/sofirem/cache/ttf-font-awesome
new file mode 100644
index 0000000..d2ca94f
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-font-awesome
@@ -0,0 +1 @@
+Iconic font designed for Bootstrap
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-hack b/usr/share/sofirem/cache/ttf-hack
new file mode 100644
index 0000000..cd4a486
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-hack
@@ -0,0 +1 @@
+A hand groomed and optically balanced typeface based on Bitstream Vera Mono.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-hactor b/usr/share/sofirem/cache/ttf-hactor
new file mode 100644
index 0000000..39a47f8
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-hactor
@@ -0,0 +1 @@
+A font alternative to Operator Mono by combination of Hack and Victor Mono.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-hellvetica b/usr/share/sofirem/cache/ttf-hellvetica
new file mode 100644
index 0000000..09234f4
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-hellvetica
@@ -0,0 +1 @@
+Like Helvetica, but with like, much shittier kerning for Halloween
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-ibm-plex b/usr/share/sofirem/cache/ttf-ibm-plex
new file mode 100644
index 0000000..9807840
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-ibm-plex
@@ -0,0 +1 @@
+IBM Plex Mono, Sans, and Serif
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-inconsolata b/usr/share/sofirem/cache/ttf-inconsolata
new file mode 100644
index 0000000..1fa3c50
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-inconsolata
@@ -0,0 +1 @@
+Monospace font for pretty code listings and for the terminal
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-iosevka-nerd b/usr/share/sofirem/cache/ttf-iosevka-nerd
new file mode 100644
index 0000000..781f143
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-iosevka-nerd
@@ -0,0 +1 @@
+Typeface family designed for coding, terminal use and technical documents (Nerd Fonts)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-jetbrains-mono b/usr/share/sofirem/cache/ttf-jetbrains-mono
new file mode 100644
index 0000000..964c971
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-jetbrains-mono
@@ -0,0 +1 @@
+Typeface for developers, by JetBrains
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-jetbrains-mono-nerd b/usr/share/sofirem/cache/ttf-jetbrains-mono-nerd
new file mode 100644
index 0000000..38d4d6b
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-jetbrains-mono-nerd
@@ -0,0 +1 @@
+JetBrains font patched for nerd fonts library
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-joypixels b/usr/share/sofirem/cache/ttf-joypixels
new file mode 100644
index 0000000..7ee343c
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-joypixels
@@ -0,0 +1 @@
+Emoji as a Service (formerly EmojiOne)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-lato b/usr/share/sofirem/cache/ttf-lato
new file mode 100644
index 0000000..74b5c84
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-lato
@@ -0,0 +1 @@
+A sanserif typeface family bearing the Polish name of "Summer"
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-liberation b/usr/share/sofirem/cache/ttf-liberation
new file mode 100644
index 0000000..5519e05
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-liberation
@@ -0,0 +1 @@
+Font family which aims at metric compatibility with Arial, Times New Roman, and Courier New
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-linux-libertine b/usr/share/sofirem/cache/ttf-linux-libertine
new file mode 100644
index 0000000..8090a03
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-linux-libertine
@@ -0,0 +1 @@
+Serif (Libertine) and Sans Serif (Biolinum) OpenType fonts with large Unicode coverage
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-linux-libertine-g b/usr/share/sofirem/cache/ttf-linux-libertine-g
new file mode 100644
index 0000000..8954cbd
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-linux-libertine-g
@@ -0,0 +1 @@
+Graphite port of Linux Libertine and Linux Biolinum fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-mac-fonts b/usr/share/sofirem/cache/ttf-mac-fonts
new file mode 100644
index 0000000..270f7a1
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-mac-fonts
@@ -0,0 +1 @@
+Mac fonts including Lucida Grande, Apple Garamond and other fonts from Apple
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-material-design-iconic-font b/usr/share/sofirem/cache/ttf-material-design-iconic-font
new file mode 100644
index 0000000..f3d3705
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-material-design-iconic-font
@@ -0,0 +1 @@
+Material Design Iconic Font is a full suite of material design icons (created and maintained by Google) with additional community-designed and brands icons for easy scalable vector graphics on websites or desktop.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-meslo-nerd-font-powerlevel10k b/usr/share/sofirem/cache/ttf-meslo-nerd-font-powerlevel10k
new file mode 100644
index 0000000..7968a53
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-meslo-nerd-font-powerlevel10k
@@ -0,0 +1 @@
+Meslo Nerd Font patched for Powerlevel10k
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-monofur b/usr/share/sofirem/cache/ttf-monofur
new file mode 100644
index 0000000..1a7f342
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-monofur
@@ -0,0 +1 @@
+A monospaced font derived from the eurofurence typeface family
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-ms-fonts b/usr/share/sofirem/cache/ttf-ms-fonts
new file mode 100644
index 0000000..b075e58
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-ms-fonts
@@ -0,0 +1 @@
+Core TTF Fonts from Microsoft
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-nerd-fonts-symbols b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols
new file mode 100644
index 0000000..62cf29f
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols
@@ -0,0 +1 @@
+High number of extra glyphs from popular 'iconic fonts' (2048-em)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-1000-em b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-1000-em
new file mode 100644
index 0000000..689605a
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-1000-em
@@ -0,0 +1 @@
+High number of extra glyphs from popular 'iconic fonts' (1000-em)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-1000-em-mono b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-1000-em-mono
new file mode 100644
index 0000000..14bb1b4
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-1000-em-mono
@@ -0,0 +1 @@
+High number of extra glyphs from popular 'iconic fonts' (1000-em monospace)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-mono b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-mono
new file mode 100644
index 0000000..689605a
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-nerd-fonts-symbols-mono
@@ -0,0 +1 @@
+High number of extra glyphs from popular 'iconic fonts' (1000-em)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-opensans b/usr/share/sofirem/cache/ttf-opensans
new file mode 100644
index 0000000..967b4be
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-opensans
@@ -0,0 +1 @@
+Sans-serif typeface commissioned by Google
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-proggy-clean b/usr/share/sofirem/cache/ttf-proggy-clean
new file mode 100644
index 0000000..77590e1
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-proggy-clean
@@ -0,0 +1 @@
+Monospaced fonts for programming
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-roboto b/usr/share/sofirem/cache/ttf-roboto
new file mode 100644
index 0000000..4ac9450
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-roboto
@@ -0,0 +1 @@
+Google's signature family of fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-roboto-mono b/usr/share/sofirem/cache/ttf-roboto-mono
new file mode 100644
index 0000000..f21365e
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-roboto-mono
@@ -0,0 +1 @@
+A monospaced addition to the Roboto type family.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-sourcecodepro-nerd b/usr/share/sofirem/cache/ttf-sourcecodepro-nerd
new file mode 100644
index 0000000..4318257
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-sourcecodepro-nerd
@@ -0,0 +1 @@
+Patched Source Code Pro from nerd fonts
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-ubuntu-font-family b/usr/share/sofirem/cache/ttf-ubuntu-font-family
new file mode 100644
index 0000000..dbe4939
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-ubuntu-font-family
@@ -0,0 +1 @@
+Ubuntu font family
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ttf-wps-fonts b/usr/share/sofirem/cache/ttf-wps-fonts
new file mode 100644
index 0000000..90e8b56
--- /dev/null
+++ b/usr/share/sofirem/cache/ttf-wps-fonts
@@ -0,0 +1 @@
+Symbol fonts required by wps-office.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tty-clock b/usr/share/sofirem/cache/tty-clock
new file mode 100644
index 0000000..4013e27
--- /dev/null
+++ b/usr/share/sofirem/cache/tty-clock
@@ -0,0 +1 @@
+Digital clock in ncurses
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tty-clock-git b/usr/share/sofirem/cache/tty-clock-git
new file mode 100644
index 0000000..4013e27
--- /dev/null
+++ b/usr/share/sofirem/cache/tty-clock-git
@@ -0,0 +1 @@
+Digital clock in ncurses
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tuxboot b/usr/share/sofirem/cache/tuxboot
new file mode 100644
index 0000000..1c94562
--- /dev/null
+++ b/usr/share/sofirem/cache/tuxboot
@@ -0,0 +1 @@
+A tool that helps you to create a bootable Live USB drive for Clonezilla live, DRBL live, GParted live and Tux2live
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tuxboot-git b/usr/share/sofirem/cache/tuxboot-git
new file mode 100644
index 0000000..2fa7a16
--- /dev/null
+++ b/usr/share/sofirem/cache/tuxboot-git
@@ -0,0 +1 @@
+A tool that helps you to create a bootable Live USB drive for Clonezilla live, DRBL live, GParted live and Tux2live. Development version
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/tweetdeck-desktop b/usr/share/sofirem/cache/tweetdeck-desktop
new file mode 100644
index 0000000..f5c4e08
--- /dev/null
+++ b/usr/share/sofirem/cache/tweetdeck-desktop
@@ -0,0 +1 @@
+An unofficial tweetdeck desktop app
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ufetch-arco-git b/usr/share/sofirem/cache/ufetch-arco-git
new file mode 100644
index 0000000..b74994e
--- /dev/null
+++ b/usr/share/sofirem/cache/ufetch-arco-git
@@ -0,0 +1 @@
+Info script for minimal *nix systems.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ufetch-git b/usr/share/sofirem/cache/ufetch-git
new file mode 100644
index 0000000..3b02245
--- /dev/null
+++ b/usr/share/sofirem/cache/ufetch-git
@@ -0,0 +1 @@
+Tiny system info for Unix-like operating systems
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ulauncher b/usr/share/sofirem/cache/ulauncher
new file mode 100644
index 0000000..08f5767
--- /dev/null
+++ b/usr/share/sofirem/cache/ulauncher
@@ -0,0 +1 @@
+Application launcher for Linux
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/unimatrix-git b/usr/share/sofirem/cache/unimatrix-git
new file mode 100644
index 0000000..0ff4719
--- /dev/null
+++ b/usr/share/sofirem/cache/unimatrix-git
@@ -0,0 +1 @@
+Python script to simulate the display from "The Matrix" in terminal. Uses half-width katakana unicode characters by default, but can use custom character sets.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/upower b/usr/share/sofirem/cache/upower
new file mode 100644
index 0000000..356baf1
--- /dev/null
+++ b/usr/share/sofirem/cache/upower
@@ -0,0 +1 @@
+Abstraction for enumerating power devices, listening to device events and querying history and statistics
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/urxvt-fullscreen b/usr/share/sofirem/cache/urxvt-fullscreen
new file mode 100644
index 0000000..088773d
--- /dev/null
+++ b/usr/share/sofirem/cache/urxvt-fullscreen
@@ -0,0 +1 @@
+script to switch fullscreen and above-other-windows on urxvt
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/urxvt-perls b/usr/share/sofirem/cache/urxvt-perls
new file mode 100644
index 0000000..61edeb3
--- /dev/null
+++ b/usr/share/sofirem/cache/urxvt-perls
@@ -0,0 +1 @@
+URL and Mouseless text selection for rxvt-unicode
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/urxvt-resize-font-git b/usr/share/sofirem/cache/urxvt-resize-font-git
new file mode 100644
index 0000000..0ae9ba0
--- /dev/null
+++ b/usr/share/sofirem/cache/urxvt-resize-font-git
@@ -0,0 +1 @@
+An urxvt plugin to adjust the font size on the fly
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/variety b/usr/share/sofirem/cache/variety
new file mode 100644
index 0000000..87d41a9
--- /dev/null
+++ b/usr/share/sofirem/cache/variety
@@ -0,0 +1 @@
+Changes the wallpaper on a regular interval using user-specified or automatically downloaded images.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/ventoy-bin b/usr/share/sofirem/cache/ventoy-bin
new file mode 100644
index 0000000..e591438
--- /dev/null
+++ b/usr/share/sofirem/cache/ventoy-bin
@@ -0,0 +1 @@
+A new multiboot USB solution
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/viber b/usr/share/sofirem/cache/viber
new file mode 100644
index 0000000..3f5d3d9
--- /dev/null
+++ b/usr/share/sofirem/cache/viber
@@ -0,0 +1 @@
+Proprietary cross-platform IM and VoIP software
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vicious b/usr/share/sofirem/cache/vicious
new file mode 100644
index 0000000..afcd387
--- /dev/null
+++ b/usr/share/sofirem/cache/vicious
@@ -0,0 +1 @@
+Widgets for the Awesome window manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vim b/usr/share/sofirem/cache/vim
new file mode 100644
index 0000000..c9ed3bd
--- /dev/null
+++ b/usr/share/sofirem/cache/vim
@@ -0,0 +1 @@
+Vi Improved, a highly configurable, improved version of the vi text editor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vim-runtime b/usr/share/sofirem/cache/vim-runtime
new file mode 100644
index 0000000..eaf1e78
--- /dev/null
+++ b/usr/share/sofirem/cache/vim-runtime
@@ -0,0 +1 @@
+Vi Improved, a highly configurable, improved version of the vi text editor (shared runtime)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vimix-cursors b/usr/share/sofirem/cache/vimix-cursors
new file mode 100644
index 0000000..3ad6e7b
--- /dev/null
+++ b/usr/share/sofirem/cache/vimix-cursors
@@ -0,0 +1 @@
+An X Cursor theme inspired by Material design and based on capitaine-cursors
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vimix-icon-theme-git b/usr/share/sofirem/cache/vimix-icon-theme-git
new file mode 100644
index 0000000..8c5f891
--- /dev/null
+++ b/usr/share/sofirem/cache/vimix-icon-theme-git
@@ -0,0 +1 @@
+A Material Design icon theme based on Paper Icon Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/virtualbox b/usr/share/sofirem/cache/virtualbox
new file mode 100644
index 0000000..2fd1082
--- /dev/null
+++ b/usr/share/sofirem/cache/virtualbox
@@ -0,0 +1 @@
+Powerful x86 virtualization for enterprise as well as home use
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/virtualbox-host-dkms b/usr/share/sofirem/cache/virtualbox-host-dkms
new file mode 100644
index 0000000..67a9ae9
--- /dev/null
+++ b/usr/share/sofirem/cache/virtualbox-host-dkms
@@ -0,0 +1 @@
+VirtualBox Host kernel modules sources
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/visual-studio-code-bin b/usr/share/sofirem/cache/visual-studio-code-bin
new file mode 100644
index 0000000..16f087b
--- /dev/null
+++ b/usr/share/sofirem/cache/visual-studio-code-bin
@@ -0,0 +1 @@
+Visual Studio Code (vscode): Editor for building and debugging modern web and cloud applications (official binary version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vivaldi b/usr/share/sofirem/cache/vivaldi
new file mode 100644
index 0000000..942c1b9
--- /dev/null
+++ b/usr/share/sofirem/cache/vivaldi
@@ -0,0 +1 @@
+An advanced browser made with the power user in mind.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vivaldi-ffmpeg-codecs b/usr/share/sofirem/cache/vivaldi-ffmpeg-codecs
new file mode 100644
index 0000000..638d628
--- /dev/null
+++ b/usr/share/sofirem/cache/vivaldi-ffmpeg-codecs
@@ -0,0 +1 @@
+additional support for proprietary codecs for vivaldi
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vivaldi-widevine b/usr/share/sofirem/cache/vivaldi-widevine
new file mode 100644
index 0000000..19d5bb5
--- /dev/null
+++ b/usr/share/sofirem/cache/vivaldi-widevine
@@ -0,0 +1 @@
+A browser plugin designed for the viewing of premium video content, standalone for vivaldi
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vkbasalt b/usr/share/sofirem/cache/vkbasalt
new file mode 100644
index 0000000..65a41b0
--- /dev/null
+++ b/usr/share/sofirem/cache/vkbasalt
@@ -0,0 +1 @@
+A Vulkan post-processing layer. Some of the effects are CAS, FXAA, SMAA, deband.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vlc b/usr/share/sofirem/cache/vlc
new file mode 100644
index 0000000..5e3942f
--- /dev/null
+++ b/usr/share/sofirem/cache/vlc
@@ -0,0 +1 @@
+Multi-platform MPEG, VCD/DVD, and DivX player
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vmware-keymaps b/usr/share/sofirem/cache/vmware-keymaps
new file mode 100644
index 0000000..3469752
--- /dev/null
+++ b/usr/share/sofirem/cache/vmware-keymaps
@@ -0,0 +1 @@
+Keymaps required by some VMware packages
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vmware-workstation b/usr/share/sofirem/cache/vmware-workstation
new file mode 100644
index 0000000..63c71ab
--- /dev/null
+++ b/usr/share/sofirem/cache/vmware-workstation
@@ -0,0 +1 @@
+The industry standard for running multiple operating systems as virtual machines on a single Linux PC.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vnstat b/usr/share/sofirem/cache/vnstat
new file mode 100644
index 0000000..9f39524
--- /dev/null
+++ b/usr/share/sofirem/cache/vnstat
@@ -0,0 +1 @@
+A console-based network traffic monitor
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/volumeicon b/usr/share/sofirem/cache/volumeicon
new file mode 100644
index 0000000..2d0be04
--- /dev/null
+++ b/usr/share/sofirem/cache/volumeicon
@@ -0,0 +1 @@
+Volume control for the system tray
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/vscodium-bin b/usr/share/sofirem/cache/vscodium-bin
new file mode 100644
index 0000000..ecf5968
--- /dev/null
+++ b/usr/share/sofirem/cache/vscodium-bin
@@ -0,0 +1 @@
+Binary releases of VS Code without MS branding/telemetry/licensing.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wacom-settings-git b/usr/share/sofirem/cache/wacom-settings-git
new file mode 100644
index 0000000..8bfca9a
--- /dev/null
+++ b/usr/share/sofirem/cache/wacom-settings-git
@@ -0,0 +1 @@
+GUI for calibrating the wacom tablet to a screen or window
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wacom-utility b/usr/share/sofirem/cache/wacom-utility
new file mode 100644
index 0000000..5e40ea7
--- /dev/null
+++ b/usr/share/sofirem/cache/wacom-utility
@@ -0,0 +1 @@
+Graphical tablet configuration utility
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/warsow b/usr/share/sofirem/cache/warsow
new file mode 100644
index 0000000..079d48a
--- /dev/null
+++ b/usr/share/sofirem/cache/warsow
@@ -0,0 +1 @@
+Free online multiplayer competitive FPS based on the Qfusion engine
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/waydroid b/usr/share/sofirem/cache/waydroid
new file mode 100644
index 0000000..1c73275
--- /dev/null
+++ b/usr/share/sofirem/cache/waydroid
@@ -0,0 +1 @@
+A container-based approach to boot a full Android system on a regular Linux system
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/we10x-icon-theme-git b/usr/share/sofirem/cache/we10x-icon-theme-git
new file mode 100644
index 0000000..38b6c74
--- /dev/null
+++ b/usr/share/sofirem/cache/we10x-icon-theme-git
@@ -0,0 +1 @@
+A colorful design icon theme for linux desktops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wesnoth b/usr/share/sofirem/cache/wesnoth
new file mode 100644
index 0000000..88269e6
--- /dev/null
+++ b/usr/share/sofirem/cache/wesnoth
@@ -0,0 +1 @@
+A turn-based strategy game on a fantasy world
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/whatsapp-nativefier b/usr/share/sofirem/cache/whatsapp-nativefier
new file mode 100644
index 0000000..7f5e848
--- /dev/null
+++ b/usr/share/sofirem/cache/whatsapp-nativefier
@@ -0,0 +1 @@
+WhatsApp desktop built with nativefier (electron)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/whitesur-icon-theme-git b/usr/share/sofirem/cache/whitesur-icon-theme-git
new file mode 100644
index 0000000..157e2d9
--- /dev/null
+++ b/usr/share/sofirem/cache/whitesur-icon-theme-git
@@ -0,0 +1 @@
+MacOS Big Sur style icon theme for linux desktops
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wire-desktop b/usr/share/sofirem/cache/wire-desktop
new file mode 100644
index 0000000..4538d77
--- /dev/null
+++ b/usr/share/sofirem/cache/wire-desktop
@@ -0,0 +1 @@
+End-to-end encrypted messenger with file sharing, voice calls and video conferences
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wireshark-qt b/usr/share/sofirem/cache/wireshark-qt
new file mode 100644
index 0000000..75fa5c0
--- /dev/null
+++ b/usr/share/sofirem/cache/wireshark-qt
@@ -0,0 +1 @@
+Network traffic and protocol analyzer/sniffer - Qt GUI
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wmderland-git b/usr/share/sofirem/cache/wmderland-git
new file mode 100644
index 0000000..1500d59
--- /dev/null
+++ b/usr/share/sofirem/cache/wmderland-git
@@ -0,0 +1 @@
+X11 tiling window manager using space partitioning trees
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/woeusb b/usr/share/sofirem/cache/woeusb
new file mode 100644
index 0000000..8d2c60c
--- /dev/null
+++ b/usr/share/sofirem/cache/woeusb
@@ -0,0 +1 @@
+A Linux program to create Windows USB stick installer from a Windows DVD or an image
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/workrave b/usr/share/sofirem/cache/workrave
new file mode 100644
index 0000000..cf1bc82
--- /dev/null
+++ b/usr/share/sofirem/cache/workrave
@@ -0,0 +1 @@
+Assist in the recovery and prevention of Repetitive Strain Injury (RSI)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/worm-dev-git b/usr/share/sofirem/cache/worm-dev-git
new file mode 100644
index 0000000..3d22df0
--- /dev/null
+++ b/usr/share/sofirem/cache/worm-dev-git
@@ -0,0 +1 @@
+A floating, tag-based window manager written in Nim
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wps-office b/usr/share/sofirem/cache/wps-office
new file mode 100644
index 0000000..526c24a
--- /dev/null
+++ b/usr/share/sofirem/cache/wps-office
@@ -0,0 +1 @@
+Kingsoft Office (WPS Office) - an office productivity suite
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wps-office-mime b/usr/share/sofirem/cache/wps-office-mime
new file mode 100644
index 0000000..60d0a58
--- /dev/null
+++ b/usr/share/sofirem/cache/wps-office-mime
@@ -0,0 +1 @@
+Mime files provided by Kingsoft Office (WPS Office)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/wttr b/usr/share/sofirem/cache/wttr
new file mode 100644
index 0000000..633171e
--- /dev/null
+++ b/usr/share/sofirem/cache/wttr
@@ -0,0 +1 @@
+a simple script that helps you check weather condition using site : http://wttr.in
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcape b/usr/share/sofirem/cache/xcape
new file mode 100644
index 0000000..98ce6a2
--- /dev/null
+++ b/usr/share/sofirem/cache/xcape
@@ -0,0 +1 @@
+Configure modifier keys to act as other keys when pressed and released on their own
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-arch-cursor-complete b/usr/share/sofirem/cache/xcursor-arch-cursor-complete
new file mode 100644
index 0000000..f239e7d
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-arch-cursor-complete
@@ -0,0 +1 @@
+Expansion of Arch Cursor Simple theme that keeps the best and modifies the rest.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-breeze b/usr/share/sofirem/cache/xcursor-breeze
new file mode 100644
index 0000000..517c4a9
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-breeze
@@ -0,0 +1 @@
+KDE Plasma 5 'Breeze' cursor theme. This package is for usage in non-KDE Plasma desktops.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-comix b/usr/share/sofirem/cache/xcursor-comix
new file mode 100644
index 0000000..9a92c73
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-comix
@@ -0,0 +1 @@
+Comix X Cursor Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-flatbed b/usr/share/sofirem/cache/xcursor-flatbed
new file mode 100644
index 0000000..f136b14
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-flatbed
@@ -0,0 +1 @@
+Flatbed XCursor Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-neutral b/usr/share/sofirem/cache/xcursor-neutral
new file mode 100644
index 0000000..8521040
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-neutral
@@ -0,0 +1 @@
+A smoothed and shadowed X cursors theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-premium b/usr/share/sofirem/cache/xcursor-premium
new file mode 100644
index 0000000..130d9fd
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-premium
@@ -0,0 +1 @@
+Premium X Cursor Theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xcursor-simpleandsoft b/usr/share/sofirem/cache/xcursor-simpleandsoft
new file mode 100644
index 0000000..4b7c2b6
--- /dev/null
+++ b/usr/share/sofirem/cache/xcursor-simpleandsoft
@@ -0,0 +1 @@
+A simple and soft X cursor theme
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xdgmenumaker b/usr/share/sofirem/cache/xdgmenumaker
new file mode 100644
index 0000000..2b4ddd4
--- /dev/null
+++ b/usr/share/sofirem/cache/xdgmenumaker
@@ -0,0 +1 @@
+A command line tool that generates XDG menus for several window managers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xdman b/usr/share/sofirem/cache/xdman
new file mode 100644
index 0000000..fb9bf83
--- /dev/null
+++ b/usr/share/sofirem/cache/xdman
@@ -0,0 +1 @@
+Xtreme Download Manager is a powerful tool to increase download speed up-to 500%, save videos from video sharing sites and integration with ANY browser.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xdo b/usr/share/sofirem/cache/xdo
new file mode 100644
index 0000000..953aba8
--- /dev/null
+++ b/usr/share/sofirem/cache/xdo
@@ -0,0 +1 @@
+Utility for performing actions on windows in X
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xf86-video-amdgpu b/usr/share/sofirem/cache/xf86-video-amdgpu
new file mode 100644
index 0000000..dc63e61
--- /dev/null
+++ b/usr/share/sofirem/cache/xf86-video-amdgpu
@@ -0,0 +1 @@
+X.org amdgpu video driver
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xf86-video-ati b/usr/share/sofirem/cache/xf86-video-ati
new file mode 100644
index 0000000..72eddf5
--- /dev/null
+++ b/usr/share/sofirem/cache/xf86-video-ati
@@ -0,0 +1 @@
+X.org ati video driver
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xf86-video-intel b/usr/share/sofirem/cache/xf86-video-intel
new file mode 100644
index 0000000..0f9eaa9
--- /dev/null
+++ b/usr/share/sofirem/cache/xf86-video-intel
@@ -0,0 +1 @@
+X.org Intel i810/i830/i915/945G/G965+ video drivers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xf86-video-nouveau b/usr/share/sofirem/cache/xf86-video-nouveau
new file mode 100644
index 0000000..ca9f4df
--- /dev/null
+++ b/usr/share/sofirem/cache/xf86-video-nouveau
@@ -0,0 +1 @@
+Open Source 3D acceleration driver for nVidia cards
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xf86-video-openchrome b/usr/share/sofirem/cache/xf86-video-openchrome
new file mode 100644
index 0000000..9bfe87b
--- /dev/null
+++ b/usr/share/sofirem/cache/xf86-video-openchrome
@@ -0,0 +1 @@
+X.Org Openchrome drivers
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xf86-video-vesa b/usr/share/sofirem/cache/xf86-video-vesa
new file mode 100644
index 0000000..297213e
--- /dev/null
+++ b/usr/share/sofirem/cache/xf86-video-vesa
@@ -0,0 +1 @@
+X.org vesa video driver
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfburn b/usr/share/sofirem/cache/xfburn
new file mode 100644
index 0000000..39a20e1
--- /dev/null
+++ b/usr/share/sofirem/cache/xfburn
@@ -0,0 +1 @@
+A simple CD/DVD burning tool based on libburnia libraries
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-notifyd b/usr/share/sofirem/cache/xfce4-notifyd
new file mode 100644
index 0000000..538e415
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-notifyd
@@ -0,0 +1 @@
+Notification daemon for the Xfce desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-power-manager b/usr/share/sofirem/cache/xfce4-power-manager
new file mode 100644
index 0000000..221a3ca
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-power-manager
@@ -0,0 +1 @@
+Power manager for the Xfce desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-screenshooter b/usr/share/sofirem/cache/xfce4-screenshooter
new file mode 100644
index 0000000..671b63c
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-screenshooter
@@ -0,0 +1 @@
+An application to take screenshots
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-settings b/usr/share/sofirem/cache/xfce4-settings
new file mode 100644
index 0000000..16fe6b5
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-settings
@@ -0,0 +1 @@
+Settings manager of the Xfce desktop
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-taskmanager b/usr/share/sofirem/cache/xfce4-taskmanager
new file mode 100644
index 0000000..8cbf5df
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-taskmanager
@@ -0,0 +1 @@
+Easy to use task manager
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-terminal b/usr/share/sofirem/cache/xfce4-terminal
new file mode 100644
index 0000000..2c53908
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-terminal
@@ -0,0 +1 @@
+A modern terminal emulator primarily for the Xfce desktop environment
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xfce4-terminal-base16-colors-git b/usr/share/sofirem/cache/xfce4-terminal-base16-colors-git
new file mode 100644
index 0000000..4c63c32
--- /dev/null
+++ b/usr/share/sofirem/cache/xfce4-terminal-base16-colors-git
@@ -0,0 +1 @@
+base16 themes for XFCE terminal
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xlunch-git b/usr/share/sofirem/cache/xlunch-git
new file mode 100644
index 0000000..71309b6
--- /dev/null
+++ b/usr/share/sofirem/cache/xlunch-git
@@ -0,0 +1 @@
+Graphical app launcher for X with few dependencies
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xmonad b/usr/share/sofirem/cache/xmonad
new file mode 100644
index 0000000..a142999
--- /dev/null
+++ b/usr/share/sofirem/cache/xmonad
@@ -0,0 +1 @@
+Lightweight X11 tiled window manager written in Haskell
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xmonad-contrib b/usr/share/sofirem/cache/xmonad-contrib
new file mode 100644
index 0000000..0072a95
--- /dev/null
+++ b/usr/share/sofirem/cache/xmonad-contrib
@@ -0,0 +1 @@
+Add-ons for xmonad
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xmonad-log b/usr/share/sofirem/cache/xmonad-log
new file mode 100644
index 0000000..d36424e
--- /dev/null
+++ b/usr/share/sofirem/cache/xmonad-log
@@ -0,0 +1 @@
+DBus monitor for xmonad log events
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xmonad-utils b/usr/share/sofirem/cache/xmonad-utils
new file mode 100644
index 0000000..89e2705
--- /dev/null
+++ b/usr/share/sofirem/cache/xmonad-utils
@@ -0,0 +1 @@
+Small collection of X utilities
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xonotic b/usr/share/sofirem/cache/xonotic
new file mode 100644
index 0000000..6a70e2e
--- /dev/null
+++ b/usr/share/sofirem/cache/xonotic
@@ -0,0 +1 @@
+A free, fast-paced crossplatform first-person shooter
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xonotic-data b/usr/share/sofirem/cache/xonotic-data
new file mode 100644
index 0000000..f0b4951
--- /dev/null
+++ b/usr/share/sofirem/cache/xonotic-data
@@ -0,0 +1 @@
+A free, fast-paced crossplatform first-person shooter (data files)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xpdf b/usr/share/sofirem/cache/xpdf
new file mode 100644
index 0000000..98a45cf
--- /dev/null
+++ b/usr/share/sofirem/cache/xpdf
@@ -0,0 +1 @@
+Viewer for Portable Document Format (PDF) files
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xreader b/usr/share/sofirem/cache/xreader
new file mode 100644
index 0000000..962ea6c
--- /dev/null
+++ b/usr/share/sofirem/cache/xreader
@@ -0,0 +1 @@
+Document viewer for files like PDF and Postscript. X-Apps Project.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xscreensaver b/usr/share/sofirem/cache/xscreensaver
new file mode 100644
index 0000000..da63c7a
--- /dev/null
+++ b/usr/share/sofirem/cache/xscreensaver
@@ -0,0 +1 @@
+Screen saver and locker for the X Window System
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/xtitle-git b/usr/share/sofirem/cache/xtitle-git
new file mode 100644
index 0000000..3102e7c
--- /dev/null
+++ b/usr/share/sofirem/cache/xtitle-git
@@ -0,0 +1 @@
+Outputs X window titles
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yad b/usr/share/sofirem/cache/yad
new file mode 100644
index 0000000..b93fcf0
--- /dev/null
+++ b/usr/share/sofirem/cache/yad
@@ -0,0 +1 @@
+A fork of zenity - display graphical dialogs from shell scripts or command line
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yakuake b/usr/share/sofirem/cache/yakuake
new file mode 100644
index 0000000..fa67d3c
--- /dev/null
+++ b/usr/share/sofirem/cache/yakuake
@@ -0,0 +1 @@
+A drop-down terminal emulator based on KDE konsole technology
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yay b/usr/share/sofirem/cache/yay
new file mode 100644
index 0000000..379b6d9
--- /dev/null
+++ b/usr/share/sofirem/cache/yay
@@ -0,0 +1 @@
+Yet another yogurt. Pacman wrapper and AUR helper written in go.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yay-bin b/usr/share/sofirem/cache/yay-bin
new file mode 100644
index 0000000..b57bc3c
--- /dev/null
+++ b/usr/share/sofirem/cache/yay-bin
@@ -0,0 +1 @@
+Yet another yogurt. Pacman wrapper and AUR helper written in go. Pre-compiled.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yay-git b/usr/share/sofirem/cache/yay-git
new file mode 100644
index 0000000..4152532
--- /dev/null
+++ b/usr/share/sofirem/cache/yay-git
@@ -0,0 +1 @@
+Yet another yogurt. Pacman wrapper and AUR helper written in go. (development version)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yin-yang-git b/usr/share/sofirem/cache/yin-yang-git
new file mode 100644
index 0000000..0cf8920
--- /dev/null
+++ b/usr/share/sofirem/cache/yin-yang-git
@@ -0,0 +1 @@
+Auto Nightmode for KDE, Gnome, Budgie, VSCode, Atom and more
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/youtube-dl b/usr/share/sofirem/cache/youtube-dl
new file mode 100644
index 0000000..958eb6a
--- /dev/null
+++ b/usr/share/sofirem/cache/youtube-dl
@@ -0,0 +1 @@
+A command-line program to download videos from YouTube.com and a few more sites
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/youtube-dl-gui-git b/usr/share/sofirem/cache/youtube-dl-gui-git
new file mode 100644
index 0000000..8341348
--- /dev/null
+++ b/usr/share/sofirem/cache/youtube-dl-gui-git
@@ -0,0 +1 @@
+Cross platform front-end GUI of the popular youtube-dl written in wxPython
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/yt-dlp b/usr/share/sofirem/cache/yt-dlp
new file mode 100644
index 0000000..b6419af
--- /dev/null
+++ b/usr/share/sofirem/cache/yt-dlp
@@ -0,0 +1 @@
+A youtube-dl fork with additional features and fixes
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zafiro-icon-theme b/usr/share/sofirem/cache/zafiro-icon-theme
new file mode 100644
index 0000000..3a6e074
--- /dev/null
+++ b/usr/share/sofirem/cache/zafiro-icon-theme
@@ -0,0 +1 @@
+A icon pack flat with light and dark colors.
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zoom b/usr/share/sofirem/cache/zoom
new file mode 100644
index 0000000..1b64b50
--- /dev/null
+++ b/usr/share/sofirem/cache/zoom
@@ -0,0 +1 @@
+Video Conferencing and Web Conferencing Service
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh b/usr/share/sofirem/cache/zsh
new file mode 100644
index 0000000..cf36980
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh
@@ -0,0 +1 @@
+A very advanced and programmable command interpreter (shell) for UNIX
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-autosuggestions-git b/usr/share/sofirem/cache/zsh-autosuggestions-git
new file mode 100644
index 0000000..19319ac
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-autosuggestions-git
@@ -0,0 +1 @@
+Fish-like autosuggestions for zsh (from git)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-completions b/usr/share/sofirem/cache/zsh-completions
new file mode 100644
index 0000000..39660cc
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-completions
@@ -0,0 +1 @@
+Additional completion definitions for Zsh
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-fast-syntax-highlighting b/usr/share/sofirem/cache/zsh-fast-syntax-highlighting
new file mode 100644
index 0000000..045308a
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-fast-syntax-highlighting
@@ -0,0 +1 @@
+Optimized and extended zsh-syntax-highlighting
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-history-substring-search-git b/usr/share/sofirem/cache/zsh-history-substring-search-git
new file mode 100644
index 0000000..0df2d42
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-history-substring-search-git
@@ -0,0 +1 @@
+A ZSH plugin to search history, a clean-room implementation of the Fish shell feature
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-syntax-highlighting b/usr/share/sofirem/cache/zsh-syntax-highlighting
new file mode 100644
index 0000000..7536d03
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-syntax-highlighting
@@ -0,0 +1 @@
+Fish shell like syntax highlighting for Zsh
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-syntax-highlighting-git b/usr/share/sofirem/cache/zsh-syntax-highlighting-git
new file mode 100644
index 0000000..6cd0334
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-syntax-highlighting-git
@@ -0,0 +1 @@
+Fish shell like syntax highlighting for Zsh (from git)
\ No newline at end of file
diff --git a/usr/share/sofirem/cache/zsh-theme-powerlevel10k-git b/usr/share/sofirem/cache/zsh-theme-powerlevel10k-git
new file mode 100644
index 0000000..fea5c75
--- /dev/null
+++ b/usr/share/sofirem/cache/zsh-theme-powerlevel10k-git
@@ -0,0 +1 @@
+Powerlevel10k is a theme for Zsh. It emphasizes speed, flexibility and out-of-the-box experience.
\ No newline at end of file
diff --git a/usr/share/sofirem/defaults/sofirem.yaml b/usr/share/sofirem/defaults/sofirem.yaml
new file mode 100644
index 0000000..690a051
--- /dev/null
+++ b/usr/share/sofirem/defaults/sofirem.yaml
@@ -0,0 +1,11 @@
+- name: "Display Package Versions"
+ description: "Show package version labels alongside the package description "
+ enabled: False
+
+- name: "Display Package Progress"
+ description: "Show the package install/uninstall progress window "
+ enabled: False
+
+- name: "Debug Logging"
+ description: "Enable debug logging for more verbose app logging "
+ enabled: False
diff --git a/usr/share/sofirem/images/credits.png b/usr/share/sofirem/images/credits.png
new file mode 100644
index 0000000..d5996fb
Binary files /dev/null and b/usr/share/sofirem/images/credits.png differ
diff --git a/usr/share/sofirem/images/panel.png b/usr/share/sofirem/images/panel.png
new file mode 100644
index 0000000..564b434
Binary files /dev/null and b/usr/share/sofirem/images/panel.png differ
diff --git a/usr/share/sofirem/images/sofirem.png b/usr/share/sofirem/images/sofirem.png
new file mode 100644
index 0000000..0e55214
--- /dev/null
+++ b/usr/share/sofirem/images/sofirem.png
@@ -0,0 +1,62 @@
+
+
+
+
diff --git a/usr/share/sofirem/images/splash.png b/usr/share/sofirem/images/splash.png
new file mode 100644
index 0000000..af85682
Binary files /dev/null and b/usr/share/sofirem/images/splash.png differ
diff --git a/usr/share/sofirem/packages/arcolinux-keyring/arcolinux-keyring-20251209-3-any.pkg.tar.zst b/usr/share/sofirem/packages/arcolinux-keyring/arcolinux-keyring-20251209-3-any.pkg.tar.zst
new file mode 100644
index 0000000..5ecb294
Binary files /dev/null and b/usr/share/sofirem/packages/arcolinux-keyring/arcolinux-keyring-20251209-3-any.pkg.tar.zst differ
diff --git a/usr/share/sofirem/packages/arcolinux-mirrorlist/arcolinux-mirrorlist-git-24.03-12-any.pkg.tar.zst b/usr/share/sofirem/packages/arcolinux-mirrorlist/arcolinux-mirrorlist-git-24.03-12-any.pkg.tar.zst
new file mode 100644
index 0000000..438218a
Binary files /dev/null and b/usr/share/sofirem/packages/arcolinux-mirrorlist/arcolinux-mirrorlist-git-24.03-12-any.pkg.tar.zst differ
diff --git a/usr/share/sofirem/packages/arcolinux-mirrorlist/arcolinux-mirrorlist-nemesis-git-24.03-12-any.pkg.tar.zst b/usr/share/sofirem/packages/arcolinux-mirrorlist/arcolinux-mirrorlist-nemesis-git-24.03-12-any.pkg.tar.zst
new file mode 100644
index 0000000..22c3383
Binary files /dev/null and b/usr/share/sofirem/packages/arcolinux-mirrorlist/arcolinux-mirrorlist-nemesis-git-24.03-12-any.pkg.tar.zst differ
diff --git a/usr/share/sofirem/scripts/get-the-keys-and-repos.sh b/usr/share/sofirem/scripts/get-the-keys-and-repos.sh
new file mode 100755
index 0000000..a342882
--- /dev/null
+++ b/usr/share/sofirem/scripts/get-the-keys-and-repos.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+######################################################################################################################
+
+sudo pacman -S wget --noconfirm --needed
+
+echo "Getting the ArcoLinux keys from the ArcoLinux repo - report if link is broken"
+sudo wget https://github.com/arcolinux/arcolinux_repo/raw/main/x86_64/arcolinux-keyring-20251209-3-any.pkg.tar.zst -O /tmp/arcolinux-keyring-20251209-3-any.pkg.tar.zst
+sudo pacman -U --noconfirm --needed /tmp/arcolinux-keyring-20251209-3-any.pkg.tar.zst
+
+echo "Getting the latest arcolinux mirrors file - report if link is broken"
+sudo wget https://github.com/arcolinux/arcolinux_repo/raw/main/x86_64/arcolinux-mirrorlist-git-23.06-01-any.pkg.tar.zst -O /tmp/arcolinux-mirrorlist-git-23.06-01-any.pkg.tar.zst
+sudo pacman -U --noconfirm --needed /tmp/arcolinux-mirrorlist-git-23.06-01-any.pkg.tar.zst
+
+######################################################################################################################
+
+if grep -q arcolinux_repo /etc/pacman.conf; then
+
+ echo "ArcoLinux repos are already in /etc/pacman.conf"
+
+else
+
+echo '
+#[arcolinux_repo_testing]
+#SigLevel = PackageRequired DatabaseNever
+#Include = /etc/pacman.d/arcolinux-mirrorlist
+
+[arcolinux_repo]
+SigLevel = PackageRequired DatabaseNever
+Include = /etc/pacman.d/arcolinux-mirrorlist
+
+[arcolinux_repo_3party]
+SigLevel = PackageRequired DatabaseNever
+Include = /etc/pacman.d/arcolinux-mirrorlist
+
+[arcolinux_repo_xlarge]
+SigLevel = PackageRequired DatabaseNever
+Include = /etc/pacman.d/arcolinux-mirrorlist' | sudo tee --append /etc/pacman.conf
+
+fi
+
+echo "DONE - UPDATE NOW"
\ No newline at end of file
diff --git a/usr/share/sofirem/sofirem.css b/usr/share/sofirem/sofirem.css
new file mode 100644
index 0000000..f3caaa4
--- /dev/null
+++ b/usr/share/sofirem/sofirem.css
@@ -0,0 +1,61 @@
+frame#awesome * {
+ padding-left: 20px;
+ padding-right: 20px;
+ padding-bottom: 20px;
+ padding-top: 10px;
+ border-color: transparent;
+}
+
+box#vbox {
+ padding-right: 20px;
+}
+
+#sidebar label {
+ font-size: 14px;
+ font-weight: 500;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+
+label#title {
+ font-size: 20px;
+ font-weight: 600;
+}
+
+label#lbl_package_version {
+ color: white;
+ background-color: #5481e5;
+ border: 3px solid #5481e5;
+ border-radius: 100px;
+ font-size: 80%;
+ font-weight: bold;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+infobar#infobar_info {
+ background-color: #5481e5;
+ color: white;
+}
+
+infobar#infobar_error {
+ background-color: #9d261d;
+ color: white;
+}
+
+infobar#infobar_warning {
+ background-color: #ffcc00;
+ color: black;
+}
+
+modelbutton#modelbtn_popover{
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 1px;
+ padding-bottom: 1px;
+}
+
+
+modelbutton#modelbtn_popover:hover{
+ font-weight: bold;
+}
diff --git a/usr/share/sofirem/sofirem.py b/usr/share/sofirem/sofirem.py
new file mode 100755
index 0000000..14a0221
--- /dev/null
+++ b/usr/share/sofirem/sofirem.py
@@ -0,0 +1,1290 @@
+#!/usr/bin/env python3
+
+import gi
+import os
+
+from requests.packages import package
+
+import Functions as fn
+import signal
+
+import subprocess
+from Functions import os
+from queue import Queue
+from time import sleep
+import sys
+import time
+
+# UI modules
+from ui.GUI import GUI
+from ui.SplashScreen import SplashScreen
+from ui.ProgressBarWindow import ProgressBarWindow
+from ui.AppFrameGUI import AppFrameGUI
+from ui.AboutDialog import AboutDialog
+from ui.MessageDialog import MessageDialog
+from ui.PacmanLogWindow import PacmanLogWindow
+from ui.PackageListDialog import PackageListDialog
+from ui.ProgressDialog import ProgressDialog
+from ui.ISOPackagesWindow import ISOPackagesWindow
+from ui.PackageSearchWindow import PackageSearchWindow
+from ui.PackagesImportDialog import PackagesImportDialog
+
+# Configuration module
+from Settings import Settings
+
+gi.require_version("Gtk", "3.0")
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+# #============================================================
+# #= Authors: Erik Dubois - Cameron Percival - Fennec =
+# #============================================================
+
+# Folder structure
+
+# cache contains descriptions - inside we have corrections for manual intervention
+# + installed applications list
+# yaml is the folder that is used to create the application
+# yaml-awesome is a copy/paste from Calamares to meld manually - not used in the app
+
+base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class Main(Gtk.Window):
+ # Create a queue, for worker communication (Multithreading - used in GUI layer)
+ queue = Queue()
+
+ # Create a queue to handle package install/removal
+ pkg_queue = Queue()
+
+ # Create a queue for storing search results
+ search_queue = Queue()
+
+ # Create a queue for storing Pacman log file contents
+ pacmanlog_queue = Queue()
+
+ # Create a queue for storing packages waiting behind an in-progress pacman install transaction
+ pkg_holding_queue = Queue()
+
+ def __init__(self):
+ try:
+ super(Main, self).__init__(title="Sofirem")
+
+ self.set_border_width(10)
+ self.connect("delete-event", self.on_close)
+ self.set_position(Gtk.WindowPosition.CENTER)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+ self.set_default_size(1100, 900)
+
+ # ctrl+f give focus to search entry
+ self.connect("key-press-event", self.on_keypress_event)
+
+ # used for notifications
+ self.timeout_id = None
+
+ # default: displaying versions are disabled
+ self.display_versions = False
+
+ # initial app load search_activated is set to False
+ self.search_activated = False
+
+ # initial app load show the progress dialog window when a package is installed/uninstalled
+ self.display_package_progress = False
+
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print("If you have errors, report it on the discord channel of ArcoLinux")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print("You can receive support on https://discord.gg/stBhS4taje")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print(
+ "Many applications are coming from the Arch Linux repos and can be installed"
+ )
+ print(
+ "without any issues. Other applications are available from third party repos"
+ )
+ print("like Chaotic repo, ArcoLinux repo and others.")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print("We do NOT build packages from AUR.")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print("Some packages are only available on the ArcoLinux repos.")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+
+ if os.path.exists(fn.sofirem_lockfile):
+ running = fn.check_if_process_running("sofirem")
+ if running is True:
+ fn.logger.error(
+ "Sofirem lock file found in %s" % fn.sofirem_lockfile
+ )
+ fn.logger.error("Is there another Sofirem instance running ?")
+
+ sys.exit(1)
+
+ else:
+ splash_screen = SplashScreen()
+
+ while Gtk.events_pending():
+ Gtk.main_iteration()
+
+ sleep(1.5)
+ splash_screen.destroy()
+
+ # test there is no pacman lock file on the system
+ if fn.check_pacman_lockfile():
+ message_dialog = MessageDialog(
+ "Error",
+ "Sofirem cannot proceed pacman lockfile found",
+ "Pacman cannot lock the db, a lockfile is found inside %s"
+ % fn.pacman_lockfile,
+ "Is there another Pacman process running ?",
+ "error",
+ False,
+ )
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ sys.exit(1)
+
+ fn.logger.info("pkgver = pkgversion")
+ fn.logger.info("pkgrel = pkgrelease")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ fn.logger.info("Distro = " + fn.distr)
+ print(
+ "---------------------------------------------------------------------------"
+ )
+
+ # start making sure sofirem starts next time with dark or light theme
+ if os.path.isdir(fn.home + "/.config/gtk-3.0"):
+ try:
+ if not os.path.islink("/root/.config/gtk-3.0"):
+ if os.path.exists("/root/.config/gtk-3.0"):
+ fn.shutil.rmtree("/root/.config/gtk-3.0")
+
+ fn.shutil.copytree(
+ fn.home + "/.config/gtk-3.0", "/root/.config/gtk-3.0"
+ )
+ except Exception as e:
+ fn.logger.warning("GTK config: %s" % e)
+
+ if os.path.isdir("/root/.config/xsettingsd/xsettingsd.conf"):
+ try:
+ if not os.path.islink("/root/.config/xsettingsd/"):
+ if os.path.exists("/root/.config/xsettingsd/"):
+ fn.shutil.rmtree("/root/.config/xsettingsd/")
+ if fn.path.isdir(fn.home + "/.config/xsettingsd/"):
+ fn.shutil.copytree(
+ fn.home + "/.config/xsettingsd/",
+ "/root/.config/xsettingsd/",
+ )
+ except Exception as e:
+ fn.logger.warning("xsettingsd config: %s" % e)
+
+ # store package information into memory, and use the dictionary returned to search in for quicker retrieval
+ fn.logger.info("Storing package metadata started")
+
+ self.packages = fn.store_packages()
+ fn.logger.info("Storing package metadata completed")
+
+ fn.logger.info("Categories = %s" % len(self.packages.keys()))
+
+ total_packages = 0
+
+ for category in self.packages:
+ total_packages += len(self.packages[category])
+
+ fn.logger.info("Total packages = %s" % total_packages)
+
+ fn.logger.info("Setting up GUI")
+
+ GUI.setup_gui(
+ self,
+ Gtk,
+ Gdk,
+ GdkPixbuf,
+ base_dir,
+ os,
+ Pango,
+ fn.settings_config,
+ )
+
+ # Create installed.lst file for first time
+
+ fn.get_current_installed()
+ installed_lst_file = "%s/cache/installed.lst" % base_dir
+ packages_app_start_file = "%s/%s-packages.txt" % (
+ fn.log_dir,
+ fn.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
+ )
+ if os.path.exists(installed_lst_file):
+ fn.logger.info("Created installed.lst")
+ # Keep log of installed packages before the app makes changes
+ # fn.shutil.copy(installed_lst_file, packages_app_start_file)
+
+ # pacman sync db and also tests network connectivity
+
+ thread_pacman_sync_db = fn.threading.Thread(
+ name="thread_pacman_sync_db",
+ target=self.pacman_db_sync,
+ daemon=True,
+ )
+ thread_pacman_sync_db.start()
+ # if self.pacman_db_sync() is False:
+ # sys.exit(1)
+
+ except Exception as e:
+ fn.logger.error("Exception in Main() : %s" % e)
+
+ # =====================================================
+ # PACMAN DB SYNC
+ # =====================================================
+
+ def pacman_db_sync(self):
+ sync_err = fn.sync_package_db()
+
+ if sync_err is not None:
+ fn.logger.error("Pacman db synchronization failed")
+
+ print(
+ "---------------------------------------------------------------------------"
+ )
+
+ GLib.idle_add(
+ self.show_sync_db_message_dialog,
+ sync_err,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+
+ else:
+ fn.logger.info("Pacman db synchronization completed")
+
+ return True
+
+ def show_sync_db_message_dialog(self, sync_err):
+ message_dialog = MessageDialog(
+ "Error",
+ "Pacman db synchronization failed",
+ "Failed to run command = pacman -Sy\nPacman db synchronization failed\nCheck the synchronization logs, and verify you can connect to the appropriate mirrors\n\n",
+ sync_err,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ # =====================================================
+ # WINDOW KEY EVENT CTRL + F
+ # =====================================================
+
+ # sets focus on the search entry
+ def on_keypress_event(self, widget, event):
+ shortcut = Gtk.accelerator_get_label(event.keyval, event.state)
+
+ if shortcut in ("Ctrl+F", "Ctrl+Mod2+F"):
+ # set focus on text entry, select all text if any
+ self.searchentry.grab_focus()
+
+ if shortcut in ("Ctrl+I", "Ctrl+Mod2+I"):
+ fn.show_package_info(self)
+
+ # =====================================================
+ # SEARCH ENTRY
+ # =====================================================
+
+ def on_search_activated(self, searchentry):
+ if searchentry.get_text_length() == 0 and self.search_activated:
+ GUI.setup_gui(
+ self,
+ Gtk,
+ Gdk,
+ GdkPixbuf,
+ base_dir,
+ os,
+ Pango,
+ None,
+ )
+ self.search_activated = False
+
+ if searchentry.get_text_length() == 0:
+ self.search_activated = False
+
+ search_term = searchentry.get_text()
+ # if the string is completely whitespace ignore searching
+ if not search_term.isspace():
+ try:
+ if len(search_term.rstrip().lstrip()) > 0:
+ # test if the string entered by the user is in the package name
+ # results is a dictionary, which holds a list of packages
+ # results[category]=pkg_list
+
+ # searching is processed inside a thread
+
+ th_search = fn.threading.Thread(
+ name="thread_search",
+ target=fn.search,
+ args=(
+ self,
+ search_term.rstrip().lstrip(),
+ ),
+ )
+ fn.logger.info("Starting search")
+
+ th_search.start()
+
+ # get the search_results from the queue
+ results = self.search_queue.get()
+
+ if results is not None:
+ fn.logger.info("Search complete")
+
+ if len(results) > 0:
+ total = 0
+ for val in results.values():
+ total += len(val)
+
+ fn.logger.info("Search found %s results" % total)
+ # make sure the gui search only displays the pkgs inside the results
+
+ GUI.setup_gui_search(
+ self,
+ Gtk,
+ Gdk,
+ GdkPixbuf,
+ base_dir,
+ os,
+ Pango,
+ results,
+ search_term,
+ None,
+ )
+
+ self.search_activated = True
+ else:
+ fn.logger.info("Search found %s results" % 0)
+ self.searchentry.grab_focus()
+
+ message_dialog = MessageDialog(
+ "Info",
+ "Search returned 0 results",
+ "Failed to find search term inside the package name or description.",
+ "Try to search again using another term",
+ "info",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ elif self.search_activated == True:
+ GUI.setup_gui(
+ self,
+ Gtk,
+ Gdk,
+ GdkPixbuf,
+ base_dir,
+ os,
+ Pango,
+ None,
+ )
+ self.search_activated = False
+ except Exception as err:
+ fn.logger.error("Exception in on_search_activated(): %s" % err)
+
+ finally:
+ if self.search_activated == True:
+ self.search_queue.task_done()
+
+ def on_search_cleared(self, searchentry, icon_pos, event):
+ if self.search_activated:
+ GUI.setup_gui(
+ self,
+ Gtk,
+ Gdk,
+ GdkPixbuf,
+ base_dir,
+ os,
+ Pango,
+ None,
+ )
+
+ self.searchentry.set_placeholder_text("Search...")
+
+ self.search_activated = False
+
+ # =====================================================
+ # RESTART/QUIT BUTTON
+ # =====================================================
+
+ def on_close(self, widget, data):
+ # to preserve settings, save current options to conf file inside $HOME/.config/sofirem/sofirem.yaml
+
+ settings = Settings(self.display_versions, self.display_package_progress)
+ settings.write_config_file()
+
+ # make a final installed packages file inside /var/log/sofirem/
+ # this allows a before/after comparison
+ # fn.on_close_create_packages_file()
+
+ if os.path.exists(fn.sofirem_lockfile):
+ os.unlink(fn.sofirem_lockfile)
+
+ if os.path.exists(fn.sofirem_pidfile):
+ os.unlink(fn.sofirem_pidfile)
+
+ # see the comment in fn.terminate_pacman()
+ fn.terminate_pacman()
+
+ Gtk.main_quit()
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print("Thanks for using Sofirem")
+ print("Report issues to make it even better")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+ print("You can report issues on https://discord.gg/stBhS4taje")
+ print(
+ "---------------------------------------------------------------------------"
+ )
+
+ # ====================================================================
+ # Button Functions
+ # ====================================================================
+ # Given what this function does, it might be worth considering making it a
+ # thread so that the app doesn't block while installing/uninstalling is happening.
+
+ def app_toggle(self, widget, active, package):
+ # switch widget is currently toggled off
+
+ if widget.get_state() == False and widget.get_active() == True:
+ if len(package.name) > 0:
+ inst_str = [
+ "pacman",
+ "-S",
+ package.name,
+ "--needed",
+ "--noconfirm",
+ ]
+
+ if self.display_package_progress is True:
+ if fn.check_pacman_lockfile():
+ widget.set_state(False)
+ widget.set_active(False)
+ proc = fn.get_pacman_process()
+
+ message_dialog = MessageDialog(
+ "Warning",
+ "Sofirem cannot proceed pacman lockfile found",
+ "Pacman cannot lock the db, a lockfile is found inside %s"
+ % fn.pacman_lockfile,
+ "Pacman is running: %s" % proc,
+ "warning",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ return True
+ else:
+ package_metadata = fn.get_package_information(package.name)
+
+ if (
+ type(package_metadata) is str
+ and package_metadata.strip()
+ == "error: package '%s' was not found" % package.name
+ ):
+ self.package_found = False
+ fn.logger.warning(
+ "The package %s was not found in any configured Pacman repositories"
+ % package.name
+ )
+ fn.logger.warning("Package install cannot continue")
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Pacman repository error: package '%s' was not found"
+ % package.name,
+ "Sofirem cannot process the request",
+ "Are the correct pacman mirrorlists configured ?",
+ "error",
+ False,
+ )
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_state(False)
+ widget.set_active(False)
+
+ return True
+ else:
+ widget.set_state(True)
+ widget.set_active(True)
+
+ progress_dialog = ProgressDialog(
+ "install",
+ package,
+ " ".join(inst_str),
+ package_metadata,
+ )
+
+ progress_dialog.show_all()
+
+ self.pkg_queue.put(
+ (
+ package,
+ "install",
+ widget,
+ inst_str,
+ progress_dialog,
+ ),
+ )
+
+ th = fn.threading.Thread(
+ name="thread_pkginst",
+ target=fn.install,
+ args=(self,),
+ daemon=True,
+ )
+
+ th.start()
+ fn.logger.debug("Package-install thread started")
+
+ else:
+ progress_dialog = None
+ widget.set_sensitive(False)
+
+ widget.set_active(True)
+ widget.set_state(True)
+
+ fn.logger.info("Package to install : %s" % package.name)
+
+ # another pacman transaction is running, add items to the holding queue
+ if (
+ fn.check_pacman_lockfile() is True
+ and self.display_package_progress is False
+ ):
+ self.pkg_holding_queue.put(
+ (
+ package,
+ "install",
+ widget,
+ inst_str,
+ progress_dialog,
+ ),
+ )
+
+ if fn.is_thread_alive("thread_check_holding_queue") is False:
+ th = fn.threading.Thread(
+ target=fn.check_holding_queue,
+ name="thread_check_holding_queue",
+ daemon=True,
+ args=(self,),
+ )
+
+ th.start()
+ fn.logger.debug("Check-holding-queue thread started")
+ elif self.display_package_progress is False:
+ self.pkg_queue.put(
+ (
+ package,
+ "install",
+ widget,
+ inst_str,
+ progress_dialog,
+ ),
+ )
+
+ th = fn.threading.Thread(
+ name="thread_pkginst",
+ target=fn.install,
+ args=(self,),
+ daemon=True,
+ )
+
+ th.start()
+ fn.logger.debug("Package-install thread started")
+
+ # switch widget is currently toggled on
+ if widget.get_state() == True and widget.get_active() == False:
+ # Uninstall the package
+
+ if len(package.name) > 0:
+ uninst_str = ["pacman", "-Rs", package.name, "--noconfirm"]
+
+ fn.logger.info("Package to remove : %s" % package.name)
+
+ if fn.check_pacman_lockfile():
+ widget.set_state(True)
+ widget.set_active(True)
+
+ fn.logger.info("Pacman lockfile found, uninstall aborted")
+
+ GLib.idle_add(
+ self.show_lockfile_message_dialog,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+
+ return True
+
+ if self.display_package_progress is True:
+ package_metadata = fn.get_package_information(package.name)
+
+ progress_dialog = ProgressDialog(
+ "uninstall",
+ package,
+ " ".join(uninst_str),
+ package_metadata,
+ )
+
+ progress_dialog.show_all()
+ else:
+ progress_dialog = None
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ self.pkg_queue.put(
+ (
+ package,
+ "uninstall",
+ widget,
+ uninst_str,
+ progress_dialog,
+ ),
+ )
+
+ th = fn.threading.Thread(
+ name="thread_pkgrem",
+ target=fn.uninstall,
+ args=(self,),
+ daemon=True,
+ )
+
+ th.start()
+ fn.logger.debug("Package-uninstall thread started")
+
+ # fn.print_running_threads()
+
+ # return True to prevent the default handler from running
+ return True
+
+ # App_Frame_GUI.GUI(self, Gtk, vboxStack1, fn, category, package_file)
+ # widget.get_parent().get_parent().get_parent().get_parent().get_parent().get_parent().get_parent().queue_redraw()
+ # self.gui.hide()
+ # self.gui.queue_redraw()
+ # self.gui.show_all()
+
+ def show_lockfile_message_dialog(self):
+ proc = fn.get_pacman_process()
+ message_dialog = MessageDialog(
+ "Warning",
+ "Sofirem cannot proceed pacman lockfile found",
+ "Pacman cannot lock the db, a lockfile is found inside %s"
+ % fn.pacman_lockfile,
+ "Process running = %s" % proc,
+ "warning",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ message_dialog.destroy()
+
+ def recache_clicked(self, widget):
+ # Check if cache is out of date. If so, run the re-cache, if not, don't.
+ # pb = ProgressBarWindow()
+ # pb.show_all()
+ # pb.set_text("Updating Cache")
+ # pb.reset_timer()
+
+ fn.logger.info("Recache applications - start")
+
+ fn.cache_btn()
+
+ # ================================================================
+ # SETTINGS
+ # ================================================================
+
+ def on_package_search_clicked(self, widget):
+ fn.logger.debug("Showing Package Search window")
+ self.toggle_popover()
+
+ package_search_win = PackageSearchWindow()
+ package_search_win.show_all()
+
+ def on_arcolinux_iso_packages_clicked(self, widget):
+ fn.logger.debug("Showing ArcoLinux ISO Packages window")
+ arcolinux_iso_packages_window = ISOPackagesWindow()
+ arcolinux_iso_packages_window.show()
+
+ def on_about_app_clicked(self, widget):
+ fn.logger.debug("Showing About dialog")
+ self.toggle_popover()
+
+ about = AboutDialog()
+ about.run()
+ about.hide()
+ about.destroy()
+
+ def on_packages_export_clicked(self, widget):
+ self.toggle_popover()
+
+ dialog_packagelist = PackageListDialog()
+ dialog_packagelist.show_all()
+
+ def on_packages_import_clicked(self, widget):
+ self.toggle_popover()
+ try:
+ if not os.path.exists(fn.pacman_lockfile):
+ package_file = "%s/packages-x86_64.txt" % (fn.export_dir,)
+ package_import_logfile = "%spackages-install-status-%s-%s.log" % (
+ fn.log_dir,
+ fn.datetime.today().date(),
+ fn.datetime.today().time().strftime("%H-%M-%S"),
+ )
+
+ if os.path.exists(package_file):
+ # check we have a valid file
+ lines = None
+ with open(package_file, encoding="utf-8", mode="r") as f:
+ lines = f.readlines()
+
+ if lines is not None:
+ if (
+ "# This file was auto-generated by the ArchLinux Tweak Tool on"
+ in lines[0]
+ or "# This file was auto-generated by Sofirem on"
+ in lines[0]
+ ):
+ fn.logger.info("Package list file is valid")
+ packages_list = []
+ for line in lines:
+ if not line.startswith("#"):
+ packages_list.append(line.strip())
+
+ if len(packages_list) > 0:
+ dialog_package_import = PackagesImportDialog(
+ package_file,
+ packages_list,
+ package_import_logfile,
+ )
+ dialog_package_import.show_all()
+
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Package file is not valid %s" % package_file,
+ "Export a list of packages first using the Show Installed Packages button",
+ "",
+ "error",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ else:
+ message_dialog = MessageDialog(
+ "Warning",
+ "Cannot locate export package file %s" % package_file,
+ "Export a list of packages first using the Show Installed Packages button",
+ "",
+ "warning",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Pacman lock file found %s" % fn.pacman_lockfile,
+ "Cannot proceed, another pacman process is running",
+ "",
+ "error",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ except Exception as e:
+ fn.logger.error("Exception in on_packages_import_clicked(): %s" % e)
+
+ # show/hide popover
+ def toggle_popover(self):
+ if self.popover.get_visible():
+ self.popover.hide()
+ else:
+ self.popover.show_all()
+
+ def on_settings_clicked(self, widget):
+ self.toggle_popover()
+
+ # ArcoLinux keys, mirrors setup
+
+ def arco_keyring_toggle(self, widget, data):
+ # toggle is currently off, add keyring
+ if widget.get_state() == False and widget.get_active() == True:
+ fn.logger.info("Installing ArcoLinux keyring")
+ install_keyring = fn.install_arco_keyring()
+
+ if install_keyring == 0:
+ fn.logger.info("Installation of ArcoLinux keyring = OK")
+ rc = fn.add_arco_repos()
+ if rc == 0:
+ fn.logger.info("ArcoLinux repos added into %s" % fn.pacman_conf)
+ widget.set_active(True)
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to update pacman conf",
+ "Errors occurred during update of the pacman config file",
+ rc,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ return True
+
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to install ArcoLinux keyring",
+ "Errors occurred during install of the ArcoLinux keyring",
+ "Command run = %s\n\n Error = %s"
+ % (install_keyring["cmd_str"], install_keyring["output"]),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ return True
+ # toggle is currently on
+ if widget.get_state() == True and widget.get_active() == False:
+ remove_keyring = fn.remove_arco_keyring()
+
+ if remove_keyring == 0:
+ fn.logger.info("Removing ArcoLinux keyring OK")
+
+ rc = fn.remove_arco_repos()
+ if rc == 0:
+ fn.logger.info("ArcoLinux repos removed from %s" % fn.pacman_conf)
+ widget.set_active(False)
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to update pacman conf",
+ "Errors occurred during update of the pacman config file",
+ rc,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(True)
+ widget.set_state(True)
+
+ return True
+ else:
+ fn.logger.error("Failed to remove ArcoLinux keyring")
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to remove ArcoLinux keyring",
+ "Errors occurred during removal of the ArcoLinux keyring",
+ "Command run = %s\n\n Error = %s"
+ % (remove_keyring["cmd_str"], remove_keyring["output"]),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ return True
+
+ def arco_mirrorlist_toggle(self, widget, data):
+ # self.toggle_popover()
+
+ # toggle is currently off
+
+ if widget.get_state() == False and widget.get_active() == True:
+ widget.set_active(True)
+ widget.set_state(True)
+
+ # before installing the mirrorlist make sure the pacman.conf file does not have any references to /etc/pacman.d/arcolinux-mirrorlist
+ # otherwise the mirrorlist package will not install
+ rc_remove = fn.remove_arco_repos()
+ if rc_remove == 0:
+ install_mirrorlist = fn.install_arco_mirrorlist()
+
+ if install_mirrorlist == 0:
+ fn.logger.info("Installation of ArcoLinux mirrorlist = OK")
+
+ rc_add = fn.add_arco_repos()
+ if rc_add == 0:
+ fn.logger.info("ArcoLinux repos added into %s" % fn.pacman_conf)
+ self.pacman_db_sync()
+
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to update pacman conf",
+ "Errors occurred during update of the pacman config file",
+ rc_add,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ return True
+
+ else:
+ fn.logger.error("Failed to install ArcoLinux mirrorlist")
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to install ArcoLinux mirrorlist",
+ "Errors occurred during install of the ArcoLinux mirrorlist",
+ "Command run = %s\n\n Error = %s"
+ % (install_mirrorlist["cmd_str"], install_mirrorlist["output"]),
+ "error",
+ True,
+ )
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ return True
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to update pacman conf",
+ "Errors occurred during update of the pacman config file",
+ rc,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(False)
+ widget.set_state(False)
+
+ return True
+ # toggle is currently on
+ if widget.get_state() == True and widget.get_active() == False:
+ widget.set_active(False)
+ widget.set_state(False)
+
+ fn.logger.info("Removing ArcoLinux mirrorlist")
+
+ remove_mirrorlist = fn.remove_arco_mirrorlist()
+
+ if remove_mirrorlist == 0:
+ fn.logger.info("Removing ArcoLinux mirrorlist OK")
+
+ rc = fn.remove_arco_repos()
+ if rc == 0:
+ fn.logger.info("ArcoLinux repos removed from %s" % fn.pacman_conf)
+ widget.set_active(False)
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to update pacman conf",
+ "Errors occurred during update of the pacman config file",
+ rc,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(True)
+ widget.set_state(True)
+
+ return True
+ else:
+ fn.logger.error("Failed to remove ArcoLinux mirrorlist")
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Failed to remove ArcoLinux mirrorlist",
+ "Errors occurred during removal of the ArcoLinux mirrorlist",
+ "Command run = %s\n\n Error = %s"
+ % (remove_mirrorlist["cmd_str"], remove_mirrorlist["output"]),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ widget.set_active(True)
+ widget.set_state(True)
+
+ return True
+
+ return True
+
+ def version_toggle(self, widget, data):
+ if widget.get_active() == True:
+ fn.logger.debug("Showing package versions")
+
+ self.display_versions = True
+ GLib.idle_add(
+ self.refresh_main_gui,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+ else:
+ fn.logger.debug("Hiding package versions")
+ self.display_versions = False
+ GLib.idle_add(
+ self.refresh_main_gui,
+ priority=GLib.PRIORITY_DEFAULT,
+ )
+
+ def refresh_main_gui(self):
+ self.remove(self.vbox)
+ GUI.setup_gui(self, Gtk, Gdk, GdkPixbuf, base_dir, os, Pango, None)
+ self.show_all()
+
+ def on_pacman_log_clicked(self, widget):
+ try:
+ self.toggle_popover()
+
+ thread_addlog = "thread_addPacmanLogQueue"
+ self.thread_add_pacmanlog_alive = fn.is_thread_alive(thread_addlog)
+
+ if self.thread_add_pacmanlog_alive == False:
+ fn.logger.info("Starting thread to monitor Pacman Log file")
+
+ th_add_pacmanlog_queue = fn.threading.Thread(
+ name=thread_addlog,
+ target=fn.add_pacmanlog_queue,
+ args=(self,),
+ daemon=True,
+ )
+ th_add_pacmanlog_queue.start()
+
+ if self.thread_add_pacmanlog_alive is True:
+ # need to recreate the textview, can't use existing reference as it throws a seg fault
+
+ self.textview_pacmanlog = Gtk.TextView()
+ self.textview_pacmanlog.set_property("editable", False)
+ self.textview_pacmanlog.set_property("monospace", True)
+ self.textview_pacmanlog.set_border_width(10)
+ self.textview_pacmanlog.set_vexpand(True)
+ self.textview_pacmanlog.set_hexpand(True)
+
+ # use the reference to the text buffer initialized before the logtimer thread started
+ self.textview_pacmanlog.set_buffer(self.textbuffer_pacmanlog)
+
+ window_pacmanlog = PacmanLogWindow(
+ self.textview_pacmanlog,
+ self.modelbtn_pacmanlog,
+ )
+ window_pacmanlog.show_all()
+
+ self.start_logtimer = window_pacmanlog.start_logtimer
+
+ else:
+ # keep a handle on the textbuffer, this is needed again later, if the pacman log file dialog is closed
+ # since the textbuffer will already hold textdata at that point
+
+ # textview is used inside another thread to update as the pacmanlog file is read into memory
+ self.textbuffer_pacmanlog = Gtk.TextBuffer()
+
+ self.textview_pacmanlog = Gtk.TextView()
+ self.textview_pacmanlog.set_property("editable", False)
+ self.textview_pacmanlog.set_property("monospace", True)
+ self.textview_pacmanlog.set_border_width(10)
+ self.textview_pacmanlog.set_vexpand(True)
+ self.textview_pacmanlog.set_hexpand(True)
+
+ self.textview_pacmanlog.set_buffer(self.textbuffer_pacmanlog)
+
+ window_pacmanlog = PacmanLogWindow(
+ self.textview_pacmanlog,
+ self.modelbtn_pacmanlog,
+ )
+ window_pacmanlog.show_all()
+
+ thread_logtimer = "thread_startLogTimer"
+ thread_logtimer_alive = False
+
+ thread_logtimer_alive = fn.is_thread_alive(thread_logtimer)
+
+ # a flag to indicate that the textview will need updating, used inside fn.start_log_timer
+ self.start_logtimer = True
+
+ if thread_logtimer_alive == False:
+ th_logtimer = fn.threading.Thread(
+ name=thread_logtimer,
+ target=fn.start_log_timer,
+ args=(self, window_pacmanlog),
+ daemon=True,
+ )
+ th_logtimer.start()
+
+ self.thread_add_pacmanlog_alive = True
+ self.modelbtn_pacmanlog.set_sensitive(False)
+
+ except Exception as e:
+ fn.logger.error("Exception in on_pacman_log_clicked() : %s" % e)
+
+ def package_progress_toggle(self, widget, data):
+ if widget.get_active() is True:
+ self.display_package_progress = True
+ if widget.get_active() is False:
+ self.display_package_progress = False
+
+
+# ====================================================================
+# MAIN
+# ====================================================================
+
+
+def signal_handler(sig, frame):
+ fn.logger.info("Sofirem is closing.")
+ if os.path.exists("/tmp/sofirem.lock"):
+ os.unlink("/tmp/sofirem.lock")
+
+ if os.path.exists("/tmp/sofirem.pid"):
+ os.unlink("/tmp/sofirem.pid")
+ Gtk.main_quit(0)
+
+
+# These should be kept as it ensures that multiple installation instances can't be run concurrently.
+if __name__ == "__main__":
+ try:
+ signal.signal(signal.SIGINT, signal_handler)
+
+ if not os.path.isfile("/tmp/sofirem.lock"):
+ with open("/tmp/sofirem.pid", "w") as f:
+ f.write(str(os.getpid()))
+
+ style_provider = Gtk.CssProvider()
+ style_provider.load_from_path(base_dir + "/sofirem.css")
+
+ Gtk.StyleContext.add_provider_for_screen(
+ Gdk.Screen.get_default(),
+ style_provider,
+ Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
+ )
+ w = Main()
+ w.show_all()
+
+ fn.logger.info("App Started")
+
+ Gtk.main()
+ else:
+ fn.logger.info("Sofirem lock file found")
+
+ md = Gtk.MessageDialog(
+ parent=Main(),
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.YES_NO,
+ text="Sofirem Lock File Found",
+ )
+ md.format_secondary_markup(
+ "A Sofirem lock file has been found. This indicates there is already an instance of Sofirem running.\n\
+ Click 'Yes' to remove the lock file and try running again"
+ ) # noqa
+
+ result = md.run()
+ md.destroy()
+
+ if result in (Gtk.ResponseType.OK, Gtk.ResponseType.YES):
+ pid = ""
+ if os.path.exists(fn.sofirem_pidfile):
+ with open("/tmp/sofirem.pid", "r") as f:
+ line = f.read()
+ pid = line.rstrip().lstrip()
+
+ if fn.check_if_process_running(int(pid)):
+ # needs to be fixed - todo
+
+ # md2 = Gtk.MessageDialog(
+ # parent=Main,
+ # flags=0,
+ # message_type=Gtk.MessageType.INFO,
+ # buttons=Gtk.ButtonsType.OK,
+ # title="Application Running!",
+ # text="You first need to close the existing application",
+ # )
+ # md2.format_secondary_markup(
+ # "You first need to close the existing application"
+ # )
+ # md2.run()
+ fn.logger.info(
+ "You first need to close the existing application"
+ )
+ else:
+ os.unlink("/tmp/sofirem.lock")
+ sys.exit(1)
+ else:
+ # in the rare event that the lock file is present, but the pid isn't
+ os.unlink("/tmp/sofirem.lock")
+ sys.exit(1)
+ else:
+ sys.exit(1)
+ except Exception as e:
+ fn.logger.error("Exception in __main__: %s" % e)
diff --git a/usr/share/sofirem/ui/AboutDialog.py b/usr/share/sofirem/ui/AboutDialog.py
new file mode 100644
index 0000000..ce39f5a
--- /dev/null
+++ b/usr/share/sofirem/ui/AboutDialog.py
@@ -0,0 +1,192 @@
+# This class stores static information about the app, and is displayed in the about dialog
+import os
+import gi
+
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class AboutDialog(Gtk.Dialog):
+ def __init__(self):
+ Gtk.Dialog.__init__(self)
+
+ app_name = "Sofirem"
+ app_title = "About Sofirem"
+ app_main_description = "%s - %s" % (app_name, "Software Installer Remover")
+ app_secondary_message = "Install or remove software from your ArcoLinux system"
+ app_secondary_description = "Report issues to make it even better"
+ app_version = "pkgversion-pkgrelease"
+ app_discord = "https://discord.gg/stBhS4taje"
+ app_website = "https://arcolinux.info"
+ app_github = "https://github.com/arcolinux/sofirem-dev"
+ app_authors = []
+ app_authors.append(("Cameron Percival", None))
+ app_authors.append(("Fennec", None))
+ app_authors.append(("Erik Dubois", None))
+
+ pixbuf = GdkPixbuf.Pixbuf().new_from_file_at_size(
+ os.path.join(base_dir, "images/sofirem.png"), 100, 100
+ )
+ app_image = Gtk.Image().new_from_pixbuf(pixbuf)
+
+ self.set_resizable(False)
+ self.set_size_request(560, 350)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+ self.set_border_width(10)
+
+ headerbar = Gtk.HeaderBar()
+ headerbar.set_show_close_button(True)
+ headerbar.set_title(app_title)
+ self.set_titlebar(headerbar)
+
+ btn_about_close = Gtk.Button(label="OK")
+ btn_about_close.connect("clicked", self.on_response, "response")
+
+ stack = Gtk.Stack()
+ stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
+ stack.set_transition_duration(350)
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ stack_switcher = Gtk.StackSwitcher()
+ stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
+ stack_switcher.set_stack(stack)
+ stack_switcher.set_homogeneous(True)
+
+ lbl_main_description = Gtk.Label(xalign=0, yalign=0)
+ lbl_main_description.set_markup(
+ " %s" % app_main_description
+ )
+
+ lbl_secondary_message = Gtk.Label(xalign=0, yalign=0)
+ lbl_secondary_message.set_text(
+ " %s" % app_secondary_message
+ )
+
+ lbl_secondary_description = Gtk.Label(xalign=0, yalign=0)
+ lbl_secondary_description.set_text(
+ " %s" % app_secondary_description
+ )
+
+ lbl_version = Gtk.Label(xalign=0, yalign=0)
+ lbl_version.set_markup(
+ " Version: %s" % app_version
+ )
+
+ ivbox_about = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
+ ivbox_about.pack_start(app_image, True, True, 0)
+ ivbox_about.pack_start(lbl_main_description, True, True, 0)
+ ivbox_about.pack_start(lbl_version, True, True, 0)
+ ivbox_about.pack_start(lbl_secondary_message, True, True, 0)
+ ivbox_about.pack_start(lbl_secondary_description, True, True, 0)
+
+ stack.add_titled(ivbox_about, "About Sofirem", "About")
+
+ grid_support = Gtk.Grid()
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text(" ")
+
+ grid_support.attach(lbl_padding1, 0, 1, 1, 1)
+
+ lbl_support_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_support_title.set_markup("Discord ")
+
+ lbl_support_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_support_value.set_markup("%s" % (app_discord, app_discord))
+
+ lbl_website_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_website_title.set_markup("ArcoLinux website ")
+
+ lbl_website_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_website_value.set_markup("%s" % (app_website, app_website))
+
+ lbl_github_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_github_title.set_markup("GitHub ")
+
+ lbl_github_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_github_value.set_markup("%s" % (app_github, app_github))
+
+ grid_support.attach(lbl_support_title, 0, 2, 1, 1)
+
+ grid_support.attach_next_to(
+ lbl_support_value, lbl_support_title, Gtk.PositionType.RIGHT, 20, 1
+ )
+
+ grid_support.attach(lbl_website_title, 0, 3, 1, 1)
+ grid_support.attach_next_to(
+ lbl_website_value, lbl_website_title, Gtk.PositionType.RIGHT, 20, 1
+ )
+
+ grid_support.attach(lbl_github_title, 0, 4, 1, 1)
+ grid_support.attach_next_to(
+ lbl_github_value, lbl_github_title, Gtk.PositionType.RIGHT, 20, 1
+ )
+
+ stack.add_titled(grid_support, "Support", "Support")
+
+ box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+ box_outer.set_border_width(10)
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text(" ")
+
+ lbl_padding3 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding3.set_text(" ")
+
+ lbl_authors_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_authors_title.set_text(
+ "The following people have contributed to the development of %s" % app_name
+ )
+
+ listbox = Gtk.ListBox()
+ listbox.set_selection_mode(Gtk.SelectionMode.NONE)
+
+ box_outer.pack_start(lbl_authors_title, True, True, 0)
+ box_outer.pack_start(listbox, True, True, 0)
+
+ treestore_authors = Gtk.TreeStore(str, str)
+ for item in app_authors:
+ treestore_authors.append(None, list(item))
+
+ treeview_authors = Gtk.TreeView(model=treestore_authors)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn(None, renderer, text=0)
+
+ treeview_authors.append_column(column)
+
+ path = Gtk.TreePath.new_from_indices([0])
+
+ selection = treeview_authors.get_selection()
+
+ selection.select_path(path)
+
+ treeview_authors.expand_all()
+ treeview_authors.columns_autosize()
+
+ row_authors = Gtk.ListBoxRow()
+ vbox_authors = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_authors.add(vbox_authors)
+
+ vbox_authors.pack_start(treeview_authors, True, True, 0)
+
+ listbox.add(row_authors)
+
+ stack.add_titled(box_outer, "Authors", "Authors")
+
+ self.connect("response", self.on_response)
+
+ self.vbox.add(stack_switcher)
+ self.vbox.add(stack)
+
+ self.show_all()
+
+ def on_response(self, dialog, response):
+ self.hide()
+ self.destroy()
diff --git a/usr/share/sofirem/ui/AppFrameGUI.py b/usr/share/sofirem/ui/AppFrameGUI.py
new file mode 100644
index 0000000..4d9900d
--- /dev/null
+++ b/usr/share/sofirem/ui/AppFrameGUI.py
@@ -0,0 +1,523 @@
+# =================================================================
+# = Author: Cameron Percival =
+# =================================================================
+from socket import TIPC_ADDR_NAME
+from urllib.parse import scheme_chars
+import Functions as fn
+
+
+class AppFrameGUI:
+ def build_ui_frame(self, Gtk, vbox_stack, category, packages_list):
+ try:
+ # Lets set some variables that we know we will need later
+ # hboxes and items to make the page look sensible
+ cat_name = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ seperator = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ lbl1 = Gtk.Label(xalign=0)
+ lbl1.set_text(category)
+ lbl1.set_name("title")
+ hseparator = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
+ seperator.pack_start(hseparator, True, True, 0)
+ cat_name.pack_start(lbl1, False, False, 0)
+
+ # Stack for the different subcategories - I like crossfade as a transition, but you choose
+ stack = Gtk.Stack()
+ stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
+ stack.set_transition_duration(350)
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ # Stack needs a stack switcher to allow the user to make different choices
+ stack_switcher = Gtk.StackSwitcher()
+ stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
+ stack_switcher.set_stack(stack)
+ stack_switcher.set_homogeneous(True)
+
+ # We will need a vbox later for storing the stack and stack switcher together at the end
+ vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+
+ # create scroller for when/if these items go "off the page"
+ scrolled_switch = Gtk.ScrolledWindow()
+ scrolled_switch.add(stack_switcher)
+
+ # These lists will ensure that we can keep track of the individual windows and their names
+ # stack of vboxes
+ vbox_stacks = []
+ # name of each vbox - derived from the sub category name
+ vbox_stacknames = []
+ sep_text = " "
+ subcats = {}
+ # index for the grid
+ index = 0
+
+ """
+ Store a list of unique sub-categories
+ e.g.
+
+ category --> applications
+ sub category --> Accessories
+ sub category --> Conky
+
+ """
+
+ sub_catlabels = []
+
+ # store unique subcategory names into a dictionary
+
+ for package in packages_list:
+ subcats[package.subcategory] = package
+
+ # we now iterate across the dictionary keys
+ # each Stack has an associated subcategory
+
+ for subcat in subcats.keys():
+ vbox_stacks.append(
+ Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ )
+ # for the sub-cat page title
+ sub_catlabels.append(Gtk.Label(xalign=0))
+
+ vbox_stacknames.append(subcat)
+ # iterate across a list of packages
+
+ for package in packages_list:
+ if package.subcategory == subcat:
+ page = vbox_stacks.pop()
+
+ if len(sub_catlabels) > 0:
+ lbl_title = sub_catlabels.pop()
+ lbl_desc = Gtk.Label(xalign=0)
+ lbl_desc.set_markup(
+ "Description: "
+ + package.subcategory_description
+ + ""
+ )
+ lbl_title.set_markup("" + package.subcategory + "")
+
+ lbl_padding_page1 = Gtk.Label(xalign=0)
+ lbl_padding_page1.set_text("")
+
+ page.pack_start(lbl_title, False, False, 0)
+ page.pack_start(lbl_desc, False, False, 0)
+ page.pack_start(lbl_padding_page1, False, False, 0)
+
+ grid = Gtk.Grid()
+
+ grid.insert_row(index)
+
+ lbl_sep1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_sep1.set_text(sep_text)
+ grid.attach(lbl_sep1, 0, index, 1, 1)
+ lbl_package = Gtk.Label(xalign=0, yalign=0) # was in for loop
+
+ lbl_package.set_markup("%s" % package.name)
+
+ ###### switch widget starts ######
+
+ # construct new switch
+ switch = Gtk.Switch()
+ switch.set_valign(Gtk.Align.CENTER)
+
+ """
+ Changed to use signal state-set for switch widget.
+ set_state(boolean) allows the switch state to be enabled/disabled.
+ When a pkg install/uninstall fails, the switch widget is enabled/disabled inside a thread.
+
+ Changing the switch using set_active(bool), and using the signal notify::active
+ caused a never-ending loop which would call app_toggle.
+
+ """
+ switch.set_state(fn.query_pkg(package.name))
+ switch.connect(
+ "state-set",
+ self.app_toggle,
+ package,
+ )
+
+ # add switch widget to grid
+
+ # attach_next_to(child, sibling, side, width, height)
+
+ grid.attach_next_to(
+ switch, lbl_sep1, Gtk.PositionType.LEFT, 1, 1
+ )
+
+ # add space seperator next to switch
+
+ lbl_sep_switch = Gtk.Label(xalign=0, yalign=0)
+ lbl_sep_switch.set_text(sep_text)
+
+ grid.attach_next_to(
+ lbl_sep_switch, switch, Gtk.PositionType.LEFT, 1, 1
+ )
+
+ ###### switch widget ends ######
+
+ ###### pkg name label widget starts ######
+
+ lbl_sep_package1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_sep_package1.set_text(sep_text)
+
+ # add space seperator next to switch for extra padding
+
+ grid.attach_next_to(
+ lbl_sep_package1, switch, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ lbl_sep_package2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_sep_package2.set_text(sep_text)
+
+ # add pkg name label widget to grid
+
+ grid.attach_next_to(
+ lbl_package, lbl_sep_package1, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ ###### pkg name label widget ends
+
+ ###### pkg desc label widget starts ######
+
+ lbl_sep_package_desc = Gtk.Label(xalign=0, yalign=0)
+ lbl_sep_package_desc.set_text(sep_text)
+
+ # add space seperator next to pkg name for extra padding
+
+ grid.attach_next_to(
+ lbl_sep_package_desc,
+ lbl_package,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ lbl_package_desc = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_desc.set_text(package.description)
+
+ # add pkg desc label widget to grid
+
+ grid.attach_next_to(
+ lbl_package_desc,
+ lbl_sep_package_desc,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ ###### pkg desc label widget ends
+
+ ##### add pkg version label widget starts #####
+
+ if self.display_versions is True:
+ lbl_package_version = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_version.set_text(package.version)
+ lbl_package_version.set_name("lbl_package_version")
+
+ lbl_sep_package_version = Gtk.Label(xalign=0, yalign=0)
+ lbl_sep_package_version.set_text(sep_text)
+
+ grid.attach_next_to(
+ lbl_sep_package_version,
+ lbl_package_desc,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid.attach_next_to(
+ lbl_package_version,
+ lbl_sep_package_version,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ ##### pkg version ends #####
+
+ # make the page scrollable
+ grid_sc = Gtk.ScrolledWindow()
+
+ # hide the horizontal scrollbar showing on each grid row if the window width is resized
+ grid_sc.set_policy(
+ Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC
+ )
+ grid_sc.add(grid)
+
+ grid_sc.set_propagate_natural_height(True)
+ # pack the grid to the page.
+
+ page.pack_start(grid_sc, True, True, 0)
+ # save the page - put it back (now populated)
+
+ """
+ UI note.
+ To remove the extra padding around the switch buttons
+ Comment out the references to grid_sc
+ Then just have page.pack_start(grid,True, True, 0)
+ """
+ vbox_stacks.append(page)
+
+ # reset the things that we need to.
+ # packages.clear()
+ grid = Gtk.Grid()
+
+ index += 1
+
+ # Now we pack the stack
+ item_num = 0
+
+ for item in vbox_stacks:
+ stack.add_titled(
+ item,
+ "stack" + str(item_num),
+ vbox_stacknames[item_num],
+ )
+ item_num += 1
+
+ # Place the stack switcher and the stack together into a vbox
+ vbox.pack_start(scrolled_switch, False, False, 0)
+
+ scrolled_window = Gtk.ScrolledWindow()
+ scrolled_window.set_propagate_natural_height(True)
+ scrolled_window.add(stack)
+ vbox.pack_start(scrolled_window, True, True, 0)
+
+ # Stuff the vbox with the title and seperator to create the page
+ vbox_stack.pack_start(cat_name, False, False, 0)
+ vbox_stack.pack_start(seperator, False, False, 0)
+ vbox_stack.pack_start(vbox, False, False, 0)
+
+ except Exception as e:
+ fn.logger.error("Exception in App_Frame_GUI.GUI(): %s" % e)
+
+
+########## PREVIOUS GUI CODE START ##########
+"""
+def GUI(self, Gtk, vboxStack1, category, package_file):
+ try:
+ # Lets set some variables that we know we will need later
+ # hboxes and items to make the page look sensible
+ cat_name = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ seperator = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ lbl1 = Gtk.Label(xalign=0)
+ lbl1.set_text(category)
+ lbl1.set_name("title")
+ hseparator = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
+ seperator.pack_start(hseparator, True, True, 0)
+ cat_name.pack_start(lbl1, False, False, 0)
+
+ # Stack for the different subcategories - I like crossfade as a transition, but you choose
+ stack = Gtk.Stack()
+ stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
+ stack.set_transition_duration(350)
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ # Stack needs a stack switcher to allow the user to make different choices
+ stack_switcher = Gtk.StackSwitcher()
+ stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
+ stack_switcher.set_stack(stack)
+ stack_switcher.set_homogeneous(True)
+
+ # We will need a vbox later for storing the stack and stack switcher together at the end
+ vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+
+ # create scroller for when/if these items go "off the page"
+ scrolledSwitch = Gtk.ScrolledWindow()
+ scrolledSwitch.add(stack_switcher)
+
+ # These lists will ensure that we can keep track of the individual windows and their names
+ # stack of vboxes
+ vboxStacks = []
+ # name of each vbox - derived from the sub category name
+ vboxStackNames = []
+
+ # page variables - reset these when making multiple subcategories:
+ # List of packages for any given subcategory
+ packages = []
+ # labels:
+ name = ""
+ description = ""
+ # Lets start by reading in the package list and saving it as a file
+ with open(package_file, "r") as f:
+ content = f.readlines()
+ # f.close()
+
+ # Add a line to the end of content to force the page to be packed.
+ content.append(
+ "pack now"
+ ) # Really, this can be any string, as long as it doesn't match the if statement below.
+ # Now lets read the file, and use some logic to drive what goes where
+ # Optomised for runspeed: the line most commonly activated appears first.
+ for line in content:
+ # this line will handle code in the yaml that we simply don't need or care about
+ # MAINTENANCE; if the structure of the .yaml file ever changes, this WILL likely need to be updated
+ if line.startswith(" packages:"):
+ continue
+ elif line.startswith(" - "):
+ # add the package to the packages list
+ package = line.strip(" - ")
+ packages.append(package)
+ # TODO: Add list and function to obtain package description from pacman and store it (maybe? Maybe the yaml file has what we need?)
+ elif line.startswith(" description: "):
+ # Set the label text for the description line
+ description = (
+ line.strip(" description: ").strip().strip('"').strip("\n")
+ )
+ else:
+ # We will only hit here for category changes, or to pack the page, or if the yaml is changed.
+ # Yaml changes are handled in the first if statement.
+ # Pack page;
+
+ if len(packages) > 0:
+ # Pack the page
+ # Packing list:
+ # vbox to pack into - pop it off the
+ page = vboxStacks.pop()
+ # grid it
+ grid = Gtk.Grid()
+ # Subcat
+ lblName = Gtk.Label(xalign=0)
+ lblName.set_markup("" + name + "")
+ page.pack_start(lblName, False, False, 0)
+ # description
+ lblDesc = Gtk.Label(xalign=0)
+ lblDesc.set_markup("Description: " + description + "")
+ page.pack_start(lblDesc, False, False, 0)
+ # packages
+ sep_text = " "
+ for i in range(len(packages)):
+ grid.insert_row(i)
+ # hbox_pkg = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0)
+ lblSep1 = Gtk.Label(xalign=0, yalign=0)
+ lblSep1.set_text(sep_text)
+ grid.attach(lblSep1, 0, i, 1, 1)
+ lblPkg = Gtk.Label(xalign=0, yalign=0) # was in for loop
+
+ lblPkg.set_markup("%s" % packages[i].strip()) # was in for loop
+ # hbox_pkg.pack_start(lblPkg, False, False, 100)
+ ###### switch widget starts ######
+
+
+ # construct new switch
+ switch = Gtk.Switch()
+
+ switch.set_active(Functions.query_pkg(packages[i]))
+ switch.connect(
+ "notify::active",
+ self.app_toggle,
+ packages[i],
+ Gtk,
+ vboxStack1,
+ Functions,
+ category,
+ )
+
+ # add switch widget to grid
+
+ # attach_next_to(child, sibling, side, width, height)
+
+ grid.attach_next_to(
+ switch, lblSep1, Gtk.PositionType.LEFT, 1, 1
+ )
+
+ # add space seperator next to switch
+
+ lblSepSwitch = Gtk.Label(xalign=0, yalign=0)
+ lblSepSwitch.set_text(sep_text)
+
+ grid.attach_next_to(
+ lblSepSwitch, switch, Gtk.PositionType.LEFT, 1, 1
+ )
+
+ ###### switch widget ends ######
+
+
+ ###### pkg name label widget starts ######
+
+ lblSepPkg1 = Gtk.Label(xalign=0, yalign=0)
+ lblSepPkg1.set_text(sep_text)
+
+
+ # add space seperator next to switch for extra padding
+
+ grid.attach_next_to(
+ lblSepPkg1, switch, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ lblSepPkg2 = Gtk.Label(xalign=0, yalign=0)
+ lblSepPkg2.set_text(sep_text)
+
+ # add pkg name label widget to grid
+
+ grid.attach_next_to(
+ lblPkg, lblSepPkg1, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ ###### pkg name label widget ends
+
+
+ ###### pkg desc label widget starts ######
+
+ lblSepPkgDesc = Gtk.Label(xalign=0, yalign=0)
+ lblSepPkgDesc.set_text(sep_text)
+
+ # add space seperator next to pkg name for extra padding
+
+ grid.attach_next_to(
+ lblSepPkgDesc, lblPkg, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ lblPkgDesc = Gtk.Label(xalign=0, yalign=0)
+ lblPkgDesc.set_text(Functions.obtain_pkg_description(packages[i]))
+
+ # add pkg desc label widget to grid
+
+ grid.attach_next_to(
+ lblPkgDesc, lblSepPkgDesc, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+
+
+
+ ###### pkg desc label widget ends
+
+ # make the page scrollable
+ grid_sc = Gtk.ScrolledWindow()
+ grid_sc.add(grid)
+
+ grid_sc.set_propagate_natural_height(True)
+ # pack the grid to the page.
+ page.pack_start(grid_sc, False, False, 0)
+ # save the page - put it back (now populated)
+ vboxStacks.append(page)
+ # reset the things that we need to.
+ packages.clear()
+ grid = Gtk.Grid()
+ # category change
+ if line.startswith("- name: "):
+ # Generate the vboxStack item and name for use later (and in packing)
+ name = line.strip("- name: ").strip().strip('"')
+ vboxStackNames.append(name)
+ vboxStacks.append(
+ Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ )
+
+ # Now we pack the stack
+ item_num = 0
+ for item in vboxStacks:
+ stack.add_titled(item, "stack" + str(item_num), vboxStackNames[item_num])
+ item_num += 1
+
+ # Place the stack switcher and the stack together into a vbox
+ vbox.pack_start(scrolledSwitch, False, False, 0)
+ vbox.pack_start(stack, True, True, 0)
+
+ # Stuff the vbox with the title and seperator to create the page
+ vboxStack1.pack_start(cat_name, False, False, 0)
+ vboxStack1.pack_start(seperator, False, False, 0)
+ vboxStack1.pack_start(vbox, False, False, 0)
+
+ except Exception as e:
+ print("Exception in App_Frame_GUI.GUI(): %s" % e)
+"""
+########## PREVIOUS GUI CODE END ##########
diff --git a/usr/share/sofirem/ui/GUI.py b/usr/share/sofirem/ui/GUI.py
new file mode 100644
index 0000000..f313e16
--- /dev/null
+++ b/usr/share/sofirem/ui/GUI.py
@@ -0,0 +1,726 @@
+# =================================================================
+# = Author: Cameron Percival =
+# =================================================================
+
+
+# ============Functions============
+import Functions as fn
+from ui.AppFrameGUI import AppFrameGUI
+from multiprocessing import cpu_count
+from queue import Queue
+from threading import Thread
+
+base_dir = fn.os.path.abspath(fn.os.path.join(fn.os.path.dirname(__file__), ".."))
+# base_dir = fn.os.path.dirname(fn.os.path.realpath(__file__))
+
+
+class GUI_Worker(Thread):
+ def __init__(self, queue):
+ Thread.__init__(self)
+ self.queue = queue
+
+ def run(self):
+ while True:
+ # pull what we need from the queue so we can process properly.
+ items = self.queue.get()
+
+ try:
+ # make sure we have the required number of items on the queue
+ if items is not None:
+ # self, Gtk, vboxStack1, category, package_file = items
+
+ self, Gtk, vbox_stack, category, packages = items
+
+ AppFrameGUI.build_ui_frame(
+ self,
+ Gtk,
+ vbox_stack,
+ category,
+ packages,
+ )
+
+ except Exception as e:
+ fn.logger.error("Exception in GUI_Worker(): %s" % e)
+ finally:
+ if items is None:
+ fn.logger.debug("Stopping GUI Worker thread")
+ self.queue.task_done()
+ return False
+ self.queue.task_done()
+
+
+class GUI:
+ def setup_gui_search(
+ self,
+ Gtk,
+ Gdk,
+ GdkPixbuf,
+ base_dir,
+ os,
+ Pango,
+ search_results,
+ search_term,
+ settings,
+ ):
+ try:
+ # remove previous vbox
+ if self.search_activated == False:
+ self.remove(self.vbox)
+ else:
+ self.remove(self.vbox_search)
+
+ # lets quickly create the latest installed list.
+ fn.get_current_installed()
+
+ # =======================================================
+ # HeaderBar
+ # =======================================================
+
+ setup_headerbar(self, Gtk, settings)
+
+ # =======================================================
+ # App Notifications
+ # =======================================================
+
+ hbox0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+
+ self.notification_revealer = Gtk.Revealer()
+ self.notification_revealer.set_reveal_child(False)
+
+ self.notification_label = Gtk.Label()
+
+ pb_panel = GdkPixbuf.Pixbuf().new_from_file(base_dir + "/images/panel.png")
+ panel = Gtk.Image().new_from_pixbuf(pb_panel)
+
+ overlay_frame = Gtk.Overlay()
+ overlay_frame.add(panel)
+ overlay_frame.add_overlay(self.notification_label)
+
+ self.notification_revealer.add(overlay_frame)
+
+ hbox0.pack_start(self.notification_revealer, True, False, 0)
+
+ # ==========================================================
+ # CONTAINER
+ # ==========================================================
+
+ self.vbox_search = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
+ vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
+ hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
+
+ self.vbox_search.pack_start(hbox, True, True, 0)
+ self.add(self.vbox_search)
+
+ # ==========================================================
+ # PREP WORK
+ # ==========================================================
+
+ # This section sets up the tabs, and the array for dealing with the tab content
+
+ # ==========================================================
+ # GENERATE STACK
+ # ==========================================================
+ stack = Gtk.Stack()
+ # stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
+ stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
+ stack.set_transition_duration(350)
+
+ vbox_stack = []
+ stack_item = 0
+
+ # Max Threads
+ """
+ Fatal Python error: Segmentation fault
+ This error happens randomly, due to the for loop iteration on the cpu_count
+ old code: for x in range(cpu_count()):
+ """
+
+ # spawn only 1 GUI_Worker threads, as any number greater causes a Segmentation fault
+
+ search_worker = GUI_Worker(self.queue)
+ search_worker.name = "thread_GUI_search_worker"
+ # Set the worker to be True to allow processing, and avoid Blocking
+ # search_worker.daemon = True
+ search_worker.start()
+
+ # This code section might look a little weird. It is because it was
+ # derived from another function before this version was required.
+
+ for category in search_results:
+ # NOTE: IF the yaml file name standard changes, be sure to update this, or weirdness will follow.
+
+ # subcategory = search_results[category][0].subcategory
+ vbox_stack.append(
+ Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+ )
+ stack.add_titled(
+ vbox_stack[stack_item],
+ str("stack" + str(len(vbox_stack))),
+ category,
+ )
+
+ # subcategory_desc = search_results[category][0].subcategory_description
+ search_res_lst = search_results[category]
+
+ # Multithreading!
+
+ self.queue.put(
+ (
+ self,
+ Gtk,
+ vbox_stack[stack_item],
+ category,
+ search_res_lst,
+ )
+ )
+
+ stack_item += 1
+
+ # send a signal that no further items are to be put on the queue
+ self.queue.put(None)
+ # safety to ensure that we finish threading before we continue on.
+ self.queue.join()
+ fn.logger.debug("GUI Worker thread completed")
+
+ stack_switcher = Gtk.StackSidebar()
+ stack_switcher.set_name("sidebar")
+ stack_switcher.set_stack(stack)
+
+ # =====================================================
+ # LOGO
+ # =====================================================
+
+ ivbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+ pixbuf = GdkPixbuf.Pixbuf().new_from_file_at_size(
+ os.path.join(base_dir, "images/sofirem.png"), 45, 45
+ )
+ image = Gtk.Image().new_from_pixbuf(pixbuf)
+
+ # remove the focus on startup from search entry
+ ivbox.set_property("can-focus", True)
+ Gtk.Window.grab_focus(ivbox)
+
+ # =====================================================
+ # RECACHE BUTTON
+ # =====================================================
+
+ btn_recache = Gtk.Button(label="Recache Applications")
+ btn_recache.connect("clicked", self.recache_clicked)
+ # btnReCache.set_property("has-tooltip", True)
+ # btnReCache.connect("query-tooltip", self.tooltip_callback,
+ # "Refresh the application cache")
+
+ # =====================================================
+ # REPOS
+ # =====================================================
+
+ # if not (
+ # fn.check_package_installed("arcolinux-keyring")
+ # or fn.check_package_installed("arcolinux-mirrorlist-git")
+ # ):
+ # self.btnRepos = Gtk.Button(label="Add ArcoLinux Repo")
+ # self.btnRepos._value = 1
+ # else:
+ # self.btnRepos = Gtk.Button(label="Remove ArcoLinux Repo")
+ # self.btnRepos._value = 2
+ #
+ # self.btnRepos.set_size_request(100, 30)
+ # self.btnRepos.connect("clicked", self.on_repos_clicked)
+
+ # =====================================================
+ # QUIT BUTTON
+ # =====================================================
+
+ btn_quit_app = Gtk.Button(label="Quit")
+ btn_quit_app.set_size_request(100, 30)
+ btn_quit_app.connect("clicked", self.on_close, "delete-event")
+ btn_context = btn_quit_app.get_style_context()
+ btn_context.add_class("destructive-action")
+
+ # =====================================================
+ # SEARCH BOX
+ # =====================================================
+
+ self.searchentry = Gtk.SearchEntry()
+ self.searchentry.set_text(search_term)
+ self.searchentry.connect("activate", self.on_search_activated)
+ self.searchentry.connect("icon-release", self.on_search_cleared)
+
+ iv_searchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+
+ # =====================================================
+ # PACKS
+ # =====================================================
+
+ # hbox1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2)
+ # hbox2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2)
+ # hbox3 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2)
+
+ # hbox3.pack_start(btnReCache, False, False, 0)
+
+ iv_searchbox.pack_start(self.searchentry, False, False, 0)
+
+ ivbox.pack_start(image, False, False, 0)
+ ivbox.pack_start(iv_searchbox, False, False, 0)
+ ivbox.pack_start(stack_switcher, True, True, 0)
+
+ ivbox.pack_start(btn_quit_app, False, False, 0)
+
+ vbox1.pack_start(hbox0, False, False, 0)
+ vbox1.pack_start(stack, True, True, 0)
+
+ hbox.pack_start(ivbox, False, True, 0)
+ hbox.pack_start(vbox1, True, True, 0)
+
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ self.show_all()
+
+ except Exception as err:
+ fn.logger.error("Exception in GUISearch(): %s" % err)
+
+ def setup_gui(self, Gtk, Gdk, GdkPixbuf, base_dir, os, Pango, settings): # noqa
+ try:
+ # reset back to main box
+ if self.search_activated:
+ # remove the search vbox
+ self.remove(self.vbox_search)
+ self.show_all()
+
+ # lets quickly create the latest installed list.
+ fn.get_current_installed()
+
+ # =======================================================
+ # HeaderBar
+ # =======================================================
+
+ setup_headerbar(self, Gtk, settings)
+
+ # =======================================================
+ # App Notifications
+ # =======================================================
+
+ hbox0 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+
+ self.notification_revealer = Gtk.Revealer()
+ self.notification_revealer.set_reveal_child(False)
+
+ self.notification_label = Gtk.Label()
+
+ pb_panel = GdkPixbuf.Pixbuf().new_from_file(base_dir + "/images/panel.png")
+ panel = Gtk.Image().new_from_pixbuf(pb_panel)
+
+ overlay_frame = Gtk.Overlay()
+ overlay_frame.add(panel)
+ overlay_frame.add_overlay(self.notification_label)
+
+ self.notification_revealer.add(overlay_frame)
+
+ hbox0.pack_start(self.notification_revealer, True, False, 0)
+
+ # ==========================================================
+ # CONTAINER
+ # ==========================================================
+
+ self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
+ vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
+ hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
+
+ self.vbox.pack_start(hbox, True, True, 0)
+ self.add(self.vbox)
+
+ # ==========================================================
+ # PREP WORK
+ # ==========================================================
+
+ # This section sets up the tabs, and the array for dealing with the tab content
+ """
+ yaml_files_unsorted = []
+ path = base_dir + "/yaml/"
+ for file in os.listdir(path):
+ if file.endswith(".yaml"):
+ yaml_files_unsorted.append(file)
+ else:
+ print(
+ "Unsupported configuration file type. Please contact Arcolinux Support."
+ )
+ # Need to sort the list (Or do we? I choose to)
+ yaml_files = sorted(yaml_files_unsorted)
+ """
+
+ # Check github for updated files
+ # fn.check_github(yaml_files)
+ # ==========================================================
+ # GENERATE STACK
+ # ==========================================================
+ stack = Gtk.Stack()
+ # stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
+ stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
+ stack.set_transition_duration(350)
+
+ vbox_stack = []
+ stack_item = 0
+
+ # Max Threads
+ """
+ Fatal Python error: Segmentation fault
+ This error happens randomly, due to the for loop iteration on the cpu_count
+ old code: for x in range(cpu_count()):
+ """
+
+ # spawn only 1 GUI_Worker threads, as any number greater causes a Segmentation fault
+
+ worker = GUI_Worker(self.queue)
+ worker.name = "thread_GUI_Worker"
+ # Set the worker to be True to allow processing, and avoid Blocking
+ # worker.daemon = True
+ worker.start()
+
+ for category in self.packages:
+ # NOTE: IF the yaml file name standard changes, be sure to update this, or weirdness will follow.
+
+ # this is the side stack listing all categories
+ vbox_stack.append(
+ Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+ )
+ stack.add_titled(
+ vbox_stack[stack_item],
+ str("stack" + str(len(vbox_stack))),
+ category,
+ )
+
+ packages_lst = self.packages[category]
+
+ # Multithreading!
+ self.queue.put(
+ (
+ self,
+ Gtk,
+ vbox_stack[stack_item],
+ category,
+ packages_lst,
+ )
+ )
+ stack_item += 1
+
+ # send a signal that no further items are to be put on the queue
+ self.queue.put(None)
+ # safety to ensure that we finish threading before we continue on.
+
+ self.queue.join()
+ fn.logger.debug("GUI Worker thread completed")
+
+ stack_switcher = Gtk.StackSidebar()
+ stack_switcher.set_name("sidebar")
+ stack_switcher.set_stack(stack)
+
+ # =====================================================
+ # LOGO
+ # =====================================================
+
+ ivbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+ pixbuf = GdkPixbuf.Pixbuf().new_from_file_at_size(
+ os.path.join(base_dir, "images/sofirem.png"), 45, 45
+ )
+ image = Gtk.Image().new_from_pixbuf(pixbuf)
+
+ # remove the focus on startup from search entry
+ ivbox.set_property("can-focus", True)
+ Gtk.Window.grab_focus(ivbox)
+
+ # =====================================================
+ # RECACHE BUTTON
+ # =====================================================
+
+ # btnReCache = Gtk.Button(label="Recache Applications")
+ # btnReCache.connect("clicked", self.recache_clicked)
+ # btnReCache.set_property("has-tooltip", True)
+ # btnReCache.connect("query-tooltip", self.tooltip_callback,
+ # "Refresh the application cache")
+
+ # =====================================================
+ # REPOS
+ # =====================================================
+
+ # =====================================================
+ # QUIT BUTTON
+ # =====================================================
+ btn_quit_app = Gtk.Button(label="Quit")
+ btn_quit_app.set_size_request(100, 30)
+ btn_quit_app.connect("clicked", self.on_close, "delete-event")
+ btn_context = btn_quit_app.get_style_context()
+ btn_context.add_class("destructive-action")
+ # =====================================================
+ # SEARCH BOX
+ # =====================================================
+ self.searchentry = Gtk.SearchEntry()
+ self.searchentry.set_placeholder_text("Search...")
+ self.searchentry.connect("activate", self.on_search_activated)
+ self.searchentry.connect("icon-release", self.on_search_cleared)
+
+ ivsearchbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+
+ ivsearchbox.pack_start(self.searchentry, False, False, 0)
+
+ ivbox.pack_start(image, False, False, 0)
+ ivbox.pack_start(ivsearchbox, False, False, 0)
+ ivbox.pack_start(stack_switcher, True, True, 0)
+ ivbox.pack_start(btn_quit_app, False, False, 0)
+
+ vbox1.pack_start(hbox0, False, False, 0)
+ vbox1.pack_start(stack, True, True, 0)
+
+ hbox.pack_start(ivbox, False, True, 0)
+ hbox.pack_start(vbox1, True, True, 0)
+
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ if self.search_activated:
+ self.show_all()
+
+ except Exception as e:
+ fn.logger.error("Exception in GUI(): %s" % e)
+
+
+# setup headerbar including popover settings
+def setup_headerbar(self, Gtk, settings):
+ try:
+ header_bar_title = "Sofirem"
+ headerbar = Gtk.HeaderBar()
+ headerbar.set_title(header_bar_title)
+ headerbar.set_show_close_button(True)
+
+ self.set_titlebar(headerbar)
+
+ toolbutton = Gtk.ToolButton()
+ # icon-name open-menu-symbolic / open-menu-symbolic.symbolic
+ toolbutton.set_icon_name("open-menu-symbolic")
+
+ toolbutton.connect("clicked", self.on_settings_clicked)
+
+ headerbar.pack_end(toolbutton)
+
+ self.popover = Gtk.Popover()
+ self.popover.set_relative_to(toolbutton)
+
+ vbox = Gtk.Box(spacing=0, orientation=Gtk.Orientation.VERTICAL)
+ vbox.set_border_width(15)
+
+ # switches
+
+ # switch to display package versions
+ self.switch_package_version = Gtk.Switch()
+
+ if settings != None:
+ if settings["Display Package Versions"]:
+ self.display_versions = settings["Display Package Versions"]
+
+ if self.display_versions == True:
+ self.switch_package_version.set_active(True)
+ else:
+ self.switch_package_version.set_active(False)
+
+ self.switch_package_version.connect("notify::active", self.version_toggle)
+
+ # switch to import arcolinux keyring
+ self.switch_arco_keyring = Gtk.Switch()
+
+ if (
+ fn.check_package_installed("arcolinux-keyring") is False
+ or fn.verify_arco_pacman_conf() is False
+ ):
+ self.switch_arco_keyring.set_state(False)
+
+ else:
+ self.switch_arco_keyring.set_state(True)
+
+ self.switch_arco_keyring.connect("state-set", self.arco_keyring_toggle)
+
+ # switch to import arcolinix mirrorlist
+ self.switch_arco_mirrorlist = Gtk.Switch()
+
+ if (
+ fn.check_package_installed("arcolinux-mirrorlist-git") is False
+ or fn.verify_arco_pacman_conf() is False
+ ):
+ self.switch_arco_mirrorlist.set_state(False)
+
+ else:
+ self.switch_arco_mirrorlist.set_state(True)
+
+ self.switch_arco_mirrorlist.connect("state-set", self.arco_mirrorlist_toggle)
+
+ # switch to display package progress window
+ self.switch_package_progress = Gtk.Switch()
+
+ if settings != None:
+ if settings["Display Package Progress"]:
+ self.display_package_progress = settings["Display Package Progress"]
+
+ if self.display_package_progress == True:
+ self.switch_package_progress.set_active(True)
+ else:
+ self.switch_package_progress.set_active(False)
+ self.switch_package_progress.connect(
+ "notify::active", self.package_progress_toggle
+ )
+
+ # modalbuttons
+
+ # button to open the pacman log monitoring dialog
+ self.modelbtn_pacmanlog = Gtk.ModelButton()
+ self.modelbtn_pacmanlog.connect("clicked", self.on_pacman_log_clicked)
+ self.modelbtn_pacmanlog.set_name("modelbtn_popover")
+ self.modelbtn_pacmanlog.props.centered = False
+ self.modelbtn_pacmanlog.props.text = "Open Pacman Log File"
+
+ # button to display installed packages window
+ modelbtn_packages_export = Gtk.ModelButton()
+ modelbtn_packages_export.connect("clicked", self.on_packages_export_clicked)
+ modelbtn_packages_export.set_name("modelbtn_popover")
+ modelbtn_packages_export.props.centered = False
+ modelbtn_packages_export.props.text = "Show Installed Packages"
+
+ # button to display import packages window
+ modelbtn_packages_import = Gtk.ModelButton()
+ modelbtn_packages_import.connect("clicked", self.on_packages_import_clicked)
+ modelbtn_packages_import.set_name("modelbtn_popover")
+ modelbtn_packages_import.props.centered = False
+ modelbtn_packages_import.props.text = "Import Packages"
+
+ # button to show about dialog
+ modelbtn_about_app = Gtk.ModelButton()
+ modelbtn_about_app.connect("clicked", self.on_about_app_clicked)
+ modelbtn_about_app.set_name("modelbtn_popover")
+ modelbtn_about_app.props.centered = False
+ modelbtn_about_app.props.text = "About Sofirem"
+
+ # button to show iso package lists window
+ modelbtn_iso_packages_list = Gtk.ModelButton()
+ modelbtn_iso_packages_list.connect(
+ "clicked", self.on_arcolinux_iso_packages_clicked
+ )
+ modelbtn_iso_packages_list.set_name("modelbtn_popover")
+ modelbtn_iso_packages_list.props.centered = False
+ modelbtn_iso_packages_list.props.text = "Explore ArcoLinux ISO Packages"
+
+ # button to show package search window
+ modelbtn_package_search = Gtk.ModelButton()
+ modelbtn_package_search.connect("clicked", self.on_package_search_clicked)
+ modelbtn_package_search.set_name("modelbtn_popover")
+ modelbtn_package_search.props.centered = False
+ modelbtn_package_search.props.text = "Open Package Search"
+
+ # grid for the switch options
+ grid_switches = Gtk.Grid()
+ grid_switches.set_row_homogeneous(True)
+
+ lbl_package_version = Gtk.Label(xalign=0)
+ lbl_package_version.set_text("Display Package Versions")
+
+ lbl_package_version_padding = Gtk.Label(xalign=0)
+ lbl_package_version_padding.set_text(" ")
+
+ lbl_package_progress = Gtk.Label(xalign=0)
+ lbl_package_progress.set_text("Display Package Progress")
+
+ lbl_package_progress_padding = Gtk.Label(xalign=0)
+ lbl_package_progress_padding.set_text(" ")
+
+ lbl_arco_keyring = Gtk.Label(xalign=0)
+ lbl_arco_keyring.set_text("Import ArcoLinux Keyring")
+
+ lbl_arco_keyring_padding = Gtk.Label(xalign=0)
+ lbl_arco_keyring_padding.set_text(" ")
+
+ lbl_arco_mirrorlist = Gtk.Label(xalign=0)
+ lbl_arco_mirrorlist.set_text("Import ArcoLinux Mirrorlist")
+
+ lbl_arco_mirrorlist_padding = Gtk.Label(xalign=0)
+ lbl_arco_mirrorlist_padding.set_text(" ")
+
+ grid_switches.attach(lbl_package_version, 0, 1, 1, 1)
+ grid_switches.attach_next_to(
+ lbl_package_version_padding,
+ lbl_package_version,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach_next_to(
+ self.switch_package_version,
+ lbl_package_version_padding,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach(lbl_package_progress, 0, 2, 1, 1)
+ grid_switches.attach_next_to(
+ lbl_package_progress_padding,
+ lbl_package_progress,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach_next_to(
+ self.switch_package_progress,
+ lbl_package_progress_padding,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach(lbl_arco_keyring, 0, 3, 1, 1)
+ grid_switches.attach_next_to(
+ lbl_arco_keyring_padding,
+ lbl_arco_keyring,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach_next_to(
+ self.switch_arco_keyring,
+ lbl_arco_keyring_padding,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach(lbl_arco_mirrorlist, 0, 4, 1, 1)
+ grid_switches.attach_next_to(
+ lbl_arco_mirrorlist_padding,
+ lbl_arco_mirrorlist,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ grid_switches.attach_next_to(
+ self.switch_arco_mirrorlist,
+ lbl_arco_mirrorlist_padding,
+ Gtk.PositionType.RIGHT,
+ 1,
+ 1,
+ )
+
+ vbox_buttons = Gtk.Box(spacing=1, orientation=Gtk.Orientation.VERTICAL)
+ vbox_buttons.pack_start(self.modelbtn_pacmanlog, False, True, 0)
+ vbox_buttons.pack_start(modelbtn_packages_export, False, True, 0)
+ vbox_buttons.pack_start(modelbtn_packages_import, False, True, 0)
+ vbox_buttons.pack_start(modelbtn_iso_packages_list, False, True, 0)
+ vbox_buttons.pack_start(modelbtn_package_search, False, True, 0)
+ vbox_buttons.pack_start(modelbtn_about_app, False, True, 0)
+
+ vbox.pack_start(grid_switches, False, False, 0)
+ vbox.pack_start(vbox_buttons, False, False, 0)
+
+ self.popover.add(vbox)
+ self.popover.set_position(Gtk.PositionType.BOTTOM)
+ except Exception as e:
+ fn.logger.error("Exception in setup_headerbar(): %s" % e)
diff --git a/usr/share/sofirem/ui/ISOPackagesWindow.py b/usr/share/sofirem/ui/ISOPackagesWindow.py
new file mode 100644
index 0000000..2e9c02a
--- /dev/null
+++ b/usr/share/sofirem/ui/ISOPackagesWindow.py
@@ -0,0 +1,429 @@
+# This class is used to create a window showing a list of packages available for a given ArcoLinux ISO
+
+import os
+import gi
+import requests
+import Functions as fn
+from ui.MessageDialog import MessageDialog
+
+gi.require_version("Gtk", "3.0")
+from gi.repository import Gtk, GLib
+
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+
+
+arcolinux_isos = [
+ "arcolinuxs-xanmod-iso",
+ "arcolinuxs-zen-iso",
+ "arcolinuxs-lts-iso",
+ "arcolinuxs-iso",
+ "arcolinuxl-iso",
+ "arcolinuxd-iso",
+]
+
+arcolinuxb_isos = [
+ "arco-sway",
+ "arco-plasma",
+ "arco-hyprland",
+ "arco-chadwm",
+ "arco-dusk",
+ "arco-dwm",
+ "arco-berry",
+ "arco-hypr",
+ "arco-enlightenment",
+ "arco-xtended",
+ "arco-pantheon",
+ "arco-awesome",
+ "arco-bspwm",
+ "arco-cinnamon",
+ "arco-budgie",
+ "arco-cutefish",
+ "arco-cwm",
+ "arco-deepin",
+ "arco-gnome",
+ "arco-fvwm3",
+ "arco-herbstluftwm",
+ "arco-i3",
+ "arco-icewm",
+ "arco-jwm",
+ "arco-leftwm",
+ "arco-lxqt",
+ "arco-mate",
+ "arco-openbox",
+ "arco-qtile",
+ "arco-spectrwm",
+ "arco-ukui",
+ "arco-wmderland",
+ "arco-xfce",
+ "arco-xmonad",
+]
+
+github_arcolinux_packagelist = "https://raw.githubusercontent.com/${ARCOLINUX}/${ISO}/master/archiso/packages.x86_64"
+headers = {"Content-Type": "text/plain;charset=UTF-8"}
+
+
+class ISOPackagesWindow(Gtk.Window):
+ def __init__(self):
+ Gtk.Window.__init__(self)
+
+ headerbar = Gtk.HeaderBar()
+ headerbar.set_title("ArcoLinux ISO Package Explorer")
+ headerbar.set_show_close_button(True)
+
+ # remove the focus on startup from search entry
+ headerbar.set_property("can-focus", True)
+ Gtk.Window.grab_focus(headerbar)
+
+ self.set_resizable(True)
+ self.set_size_request(500, 600)
+ self.set_border_width(10)
+ self.set_titlebar(headerbar)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+ self.treeview_loaded = False
+ self.build_gui()
+
+ def get_packagelist(self):
+ try:
+ # make request to get the package list from github
+ url = None
+
+ self.package_list = []
+
+ if "-iso" in self.selected_iso:
+ url = github_arcolinux_packagelist.replace(
+ "${ARCOLINUX}", "arcolinux"
+ ).replace("${ISO}", self.selected_iso)
+ github_arcolinux = [
+ "https://github.com/arcolinux/",
+ self.selected_iso,
+ "/blob/master/archiso/packages.x86_64",
+ ]
+
+ self.github_source = "".join(github_arcolinux)
+ else:
+ url = github_arcolinux_packagelist.replace(
+ "${ARCOLINUX}", "arcolinuxb"
+ ).replace("${ISO}", self.selected_iso)
+
+ github_arcolinuxb = [
+ "https://github.com/arcolinuxb/",
+ self.selected_iso,
+ "/blob/master/archiso/packages.x86_64",
+ ]
+
+ self.github_source = "".join(github_arcolinuxb)
+
+ r = requests.get(url, headers=headers, allow_redirects=True)
+
+ # read the package list ignore any commented lines
+ if r.status_code == 200:
+ if len(r.text) > 0:
+ for line in r.text.splitlines():
+ if "#" not in line.strip() and len(line.strip()) > 0:
+ self.package_list.append((line.strip(), None))
+ else:
+ fn.logger.error("Request for %s returned %s" % (url, r.status_code))
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Request failed",
+ "Failed to request package list",
+ "Request for %s returned status code = %s" % (url, r.status_code),
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ message_dialog.destroy()
+
+ except Exception as e:
+ message_dialog = MessageDialog(
+ "Error",
+ "Request failed",
+ "Failed to request package list",
+ e,
+ "error",
+ True,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ message_dialog.destroy()
+
+ def on_combo_iso_changed(self, combo):
+ try:
+ iso = combo.get_active_text()
+ if iso is not None:
+ self.selected_iso = iso
+ self.get_packagelist()
+
+ if len(self.package_list) > 0:
+ lbl_github_source_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_github_source_title.set_markup("Package list source")
+
+ lbl_github_source_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_github_source_value.set_markup(
+ "%s" % (self.github_source, self.github_source)
+ )
+
+ lbl_package_count_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_count_title.set_markup("Activated packages")
+
+ lbl_package_count_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_count_value.set_text(str(len(self.package_list)))
+
+ self.filename = "%s/sofirem-exports/%s-%s-packages.x86_64.txt" % (
+ fn.home,
+ self.selected_iso,
+ fn.datetime.now().strftime("%Y-%m-%d"),
+ )
+
+ lbl_export_desc_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_export_desc_title.set_markup("Export destination")
+
+ lbl_export_desc_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_export_desc_value.set_text(self.filename)
+
+ if self.treeview_loaded is True:
+ self.vbox_package_data.destroy()
+
+ search_entry = Gtk.SearchEntry()
+ search_entry.set_placeholder_text("Search...")
+ search_entry.set_size_request(450, 0)
+
+ grid_package_data = Gtk.Grid()
+
+ treestore_packages_explorer = Gtk.TreeStore(str, str)
+
+ for item in sorted(self.package_list):
+ treestore_packages_explorer.append(None, list(item))
+
+ treeview_packages_explorer = Gtk.TreeView()
+ treeview_packages_explorer.set_search_entry(search_entry)
+
+ treeview_packages_explorer.set_model(treestore_packages_explorer)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Packages", renderer, text=0)
+
+ treeview_packages_explorer.append_column(column)
+
+ path = Gtk.TreePath.new_from_indices([0])
+
+ selection = treeview_packages_explorer.get_selection()
+
+ selection.select_path(path)
+
+ treeview_packages_explorer.expand_all()
+ treeview_packages_explorer.columns_autosize()
+
+ scrolled_window = Gtk.ScrolledWindow()
+ scrolled_window.set_vexpand(True)
+ scrolled_window.set_hexpand(True)
+
+ scrolled_window.add(treeview_packages_explorer)
+
+ grid_treeview = Gtk.Grid()
+ grid_treeview.set_column_homogeneous(True)
+
+ self.vbox_package_data = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+
+ self.vbox_package_data.pack_start(
+ lbl_github_source_title, False, True, 1
+ )
+
+ self.vbox_package_data.pack_start(
+ lbl_github_source_value, False, True, 1
+ )
+
+ self.vbox_package_data.pack_start(
+ lbl_package_count_title, False, True, 1
+ )
+
+ self.vbox_package_data.pack_start(
+ lbl_package_count_value, False, True, 1
+ )
+
+ self.vbox_package_data.pack_start(
+ lbl_export_desc_title, False, True, 1
+ )
+ self.vbox_package_data.pack_start(
+ lbl_export_desc_value, False, True, 1
+ )
+
+ lbl_padding_search_entry1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_search_entry1.set_text("")
+
+ lbl_padding_search_entry2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_search_entry2.set_text("")
+
+ grid_search_entry = Gtk.Grid()
+
+ grid_search_entry.attach(lbl_padding_search_entry1, 0, 1, 1, 1)
+ grid_search_entry.attach(search_entry, 0, 2, 1, 1)
+ grid_search_entry.attach(lbl_padding_search_entry2, 0, 3, 1, 1)
+
+ self.vbox_package_data.pack_start(
+ grid_search_entry, False, False, 1
+ )
+
+ self.vbox_package_data.pack_start(scrolled_window, False, True, 1)
+
+ self.vbox_combo.pack_start(self.vbox_package_data, False, True, 1)
+
+ self.show_all()
+
+ self.treeview_loaded = True
+
+ except Exception as e:
+ fn.logger.error("Exception in on_combo_iso_changed(): %s" % e)
+
+ def on_iso_package_list_export(self, widget):
+ # export the package list to a file inside $HOME/sofirem-exports
+ fn.logger.debug("Exporting ArcoLinux ISO package list")
+ try:
+ if self.filename is not None:
+ with open(self.filename, "w", encoding="utf-8") as f:
+ f.write(
+ "# Created by Sofirem on %s\n"
+ % fn.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ )
+ f.write("# %s\n" % self.github_source)
+ for line in sorted(self.package_list):
+ f.write("%s\n" % line[0])
+
+ if os.path.exists(self.filename):
+ message_dialog = MessageDialog(
+ "Info",
+ "Package export complete",
+ "Package list exported to %s" % self.filename,
+ "",
+ "info",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ else:
+ message_dialog = MessageDialog(
+ "Error",
+ "Package export failed",
+ "Package list export failed",
+ "",
+ "error",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ # file is created by root, update the permissions to the sudo username
+ fn.permissions(self.filename)
+ else:
+ message_dialog = MessageDialog(
+ "Warning",
+ "Select an ISO",
+ "An ArcoLinux ISO needs to be selected before exporting",
+ "",
+ "warning",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ except Exception as e:
+ fn.logger.error("Exception in on_iso_package_list_export(): %s" % e)
+
+ def on_close(self, widget):
+ self.hide()
+ self.destroy()
+
+ def populate_combo_iso(self):
+ for arco_iso in arcolinux_isos:
+ self.combo_iso.append_text(arco_iso)
+
+ for arco_isob in sorted(arcolinuxb_isos):
+ self.combo_iso.append_text(arco_isob)
+
+ def build_gui(self):
+ try:
+ lbl_select_iso = Gtk.Label(xalign=0, yalign=0)
+ lbl_select_iso.set_markup("Select ArcoLinux ISO")
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text("")
+
+ self.combo_iso = Gtk.ComboBoxText()
+ self.combo_iso.set_wrap_width(3)
+ self.combo_iso.set_entry_text_column(0)
+ self.combo_iso.connect("changed", self.on_combo_iso_changed)
+
+ self.populate_combo_iso()
+
+ self.filename = None
+
+ grid_top = Gtk.Grid()
+
+ grid_top.attach(lbl_select_iso, 0, 1, 1, 1)
+ grid_top.attach_next_to(
+ lbl_padding1, lbl_select_iso, Gtk.PositionType.BOTTOM, 1, 1
+ )
+ grid_top.attach(self.combo_iso, 0, 2, 1, 1)
+ grid_top.attach(lbl_padding2, 0, 3, 1, 1)
+
+ btn_ok = Gtk.Button(label="OK")
+ btn_ok.set_size_request(100, 30)
+ btn_ok.connect("clicked", self.on_close)
+ btn_ok.set_halign(Gtk.Align.END)
+
+ btn_export = Gtk.Button(label="Export")
+ btn_export.set_size_request(100, 30)
+ btn_export.connect("clicked", self.on_iso_package_list_export)
+ btn_export.set_halign(Gtk.Align.END)
+
+ grid_bottom = Gtk.Grid()
+ grid_bottom.attach(btn_ok, 0, 1, 1, 1)
+
+ lbl_padding3 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding3.set_text(" ")
+
+ grid_bottom.attach_next_to(
+ lbl_padding3, btn_ok, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ grid_bottom.attach_next_to(
+ btn_export, lbl_padding3, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ grid_bottom.set_halign(Gtk.Align.END)
+
+ vbox_bottom = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+
+ lbl_padding_bottom = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_bottom.set_text("")
+
+ vbox_bottom.pack_start(lbl_padding_bottom, False, True, 0)
+ vbox_bottom.pack_start(grid_bottom, False, True, 0)
+
+ self.vbox_combo = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+
+ self.vbox_combo.pack_start(grid_top, False, True, 0)
+ self.vbox_combo.pack_end(vbox_bottom, False, True, 0)
+
+ self.add(self.vbox_combo)
+
+ self.show_all()
+
+ except Exception as e:
+ fn.logger.error("Exception in build_gui(): %s" % e)
diff --git a/usr/share/sofirem/ui/MessageDialog.py b/usr/share/sofirem/ui/MessageDialog.py
new file mode 100644
index 0000000..c2b9ee4
--- /dev/null
+++ b/usr/share/sofirem/ui/MessageDialog.py
@@ -0,0 +1,118 @@
+# This class is used to create a modal dialog window showing detailed information about an event
+
+import os
+import gi
+import Functions as fn
+
+gi.require_version("Gtk", "3.0")
+from gi.repository import Gtk
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class MessageDialog(Gtk.Dialog):
+ # message_type is a string, either one of "info", "warning", "error" to show which infobar to display
+ # extended argument when set to true shows a textview inside the dialog
+ # extended argument when set to false only shows a standard dialog
+ def __init__(
+ self, title, subtitle, first_msg, secondary_msg, message_type, extended
+ ):
+ Gtk.Dialog.__init__(self)
+
+ headerbar = Gtk.HeaderBar()
+ headerbar.set_title(title)
+ headerbar.set_show_close_button(True)
+
+ self.set_resizable(True)
+
+ self.set_border_width(10)
+
+ self.set_titlebar(headerbar)
+
+ btn_ok = Gtk.Button(label="OK")
+ btn_ok.set_size_request(100, 30)
+ btn_ok.connect("clicked", on_message_dialog_ok_response, self)
+ btn_ok.set_halign(Gtk.Align.END)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+
+ infobar = Gtk.InfoBar()
+
+ if message_type == "info":
+ infobar.set_name("infobar_info")
+ if message_type == "error":
+ infobar.set_name("infobar_error")
+ if message_type == "warning":
+ infobar.set_name("infobar_warning")
+
+ lbl_title_message = Gtk.Label(xalign=0, yalign=0)
+ lbl_title_message.set_markup("%s" % subtitle)
+ content = infobar.get_content_area()
+ content.add(lbl_title_message)
+
+ infobar.set_revealed(True)
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text("")
+
+ grid_message = Gtk.Grid()
+
+ grid_message.attach(infobar, 0, 0, 1, 1)
+ grid_message.attach(lbl_padding1, 0, 1, 1, 1)
+
+ if extended is True:
+ scrolled_window = Gtk.ScrolledWindow()
+ textview = Gtk.TextView()
+ textview.set_property("editable", False)
+ textview.set_property("monospace", True)
+ textview.set_border_width(10)
+ textview.set_vexpand(True)
+ textview.set_hexpand(True)
+
+ msg_buffer = textview.get_buffer()
+ msg_buffer.insert(
+ msg_buffer.get_end_iter(),
+ "Event timestamp = %s\n"
+ % fn.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+ )
+ msg_buffer.insert(msg_buffer.get_end_iter(), "%s\n" % first_msg)
+ msg_buffer.insert(msg_buffer.get_end_iter(), "%s\n" % secondary_msg)
+
+ # move focus away from the textview, to hide the cursor at load
+ headerbar.set_property("can-focus", True)
+ Gtk.Window.grab_focus(headerbar)
+
+ scrolled_window.add(textview)
+
+ grid_message.attach(scrolled_window, 0, 2, 1, 1)
+ grid_message.attach(lbl_padding2, 0, 3, 1, 1)
+
+ self.set_default_size(800, 600)
+
+ else:
+ # do not display textview
+ lbl_first_message = Gtk.Label(xalign=0, yalign=0)
+ lbl_first_message.set_text(first_msg)
+
+ lbl_second_message = Gtk.Label(xalign=0, yalign=0)
+ lbl_second_message.set_markup("%s" % secondary_msg)
+
+ grid_message.attach(lbl_first_message, 0, 2, 1, 1)
+ grid_message.attach(lbl_second_message, 0, 3, 1, 1)
+
+ self.set_default_size(600, 100)
+ self.set_resizable(False)
+
+ vbox_close = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+ vbox_close.pack_start(btn_ok, True, True, 1)
+
+ self.vbox.add(grid_message)
+ self.vbox.add(vbox_close)
+
+
+def on_message_dialog_ok_response(self, widget):
+ # widget.hide()
+ widget.destroy()
diff --git a/usr/share/sofirem/ui/PackageListDialog.py b/usr/share/sofirem/ui/PackageListDialog.py
new file mode 100644
index 0000000..ce806c9
--- /dev/null
+++ b/usr/share/sofirem/ui/PackageListDialog.py
@@ -0,0 +1,283 @@
+# This class is used to create a modal dialog window to display currently installed packages
+
+import os
+import gi
+import Functions as fn
+from ui.MessageDialog import MessageDialog
+from queue import Queue
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class PackageListDialog(Gtk.Dialog):
+ def __init__(self):
+ Gtk.Dialog.__init__(self)
+
+ # Create a queue for storing package list exports to display inside PackageListDialog
+ self.pkg_export_queue = Queue()
+
+ self.filename = "%s/packages-x86_64.txt" % (fn.export_dir,)
+
+ self.set_resizable(True)
+ self.set_size_request(1050, 700)
+ self.set_modal(True)
+
+ self.set_border_width(10)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+
+ self.connect("delete-event", self.on_close)
+
+ self.installed_packages_list = None
+
+ self.headerbar = Gtk.HeaderBar()
+ self.headerbar.set_title("Loading please wait ..")
+ self.headerbar.set_show_close_button(True)
+
+ self.set_titlebar(self.headerbar)
+
+ self.grid_packageslst = Gtk.Grid()
+ self.grid_packageslst.set_column_homogeneous(True)
+
+ self.lbl_info = Gtk.Label(xalign=0, yalign=0)
+ self.lbl_info.set_text("Export destination %s" % self.filename)
+
+ # get a list of installed packages on the system
+
+ self.pacman_export_cmd = ["pacman", "-Qien"]
+
+ fn.Thread(
+ target=fn.get_installed_package_data,
+ args=(self,),
+ daemon=True,
+ ).start()
+
+ fn.Thread(target=self.check_queue, daemon=True).start()
+
+ def setup_gui(self):
+ if len(self.installed_packages_list) > 0:
+ self.set_title(
+ "Showing %s installed packages" % len(self.installed_packages_list)
+ )
+
+ search_entry = Gtk.SearchEntry()
+ search_entry.set_placeholder_text("Search...")
+
+ # remove the focus on startup from search entry
+ self.headerbar.set_property("can-focus", True)
+ Gtk.Window.grab_focus(self.headerbar)
+
+ treestore_packages = Gtk.TreeStore(str, str, str, str, str)
+ for item in sorted(self.installed_packages_list):
+ treestore_packages.append(None, list(item))
+
+ treeview_packages = Gtk.TreeView()
+ treeview_packages.set_search_entry(search_entry)
+
+ treeview_packages.set_model(treestore_packages)
+
+ for i, col_title in enumerate(
+ [
+ "Name",
+ "Installed Version",
+ "Latest Version",
+ "Installed Size",
+ "Installed Date",
+ ]
+ ):
+ renderer = Gtk.CellRendererText()
+ col = Gtk.TreeViewColumn(col_title, renderer, text=i)
+ treeview_packages.append_column(col)
+
+ # allow sorting by installed date
+
+ col_installed_date = treeview_packages.get_column(4)
+ col_installed_date.set_sort_column_id(4)
+
+ treestore_packages.set_sort_func(4, self.compare_install_date, None)
+
+ path = Gtk.TreePath.new_from_indices([0])
+
+ selection = treeview_packages.get_selection()
+ selection.select_path(path)
+
+ treeview_packages.expand_all()
+ treeview_packages.columns_autosize()
+
+ scrolled_window = Gtk.ScrolledWindow()
+ scrolled_window.set_vexpand(True)
+ scrolled_window.set_hexpand(True)
+
+ self.grid_packageslst.attach(scrolled_window, 0, 0, 8, 10)
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ self.grid_packageslst.attach_next_to(
+ lbl_padding1, scrolled_window, Gtk.PositionType.BOTTOM, 1, 1
+ )
+
+ btn_dialog_export = Gtk.Button(label="Export")
+ btn_dialog_export.connect("clicked", self.on_dialog_export_clicked)
+ btn_dialog_export.set_size_request(100, 30)
+ btn_dialog_export.set_halign(Gtk.Align.END)
+
+ btn_dialog_export_close = Gtk.Button(label="Close")
+ btn_dialog_export_close.connect("clicked", self.on_close, "delete-event")
+ btn_dialog_export_close.set_size_request(100, 30)
+ btn_dialog_export_close.set_halign(Gtk.Align.END)
+
+ scrolled_window.add(treeview_packages)
+
+ grid_btn = Gtk.Grid()
+ grid_btn.attach(btn_dialog_export, 0, 1, 1, 1)
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text(" ")
+
+ grid_btn.attach_next_to(
+ lbl_padding2, btn_dialog_export, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ grid_btn.attach_next_to(
+ btn_dialog_export_close, lbl_padding2, Gtk.PositionType.RIGHT, 1, 1
+ )
+
+ grid_btn.set_halign(Gtk.Align.END)
+
+ vbox_btn = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+ vbox_btn.pack_start(grid_btn, True, True, 1)
+
+ lbl_padding3 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding3.set_text("")
+
+ self.vbox.add(search_entry)
+ self.vbox.add(lbl_padding3)
+ self.vbox.add(self.grid_packageslst)
+ self.vbox.add(self.lbl_info)
+ self.vbox.add(vbox_btn)
+
+ self.show_all()
+
+ def check_queue(self):
+ while True:
+ self.installed_packages_list = self.pkg_export_queue.get()
+
+ if self.installed_packages_list is not None:
+ break
+
+ self.pkg_export_queue.task_done()
+
+ GLib.idle_add(self.setup_gui, priority=GLib.PRIORITY_DEFAULT)
+
+ def on_close(self, dialog, event):
+ self.hide()
+ self.destroy()
+
+ def on_dialog_export_clicked(self, dialog):
+ try:
+ if not os.path.exists(fn.export_dir):
+ fn.makedirs(fn.export_dir)
+ fn.permissions(fn.export_dir)
+
+ with open(self.filename, "w", encoding="utf-8") as f:
+ f.write(
+ "# This file was auto-generated by Sofirem on %s at %s\n"
+ % (
+ fn.datetime.today().date(),
+ fn.datetime.now().strftime("%H:%M:%S"),
+ )
+ )
+
+ f.write(
+ "# Exported explicitly installed packages using %s\n"
+ % " ".join(self.pacman_export_cmd)
+ )
+
+ for package in sorted(self.installed_packages_list):
+ f.write("%s\n" % (package[0]))
+
+ if os.path.exists(self.filename):
+ fn.logger.info("Export completed")
+
+ # fix permissions, file is owned by root
+ fn.permissions(self.filename)
+
+ message_dialog = MessageDialog(
+ "Info",
+ "Package export complete",
+ "Package list exported to %s" % self.filename,
+ "",
+ "info",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ message_dialog.destroy()
+
+ else:
+ fn.logger.error("Export failed")
+
+ message_dialog = MessageDialog(
+ "Error",
+ "Package export failed",
+ "Failed to export package list to %s." % self.filename,
+ "",
+ "error",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+ message_dialog.destroy()
+
+ except Exception as e:
+ fn.logger.error("Exception in on_dialog_export_clicked(): %s" % e)
+
+ # noqa: any locales other than en_GB.UTF-8 / en_US.UTF-8 are untested
+ def compare_install_date(self, model, row1, row2, user_data):
+ try:
+ sort_column, _ = model.get_sort_column_id()
+ str_value1 = model.get_value(row1, sort_column)
+ str_value2 = model.get_value(row2, sort_column)
+
+ datetime_value1 = None
+ datetime_value2 = None
+
+ # convert string into datetime object, check if time format is 12H format with AM/PM
+ if str_value1.lower().find("am") > 0 or str_value1.lower().find("pm") > 0:
+ # 12H format
+ datetime_value1 = fn.datetime.strptime(
+ str_value1, "%a %d %b %Y %I:%M:%S %p %Z"
+ ).replace(tzinfo=None)
+ datetime_value2 = fn.datetime.strptime(
+ str_value2, "%a %d %b %Y %I:%M:%S %p %Z"
+ ).replace(tzinfo=None)
+ else:
+ # 24H format
+ datetime_value1 = fn.datetime.strptime(
+ str_value1, "%a %d %b %Y %H:%M:%S %Z"
+ ).replace(tzinfo=None)
+ datetime_value2 = fn.datetime.strptime(
+ str_value2, "%a %d %b %Y %H:%M:%S %Z"
+ ).replace(tzinfo=None)
+
+ if datetime_value1 is not None and datetime_value2 is not None:
+ if datetime_value1 < datetime_value2:
+ return -1
+ elif datetime_value1 == datetime_value2:
+ return 0
+ else:
+ return 1
+ except ValueError as ve:
+ # fn.logger.error("ValueError in compare_install_date: %s" % ve)
+ # compare fails due to the format of the datetime string, which hasn't been tested
+ pass
+ except Exception as e:
+ fn.logger.error("Exception in compare_install_date: %s" % e)
diff --git a/usr/share/sofirem/ui/PackageSearchWindow.py b/usr/share/sofirem/ui/PackageSearchWindow.py
new file mode 100644
index 0000000..016a00a
--- /dev/null
+++ b/usr/share/sofirem/ui/PackageSearchWindow.py
@@ -0,0 +1,543 @@
+# This class is used to create a window for package name searches and to display package information
+
+import os
+import gi
+
+import Functions as fn
+from ui.MessageDialog import MessageDialog
+
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+
+
+class PackageSearchWindow(Gtk.Window):
+ def __init__(self):
+ Gtk.Window.__init__(self)
+
+ self.headerbar = Gtk.HeaderBar()
+ self.headerbar.set_title("Package Search")
+ self.headerbar.set_show_close_button(True)
+
+ # remove the focus on startup from search entry
+ self.headerbar.set_property("can-focus", True)
+ Gtk.Window.grab_focus(self.headerbar)
+
+ self.set_resizable(True)
+ self.set_size_request(700, 500)
+ self.set_border_width(10)
+ self.set_titlebar(self.headerbar)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+ self.search_package_activated = False
+ self.build_gui()
+
+ def build_gui(self):
+ self.stack = Gtk.Stack()
+ self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
+ self.stack.set_transition_duration(350)
+ self.stack.set_hhomogeneous(False)
+ self.stack.set_vhomogeneous(False)
+
+ stack_switcher = Gtk.StackSwitcher()
+ stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
+ stack_switcher.set_stack(self.stack)
+ stack_switcher.set_homogeneous(True)
+
+ searchentry = Gtk.SearchEntry()
+ searchentry.set_placeholder_text("Search using package name...")
+ searchentry.set_size_request(400, 0)
+ searchentry.connect("activate", self.on_search_package_activated)
+ searchentry.connect("icon-release", self.on_search_package_cleared)
+
+ btn_ok = Gtk.Button(label="OK")
+ btn_ok.set_size_request(100, 30)
+ btn_ok.connect("clicked", self.on_close)
+ btn_ok.set_halign(Gtk.Align.END)
+
+ grid_bottom = Gtk.Grid()
+ grid_bottom.attach(btn_ok, 0, 1, 1, 1)
+ grid_bottom.set_halign(Gtk.Align.END)
+
+ vbox_bottom = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+ lbl_padding_bottom = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_bottom.set_text("")
+
+ vbox_bottom.pack_start(lbl_padding_bottom, False, True, 0)
+ vbox_bottom.pack_start(grid_bottom, False, True, 0)
+
+ self.stack.add_titled(searchentry, "Package Search", "Package Search")
+
+ vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
+ vbox.set_border_width(10)
+
+ vbox.pack_start(stack_switcher, False, False, 0)
+ vbox.pack_start(self.stack, False, False, 0)
+ vbox.pack_end(vbox_bottom, False, True, 0)
+
+ self.add(vbox)
+ self.show_all()
+
+ thread_pacman_sync_file_db = fn.threading.Thread(
+ name="thread_pacman_sync_file_db",
+ target=fn.sync_file_db,
+ daemon=True,
+ )
+ thread_pacman_sync_file_db.start()
+
+ def on_close(self, widget):
+ self.hide()
+ self.destroy()
+
+ def on_search_package_activated(self, searchentry):
+ if searchentry.get_text_length() == 0 and self.search_package_activated:
+ self.search_package_activated = False
+ self.stack.get_child_by_name("Package Information").destroy()
+
+ self.stack.get_child_by_name("Package Files").destroy()
+ Gtk.Window.grab_focus(self.headerbar)
+ else:
+ self.perform_search(searchentry)
+
+ def on_search_package_cleared(self, searchentry, icon_pos, event):
+ searchentry.set_placeholder_text("Search using package name...")
+ if self.search_package_activated is True:
+ self.search_package_activated = False
+ self.stack.get_child_by_name("Package Information").destroy()
+
+ self.stack.get_child_by_name("Package Files").destroy()
+
+ Gtk.Window.grab_focus(self.headerbar)
+
+ def perform_search(self, searchentry):
+ try:
+ if (
+ len(searchentry.get_text().rstrip().lstrip()) > 0
+ and not searchentry.get_text().isspace()
+ ):
+ term = searchentry.get_text().rstrip().lstrip()
+
+ if len(term) > 0:
+ fn.logger.info("Searching pacman file database")
+
+ package_metadata = fn.get_package_information(term)
+
+ if package_metadata is not None:
+ # package information
+
+ if self.search_package_activated is True:
+ self.stack.get_child_by_name(
+ "Package Information"
+ ).destroy()
+
+ self.stack.get_child_by_name("Package Files").destroy()
+
+ box_outer = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=5
+ )
+
+ listbox = Gtk.ListBox()
+ listbox.set_selection_mode(Gtk.SelectionMode.NONE)
+ box_outer.pack_start(listbox, True, True, 0)
+
+ # package name
+ row_package_title = Gtk.ListBoxRow()
+ vbox_package_title = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_title.add(vbox_package_title)
+ lbl_package_name_title = Gtk.Label(xalign=0)
+ lbl_package_name_title.set_markup("Package Name")
+
+ lbl_package_name_value = Gtk.Label(xalign=0)
+ lbl_package_name_value.set_text(package_metadata["name"])
+ vbox_package_title.pack_start(
+ lbl_package_name_title, True, True, 0
+ )
+ vbox_package_title.pack_start(
+ lbl_package_name_value, True, True, 0
+ )
+
+ listbox.add(row_package_title)
+
+ # repository
+
+ row_package_repo = Gtk.ListBoxRow()
+ vbox_package_repo = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_repo.add(vbox_package_repo)
+ lbl_package_repo_title = Gtk.Label(xalign=0)
+ lbl_package_repo_title.set_markup("Repository")
+
+ lbl_package_repo_value = Gtk.Label(xalign=0)
+ lbl_package_repo_value.set_text(package_metadata["repository"])
+ vbox_package_repo.pack_start(
+ lbl_package_repo_title, True, True, 0
+ )
+ vbox_package_repo.pack_start(
+ lbl_package_repo_value, True, True, 0
+ )
+
+ listbox.add(row_package_repo)
+
+ # description
+
+ row_package_description = Gtk.ListBoxRow()
+ vbox_package_description = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_description.add(vbox_package_description)
+ lbl_package_description_title = Gtk.Label(xalign=0)
+ lbl_package_description_title.set_markup("Description")
+
+ lbl_package_description_value = Gtk.Label(xalign=0)
+ lbl_package_description_value.set_text(
+ package_metadata["description"]
+ )
+ vbox_package_description.pack_start(
+ lbl_package_description_title, True, True, 0
+ )
+ vbox_package_description.pack_start(
+ lbl_package_description_value, True, True, 0
+ )
+
+ listbox.add(row_package_description)
+
+ # arch
+
+ row_package_arch = Gtk.ListBoxRow()
+ vbox_package_arch = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_arch.add(vbox_package_arch)
+ lbl_package_arch_title = Gtk.Label(xalign=0)
+ lbl_package_arch_title.set_markup("Architecture")
+
+ lbl_package_arch_value = Gtk.Label(xalign=0)
+ lbl_package_arch_value.set_text(package_metadata["arch"])
+ vbox_package_arch.pack_start(
+ lbl_package_arch_title, True, True, 0
+ )
+ vbox_package_arch.pack_start(
+ lbl_package_arch_value, True, True, 0
+ )
+
+ listbox.add(row_package_arch)
+
+ # url
+
+ row_package_url = Gtk.ListBoxRow()
+ vbox_package_url = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_url.add(vbox_package_url)
+ lbl_package_url_title = Gtk.Label(xalign=0)
+ lbl_package_url_title.set_markup("URL")
+
+ lbl_package_url_value = Gtk.Label(xalign=0)
+ lbl_package_url_value.set_markup(
+ "%s"
+ % (package_metadata["url"], package_metadata["url"])
+ )
+ vbox_package_url.pack_start(
+ lbl_package_url_title, True, True, 0
+ )
+ vbox_package_url.pack_start(
+ lbl_package_url_value, True, True, 0
+ )
+
+ listbox.add(row_package_url)
+
+ # download size
+
+ row_package_size = Gtk.ListBoxRow()
+ vbox_package_size = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_size.add(vbox_package_size)
+ lbl_package_size_title = Gtk.Label(xalign=0)
+ lbl_package_size_title.set_markup("Download size")
+
+ lbl_package_size_value = Gtk.Label(xalign=0)
+ lbl_package_size_value.set_text(
+ package_metadata["download_size"]
+ )
+ vbox_package_size.pack_start(
+ lbl_package_size_title, True, True, 0
+ )
+ vbox_package_size.pack_start(
+ lbl_package_size_value, True, True, 0
+ )
+
+ listbox.add(row_package_size)
+
+ # installed size
+
+ row_package_installed_size = Gtk.ListBoxRow()
+ vbox_package_installed_size = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_installed_size.add(vbox_package_installed_size)
+ lbl_package_installed_size_title = Gtk.Label(xalign=0)
+ lbl_package_installed_size_title.set_markup(
+ "Installed size"
+ )
+
+ lbl_package_installed_size_value = Gtk.Label(xalign=0)
+ lbl_package_installed_size_value.set_text(
+ package_metadata["installed_size"]
+ )
+ vbox_package_installed_size.pack_start(
+ lbl_package_installed_size_title, True, True, 0
+ )
+ vbox_package_installed_size.pack_start(
+ lbl_package_installed_size_value, True, True, 0
+ )
+
+ listbox.add(row_package_installed_size)
+
+ # build date
+
+ row_package_build_date = Gtk.ListBoxRow()
+ vbox_package_build_date = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_build_date.add(vbox_package_build_date)
+ lbl_package_build_date_title = Gtk.Label(xalign=0)
+ lbl_package_build_date_title.set_markup("Build date")
+
+ lbl_package_build_date_value = Gtk.Label(xalign=0)
+ lbl_package_build_date_value.set_text(
+ package_metadata["build_date"]
+ )
+ vbox_package_build_date.pack_start(
+ lbl_package_build_date_title, True, True, 0
+ )
+ vbox_package_build_date.pack_start(
+ lbl_package_build_date_value, True, True, 0
+ )
+
+ listbox.add(row_package_build_date)
+
+ # packager
+
+ row_package_maintainer = Gtk.ListBoxRow()
+ vbox_package_maintainer = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_maintainer.add(vbox_package_maintainer)
+ lbl_package_maintainer_title = Gtk.Label(xalign=0)
+ lbl_package_maintainer_title.set_markup("Packager")
+
+ lbl_package_maintainer_value = Gtk.Label(xalign=0)
+ lbl_package_maintainer_value.set_text(
+ package_metadata["packager"]
+ )
+ vbox_package_maintainer.pack_start(
+ lbl_package_maintainer_title, True, True, 0
+ )
+ vbox_package_maintainer.pack_start(
+ lbl_package_maintainer_value, True, True, 0
+ )
+
+ listbox.add(row_package_maintainer)
+
+ # depends on
+
+ expander_depends_on = Gtk.Expander()
+ expander_depends_on.set_expanded(True)
+ expander_depends_on.set_use_markup(True)
+ expander_depends_on.set_resize_toplevel(True)
+ expander_depends_on.set_label("Depends on")
+
+ row_package_depends_on = Gtk.ListBoxRow()
+ expander_depends_on.add(row_package_depends_on)
+ vbox_package_depends_on = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_depends_on.add(vbox_package_depends_on)
+
+ if len(package_metadata["depends_on"]) > 0:
+ treestore_depends = Gtk.TreeStore(str, str)
+
+ for item in package_metadata["depends_on"]:
+ treestore_depends.append(None, list(item))
+
+ treeview_depends = Gtk.TreeView(model=treestore_depends)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Package", renderer, text=0)
+
+ treeview_depends.append_column(column)
+
+ vbox_package_depends_on.pack_start(
+ treeview_depends, True, True, 0
+ )
+
+ else:
+ lbl_package_depends_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_depends_value.set_text("None")
+
+ vbox_package_depends_on.pack_start(
+ lbl_package_depends_value, True, True, 0
+ )
+
+ listbox.add(expander_depends_on)
+
+ # conflicts with
+
+ expander_conflicts_with = Gtk.Expander()
+ expander_conflicts_with.set_use_markup(True)
+ expander_conflicts_with.set_expanded(True)
+ expander_conflicts_with.set_resize_toplevel(True)
+ expander_conflicts_with.set_label("Conflicts with")
+
+ row_package_conflicts_with = Gtk.ListBoxRow()
+ expander_conflicts_with.add(row_package_conflicts_with)
+ vbox_package_conflicts_with = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_conflicts_with.add(vbox_package_conflicts_with)
+
+ if len(package_metadata["conflicts_with"]) > 0:
+ treestore_conflicts = Gtk.TreeStore(str, str)
+
+ for item in package_metadata["conflicts_with"]:
+ treestore_conflicts.append(None, list(item))
+
+ treeview_conflicts = Gtk.TreeView(model=treestore_conflicts)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Package", renderer, text=0)
+
+ treeview_conflicts.append_column(column)
+
+ vbox_package_conflicts_with.pack_start(
+ treeview_conflicts, True, True, 0
+ )
+
+ else:
+ lbl_package_conflicts_with_value = Gtk.Label(
+ xalign=0, yalign=0
+ )
+ lbl_package_conflicts_with_value.set_text("None")
+
+ vbox_package_conflicts_with.pack_start(
+ lbl_package_conflicts_with_value, True, True, 0
+ )
+
+ listbox.add(expander_conflicts_with)
+
+ checkbtn_installed = Gtk.CheckButton(label="Installed")
+ checkbtn_installed.set_active(False)
+ checkbtn_installed.set_sensitive(False)
+
+ # is the package installed
+ installed = fn.check_package_installed(term)
+
+ if installed is True:
+ checkbtn_installed.set_active(True)
+
+ # box_outer.pack_start(checkbtn_installed, True, True, 0)
+
+ scrolled_window_package_info = Gtk.ScrolledWindow()
+ scrolled_window_package_info.set_propagate_natural_height(True)
+ scrolled_window_package_info.add(box_outer)
+
+ vbox_package_info = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+
+ lbl_padding_vbox = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_vbox.set_text("")
+
+ vbox_package_info.pack_start(
+ scrolled_window_package_info, True, True, 0
+ )
+ vbox_package_info.pack_start(lbl_padding_vbox, True, True, 0)
+ vbox_package_info.pack_start(checkbtn_installed, True, True, 0)
+
+ self.stack.add_titled(
+ vbox_package_info,
+ "Package Information",
+ "Package Information",
+ )
+
+ # package files
+
+ package_files = fn.get_package_files(term)
+ if package_files is not None:
+ lbl_package_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_title.set_markup("Package")
+
+ lbl_package_title_value = Gtk.Label(xalign=0, yalign=0)
+
+ lbl_package_title_value.set_text(package_metadata["name"])
+
+ treestore_filelist = Gtk.TreeStore(str, str)
+
+ for file in package_files:
+ treestore_filelist.append(None, list(file))
+
+ treeview_files = Gtk.TreeView(model=treestore_filelist)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Files", renderer, text=0)
+
+ treeview_files.append_column(column)
+
+ vbox_package_files = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+
+ vbox_package_files.pack_start(
+ lbl_package_title, True, True, 0
+ )
+ vbox_package_files.pack_start(
+ lbl_package_title_value, True, True, 0
+ )
+
+ lbl_padding_package_files = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_package_files.set_text("")
+
+ vbox_package_files.pack_start(
+ lbl_padding_package_files, True, True, 0
+ )
+
+ scrolled_window_package_files = Gtk.ScrolledWindow()
+ scrolled_window_package_files.set_propagate_natural_height(
+ True
+ )
+ scrolled_window_package_files.add(treeview_files)
+
+ vbox_package_files.pack_start(
+ scrolled_window_package_files, True, True, 0
+ )
+
+ self.stack.add_titled(
+ vbox_package_files,
+ "Package Files",
+ "Package Files",
+ )
+
+ self.search_package_activated = True
+ self.show_all()
+
+ else:
+ message_dialog = MessageDialog(
+ "Info",
+ "Search returned 0 results",
+ "Failed to find package name",
+ "Are the correct pacman mirrorlists configured ?\nOr try to search again using the exact package name",
+ "info",
+ False,
+ )
+
+ message_dialog.show_all()
+ message_dialog.run()
+ message_dialog.hide()
+
+ except Exception as e:
+ fn.logger.error("Exception in perform_search(): %s" % e)
diff --git a/usr/share/sofirem/ui/PackagesImportDialog.py b/usr/share/sofirem/ui/PackagesImportDialog.py
new file mode 100644
index 0000000..014df12
--- /dev/null
+++ b/usr/share/sofirem/ui/PackagesImportDialog.py
@@ -0,0 +1,228 @@
+# ============================================================
+# Authors: Brad Heffernan - Erik Dubois - Cameron Percival
+# ============================================================
+
+import os
+import gi
+import Functions as fn
+from queue import Queue
+from ui.MessageDialog import MessageDialog
+
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+
+
+class PackagesImportDialog(Gtk.Dialog):
+ """create a gui"""
+
+ def __init__(self, package_file, packages_list, logfile):
+ Gtk.Dialog.__init__(self)
+
+ # Create a queue for storing package import messages from pacman
+ self.pkg_import_queue = Queue()
+
+ # Create a queue for storing package install errors
+ self.pkg_err_queue = Queue()
+
+ # Create a queue for storing package install status
+ self.pkg_status_queue = Queue()
+
+ self.package_file = package_file
+ self.packages_list = packages_list
+ self.logfile = logfile
+
+ self.stop_thread = False
+
+ self.set_resizable(True)
+ self.set_border_width(10)
+ self.set_size_request(800, 700)
+ self.set_modal(True)
+
+ headerbar = Gtk.HeaderBar()
+ headerbar.set_title("Import packages")
+ headerbar.set_show_close_button(True)
+
+ self.set_titlebar(headerbar)
+
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+
+ hbox_title = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ lbl_packages_title = Gtk.Label(xalign=0)
+ lbl_packages_title.set_name("title")
+ lbl_packages_title.set_text("Packages")
+
+ hbox_title.pack_start(lbl_packages_title, False, False, 0)
+
+ hbox_title_install = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ label_install_title = Gtk.Label(xalign=0)
+ label_install_title.set_markup(" Install Packages")
+
+ hbox_title_install.pack_start(label_install_title, False, False, 0)
+
+ hbox_sep = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ hsep = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
+ hbox_sep.pack_start(hsep, True, True, 0)
+
+ frame_install = Gtk.Frame(label="")
+ frame_install_label = frame_install.get_label_widget()
+ frame_install_label.set_markup("Install Packages")
+
+ hbox_install = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+ label_install_desc = Gtk.Label(xalign=0, yalign=0)
+ label_install_desc.set_markup(
+ f""
+ f" WARNING: Proceed with caution this will install packages onto your system!\n"
+ f" Packages from the AUR are not supported \n"
+ f" This also performs a full system upgrade\n\n"
+ f" - A list of packages are sourced from {self.package_file}\n"
+ f" - To ignore a package, add a # in front of the package name\n"
+ f" - Log file: {self.logfile}\n"
+ f" - A reboot is recommended when core Linux packages are installed\n"
+ )
+
+ self.scrolled_window = Gtk.ScrolledWindow()
+
+ self.textview = Gtk.TextView()
+ self.textview.set_name("textview_log")
+ self.textview.set_property("editable", False)
+ self.textview.set_property("monospace", True)
+ self.textview.set_border_width(10)
+ self.textview.set_vexpand(True)
+ self.textview.set_hexpand(True)
+
+ msg_buffer = self.textview.get_buffer()
+ msg_buffer.insert(
+ msg_buffer.get_end_iter(),
+ "\n Click Yes to confirm install of the following packages:\n\n",
+ )
+
+ lbl_title_message = Gtk.Label(xalign=0, yalign=0)
+ lbl_title_message.set_markup(
+ "There are %s packages to install, proceed ?"
+ % len(self.packages_list)
+ )
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text("")
+
+ self.infobar = Gtk.InfoBar()
+
+ content = self.infobar.get_content_area()
+ content.add(lbl_title_message)
+
+ self.infobar.set_revealed(True)
+
+ for package in sorted(self.packages_list):
+ msg_buffer.insert(msg_buffer.get_end_iter(), " - %s\n" % package)
+
+ # move focus away from the textview, to hide the cursor at load
+ headerbar.set_property("can-focus", True)
+ Gtk.Window.grab_focus(headerbar)
+
+ self.scrolled_window.add(self.textview)
+
+ self.button_yes = self.add_button("Yes", Gtk.ResponseType.OK)
+ self.button_yes.set_size_request(100, 30)
+ btn_yes_context = self.button_yes.get_style_context()
+ btn_yes_context.add_class("destructive-action")
+
+ self.button_no = self.add_button("Close", Gtk.ResponseType.CANCEL)
+ self.button_no.set_size_request(100, 30)
+
+ self.connect("response", self.on_response)
+
+ vbox_log_dir = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
+
+ btn_open_log_dir = Gtk.Button(label="Open log directory")
+ btn_open_log_dir.connect("clicked", self.on_open_log_dir_clicked)
+ btn_open_log_dir.set_size_request(100, 30)
+
+ vbox_log_dir.pack_start(btn_open_log_dir, False, False, 0)
+
+ grid_message = Gtk.Grid()
+
+ grid_message.attach(label_install_desc, 0, 0, 1, 1)
+ grid_message.attach(self.infobar, 0, 1, 1, 1)
+ grid_message.attach(lbl_padding1, 0, 2, 1, 1)
+
+ grid_message.attach(self.scrolled_window, 0, 3, 1, 1)
+ grid_message.attach(lbl_padding2, 0, 4, 1, 1)
+ grid_message.attach(vbox_log_dir, 0, 5, 1, 1)
+
+ self.vbox.add(grid_message)
+
+ def on_open_log_dir_clicked(self, widget):
+ fn.open_log_dir()
+
+ def display_progress(self):
+ self.textview.destroy()
+ self.infobar.destroy()
+ self.button_yes.destroy()
+
+ self.label_package_status = Gtk.Label(xalign=0, yalign=0)
+ self.label_package_count = Gtk.Label(xalign=0, yalign=0)
+
+ label_warning_close = Gtk.Label(xalign=0, yalign=0)
+ label_warning_close.set_markup(
+ "Do not close this window during package installation"
+ )
+
+ self.textview = Gtk.TextView()
+ self.textview.set_name("textview_log")
+ self.textview.set_property("editable", False)
+ self.textview.set_property("monospace", True)
+ self.textview.set_border_width(10)
+ self.textview.set_vexpand(True)
+ self.textview.set_hexpand(True)
+
+ self.scrolled_window.add(self.textview)
+
+ self.msg_buffer = self.textview.get_buffer()
+
+ self.vbox.add(label_warning_close)
+ self.vbox.add(self.label_package_status)
+ self.vbox.add(self.label_package_count)
+
+ fn.Thread(
+ target=fn.monitor_package_import,
+ args=(self,),
+ daemon=True,
+ ).start()
+
+ self.show_all()
+
+ fn.logger.info("Installing packages")
+ event = "%s [INFO]: Installing packages\n" % fn.datetime.now().strftime(
+ "%Y-%m-%d-%H-%M-%S"
+ )
+
+ fn.logger.info("Log file = %s" % self.logfile)
+
+ self.pkg_import_queue.put(event)
+
+ # debug install, overrride packages_list
+ # self.packages_list = ["cheese", "firefox", "sofirem-dev-git", "sofirem-git"]
+
+ # starts 2 threads one to install the packages, and another to check install status
+
+ fn.Thread(
+ target=fn.import_packages,
+ args=(self,),
+ daemon=True,
+ ).start()
+
+ fn.Thread(target=fn.log_package_status, args=(self,), daemon=True).start()
+
+ def on_response(self, dialog, response):
+ if response in (Gtk.ResponseType.OK, Gtk.ResponseType.YES):
+ self.stop_thread = False
+ self.display_progress()
+
+ else:
+ self.stop_thread = True
+ dialog.hide()
+ dialog.destroy()
diff --git a/usr/share/sofirem/ui/PacmanLogWindow.py b/usr/share/sofirem/ui/PacmanLogWindow.py
new file mode 100644
index 0000000..0097bd9
--- /dev/null
+++ b/usr/share/sofirem/ui/PacmanLogWindow.py
@@ -0,0 +1,71 @@
+# This class is used to create a window to monitor the pacman log file inside /var/log/pacman.log
+
+import os
+import gi
+import Functions as fn
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class PacmanLogWindow(Gtk.Window):
+ def __init__(self, textview_pacmanlog, btn_pacmanlog):
+ Gtk.Window.__init__(self)
+
+ self.start_logtimer = True
+ self.textview_pacmanlog = textview_pacmanlog
+ self.btn_pacmanlog = btn_pacmanlog
+ headerbar = Gtk.HeaderBar()
+
+ headerbar.set_show_close_button(True)
+
+ self.set_titlebar(headerbar)
+
+ self.set_title("Sofirem - Pacman log file viewer")
+ self.set_default_size(800, 600)
+ self.set_resizable(True)
+ self.set_border_width(10)
+ self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+ self.connect("delete-event", self.on_close)
+
+ btn_pacmanlog_ok = Gtk.Button(label="OK")
+ btn_pacmanlog_ok.connect("clicked", self.on_response, "response")
+ btn_pacmanlog_ok.set_size_request(100, 30)
+ btn_pacmanlog_ok.set_halign(Gtk.Align.END)
+
+ pacmanlog_scrolledwindow = Gtk.ScrolledWindow()
+ pacmanlog_scrolledwindow.set_size_request(750, 500)
+ pacmanlog_scrolledwindow.add(self.textview_pacmanlog)
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ vbox_pacmanlog = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+
+ vbox_pacmanlog.pack_start(pacmanlog_scrolledwindow, True, True, 0)
+ vbox_pacmanlog.pack_start(lbl_padding1, False, False, 0)
+ vbox_pacmanlog.pack_start(btn_pacmanlog_ok, False, False, 0)
+
+ self.add(vbox_pacmanlog)
+
+ def on_close(self, widget, data):
+ fn.logger.debug("Closing pacman log monitoring window")
+ self.start_logtimer = False
+ self.btn_pacmanlog.set_sensitive(True)
+
+ self.hide()
+ self.destroy()
+
+ def on_response(self, widget, response):
+ # stop updating the textview
+ fn.logger.debug("Closing pacman log monitoring dialog")
+ self.start_logtimer = False
+ self.btn_pacmanlog.set_sensitive(True)
+
+ # self.remove(self)
+ self.hide()
+ self.destroy()
diff --git a/usr/share/sofirem/ui/ProgressBarWindow.py b/usr/share/sofirem/ui/ProgressBarWindow.py
new file mode 100644
index 0000000..95ccc24
--- /dev/null
+++ b/usr/share/sofirem/ui/ProgressBarWindow.py
@@ -0,0 +1,87 @@
+from gi.repository import Gtk, GLib
+import gi
+
+
+# Since a system can have multiple versions
+# of GTK + installed, we want to make
+# sure that we are importing GTK + 3.
+gi.require_version("Gtk", "3.0")
+
+
+class ProgressBarWindow(Gtk.Window):
+ new_value = 0.0
+
+ def __init__(self):
+ Gtk.Window.__init__(self, title="Progress Bar")
+ self.set_border_width(10)
+
+ vbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
+ self.add(vbox)
+
+ # Create a ProgressBar
+ self.progressbar = Gtk.ProgressBar()
+ vbox.pack_start(self.progressbar, True, True, 0)
+
+ # Create CheckButton with labels "Show text",
+ # "Activity mode", "Right to Left" respectively
+ # button = Gtk.CheckButton(label="Show text")
+ # button.connect("toggled", self.on_show_text_toggled)
+ # vbox.pack_start(button, True, True, 0)
+
+ # button = Gtk.CheckButton(label="Activity mode")
+ # button.connect("toggled", self.on_activity_mode_toggled)
+ # vbox.pack_start(button, True, True, 0)
+
+ # button = Gtk.CheckButton(label="Right to Left")
+ # button.connect("toggled", self.on_right_to_left_toggled)
+ # vbox.pack_start(button, True, True, 0)
+
+ # self.timeout_id = GLib.timeout_add(5000, self.on_timeout, None)
+ self.activity_mode = False
+
+ def set_text(self, text):
+ self.progressbar.set_text(text)
+ self.progressbar.set_show_text(True)
+
+ def reset_timer(self):
+ new_value = 0.0
+ self.progressbar.set_fraction(new_value)
+
+ def on_activity_mode_toggled(self, button):
+ self.activity_mode = button.get_active()
+ if self.activity_mode:
+ self.progressbar.pulse()
+ else:
+ self.progressbar.set_fraction(0.0)
+
+ def on_right_to_left_toggled(self, button):
+ value = button.get_active()
+ self.progressbar.set_inverted(value)
+
+ def update(self, fraction):
+ new_value = self.progressbar.get_fraction() + fraction
+ self.progressbar.set_fraction(new_value)
+ if new_value >= 1.0:
+ return False
+ return True
+
+ def get_complete(self):
+ if self.progressbar.get_fraction() >= 1.0:
+ return True
+ return False
+
+ def on_timeout(self, user_data=0.01):
+ """
+ Update value on the progress bar
+ """
+ if self.activity_mode:
+ self.progressbar.pulse()
+ else:
+ new_value = self.progressbar.get_fraction() + user_data
+
+ if new_value > 1:
+ new_value = 0.0
+ return False
+
+ self.progressbar.set_fraction(new_value)
+ return True
diff --git a/usr/share/sofirem/ui/ProgressDialog.py b/usr/share/sofirem/ui/ProgressDialog.py
new file mode 100644
index 0000000..138c93f
--- /dev/null
+++ b/usr/share/sofirem/ui/ProgressDialog.py
@@ -0,0 +1,400 @@
+# This class is used to create a modal dialog window showing progress of a package install/uninstall and general package information
+
+import os
+import gi
+import Functions as fn
+from ui.MessageDialog import MessageDialog
+from gi.repository import Gtk, Gdk, GdkPixbuf, Pango, GLib
+
+gi.require_version("Gtk", "3.0")
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class ProgressDialog(Gtk.Dialog):
+ def __init__(self, action, package, command, package_metadata):
+ Gtk.Dialog.__init__(self)
+
+ self.package_found = True
+ # this gets package information using pacman -Si or pacman -Qi whichever returns output
+ # package_metadata = fn.get_package_information(pkg.name)
+
+ # if a mirrorlist isn't configured properly, pacman will not be able to query its repository
+ # so the following is a condition to make sure the data returned isn't an error
+
+ if type(package_metadata) is dict:
+ package_progress_dialog_headerbar = Gtk.HeaderBar()
+ package_progress_dialog_headerbar.set_show_close_button(True)
+ self.set_titlebar(package_progress_dialog_headerbar)
+
+ self.connect("delete-event", package_progress_dialog_on_close, self, action)
+
+ if action == "install":
+ self.set_title("Sofirem - installing package %s" % package.name)
+
+ elif action == "uninstall":
+ self.set_title("Sofirem - removing package %s" % package.name)
+
+ self.btn_package_progress_close = Gtk.Button(label="OK")
+ self.btn_package_progress_close.connect(
+ "clicked",
+ on_package_progress_close_response,
+ self,
+ )
+ self.btn_package_progress_close.set_sensitive(False)
+ self.btn_package_progress_close.set_size_request(100, 30)
+ self.btn_package_progress_close.set_halign(Gtk.Align.END)
+
+ self.set_resizable(True)
+ self.set_size_request(850, 700)
+ self.set_modal(True)
+ self.set_border_width(10)
+ self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT)
+ self.set_icon_from_file(os.path.join(base_dir, "images/sofirem.png"))
+
+ lbl_pacman_action_title = Gtk.Label(xalign=0, yalign=0)
+ lbl_pacman_action_title.set_text("Running command:")
+
+ lbl_pacman_action_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_pacman_action_value.set_markup("%s" % command)
+
+ stack = Gtk.Stack()
+ stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
+ stack.set_transition_duration(350)
+ stack.set_hhomogeneous(False)
+ stack.set_vhomogeneous(False)
+
+ stack_switcher = Gtk.StackSwitcher()
+ stack_switcher.set_orientation(Gtk.Orientation.HORIZONTAL)
+ stack_switcher.set_stack(stack)
+ stack_switcher.set_homogeneous(True)
+
+ package_progress_grid = Gtk.Grid()
+
+ self.infobar = Gtk.InfoBar()
+ self.infobar.set_name("infobar_info")
+
+ content = self.infobar.get_content_area()
+ content.add(lbl_pacman_action_title)
+ content.add(lbl_pacman_action_value)
+
+ self.infobar.set_revealed(True)
+
+ lbl_padding_header1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding_header1.set_text("")
+
+ package_progress_grid.attach(lbl_padding_header1, 0, 1, 1, 1)
+ package_progress_grid.attach(self.infobar, 0, 2, 1, 1)
+
+ package_progress_grid.set_property("can-focus", True)
+ Gtk.Window.grab_focus(package_progress_grid)
+
+ lbl_padding1 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding1.set_text("")
+
+ lbl_padding2 = Gtk.Label(xalign=0, yalign=0)
+ lbl_padding2.set_text("")
+ lbl_padding2.set_halign(Gtk.Align.END)
+
+ package_progress_grid.attach(lbl_padding1, 0, 3, 1, 1)
+
+ package_progress_scrolled_window = Gtk.ScrolledWindow()
+ self.package_progress_textview = Gtk.TextView()
+ self.package_progress_textview.set_property("editable", False)
+ self.package_progress_textview.set_property("monospace", True)
+ self.package_progress_textview.set_border_width(10)
+ self.package_progress_textview.set_vexpand(True)
+ self.package_progress_textview.set_hexpand(True)
+ buffer = self.package_progress_textview.get_buffer()
+ self.package_progress_textview.set_buffer(buffer)
+
+ package_progress_scrolled_window.set_size_request(700, 430)
+
+ package_progress_scrolled_window.add(self.package_progress_textview)
+ package_progress_grid.attach(package_progress_scrolled_window, 0, 4, 1, 1)
+
+ vbox_close = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+
+ vbox_close.pack_start(lbl_padding2, True, True, 0)
+ vbox_close.pack_start(self.btn_package_progress_close, True, True, 0)
+
+ stack.add_titled(package_progress_grid, "Progress", "Package Progress")
+
+ # package information
+ box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)
+
+ listbox = Gtk.ListBox()
+ listbox.set_selection_mode(Gtk.SelectionMode.NONE)
+ box_outer.pack_start(listbox, True, True, 0)
+
+ # package name
+ row_package_title = Gtk.ListBoxRow()
+ vbox_package_title = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_title.add(vbox_package_title)
+ lbl_package_name_title = Gtk.Label(xalign=0)
+ lbl_package_name_title.set_markup("Package Name")
+
+ lbl_package_name_value = Gtk.Label(xalign=0)
+ lbl_package_name_value.set_text(package_metadata["name"])
+ vbox_package_title.pack_start(lbl_package_name_title, True, True, 0)
+ vbox_package_title.pack_start(lbl_package_name_value, True, True, 0)
+
+ listbox.add(row_package_title)
+
+ # repository
+
+ row_package_repo = Gtk.ListBoxRow()
+ vbox_package_repo = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_repo.add(vbox_package_repo)
+ lbl_package_repo_title = Gtk.Label(xalign=0)
+ lbl_package_repo_title.set_markup("Repository")
+
+ lbl_package_repo_value = Gtk.Label(xalign=0)
+ lbl_package_repo_value.set_text(package_metadata["repository"])
+ vbox_package_repo.pack_start(lbl_package_repo_title, True, True, 0)
+ vbox_package_repo.pack_start(lbl_package_repo_value, True, True, 0)
+
+ listbox.add(row_package_repo)
+
+ # description
+
+ row_package_description = Gtk.ListBoxRow()
+ vbox_package_description = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_description.add(vbox_package_description)
+ lbl_package_description_title = Gtk.Label(xalign=0)
+ lbl_package_description_title.set_markup("Description")
+
+ lbl_package_description_value = Gtk.Label(xalign=0)
+ lbl_package_description_value.set_text(package_metadata["description"])
+ vbox_package_description.pack_start(
+ lbl_package_description_title, True, True, 0
+ )
+ vbox_package_description.pack_start(
+ lbl_package_description_value, True, True, 0
+ )
+
+ listbox.add(row_package_description)
+
+ # arch
+
+ row_package_arch = Gtk.ListBoxRow()
+ vbox_package_arch = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_arch.add(vbox_package_arch)
+ lbl_package_arch_title = Gtk.Label(xalign=0)
+ lbl_package_arch_title.set_markup("Architecture")
+
+ lbl_package_arch_value = Gtk.Label(xalign=0)
+ lbl_package_arch_value.set_text(package_metadata["arch"])
+ vbox_package_arch.pack_start(lbl_package_arch_title, True, True, 0)
+ vbox_package_arch.pack_start(lbl_package_arch_value, True, True, 0)
+
+ listbox.add(row_package_arch)
+
+ # url
+
+ row_package_url = Gtk.ListBoxRow()
+ vbox_package_url = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_url.add(vbox_package_url)
+ lbl_package_url_title = Gtk.Label(xalign=0)
+ lbl_package_url_title.set_markup("URL")
+
+ lbl_package_url_value = Gtk.Label(xalign=0)
+ lbl_package_url_value.set_markup(
+ "%s"
+ % (package_metadata["url"], package_metadata["url"])
+ )
+ vbox_package_url.pack_start(lbl_package_url_title, True, True, 0)
+ vbox_package_url.pack_start(lbl_package_url_value, True, True, 0)
+
+ listbox.add(row_package_url)
+
+ # download size
+
+ row_package_size = Gtk.ListBoxRow()
+ vbox_package_size = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0)
+ row_package_size.add(vbox_package_size)
+ lbl_package_size_title = Gtk.Label(xalign=0)
+ lbl_package_size_title.set_markup("Download size")
+
+ lbl_package_size_value = Gtk.Label(xalign=0)
+ lbl_package_size_value.set_text(package_metadata["download_size"])
+ vbox_package_size.pack_start(lbl_package_size_title, True, True, 0)
+ vbox_package_size.pack_start(lbl_package_size_value, True, True, 0)
+
+ listbox.add(row_package_size)
+
+ # installed size
+
+ row_package_installed_size = Gtk.ListBoxRow()
+ vbox_package_installed_size = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_installed_size.add(vbox_package_installed_size)
+ lbl_package_installed_size_title = Gtk.Label(xalign=0)
+ lbl_package_installed_size_title.set_markup("Installed size")
+
+ lbl_package_installed_size_value = Gtk.Label(xalign=0)
+ lbl_package_installed_size_value.set_text(
+ package_metadata["installed_size"]
+ )
+ vbox_package_installed_size.pack_start(
+ lbl_package_installed_size_title, True, True, 0
+ )
+ vbox_package_installed_size.pack_start(
+ lbl_package_installed_size_value, True, True, 0
+ )
+
+ listbox.add(row_package_installed_size)
+
+ # build date
+
+ row_package_build_date = Gtk.ListBoxRow()
+ vbox_package_build_date = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_build_date.add(vbox_package_build_date)
+ lbl_package_build_date_title = Gtk.Label(xalign=0)
+ lbl_package_build_date_title.set_markup("Build date")
+
+ lbl_package_build_date_value = Gtk.Label(xalign=0)
+ lbl_package_build_date_value.set_text(package_metadata["build_date"])
+ vbox_package_build_date.pack_start(
+ lbl_package_build_date_title, True, True, 0
+ )
+ vbox_package_build_date.pack_start(
+ lbl_package_build_date_value, True, True, 0
+ )
+
+ listbox.add(row_package_build_date)
+
+ # packager
+
+ row_package_maintainer = Gtk.ListBoxRow()
+ vbox_package_maintainer = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_maintainer.add(vbox_package_maintainer)
+ lbl_package_maintainer_title = Gtk.Label(xalign=0)
+ lbl_package_maintainer_title.set_markup("Packager")
+
+ lbl_package_maintainer_value = Gtk.Label(xalign=0)
+ lbl_package_maintainer_value.set_text(package_metadata["packager"])
+ vbox_package_maintainer.pack_start(
+ lbl_package_maintainer_title, True, True, 0
+ )
+ vbox_package_maintainer.pack_start(
+ lbl_package_maintainer_value, True, True, 0
+ )
+
+ listbox.add(row_package_maintainer)
+
+ # depends on
+
+ expander_depends_on = Gtk.Expander()
+ expander_depends_on.set_use_markup(True)
+ expander_depends_on.set_resize_toplevel(True)
+ expander_depends_on.set_label("Depends on")
+
+ row_package_depends_on = Gtk.ListBoxRow()
+ expander_depends_on.add(row_package_depends_on)
+ vbox_package_depends_on = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_depends_on.add(vbox_package_depends_on)
+
+ if len(package_metadata["depends_on"]) > 0:
+ treestore_depends = Gtk.TreeStore(str, str)
+
+ for item in package_metadata["depends_on"]:
+ treestore_depends.append(None, list(item))
+
+ treeview_depends = Gtk.TreeView(model=treestore_depends)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Package", renderer, text=0)
+
+ treeview_depends.append_column(column)
+
+ vbox_package_depends_on.pack_start(treeview_depends, True, True, 0)
+
+ else:
+ lbl_package_depends_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_depends_value.set_text("None")
+
+ vbox_package_depends_on.pack_start(
+ lbl_package_depends_value, True, True, 0
+ )
+
+ listbox.add(expander_depends_on)
+
+ # conflicts with
+
+ expander_conflicts_with = Gtk.Expander()
+ expander_conflicts_with.set_use_markup(True)
+ expander_conflicts_with.set_resize_toplevel(True)
+ expander_conflicts_with.set_label("Conflicts with")
+
+ row_package_conflicts_with = Gtk.ListBoxRow()
+ expander_conflicts_with.add(row_package_conflicts_with)
+ vbox_package_conflicts_with = Gtk.Box(
+ orientation=Gtk.Orientation.VERTICAL, spacing=0
+ )
+ row_package_conflicts_with.add(vbox_package_conflicts_with)
+
+ if len(package_metadata["conflicts_with"]) > 0:
+ treestore_conflicts = Gtk.TreeStore(str, str)
+
+ for item in package_metadata["conflicts_with"]:
+ treestore_conflicts.append(None, list(item))
+
+ treeview_conflicts = Gtk.TreeView(model=treestore_conflicts)
+
+ renderer = Gtk.CellRendererText()
+ column = Gtk.TreeViewColumn("Package", renderer, text=0)
+
+ treeview_conflicts.append_column(column)
+
+ vbox_package_conflicts_with.pack_start(
+ treeview_conflicts, True, True, 0
+ )
+
+ else:
+ lbl_package_conflicts_with_value = Gtk.Label(xalign=0, yalign=0)
+ lbl_package_conflicts_with_value.set_text("None")
+
+ vbox_package_conflicts_with.pack_start(
+ lbl_package_conflicts_with_value, True, True, 0
+ )
+
+ listbox.add(expander_conflicts_with)
+
+ package_metadata_scrolled_window = Gtk.ScrolledWindow()
+
+ package_metadata_scrolled_window.add(box_outer)
+
+ stack.add_titled(
+ package_metadata_scrolled_window, "Package Information", "Information"
+ )
+
+ self.vbox.add(stack_switcher)
+ self.vbox.add(stack)
+ self.vbox.add(vbox_close)
+
+
+def on_package_progress_close_response(self, widget):
+ self.pkg_dialog_closed = True
+ fn.logger.debug("Closing package progress dialog")
+ widget.hide()
+ widget.destroy()
+
+
+def package_progress_dialog_on_close(widget, data, self, action):
+ self.pkg_dialog_closed = True
+ fn.logger.debug("Closing package progress dialog")
+ widget.hide()
+ widget.destroy()
diff --git a/usr/share/sofirem/ui/SplashScreen.py b/usr/share/sofirem/ui/SplashScreen.py
new file mode 100644
index 0000000..f2ad00d
--- /dev/null
+++ b/usr/share/sofirem/ui/SplashScreen.py
@@ -0,0 +1,30 @@
+import gi
+from Functions import os
+
+gi.require_version("Gtk", "3.0")
+from gi.repository import Gtk, GdkPixbuf, Gdk # noqa
+
+base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+# base_dir = os.path.dirname(os.path.realpath(__file__))
+
+
+class SplashScreen(Gtk.Window):
+ def __init__(self):
+ Gtk.Window.__init__(self, Gtk.WindowType.POPUP, title="")
+ self.set_decorated(False)
+ self.set_resizable(False)
+ self.set_size_request(600, 400)
+ self.set_position(Gtk.WindowPosition.CENTER)
+
+ main_vbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=1)
+ self.add(main_vbox)
+
+ self.image = Gtk.Image()
+ pimage = GdkPixbuf.Pixbuf().new_from_file_at_size(
+ base_dir + "/images/splash.png", 600, 400
+ )
+ self.image.set_from_pixbuf(pimage)
+
+ main_vbox.pack_start(self.image, True, True, 0)
+
+ self.show_all()
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-applications.yaml b/usr/share/sofirem/yaml-awesome/netinstall-applications.yaml
new file mode 100644
index 0000000..69cc4b7
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-applications.yaml
@@ -0,0 +1,111 @@
+- name: "Accessories"
+ description: "Accessories"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - cheese
+ - font-manager-git
+ - galculator
+ - gpick
+ - flameshot-git
+ - liferea
+ - mediainfo-gui
+ - mcomix
+ - nitrogen
+ - nomacs
+ - nomacs-git
+ - nomacs-qt6-git
+ - pdfarranger
+ - plank
+ - arcolinux-plank-themes-git
+ - screenkey-git
+ - variety
+- name: "Conky"
+ description: "Conky and conky collection"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-conky-collection-git
+ - arcolinux-pipemenus-git
+ - conky-lua-archers
+ - yad
+- name: "Git"
+ description: "Git applications"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - gitahead
+ - gitg
+ - gitfiend
+ - github-desktop-bin
+ - gitkraken
+- name: "Password Manager"
+ description: "Password managers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - bitwarden
+ - enpass-bin
+ - keepassxc
+ - lastpass
+- name: "Privacy"
+ description: "Applications that ensure your privacy"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - torbrowser-launcher
+ - privoxy
+- name: "Virtualbox for Linux kernel"
+ description: "Installs virtualbox for linux kernel"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: false
+ packages:
+ - virtualbox
+ - virtualbox-host-dkms
+ - linux
+ - linux-headers
+- name: "Virtualbox for Linux-lts kernel"
+ description: "Installs virtualbox for linux-lts kernel"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: false
+ packages:
+ - virtualbox
+ - virtualbox-host-dkms
+ - linux-lts
+ - linux-lts-headers
+- name: "Vmware"
+ description: "Installs vmware software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: false
+ packages:
+ - open-vm-tools
+ - vmware-workstation
+ - vmware-keymaps
+- name: "Qemu software"
+ description: "Installs qemu software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: false
+ packages:
+ - qemu-base
+ - qemu-full
+ - quickemu
+ - quickemu-git
+ - quickgui-bin
\ No newline at end of file
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-arcolinux.yaml b/usr/share/sofirem/yaml-awesome/netinstall-arcolinux.yaml
new file mode 100644
index 0000000..a3c18ac
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-arcolinux.yaml
@@ -0,0 +1,154 @@
+- name: "ArcoLinux Plasma Packages"
+ description: "ArcoLinux plasma packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-plasma-keybindings-git
+ - arcolinux-plasma-servicemenus-git
+ - arcolinux-plasma-theme-candy-beauty-arc-dark-git
+ - arcolinux-plasma-theme-candy-beauty-nordic-git
+ - arcolinux-plasma-theme-surfn-arc-dark-git
+ - arcolinux-plasma-theme-surfn-nordic-git
+- name: "ArcoLinux Meta Packages"
+ description: "ArcoLinux meta packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-meta-arc-theme
+ - arcolinux-meta-asian-fonts
+ - arcolinux-meta-fun
+ - arcolinux-meta-log
+ - arcolinux-meta-samba
+ - arcolinux-meta-sddm-themes
+ - arcolinux-meta-steam-amd
+ - arcolinux-meta-steam-intel
+ - arcolinux-meta-steam-nvidia
+ - arcolinux-meta-utilities
+ - arcolinux-meta-wine
+- name: "ArcoLinux Applications"
+ description: "ArcoLinux applications"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - archlinux-logout-git
+ - archlinux-tweak-tool-git
+ - arcolinux-desktop-trasher-git
+ - arcolinux-powermenu-git
+ - arcolinux-reflector-simple-git
+ - arcolinux-teamviewer
+ - arcolinux-tellme-git
+ - arcolinux-xlunch-git
+- name: "ArcoLinux Arc Theming"
+ description: "ArcoLinux arc theming packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-arc-aqua-git
+ - arcolinux-arc-archlinux-blue-git
+ - arcolinux-arc-arcolinux-blue-git
+ - arcolinux-arc-azul-git
+ - arcolinux-arc-azure-git
+ - arcolinux-arc-azure-dodger-blue-git
+ - arcolinux-arc-blood-git
+ - arcolinux-arc-blue-sky-git
+ - arcolinux-arc-blueberry-git
+ - arcolinux-arc-botticelli-git
+ - arcolinux-arc-bright-lilac-git
+ - arcolinux-arc-carnation-git
+ - arcolinux-arc-carolina-blue-git
+ - arcolinux-arc-casablanca-git
+ - arcolinux-arc-cornflower-blue-git
+ - arcolinux-arc-crimson-git
+ - arcolinux-arc-darkish-git
+ - arcolinux-arc-dawn-git
+ - arcolinux-arc-dodger-blue-git
+ - arcolinux-arc-emerald-git
+ - arcolinux-arc-evopop-git
+ - arcolinux-arc-fern-git
+ - arcolinux-arc-fire-git
+ - arcolinux-arc-froly-git
+ - arcolinux-arc-havelock-git
+ - arcolinux-arc-hibiscus-git
+ - arcolinux-arc-light-blue-grey-git
+ - arcolinux-arc-light-blue-surfn-git
+ - arcolinux-arc-light-salmon-git
+ - arcolinux-arc-mandy-git
+ - arcolinux-arc-mantis-git
+ - arcolinux-arc-medium-blue-git
+ - arcolinux-arc-niagara-git
+ - arcolinux-arc-nice-blue-git
+ - arcolinux-arc-numix-git
+ - arcolinux-arc-orchid-git
+ - arcolinux-arc-pale-grey-git
+ - arcolinux-arc-paper-git
+ - arcolinux-arc-pink-git
+ - arcolinux-arc-polo-git
+ - arcolinux-arc-punch-git
+ - arcolinux-arc-purpley-git
+ - arcolinux-arc-red-orange-git
+ - arcolinux-arc-red-violet-git
+ - arcolinux-arc-rusty-orange-git
+ - arcolinux-arc-sky-blue-git
+ - arcolinux-arc-slate-grey-git
+ - arcolinux-arc-smoke-git
+ - arcolinux-arc-soft-blue-git
+ - arcolinux-arc-tacao-git
+ - arcolinux-arc-tangerine-git
+ - arcolinux-arc-tory-git
+ - arcolinux-arc-twilight-git
+ - arcolinux-arc-warm-pink-git
+- name: "ArcoLinux Theming"
+ description: "ArcoLinux theming packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - a-candy-beauty-icon-theme-git
+ - arcolinux-arc-kde
+ - arcolinux-mint-y-icons-git
+ - arcolinux-paleofetch-git
+ - arcolinux-plank-git
+ - arcolinux-plank-themes-git
+- name: "ArcoLinux Wallpapers"
+ description: "ArcoLinux wallpapers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - archlinux-login-backgrounds-git
+ - arcolinux-wallpapers-git
+ - arcolinux-wallpapers-candy-git
+ - arcolinux-wallpapers-dual-git
+- name: "ArcoLinux Sddm themes"
+ description: "ArcoLinux Sddm themes"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - archlinux-login-backgrounds-git
+ - arcolinux-sddm-futuristic-git
+ - arcolinux-sddm-materia-git
+ - arcolinux-sddm-simplicity-git
+ - arcolinux-sddm-slice-git
+ - arcolinux-sddm-sugar-candy-git
+ - arcolinux-sddm-urbanlifestyle-git
+- name: "Packages that will install plasma as a dependency"
+ description: "Plasma related"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-sddm-breeze-git
+ - arcolinux-sddm-breeze-minimal-git
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-arcolinuxdev.yaml b/usr/share/sofirem/yaml-awesome/netinstall-arcolinuxdev.yaml
new file mode 100644
index 0000000..a9ae768
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-arcolinuxdev.yaml
@@ -0,0 +1,23 @@
+- name: "ArcoLinux Dev"
+ description: "Software for ArcoLinux developers and betatesters"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-local-xfce4-git
+ - arcolinux-powermenu-git
+ - arcolinux-xfce-git
+ - discord
+ - firefox
+ - flameshot-git
+ - gitahead
+ - meld
+ - scrot
+ - simplescreenrecorder
+ - sublime-text-4
+ - telegram-desktop
+ - the_platinum_searcher-bin
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-communication.yaml b/usr/share/sofirem/yaml-awesome/netinstall-communication.yaml
new file mode 100644
index 0000000..7a7d294
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-communication.yaml
@@ -0,0 +1,44 @@
+- name: "Communication"
+ description: "Communication software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - element-desktop
+ - discord
+ - discord_arch_electron
+ - google-chat-linux-bin
+ - hexchat
+ - jitsi-meet-desktop-bin
+ - mumble
+ - neochat
+ - pidgin
+ - qtox
+ - skypeforlinux-stable-bin
+ - signal-desktop
+ - signal-desktop-beta-bin
+ - slack-desktop
+ - teams
+ - telegram-desktop
+ - telegram-desktop-bin
+ - tweetdeck-desktop
+ - viber
+ - whatsapp-nativefier
+ - wire-desktop
+ - zoom
+- name: "Connect Remotely"
+ description: "Applications to connect to other systems"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - anydesk-bin
+ - arcolinux-teamviewer
+ - krdc
+ - nomachine
+ - realvnc-vnc-server
+ - realvnc-vnc-viewer
+ - remmina
+ - tigervnc
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-desktop-wayland.yaml b/usr/share/sofirem/yaml-awesome/netinstall-desktop-wayland.yaml
new file mode 100644
index 0000000..ff483a7
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-desktop-wayland.yaml
@@ -0,0 +1,85 @@
+- name: "Desktop: Hyprland - Wayland"
+ description: "Installs hyprland - only on real metal"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - archlinux-logout-git
+ - arcolinux-hyprland-git
+ - arcolinux-kitty-git
+ - hyprland-git
+ - kitty
+ - swaybg
+ - thunar
+ - ttf-jetbrains-mono-nerd
+ - waybar-hyprland-git
+ - wofi
+ - xfce4-terminal
+- name: "Desktop: Sway - Wayland"
+ description: "Installs sway - only on real metal"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - archlinux-logout-git
+ - arcolinux-kitty-git
+ - arcolinux-nwg-drawer-git
+ - arcolinux-sway-git
+ - kitty
+ - nwg-drawer-bin
+ - rofi-lbonn-wayland-only-git
+ - thunar
+ - sway-dev
+ - swaybg
+ - swayidle
+ - swaylock
+ - ttf-iosevka-nerd
+ - waybar
+- name: "Desktop: Wayfire - Wayland"
+ description: "Installs wayfire - only on real metal"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - a-candy-beauty-icon-theme-git
+ - archlinux-logout-git
+ - arcolinux-foot-git
+ - arcolinux-kitty-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-wallpapers-wayfire-git
+ - arcolinux-wayfire-dconf-git
+ - arcolinux-wayfire-nemesis-git
+ - arcolinux-xfce-git
+ - feh
+ - foot
+ - grim
+ - kitty
+ - libdisplay-info
+ - mako
+ - polkit-gnome
+ - rofi-lbonn-wayland
+ - slurp
+ - swaybg
+ - swayidle
+ - swaylock
+ - swww
+ - thunar
+ - ttf-font-awesome
+ - ttf-jetbrains-mono-nerd
+ - waybar
+ - wayfire-git
+ - wayfire-plugins-extra-git
+ - wcm-git
+ - wf-kill-git
+ - wf-shell-git
+ - wl-clipboard
+ - wofi
+ - xdg-desktop-portal-wlr
+ - xfce4-terminal
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-desktop.yaml b/usr/share/sofirem/yaml-awesome/netinstall-desktop.yaml
new file mode 100644
index 0000000..82a4f1a
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-desktop.yaml
@@ -0,0 +1,1175 @@
+- name: "Desktop: Awesome"
+ description: "Installs awesome desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-awesome-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - autorandr
+ - awesome
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - rofi
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - vicious
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Berry"
+ description: "Installs berry desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - alacritty
+ - arcolinux-berry-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - berry-dev-git
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polybar
+ - polkit-gnome
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - ttf-hack
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Bspwm"
+ description: "Installs bspwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-bspwm-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - awesome-terminal-fonts
+ - bspwm
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polybar
+ - polkit-gnome
+ - rofi
+ - sutils-git
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+ - xtitle-git
+- name: "Desktop: Budgie"
+ description: "Installs budgie desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-budgie-dconf-git
+ - arcolinux-budgie-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-guake-autostart-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - budgie-desktop
+ - budgie-extras
+ - gnome
+ - guake
+ - ttf-hack
+- name: "Desktop: Cinnamon"
+ description: "Installs cinnamon desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-cinnamon-dconf-git
+ - arcolinux-cinnamon-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gtk3-surfn-arc-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - cinnamon
+ - cinnamon-translations
+ - gnome-screenshot
+ - gnome-system-monitor
+ - gnome-terminal
+ - iso-flag-png
+ - mintlocale
+ - nemo-fileroller
+ - xfce4-terminal
+- name: "Desktop: Chadwm"
+ description: "Installs chadwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - alacritty
+ - arcolinux-chadwm-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - ttf-hack
+ - ttf-jetbrains-mono-nerd
+ - ttf-meslo-nerd-font-powerlevel10k
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Cutefish"
+ description: "Installs cutefish desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-cutefish-dconf-git
+ - arcolinux-cutefish-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - cutefish
+- name: "Desktop: Cwm"
+ description: "Installs cwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-cwm-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - autorandr
+ - cwm
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polybar
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Deepin"
+ description: "Installs deepin desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-deepin-dconf-git
+ - arcolinux-deepin-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - deepin
+ - deepin-extra
+- name: "Desktop: Dk"
+ description: "Installs dk desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-dk-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dk
+ - dmenu
+ - feh
+ - lxappearance
+ - nerd-fonts-source-code-pro
+ - picom
+ - polkit-gnome
+ - polybar
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Dusk"
+ description: "Installs dusk desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-dusk-git
+ - arcolinux-dwm-st-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Dwm"
+ description: "Installs dwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-dwm-git
+ - arcolinux-dwm-slstatus-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - gsimplecal
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Enlightenment"
+ description: "Installs enlightenment desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - enlightenment
+- name: "Desktop: Fvwm3"
+ description: "Installs fvwm3 desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-fvwm3-git
+ - arcolinux-gtk3-surfn-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - fvwm3-git
+ - gsimplecal
+ - picom
+ - polkit-gnome
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Gnome"
+ description: "Installs gnome desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gnome-dconf-git
+ - arcolinux-gnome-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-guake-autostart-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - gnome
+ - gnome-extra
+ - gnome-shell-extension-appindicator-git
+ - gnome-shell-extension-dash-to-dock
+ - gnome-shell-extension-pop-shell-git
+ - gnome-system-tools
+ - guake
+ - ttf-hack
+- name: "Desktop: Herbstluftwm"
+ description: "Installs herbstluftwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-herbstluftwm-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - awesome-terminal-fonts
+ - dmenu
+ - feh
+ - herbstluftwm
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - polybar
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+ - xtitle-git
+- name: "Desktop: Hypr"
+ description: "Installs hypr desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - alacritty
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-hypr-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - hypr-dev-git
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - polybar
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - ttf-hack
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: i3"
+ description: "Installs i3 desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-i3wm-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-nitrogen-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - autotiling
+ - dmenu
+ - feh
+ - i3blocks
+ - i3-wm
+ - i3status
+ - lxappearance
+ - nitrogen
+ - picom
+ - polkit-gnome
+ - polybar
+ - rofi
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Icewm"
+ description: "Installs icewm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-surfn-arc-git
+ - arcolinux-icewm-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - autorandr
+ - dmenu
+ - feh
+ - icewm
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - rofi
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xdgmenumaker
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Jwm"
+ description: "Installs jwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-surfn-arc-git
+ - arcolinux-jwm-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - autorandr
+ - dmenu
+ - feh
+ - jwm
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xdgmenumaker
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Leftwm"
+ description: "Installs leftwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - a-candy-beauty-icon-theme-git
+ - arcolinux-leftwm-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-arcolinux-candy-beauty-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - autorandr
+ - dmenu
+ - feh
+ - leftwm-dev-git
+ - leftwm-theme-git
+ - lxappearance
+ - nerd-fonts-source-code-pro
+ - nitrogen
+ - picom
+ - polybar
+ - polkit-gnome
+ - rofi
+ - rofi-theme-fonts
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-media-tags-plugin
+ - thunar-volman
+ - ttf-fantasque-sans-mono
+ - ttf-iosevka-nerd
+ - ttf-material-design-iconic-font
+ - ttf-meslo-nerd-font-powerlevel10k
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Lxqt"
+ description: "Installs lxqt desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-lxqt-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - lxappearance
+ - lxqt
+ - lxqt-arc-dark-theme-git
+ - obconf-qt
+ - pavucontrol-qt
+ - picom
+ - polkit-gnome
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+ - xscreensaver
+- name: "Desktop: Mate"
+ description: "Installs mate desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gtk3-surfn-arc-git
+ - arcolinux-mate-dconf-git
+ - arcolinux-mate-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - gnome-screenshot
+ - mate
+ - mate-extra
+ - mate-tweak
+ - xfce4-terminal
+- name: "Desktop: Nimdow"
+ description: "Installs nimdow desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - alacritty
+ - archlinux-logout-git
+ - arcolinux-btop-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-nimdow-git
+ - arcolinux-powermenu-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - btop
+ - dmenu
+ - feh
+ - lxappearance
+ - nim
+ - nimdow-bin
+ - nitrogen
+ - picom
+ - polkit-gnome
+ - rofi
+ - rofi-theme-fonts
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-media-tags-plugin
+ - thunar-volman
+ - ttf-jetbrains-mono-nerd
+ - ttf-hack
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Openbox"
+ description: "Installs openbox desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-common-git
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-docs-git
+ - arcolinux-geany-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-nitrogen-git
+ - arcolinux-obmenu-generator-git
+ - arcolinux-openbox-git
+ - arcolinux-openbox-themes-git
+ - arcolinux-pipemenus-git
+ - arcolinux-plank-git
+ - arcolinux-plank-themes-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - arcolinux-tint2-git
+ - arcolinux-tint2-themes-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - geany
+ - gksu
+ - gnome-screenshot
+ - gsimplecal
+ - gtk2-perl
+ - lxappearance-obconf
+ - lxrandr
+ - nitrogen
+ - obconf
+ - obmenu-generator
+ - obmenu3
+ - openbox
+ - openbox-arc-git
+ - openbox-themes-pambudi-git
+ - perl-linux-desktopfiles
+ - picom
+ - plank
+ - polkit-gnome
+ - rofi
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - tint2
+ - volumeicon
+ - xcape
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+ - yad
+- name: "Desktop: Pantheon"
+ description: "Installs pantheon desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - pantheon
+- name: "Desktop: Plasma"
+ description: "Installs plasma desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-plasma-theme-candy-beauty-arc-dark-git
+ - arcolinux-plasma-theme-candy-beauty-nordic-git
+ - arcolinux-plasma-theme-surfn-arc-dark-git
+ - arcolinux-plasma-theme-surfn-nordic-git
+ - plasma
+ - kde-accessibility-meta
+ - kde-education-meta
+ - kde-games-meta
+ - kde-graphics-meta
+ - kde-multimedia-meta
+ - kde-network-meta
+ - kde-pim-meta
+ - kde-sdk-meta
+ - kde-system-meta
+ - kde-utilities-meta
+ - kdevelop-meta
+ - arcolinux-arc-kde
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-wallpapers-git
+ - ark
+ - breeze
+ - cryfs
+ - discover
+ - dolphin
+ - dolphin-plugins
+ - encfs
+ - ffmpegthumbs
+ - gocryptfs
+ - gwenview
+ - kate
+ - kde-gtk-config
+ - kdeconnect
+ - kdenetwork-filesharing
+ - ktorrent
+ - ocs-url
+ - okular
+ - packagekit-qt5
+ - partitionmanager
+ - spectacle
+ - surfn-plasma-dark-icons-git
+ - surfn-plasma-light-icons-git
+ - yakuake
+- name: "Desktop: Qtile"
+ description: "Installs qtile desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-qtile-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - awesome-terminal-fonts
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - python-psutil
+ - python-setuptools
+ - qtile
+ - rofi
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Spectrwm"
+ description: "Installs spectrwm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - arcolinux-spectrwm-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - awesome-terminal-fonts
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - polybar
+ - python-psutil
+ - spectrwm
+ - sutils-git
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xdo
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+ - xtitle-git
+- name: "Desktop: Ukui"
+ description: "Installs ukui desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - arcolinux-qt5-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-ukui-dconf-git
+ - arcolinux-ukui-git
+ - arcolinux-xfce-git
+ - arcolinux-wallpapers-git
+ - dmenu
+ - gnome-screenshot
+ - gvfs
+ - lxappearance
+ - mate-control-center
+ - mate-desktop
+ - mate-menus
+ - mate-system-monitor
+ - mate-terminal
+ - qt5-quickcontrols
+ - redshift
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - ukui
+ - xfce4-terminal
+- name: "Desktop: Wmderland"
+ description: "Installs wmderland desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-wmderland-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - polybar
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - wmderland-git
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Worm"
+ description: "Installs worm desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - alacritty
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-worm-git
+ - arcolinux-xfce-git
+ - dmenu
+ - feh
+ - lxappearance
+ - picom
+ - polkit-gnome
+ - polybar
+ - rofi
+ - sxhkd
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - ttf-hack
+ - volumeicon
+ - worm-dev-git
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+- name: "Desktop: Xfce4"
+ description: "Installs xfce4 desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - xfce4
+ - xfce4-goodies
+ - dmenu
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-xfce-git
+- name: "Desktop: Xmonad"
+ description: "Installs xmonad desktop"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - arcolinux-config-all-desktops-git
+ - arcolinux-dconf-all-desktops-git
+ - arcolinux-gtk3-sardi-arc-git
+ - arcolinux-local-xfce4-git
+ - archlinux-logout-git
+ - arcolinux-polybar-git
+ - arcolinux-rofi-git
+ - arcolinux-rofi-themes-git
+ - arcolinux-root-git
+ - archlinux-tweak-tool-git
+ - arcolinux-volumeicon-git
+ - arcolinux-wallpapers-git
+ - arcolinux-xfce-git
+ - arcolinux-xmonad-polybar-git
+ - awesome-terminal-fonts
+ - dmenu
+ - feh
+ - haskell-dbus
+ - lxappearance
+ - perl-checkupdates-aur
+ - perl-www-aur
+ - picom
+ - polybar
+ - rofi
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - volumeicon
+ - xfce4-notifyd
+ - xfce4-power-manager
+ - xfce4-screenshooter
+ - xfce4-settings
+ - xfce4-taskmanager
+ - xfce4-terminal
+ - xmonad
+ - xmonad-contrib
+ - xmonad-log
+ - xmonad-utils
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-development.yaml b/usr/share/sofirem/yaml-awesome/netinstall-development.yaml
new file mode 100644
index 0000000..9a017cd
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-development.yaml
@@ -0,0 +1,34 @@
+- name: "Development"
+ description: "Development software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arduino
+ - bluefish
+ - brackets-bin
+ - code
+ - codeblocks
+ - emacs
+ - geany
+ - geany-plugins
+ - glade
+ - intellij-idea-community-edition
+ - kdevelop
+ - kde-dev-utils
+ - leafpad
+ - meld
+ - micro
+ - netbeans
+ - notepadqq
+ - openscad
+ - pulsar-bin
+ - pycharm-community-edition
+ - qt5-tools
+ - qtcreator
+ - sublime-text-4
+ - vim
+ - vim-runtime
+ - visual-studio-code-bin
+ - vscodium-bin
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-drivers.yaml b/usr/share/sofirem/yaml-awesome/netinstall-drivers.yaml
new file mode 100644
index 0000000..c8f6f09
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-drivers.yaml
@@ -0,0 +1,41 @@
+- name: "Xf86-video-nouveau"
+ description: "Installs xf86-video-nouveau"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - xf86-video-nouveau
+- name: "Xf86-video-amdgpu"
+ description: "Installs xf86-video-amdgpu"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - xf86-video-amdgpu
+- name: "Xf86-video-ati"
+ description: "Installs xf86-video-ati"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - xf86-video-ati
+- name: "Xf86-video-vesa"
+ description: "Installs xf86-video-vesa"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - xf86-video-vesa
+- name: "Xf86-video-openchrome"
+ description: "Installs xf86-video-openchrome"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - xf86-video-openchrome
\ No newline at end of file
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-filemanagers.yaml b/usr/share/sofirem/yaml-awesome/netinstall-filemanagers.yaml
new file mode 100644
index 0000000..c68b0bb
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-filemanagers.yaml
@@ -0,0 +1,23 @@
+- name: "Filemanagers"
+ description: "Filemanagers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - caja
+ - dolphin
+ - doublecmd-qt5
+ - joshuto
+ - lf
+ - nnn
+ - mc
+ - nautilus
+ - nemo
+ - nemo-fileroller
+ - pcmanfm
+ - ranger
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
+ - thunar-shares-plugin
\ No newline at end of file
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-fonts.yaml b/usr/share/sofirem/yaml-awesome/netinstall-fonts.yaml
new file mode 100644
index 0000000..d9c2234
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-fonts.yaml
@@ -0,0 +1,55 @@
+- name: "Fonts"
+ description: "Fonts"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - adobe-source-code-pro-fonts
+ - adobe-source-sans-fonts
+ - adobe-source-serif-fonts
+ - awesome-terminal-fonts
+ - libertinus-font
+ - lohit-fonts
+ - nerd-fonts-source-code-pro
+ - noto-fonts
+ - noto-fonts-emoji
+ - ttf-anonymous-pro
+ - ttf-bitstream-vera
+ - ttf-caladea
+ - ttf-carlito
+ - ttf-cascadia-code
+ - ttf-cormorant
+ - ttf-croscore
+ - ttf-dejavu
+ - ttf-droid
+ - ttf-eurof
+ - ttf-fantasque-sans-mono
+ - ttf-fira-code
+ - ttf-fira-mono
+ - ttf-fira-sans
+ - ttf-font-awesome
+ - ttf-hack
+ - ttf-hactor
+ - ttf-hellvetica
+ - ttf-ibm-plex
+ - ttf-inconsolata
+ - ttf-iosevka-nerd
+ - ttf-jetbrains-mono
+ - ttf-jetbrains-mono-nerd
+ - ttf-joypixels
+ - ttf-lato
+ - ttf-liberation
+ - ttf-linux-libertine
+ - ttf-linux-libertine-g
+ - ttf-meslo-nerd-font-powerlevel10k
+ - ttf-mac-fonts
+ - ttf-monofur
+ - ttf-ms-fonts
+ - ttf-nerd-fonts-symbols
+ - ttf-nerd-fonts-symbols-mono
+ - ttf-opensans
+ - ttf-proggy-clean
+ - ttf-roboto
+ - ttf-roboto-mono
+ - ttf-ubuntu-font-family
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-gaming.yaml b/usr/share/sofirem/yaml-awesome/netinstall-gaming.yaml
new file mode 100644
index 0000000..ffc978d
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-gaming.yaml
@@ -0,0 +1,64 @@
+- name: "Games"
+ description: "Gaming software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - aisleriot
+ - armagetronad
+ - astromenace
+ - chromium-bsu
+ - extremetuxracer
+ - freeciv
+ - gnome-chess
+ - gnuchess
+ - hedgewars
+ - kbreakout
+ - knights
+ - mari0
+ - minecraft-launcher
+ - multimc-git
+ - neverball
+ - sauerbraten
+ - sauerbraten-data
+ - supertux
+ - supertuxkart
+ - warsow
+ - wesnoth
+ - xonotic
+ - xonotic-data
+- name: "Game utilities"
+ description: "Game utilities"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-meta-steam-amd
+ - arcolinux-meta-steam-intel
+ - arcolinux-meta-steam-nvidia
+ - gamehub-bin
+ - gamemode
+ - game-devices-udev
+ - goverlay-bin
+ - heroic-games-launcher-bin
+ - itch
+ - legendary
+ - lutris
+ - mangohud
+ - minigalaxy
+ - playonlinux
+ - proton-community-updater
+ - proton-ge-custom-bin
+ - protontricks
+ - protontricks-git
+ - protonup-qt-bin
+ - protonup-git
+ - rare
+ - replay-sorcery
+ - supergfxctl
+ - steam-buddy
+ - steam-tweaks
+ - steamtinkerlaunch
+ - vkbasalt
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-graphics.yaml b/usr/share/sofirem/yaml-awesome/netinstall-graphics.yaml
new file mode 100644
index 0000000..332f0d9
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-graphics.yaml
@@ -0,0 +1,13 @@
+- name: "Graphics"
+ description: "Graphics"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - blender
+ - darktable
+ - digikam
+ - gimp
+ - inkscape
+ - krita
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-internet.yaml b/usr/share/sofirem/yaml-awesome/netinstall-internet.yaml
new file mode 100644
index 0000000..f608b02
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-internet.yaml
@@ -0,0 +1,79 @@
+- name: "Browsers"
+ description: "Browsers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - brave-bin
+ - chrome-gnome-shell
+ - chromium
+ - chromium-widevine
+ - falkon
+ - firefox
+ - firefox-adblock-plus
+ - firefox-ublock-origin
+ - google-chrome
+ - icecat
+ - librewolf-bin
+ - midori
+ - min
+ - netsurf
+ - opera
+ - qutebrowser
+ - torbrowser-launcher
+ - vivaldi
+ - vivaldi-ffmpeg-codecs
+ - vivaldi-widevine
+- name: "Downloaders"
+ description: "Downloaders"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - aria2
+ - deluge
+ - filezilla
+ - fragments
+ - freedownloadmanager
+ - gdown
+ - jdownloader2
+ - ktorrent
+ - persepolis
+ - qbittorrent
+ - transmission-gtk
+ - xdman
+- name: "Cloud Software"
+ description: "Cloud software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - dropbox
+ - insync
+ - megasync-bin
+ - nextcloud-client
+- name: "Mail Clients"
+ description: "Mail clients"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - evolution
+ - geary
+ - mailspring
+ - thunderbird
+- name: "Vpn Software"
+ description: "Vpn Software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - mullvad-vpn-bin
+ - nordtray-bin
+ - nordpass-bin
+ - nordvpn-bin
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-login.yaml b/usr/share/sofirem/yaml-awesome/netinstall-login.yaml
new file mode 100644
index 0000000..ed12c49
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-login.yaml
@@ -0,0 +1,50 @@
+- name: "Login Manager: Sddm"
+ description: "Installs sddm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - sddm
+ - arcolinux-sddm-futuristic-git
+ - arcolinux-sddm-materia-git
+ - arcolinux-sddm-simplicity-git
+ - arcolinux-sddm-slice-git
+ - arcolinux-sddm-sugar-candy-git
+ - arcolinux-sddm-urbanlifestyle-git
+- name: "Login Manager: Lightdm"
+ description: "Installs lightdm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - lightdm
+ - lightdm-gtk-greeter
+ - lightdm-gtk-greeter-settings
+ - lightdm-webkit-theme-aether
+ - lightdm-webkit2-theme-reactive
+ - arcolinux-wallpapers-git
+ - lightdm-slick-greeter
+- name: "Login Manager: Gdm"
+ description: "Installs gdm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - gdm
+ - arcolinux-wallpapers-git
+- name: "Login Manager: Lxdm"
+ description: "Installs lxdm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - lxdm
+ - arcolinux-wallpapers-git
+- name: "Login Manager: Ly"
+ description: "Installs ly"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - ly
+ - arcolinux-wallpapers-git
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-multimedia.yaml b/usr/share/sofirem/yaml-awesome/netinstall-multimedia.yaml
new file mode 100644
index 0000000..675c96c
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-multimedia.yaml
@@ -0,0 +1,77 @@
+- name: "Audio Software"
+ description: "Primarily Audio software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - amberol
+ - ardour
+ - audacious
+ - audacious-plugins
+ - audacity
+ - byte
+ - cava
+ - clementine
+ - curseradio-git
+ - deadbeef
+ - deezer
+ - elisa
+ - gmusicbrowser
+ - g4music
+ - juk
+ - kwave
+ - lollypop
+ - lxmusic
+ - lmms
+ - ncmpcpp
+ - olivia
+ - pragha
+ - radiotray
+ - rhythmbox
+ - sayonara-player
+ - shortwave
+ - soundconverter
+ - spotify
+ - spotifywm-git
+ - spotify-adblock-git
+ - tauon-music-box
+- name: "Video Software"
+ description: "Primarily Video software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - celluloid
+ - clapper
+ - freetube-bin
+ - guvcview
+ - handbrake
+ - hypnotix
+ - juk
+ - kazam
+ - kdenlive
+ - kodi-x11
+ - kodi
+ - kodi-addons
+ - losslesscut-bin
+ - obs-studio
+ - openshot
+ - makemkv
+ - mkvtoolnix-gui
+ - mpc
+ - mpd
+ - mpv
+ - peek
+ - pitivi
+ - plex-media-player
+ - plex-media-server
+ - qtwebflix-git
+ - simplescreenrecorder
+ - simplescreenrecorder-git
+ - smplayer
+ - vlc
+ - youtube-dl
+ - youtube-dl-gui-git
+ - yt-dlp
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-nvidia.yaml b/usr/share/sofirem/yaml-awesome/netinstall-nvidia.yaml
new file mode 100644
index 0000000..4a2fa6f
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-nvidia.yaml
@@ -0,0 +1,74 @@
+- name: "Nvidia-dkms for linux kernel - installed by default"
+ description: "Installs nvidia-dkms for linux kernel"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - linux
+ - linux-headers
+ - nvidia-dkms
+ - nvidia-settings
+ - nvidia-utils
+- name: "Nvidia-dkms for linux-lts kernel"
+ description: "Installs nvidia-dkms for linux-lts kernel"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - linux-lts
+ - linux-lts-headers
+ - nvidia-dkms
+ - nvidia-settings
+ - nvidia-utils
+- name: "Nvidia-dkms for linux-hardened kernel"
+ description: "Installs nvidia-dkms for linux-hardened kernel"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - linux-hardened
+ - linux-hardened-headers
+ - nvidia-dkms
+ - nvidia-settings
+ - nvidia-utils
+- name: "Nvidia-dkms for linux-zen kernel"
+ description: "Installs nvidia-dkms for linux-zen kernel"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - linux-zen
+ - linux-zen-headers
+ - nvidia-dkms
+ - nvidia-settings
+ - nvidia-utils
+- name: "Nvidia Related"
+ description: "Nvidia related applications"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - bumblebee
+ - bumblebee-status
+ - bumblebee-status-git
+ - cuda
+ - envycontrol
+ - gwe
+ - nvflash
+ - nvidia
+ - nvidia-lts
+ - nvidia-prime
+ - nvidia-xrun
+ - nvtop
+ - optimus-manager
+ - optimus-manager-qt
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-office.yaml b/usr/share/sofirem/yaml-awesome/netinstall-office.yaml
new file mode 100644
index 0000000..f3411f5
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-office.yaml
@@ -0,0 +1,123 @@
+- name: "Abiword"
+ description: "Abiword"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - abiword
+- name: "Calligra"
+ description: "Office Suite"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - calligra
+ - calligra-plan
+- name: "Epub"
+ description: "Epub"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - calibre
+ - sigil
+- name: "Freeoffice"
+ description: "Freeoffice"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - freeoffice
+- name: "Focuswriter"
+ description: "Focuswriter"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - focuswriter
+- name: "Ghostwriter"
+ description: "Ghostwriter"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - ghostwriter
+- name: "Gnumeric"
+ description: "Gnumeric"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - gnumeric
+- name: "Libre Office Fresh"
+ description: "Installs libre office fresh - feature branch - conflicts with still"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - libreoffice-fresh
+ - hunspell
+- name: "Libre Office Still"
+ description: "Installs libre office still - stable branch - conflicts with fresh"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - libreoffice-still
+ - hunspell
+- name: "Ms Office Online"
+ description: "Microsoft Office Suite Online as a native application"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - ms-office-online
+- name: "Moneydance"
+ description: "Moneydance"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - moneydance
+- name: "Onlyoffice"
+ description: "Onlyoffice"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - onlyoffice-bin
+- name: "Openoffice"
+ description: "Openoffice"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - openoffice-bin
+- name: "PDF applications"
+ description: "PDF applications"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - atril
+ - evince
+ - okular
+ - pdfarranger
+ - xpdf
+ - xreader
+- name: "Scribus"
+ description: "Scribus"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - scribus
+- name: "WPS Office"
+ description: "Installs wps office"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - wps-office
+ - wps-office-mime
+ - ttf-wps-fonts
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-terminals.yaml b/usr/share/sofirem/yaml-awesome/netinstall-terminals.yaml
new file mode 100644
index 0000000..28c8ae2
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-terminals.yaml
@@ -0,0 +1,101 @@
+- name: "Terminals"
+ description: "Terminals"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - alacritty
+ - alacritty-themes
+ - base16-alacritty-git
+ - gnome-terminal
+ - gnome-terminal-transparency
+ - guake
+ - kitty
+ - konsole
+ - lxterminal
+ - nautilus-open-any-terminal
+ - oh-my-zsh-powerline-theme-git
+ - prot16-xfce4-terminal
+ - rxvt-unicode
+ - sakura
+ - tabby-bin
+ - tempus-themes-xfce4-terminal-git
+ - terminator
+ - termite
+ - tilix
+ - tilda
+ - tmux
+ - urxvt-fullscreen
+ - urxvt-perls
+ - urxvt-resize-font-git
+ - xfce4-terminal
+ - xfce4-terminal-base16-colors-git
+- name: "Terminal Tools To Search"
+ description: "Terminal tools to search"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - ripgrep
+ - ripgrep-all
+ - the_platinum_searcher-bin
+ - the_silver_searcher
+- name: "Terminal Fun"
+ description: "Terminal fun"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - asciiquarium
+ - bash-pipes
+ - boxes
+ - bpytop
+ - cava
+ - c-lolcat
+ - cool-retro-term
+ - cowfortune
+ - cmatrix-git
+ - cpufetch-git
+ - curseradio-git
+ - cxxmatrix-git
+ - figlet
+ - gotop-bin
+ - inetutils
+ - lolcat
+ - mc
+ - nixieclock
+ - pipes.sh
+ - pfetch
+ - python-pywal
+ - ranger
+ - sl
+ - slurm
+ - sparklines-git
+ - toilet
+ - tty-clock
+ - tty-clock-git
+ - ufetch-git
+ - ufetch-arco-git
+ - unimatrix-git
+ - wttr
+- name: "Zsh"
+ description: "Zsh"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - zsh
+ - zsh-autosuggestions-git
+ - zsh-completions
+ - zsh-fast-syntax-highlighting
+ - zsh-history-substring-search-git
+ - zsh-syntax-highlighting
+ - zsh-syntax-highlighting-git
+ - zsh-theme-powerlevel10k-git
+ - arcolinux-zsh-git
+ - oh-my-zsh-git
+ - oh-my-zsh-powerline-theme-git
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-theming.yaml b/usr/share/sofirem/yaml-awesome/netinstall-theming.yaml
new file mode 100644
index 0000000..b22820d
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-theming.yaml
@@ -0,0 +1,150 @@
+- name: "Themes"
+ description: "Themes"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - adapta-gtk-theme
+ - arc-darkest-theme-git
+ - arcolinux-arc-kde
+ - arcolinux-sweet-mars-git
+ - ayu-theme
+ - breeze
+ - dracula-gtk-theme
+ - fluent-gtk-theme
+ - fluent-kde-theme-git
+ - graphite-gtk-theme-git
+ - kripton-theme-git
+ - layan-gtk-theme-git
+ - layan-kde-git
+ - materia-gtk-theme
+ - materia-kde
+ - nordic-kde-git
+ - numix-gtk-theme-git
+ - openbox-themes-pambudi-git
+ - orchis-kde-theme-git
+ - orchis-theme-git
+ - plata-theme
+ - qogir-gtk-theme-git
+ - sweet-theme-git
+ - sweet-gtk-theme-dark
+- name: "Icons"
+ description: "Icons"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - a-candy-beauty-icon-theme-git
+ - arc-icon-theme
+ - arc-x-icons-theme
+ - breeze-icons
+ - dracula-icons-git
+ - faba-icon-theme-git
+ - faba-mono-icons-git
+ - flat-remix-git
+ - fluent-icon-theme-git
+ - halo-icons-git
+ - la-capitaine-icon-theme-git
+ - luna-icon-theme-git
+ - moka-icon-theme-git
+ - nordzy-icon-theme-git
+ - numix-circle-arc-icons-git
+ - numix-circle-icon-theme-git
+ - numix-icon-theme-git
+ - numix-kde-theme-git
+ - obsidian-icon-theme
+ - oranchelo-icon-theme-git
+ - paper-icon-theme
+ - papirus-folders-git
+ - papirus-folders-gui-bin
+ - papirus-folders-nordic
+ - papirus-icon-theme
+ - papirus-linux-universe
+ - papirus-nord
+ - qogir-icon-theme
+ - sardi-icons
+ - sardi-colora-variations-icons-git
+ - sardi-flat-colora-variations-icons-git
+ - sardi-flat-mint-y-icons-git
+ - sardi-flat-mixing-icons-git
+ - sardi-flexible-colora-variations-icons-git
+ - sardi-flexible-luv-colora-variations-icons-git
+ - sardi-flexible-mint-y-icons-git
+ - sardi-flexible-mixing-icons-git
+ - sardi-flexible-variations-icons-git
+ - sardi-ghost-flexible-colora-variations-icons-git
+ - sardi-ghost-flexible-mint-y-icons-git
+ - sardi-ghost-flexible-mixing-icons-git
+ - sardi-ghost-flexible-variations-icons-git
+ - sardi-mint-y-icons-git
+ - sardi-mixing-icons-git
+ - sardi-mono-colora-variations-icons-git
+ - sardi-mono-mint-y-icons-git
+ - sardi-mono-mixing-icons-git
+ - sardi-mono-numix-colora-variations-icons-git
+ - sardi-mono-papirus-colora-variations-icons-git
+ - sardi-orb-colora-mint-y-icons-git
+ - sardi-orb-colora-mixing-icons-git
+ - sardi-orb-colora-variations-icons-git
+ - surfn-icons-git
+ - surfn-arc-breeze-icons-git
+ - surfn-mint-y-icons-git
+ - surfn-plasma-dark-icons-git
+ - surfn-plasma-light-icons-git
+ - tela-circle-icon-theme-git
+ - vimix-icon-theme-git
+ - we10x-icon-theme-git
+ - whitesur-icon-theme-git
+ - zafiro-icon-theme
+- name: "Cursors"
+ description: "Cursors"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - bibata-cursor-theme-bin
+ - bibata-cursor-translucent
+ - bibata-extra-cursor-theme
+ - bibata-rainbow-cursor-theme
+ - capitaine-cursors
+ - catppuccin-cursors-git
+ - dracula-cursors-git
+ - layan-cursor-theme-git
+ - oxy-neon
+ - phinger-cursors
+ - sweet-cursor-theme-git
+ - vimix-cursors
+ - xcursor-arch-cursor-complete
+ - xcursor-breeze
+ - xcursor-comix
+ - xcursor-flatbed
+ - xcursor-neutral
+ - xcursor-premium
+ - xcursor-simpleandsoft
+- name: "Changing the look"
+ description: "Changing the look"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - kvantum-qt5-git
+ - kvantum-qt6-git
+ - kvantum-theme-materia
+ - kvantum-theme-qogir-git
+ - picom
+ - picom-jonaburg-git
+ - picom-ibhagwan-git
+ - picom-git
+- name: "Packages that will install plasma as a dependency"
+ description: "Plasma related"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - qogir-kde-theme-git
+ - sweet-kde-theme-mars-git
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-usb.yaml b/usr/share/sofirem/yaml-awesome/netinstall-usb.yaml
new file mode 100644
index 0000000..1d39bc2
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-usb.yaml
@@ -0,0 +1,36 @@
+- name: "Usb/Disk Utilities"
+ description: "Utility software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - baobab
+ - brasero
+ - etcher-bin
+ - imagewriter
+ - mintstick-git
+ - ventoy-bin
+ - woeusb
+ - xfburn
+- name: "Printing Utilities"
+ description: "Printing software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - hplip
+- name: "Accessibility Utilities"
+ description: "Accessibility Utility software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - brltty
+ - espeak-ng
+ - florence
+ - mousetweaks
+ - onboard
+ - orca
diff --git a/usr/share/sofirem/yaml-awesome/netinstall-utilities.yaml b/usr/share/sofirem/yaml-awesome/netinstall-utilities.yaml
new file mode 100644
index 0000000..3977abe
--- /dev/null
+++ b/usr/share/sofirem/yaml-awesome/netinstall-utilities.yaml
@@ -0,0 +1,224 @@
+- name: "Utilities for Timeshift and Btrfs"
+ description: "Utility software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - grub-btrfs
+ - timeshift
+ - timeshift-autosnap
+- name: "Utilities for Snapper and Btrfs"
+ description: "Utility software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - btrfs-assistant
+ - btrfsmaintenance
+ - grub-btrfs
+ - snap-pac
+ - snapper
+ - snapper-support
+ - snapper-tools
+- name: "Utilities for Android"
+ description: "Utility software android"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - airdroid-nativefier
+ - android-tools
+ - android-file-transfer
+ - android-sdk-platform-tools
+ - droidcam
+ - qtscrcpy
+ - scrcpy
+ - waydroid
+- name: "Utilities for IOS"
+ description: "Utility software ios"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - ifuse
+ - shairport-sync
+- name: "Utilities for benchmarking"
+ description: "Utility software benchmarking"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - blender-benchmark
+ - geekbench
+ - gputest
+ - phoronix-test-suite
+- name: "Application installers or launchers"
+ description: "Application installers or launchers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - albert
+ - appimagelauncher
+ - aura-bin
+ - bauh
+ - flatpak
+ - gnome-software
+ - octopi
+ - octopi-notifier-qt5
+ - pace
+ - pace-git
+ - pacui
+ - pacui-git
+ - pacseek-bin
+ - paru
+ - paru-bin
+ - paru-git
+ - pikaur-git
+ - rate-mirrors
+ - rate-mirrors-bin
+ - skippy-xd-git
+ - snapd
+ - synapse
+ - topgrade
+ - topgrade-bin
+ - topgrade-git
+ - trizen
+ - ulauncher
+ - xlunch-git
+ - yay
+ - yay-bin
+ - yay-git
+- name: "Power Management"
+ description: "Power Management"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - upower
+ - system76-power
+- name: "Backlight"
+ description: "Backlight"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - acpilight
+ - brightnessctl
+ - brillo
+ - gummy
+ - light
+- name: "Utilities for hardware discovery"
+ description: "Utility software for hardware discovery"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - alsi
+ - archey3
+ - bottom
+ - btop
+ - cpufetch-git
+ - cpuid
+ - cpu-x
+ - dmidecode
+ - duf
+ - edid-decode-git
+ - fastfetch
+ - fastfetch-git
+ - glances
+ - gnome-disk-utility
+ - gotop-bin
+ - gsmartcontrol
+ - gtop
+ - hddtemp
+ - htop
+ - hw-probe
+ - inxi
+ - lm_sensors
+ - lshw
+ - neofetch
+ - nvtop
+ - nvtop-git
+ - ookla-speedtest-bin
+ - pfetch
+ - powertop
+ - screenfetch
+ - slurm
+ - speedtest-cli-git
+ - s-tui
+ - sysprof
+- name: "Utilities Kernels"
+ description: "Utility software kernels"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - mkinitcpio-firmware
+ - modprobed-db
+ - modprobed-db-git
+- name: "Utilities"
+ description: "Utility software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - auto-cpufreq
+ - betterlockscreen
+ - betterlockscreen-git
+ - bleachbit
+ - btrbk
+ - caffeine
+ - caffeine-ng
+ - catfish
+ - ckb-next-git
+ - debtap
+ - deja-dup
+ - downgrade
+ - fancontrol-gui-git
+ - find-the-command-git
+ - fingerprint-gui
+ - flavours
+ - hardcode-fixer-git
+ - galculator
+ - gammy
+ - google-earth-pro
+ - grsync
+ - grub-customizer
+ - gufw
+ - hardinfo-gtk3
+ - kbackup
+ - konsave
+ - linux-wifi-hotspot
+ - pacback
+ - parcellite
+ - piper
+ - power-profiles-daemon
+ - powerpill
+ - putty
+ - redshift
+ - simple-scan
+ - slimbookbattery
+ - solaar
+ - stacer
+ - stacer-bin
+ - systemd-manager-git
+ - tlp
+ - tuxboot
+ - tuxboot-git
+ - vnstat
+ - wacom-settings-git
+ - wireshark-qt
+ - workrave
+ - yin-yang-git
diff --git a/usr/share/sofirem/yaml/netinstall-applications.yaml b/usr/share/sofirem/yaml/netinstall-applications.yaml
new file mode 100644
index 0000000..56c1d96
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-applications.yaml
@@ -0,0 +1,63 @@
+- name: "Accessories"
+ description: "Accessories"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-plank-themes-git
+ - baobab
+ - bitwarden
+ - brasero
+ - brltty
+ - cheese
+ - enpass-bin
+ - espeak-ng
+ - etcher-bin
+ - flameshot-git
+ - florence
+ - font-manager
+ - font-manager-git
+ - galculator
+ - gitahead
+ - gitahead-bin
+ - gitfiend
+ - gitg
+ - github-desktop-bin
+ - gitkraken
+ - gpick
+ - imagewriter
+ - keepassxc
+ - lastpass
+ - liferea
+ - mcomix
+ - mediainfo-gui
+ - mintstick-git
+ - mousetweaks
+ - nitrogen
+ - nomacs
+ - nomacs-git
+ - nomacs-qt6-git
+ - onboard
+ - orca
+ - pdfarranger
+ - plank
+ - privoxy
+ - screenkey-git
+ - torbrowser-launcher
+ - variety
+ - ventoy-bin
+ - woeusb
+ - xfburn
+- name: "Conky"
+ description: "Conky and conky collection"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-conky-collection-git
+ - arcolinux-conky-collection-plasma-git
+ - arcolinux-pipemenus-git
+ - conky-lua-archers
+ - yad
diff --git a/usr/share/sofirem/yaml/netinstall-arcolinux-dev.yaml b/usr/share/sofirem/yaml/netinstall-arcolinux-dev.yaml
new file mode 100644
index 0000000..c1730b0
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-arcolinux-dev.yaml
@@ -0,0 +1,23 @@
+- name: "ArcoLinux Dev"
+ description: "Software for ArcoLinux developers and betatesters"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-local-xfce4-git
+ - arcolinux-xfce-git
+ - discord
+ - firefox
+ - flameshot-git
+ - gitahead
+ - gitahead-bin
+ - meld
+ - scrot
+ - simplescreenrecorder
+ - sublime-text-4
+ - telegram-desktop
+ - the_platinum_searcher-bin
+ - thunar
+ - thunar-archive-plugin
+ - thunar-volman
diff --git a/usr/share/sofirem/yaml/netinstall-arcolinux.yaml b/usr/share/sofirem/yaml/netinstall-arcolinux.yaml
new file mode 100644
index 0000000..01294d5
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-arcolinux.yaml
@@ -0,0 +1,128 @@
+- name: "ArcoLinux Plasma Packages"
+ description: "ArcoLinux plasma packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-plasma-keybindings-git
+ - arcolinux-plasma-servicemenus-git
+ - arcolinux-plasma-theme-candy-beauty-arc-dark-git
+ - arcolinux-plasma-theme-candy-beauty-nordic-git
+ - arcolinux-plasma-theme-surfn-arc-dark-git
+ - arcolinux-plasma-theme-surfn-nordic-git
+- name: "Applications"
+ description: "Applications"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - archlinux-logout-git
+ - archlinux-tweak-tool-git
+ - arcolinux-desktop-trasher-git
+ - arcolinux-powermenu-git
+ - arcolinux-reflector-simple-git
+ - arcolinux-teamviewer
+ - arcolinux-tellme-git
+- name: "Arc Theming"
+ description: "Arc theming packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-arc-aqua-git
+ - arcolinux-arc-archlinux-blue-git
+ - arcolinux-arc-arcolinux-blue-git
+ - arcolinux-arc-azul-git
+ - arcolinux-arc-azure-git
+ - arcolinux-arc-azure-dodger-blue-git
+ - arcolinux-arc-blood-git
+ - arcolinux-arc-blue-sky-git
+ - arcolinux-arc-blueberry-git
+ - arcolinux-arc-botticelli-git
+ - arcolinux-arc-bright-lilac-git
+ - arcolinux-arc-carnation-git
+ - arcolinux-arc-carolina-blue-git
+ - arcolinux-arc-casablanca-git
+ - arcolinux-arc-cornflower-blue-git
+ - arcolinux-arc-crimson-git
+ - arcolinux-arc-darkish-git
+ - arcolinux-arc-dawn-git
+ - arcolinux-arc-dodger-blue-git
+ - arcolinux-arc-emerald-git
+ - arcolinux-arc-evopop-git
+ - arcolinux-arc-fern-git
+ - arcolinux-arc-fire-git
+ - arcolinux-arc-froly-git
+ - arcolinux-arc-havelock-git
+ - arcolinux-arc-hibiscus-git
+ - arcolinux-arc-light-blue-grey-git
+ - arcolinux-arc-light-blue-surfn-git
+ - arcolinux-arc-light-salmon-git
+ - arcolinux-arc-mandy-git
+ - arcolinux-arc-mantis-git
+ - arcolinux-arc-medium-blue-git
+ - arcolinux-arc-niagara-git
+ - arcolinux-arc-nice-blue-git
+ - arcolinux-arc-numix-git
+ - arcolinux-arc-orchid-git
+ - arcolinux-arc-pale-grey-git
+ - arcolinux-arc-paper-git
+ - arcolinux-arc-pink-git
+ - arcolinux-arc-polo-git
+ - arcolinux-arc-punch-git
+ - arcolinux-arc-purpley-git
+ - arcolinux-arc-red-orange-git
+ - arcolinux-arc-red-violet-git
+ - arcolinux-arc-rusty-orange-git
+ - arcolinux-arc-sky-blue-git
+ - arcolinux-arc-slate-grey-git
+ - arcolinux-arc-smoke-git
+ - arcolinux-arc-soft-blue-git
+ - arcolinux-arc-tacao-git
+ - arcolinux-arc-tangerine-git
+ - arcolinux-arc-tory-git
+ - arcolinux-arc-twilight-git
+ - arcolinux-arc-warm-pink-git
+- name: "Theming"
+ description: "Theming packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - a-candy-beauty-icon-theme-git
+ - archlinux-login-backgrounds-git
+ - arcolinux-arc-kde
+ - arcolinux-mint-y-icons-git
+ - arcolinux-plank-git
+ - arcolinux-plank-themes-git
+ - arcolinux-sddm-futuristic-git
+ - arcolinux-sddm-materia-git
+ - arcolinux-sddm-simplicity-git
+ - arcolinux-sddm-slice-git
+ - arcolinux-sddm-sugar-candy-git
+ - arcolinux-sddm-urbanlifestyle-git
+ - arcolinux-wallpapers-candy-git
+ - arcolinux-wallpapers-dual-git
+ - arcolinux-wallpapers-git
+- name: "Meta"
+ description: "ArcoLinux meta packages"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-meta-arc-theme
+ - arcolinux-meta-asian-fonts
+ - arcolinux-meta-fun
+ - arcolinux-meta-log
+ - arcolinux-meta-samba
+ - arcolinux-meta-sddm-themes
+ - arcolinux-meta-steam-amd
+ - arcolinux-meta-steam-intel
+ - arcolinux-meta-steam-nvidia
+ - arcolinux-meta-utilities
+ - arcolinux-meta-wine
diff --git a/usr/share/sofirem/yaml/netinstall-communication.yaml b/usr/share/sofirem/yaml/netinstall-communication.yaml
new file mode 100644
index 0000000..7a7d294
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-communication.yaml
@@ -0,0 +1,44 @@
+- name: "Communication"
+ description: "Communication software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - element-desktop
+ - discord
+ - discord_arch_electron
+ - google-chat-linux-bin
+ - hexchat
+ - jitsi-meet-desktop-bin
+ - mumble
+ - neochat
+ - pidgin
+ - qtox
+ - skypeforlinux-stable-bin
+ - signal-desktop
+ - signal-desktop-beta-bin
+ - slack-desktop
+ - teams
+ - telegram-desktop
+ - telegram-desktop-bin
+ - tweetdeck-desktop
+ - viber
+ - whatsapp-nativefier
+ - wire-desktop
+ - zoom
+- name: "Connect Remotely"
+ description: "Applications to connect to other systems"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - anydesk-bin
+ - arcolinux-teamviewer
+ - krdc
+ - nomachine
+ - realvnc-vnc-server
+ - realvnc-vnc-viewer
+ - remmina
+ - tigervnc
diff --git a/usr/share/sofirem/yaml/netinstall-development.yaml b/usr/share/sofirem/yaml/netinstall-development.yaml
new file mode 100644
index 0000000..9a017cd
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-development.yaml
@@ -0,0 +1,34 @@
+- name: "Development"
+ description: "Development software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arduino
+ - bluefish
+ - brackets-bin
+ - code
+ - codeblocks
+ - emacs
+ - geany
+ - geany-plugins
+ - glade
+ - intellij-idea-community-edition
+ - kdevelop
+ - kde-dev-utils
+ - leafpad
+ - meld
+ - micro
+ - netbeans
+ - notepadqq
+ - openscad
+ - pulsar-bin
+ - pycharm-community-edition
+ - qt5-tools
+ - qtcreator
+ - sublime-text-4
+ - vim
+ - vim-runtime
+ - visual-studio-code-bin
+ - vscodium-bin
diff --git a/usr/share/sofirem/yaml/netinstall-filemanagers.yaml b/usr/share/sofirem/yaml/netinstall-filemanagers.yaml
new file mode 100644
index 0000000..2a4994d
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-filemanagers.yaml
@@ -0,0 +1,24 @@
+- name: "Filemanagers"
+ description: "Filemanagers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - caja
+ - dolphin
+ - doublecmd-qt5
+ - joshuto
+ - lf
+ - nnn
+ - mc
+ - nautilus
+ - nemo
+ - nemo-fileroller
+ - pcmanfm
+ - ranger
+ - thunar
+ - thunar-extended
+ - thunar-archive-plugin
+ - thunar-volman
+ - thunar-shares-plugin
diff --git a/usr/share/sofirem/yaml/netinstall-fonts.yaml b/usr/share/sofirem/yaml/netinstall-fonts.yaml
new file mode 100644
index 0000000..d9c2234
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-fonts.yaml
@@ -0,0 +1,55 @@
+- name: "Fonts"
+ description: "Fonts"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - adobe-source-code-pro-fonts
+ - adobe-source-sans-fonts
+ - adobe-source-serif-fonts
+ - awesome-terminal-fonts
+ - libertinus-font
+ - lohit-fonts
+ - nerd-fonts-source-code-pro
+ - noto-fonts
+ - noto-fonts-emoji
+ - ttf-anonymous-pro
+ - ttf-bitstream-vera
+ - ttf-caladea
+ - ttf-carlito
+ - ttf-cascadia-code
+ - ttf-cormorant
+ - ttf-croscore
+ - ttf-dejavu
+ - ttf-droid
+ - ttf-eurof
+ - ttf-fantasque-sans-mono
+ - ttf-fira-code
+ - ttf-fira-mono
+ - ttf-fira-sans
+ - ttf-font-awesome
+ - ttf-hack
+ - ttf-hactor
+ - ttf-hellvetica
+ - ttf-ibm-plex
+ - ttf-inconsolata
+ - ttf-iosevka-nerd
+ - ttf-jetbrains-mono
+ - ttf-jetbrains-mono-nerd
+ - ttf-joypixels
+ - ttf-lato
+ - ttf-liberation
+ - ttf-linux-libertine
+ - ttf-linux-libertine-g
+ - ttf-meslo-nerd-font-powerlevel10k
+ - ttf-mac-fonts
+ - ttf-monofur
+ - ttf-ms-fonts
+ - ttf-nerd-fonts-symbols
+ - ttf-nerd-fonts-symbols-mono
+ - ttf-opensans
+ - ttf-proggy-clean
+ - ttf-roboto
+ - ttf-roboto-mono
+ - ttf-ubuntu-font-family
diff --git a/usr/share/sofirem/yaml/netinstall-gaming.yaml b/usr/share/sofirem/yaml/netinstall-gaming.yaml
new file mode 100644
index 0000000..ffc978d
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-gaming.yaml
@@ -0,0 +1,64 @@
+- name: "Games"
+ description: "Gaming software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - aisleriot
+ - armagetronad
+ - astromenace
+ - chromium-bsu
+ - extremetuxracer
+ - freeciv
+ - gnome-chess
+ - gnuchess
+ - hedgewars
+ - kbreakout
+ - knights
+ - mari0
+ - minecraft-launcher
+ - multimc-git
+ - neverball
+ - sauerbraten
+ - sauerbraten-data
+ - supertux
+ - supertuxkart
+ - warsow
+ - wesnoth
+ - xonotic
+ - xonotic-data
+- name: "Game utilities"
+ description: "Game utilities"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - arcolinux-meta-steam-amd
+ - arcolinux-meta-steam-intel
+ - arcolinux-meta-steam-nvidia
+ - gamehub-bin
+ - gamemode
+ - game-devices-udev
+ - goverlay-bin
+ - heroic-games-launcher-bin
+ - itch
+ - legendary
+ - lutris
+ - mangohud
+ - minigalaxy
+ - playonlinux
+ - proton-community-updater
+ - proton-ge-custom-bin
+ - protontricks
+ - protontricks-git
+ - protonup-qt-bin
+ - protonup-git
+ - rare
+ - replay-sorcery
+ - supergfxctl
+ - steam-buddy
+ - steam-tweaks
+ - steamtinkerlaunch
+ - vkbasalt
diff --git a/usr/share/sofirem/yaml/netinstall-graphics.yaml b/usr/share/sofirem/yaml/netinstall-graphics.yaml
new file mode 100644
index 0000000..332f0d9
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-graphics.yaml
@@ -0,0 +1,13 @@
+- name: "Graphics"
+ description: "Graphics"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - blender
+ - darktable
+ - digikam
+ - gimp
+ - inkscape
+ - krita
diff --git a/usr/share/sofirem/yaml/netinstall-internet.yaml b/usr/share/sofirem/yaml/netinstall-internet.yaml
new file mode 100644
index 0000000..cc5a04f
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-internet.yaml
@@ -0,0 +1,77 @@
+- name: "Browsers"
+ description: "Browsers"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - brave-bin
+ - chrome-gnome-shell
+ - chromium
+ - chromium-widevine
+ - falkon
+ - firefox
+ - firefox-adblock-plus
+ - firefox-ublock-origin
+ - google-chrome
+ - icecat
+ - librewolf-bin
+ - netsurf
+ - opera
+ - qutebrowser
+ - torbrowser-launcher
+ - vivaldi
+ - vivaldi-ffmpeg-codecs
+ - vivaldi-widevine
+- name: "Downloaders"
+ description: "Downloaders"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - aria2
+ - deluge
+ - filezilla
+ - fragments
+ - freedownloadmanager
+ - gdown
+ - jdownloader2
+ - ktorrent
+ - persepolis
+ - qbittorrent
+ - transmission-gtk
+ - xdman
+- name: "Cloud Software"
+ description: "Cloud software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - dropbox
+ - insync
+ - megasync-bin
+ - nextcloud-client
+- name: "Mail Clients"
+ description: "Mail clients"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - evolution
+ - geary
+ - mailspring
+ - thunderbird
+- name: "Vpn Software"
+ description: "Vpn Software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - mullvad-vpn-bin
+ - nordtray-bin
+ - nordpass-bin
+ - nordvpn-bin
diff --git a/usr/share/sofirem/yaml/netinstall-login.yaml b/usr/share/sofirem/yaml/netinstall-login.yaml
new file mode 100644
index 0000000..ed12c49
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-login.yaml
@@ -0,0 +1,50 @@
+- name: "Login Manager: Sddm"
+ description: "Installs sddm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - sddm
+ - arcolinux-sddm-futuristic-git
+ - arcolinux-sddm-materia-git
+ - arcolinux-sddm-simplicity-git
+ - arcolinux-sddm-slice-git
+ - arcolinux-sddm-sugar-candy-git
+ - arcolinux-sddm-urbanlifestyle-git
+- name: "Login Manager: Lightdm"
+ description: "Installs lightdm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - lightdm
+ - lightdm-gtk-greeter
+ - lightdm-gtk-greeter-settings
+ - lightdm-webkit-theme-aether
+ - lightdm-webkit2-theme-reactive
+ - arcolinux-wallpapers-git
+ - lightdm-slick-greeter
+- name: "Login Manager: Gdm"
+ description: "Installs gdm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - gdm
+ - arcolinux-wallpapers-git
+- name: "Login Manager: Lxdm"
+ description: "Installs lxdm"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - lxdm
+ - arcolinux-wallpapers-git
+- name: "Login Manager: Ly"
+ description: "Installs ly"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - ly
+ - arcolinux-wallpapers-git
diff --git a/usr/share/sofirem/yaml/netinstall-multimedia.yaml b/usr/share/sofirem/yaml/netinstall-multimedia.yaml
new file mode 100644
index 0000000..1a57804
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-multimedia.yaml
@@ -0,0 +1,78 @@
+- name: "Audio Software"
+ description: "Primarily Audio software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - amberol
+ - ardour
+ - audacious
+ - audacious-plugins
+ - audacity
+ - byte
+ - cava
+ - clementine
+ - curseradio-git
+ - deadbeef
+ - deezer
+ - elisa
+ - gmusicbrowser
+ - g4music
+ - juk
+ - kwave
+ - lollypop
+ - lxmusic
+ - lmms
+ - ncmpcpp
+ - olivia
+ - pragha
+ - radiotray
+ - rhythmbox
+ - sayonara-player
+ - shortwave
+ - soundconverter
+ - spotify
+ - spotifywm-git
+ - spotify-adblock-git
+ - tauon-music-box
+- name: "Video Software"
+ description: "Primarily Video software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - celluloid
+ - clapper
+ - filebot
+ - freetube-bin
+ - guvcview
+ - handbrake
+ - hypnotix
+ - juk
+ - kazam
+ - kdenlive
+ - kodi-x11
+ - kodi
+ - kodi-addons
+ - losslesscut-bin
+ - obs-studio
+ - openshot
+ - makemkv
+ - mkvtoolnix-gui
+ - mpc
+ - mpd
+ - mpv
+ - peek
+ - pitivi
+ - plex-media-player
+ - plex-media-server
+ - qtwebflix-git
+ - simplescreenrecorder
+ - simplescreenrecorder-git
+ - smplayer
+ - vlc
+ - youtube-dl
+ - youtube-dl-gui-git
+ - yt-dlp
diff --git a/usr/share/sofirem/yaml/netinstall-nvidia.yaml b/usr/share/sofirem/yaml/netinstall-nvidia.yaml
new file mode 100644
index 0000000..23e5463
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-nvidia.yaml
@@ -0,0 +1,27 @@
+- name: "Nvidia tools"
+ description: "Nvidia related applications"
+ critical: false
+ hidden: false
+ selected: false
+ immutable: false
+ expanded: false
+ packages:
+ - bumblebee
+ - bumblebee-status
+ - bumblebee-status-git
+ - cuda
+ - envycontrol
+ - gwe
+ - nvflash
+ - nvidia
+ - nvidia-dkms
+ - nvidia-lts
+ - nvidia-open
+ - nvidia-open-dkms
+ - nvidia-prime
+ - nvidia-settings
+ - nvidia-utils
+ - nvidia-xrun
+ - nvtop
+ - optimus-manager
+ - optimus-manager-qt
diff --git a/usr/share/sofirem/yaml/netinstall-office.yaml b/usr/share/sofirem/yaml/netinstall-office.yaml
new file mode 100644
index 0000000..c511f8b
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-office.yaml
@@ -0,0 +1,32 @@
+- name: "Office"
+ description: "Office applications"
+ critical: false
+ hidden: false
+ selected: false
+ packages:
+ - abiword
+ - atril
+ - calibre
+ - calligra
+ - calligra-plan
+ - evince
+ - focuswriter
+ - freeoffice
+ - ghostwriter
+ - gnumeric
+ - hunspell
+ - libreoffice-fresh
+ - libreoffice-still
+ - moneydance
+ - ms-office-online
+ - okular
+ - onlyoffice-bin
+ - openoffice-bin
+ - pdfarranger
+ - scribus
+ - sigil
+ - ttf-wps-fonts
+ - wps-office
+ - wps-office-mime
+ - xpdf
+ - xreader
diff --git a/usr/share/sofirem/yaml/netinstall-terminals.yaml b/usr/share/sofirem/yaml/netinstall-terminals.yaml
new file mode 100644
index 0000000..ff870a5
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-terminals.yaml
@@ -0,0 +1,94 @@
+- name: "Terminals"
+ description: "Terminals + search tools"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - alacritty
+ - alacritty-themes
+ - base16-alacritty-git
+ - gnome-terminal
+ - gnome-terminal-transparency
+ - guake
+ - kitty
+ - konsole
+ - lxterminal
+ - nautilus-open-any-terminal
+ - oh-my-zsh-powerline-theme-git
+ - prot16-xfce4-terminal
+ - ripgrep
+ - ripgrep-all
+ - rxvt-unicode
+ - sakura
+ - tabby-bin
+ - tempus-themes-xfce4-terminal-git
+ - terminator
+ - termite
+ - the_platinum_searcher-bin
+ - the_silver_searcher
+ - tilda
+ - tilix
+ - tmux
+ - urxvt-fullscreen
+ - urxvt-perls
+ - urxvt-resize-font-git
+ - xfce4-terminal
+ - xfce4-terminal-base16-colors-git
+- name: "Terminal Fun"
+ description: "Terminal fun"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - asciiquarium
+ - bash-pipes
+ - boxes
+ - bpytop
+ - cava
+ - c-lolcat
+ - cool-retro-term
+ - cowfortune
+ - cmatrix-git
+ - cpufetch-git
+ - curseradio-git
+ - cxxmatrix-git
+ - figlet
+ - gotop-bin
+ - inetutils
+ - lolcat
+ - mc
+ - nixieclock
+ - pipes.sh
+ - pfetch
+ - python-pywal
+ - ranger
+ - sl
+ - slurm
+ - sparklines-git
+ - toilet
+ - tty-clock
+ - tty-clock-git
+ - ufetch-git
+ - ufetch-arco-git
+ - unimatrix-git
+ - wttr
+- name: "Zsh"
+ description: "Zsh"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - zsh
+ - zsh-autosuggestions-git
+ - zsh-completions
+ - zsh-fast-syntax-highlighting
+ - zsh-history-substring-search-git
+ - zsh-syntax-highlighting
+ - zsh-syntax-highlighting-git
+ - zsh-theme-powerlevel10k-git
+ - arcolinux-zsh-git
+ - oh-my-zsh-git
+ - oh-my-zsh-powerline-theme-git
diff --git a/usr/share/sofirem/yaml/netinstall-theming.yaml b/usr/share/sofirem/yaml/netinstall-theming.yaml
new file mode 100644
index 0000000..770de0c
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-theming.yaml
@@ -0,0 +1,142 @@
+- name: "Themes"
+ description: "Themes"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - adapta-gtk-theme
+ - arc-darkest-theme-git
+ - arcolinux-arc-kde
+ - arcolinux-sweet-mars-git
+ - ayu-theme
+ - breeze
+ - dracula-gtk-theme
+ - fluent-gtk-theme
+ - fluent-kde-theme-git
+ - graphite-gtk-theme-git
+ - kripton-theme-git
+ - layan-gtk-theme-git
+ - layan-kde-git
+ - materia-gtk-theme
+ - materia-kde
+ - nordic-kde-git
+ - numix-gtk-theme-git
+ - openbox-themes-pambudi-git
+ - orchis-kde-theme-git
+ - orchis-theme-git
+ - plata-theme
+ - qogir-gtk-theme-git
+ - sweet-theme-git
+ - sweet-gtk-theme-dark
+- name: "Icons"
+ description: "Icons"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - a-candy-beauty-icon-theme-git
+ - arc-icon-theme
+ - arc-x-icons-theme
+ - breeze-icons
+ - dracula-icons-git
+ - faba-icon-theme-git
+ - faba-mono-icons-git
+ - flat-remix-git
+ - fluent-icon-theme-git
+ - halo-icons-git
+ - la-capitaine-icon-theme-git
+ - luna-icon-theme-git
+ - moka-icon-theme-git
+ - nordzy-icon-theme-git
+ - numix-circle-arc-icons-git
+ - numix-circle-icon-theme-git
+ - numix-icon-theme-git
+ - numix-kde-theme-git
+ - obsidian-icon-theme
+ - oranchelo-icon-theme-git
+ - paper-icon-theme
+ - papirus-folders-git
+ - papirus-folders-gui-bin
+ - papirus-folders-nordic
+ - papirus-icon-theme
+ - papirus-linux-universe
+ - papirus-nord
+ - qogir-icon-theme
+ - sardi-icons
+ - sardi-colora-variations-icons-git
+ - sardi-flat-colora-variations-icons-git
+ - sardi-flat-mint-y-icons-git
+ - sardi-flat-mixing-icons-git
+ - sardi-flexible-colora-variations-icons-git
+ - sardi-flexible-luv-colora-variations-icons-git
+ - sardi-flexible-mint-y-icons-git
+ - sardi-flexible-mixing-icons-git
+ - sardi-flexible-variations-icons-git
+ - sardi-ghost-flexible-colora-variations-icons-git
+ - sardi-ghost-flexible-mint-y-icons-git
+ - sardi-ghost-flexible-mixing-icons-git
+ - sardi-ghost-flexible-variations-icons-git
+ - sardi-mint-y-icons-git
+ - sardi-mixing-icons-git
+ - sardi-mono-colora-variations-icons-git
+ - sardi-mono-mint-y-icons-git
+ - sardi-mono-mixing-icons-git
+ - sardi-mono-numix-colora-variations-icons-git
+ - sardi-mono-papirus-colora-variations-icons-git
+ - sardi-orb-colora-mint-y-icons-git
+ - sardi-orb-colora-mixing-icons-git
+ - sardi-orb-colora-variations-icons-git
+ - surfn-icons-git
+ - surfn-arc-breeze-icons-git
+ - surfn-mint-y-icons-git
+ - surfn-plasma-dark-icons-git
+ - surfn-plasma-light-icons-git
+ - tela-circle-icon-theme-git
+ - vimix-icon-theme-git
+ - we10x-icon-theme-git
+ - whitesur-icon-theme-git
+ - zafiro-icon-theme
+- name: "Cursors"
+ description: "Cursors"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - bibata-cursor-theme-bin
+ - bibata-cursor-translucent
+ - bibata-extra-cursor-theme
+ - bibata-rainbow-cursor-theme
+ - capitaine-cursors
+ - catppuccin-cursors-git
+ - dracula-cursors-git
+ - layan-cursor-theme-git
+ - oxy-neon
+ - phinger-cursors
+ - sweet-cursor-theme-git
+ - vimix-cursors
+ - xcursor-arch-cursor-complete
+ - xcursor-breeze
+ - xcursor-comix
+ - xcursor-flatbed
+ - xcursor-neutral
+ - xcursor-premium
+ - xcursor-simpleandsoft
+- name: "Looks"
+ description: "Changing the look"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - kvantum
+ - kvantum-qt5-git
+ - kvantum-qt6-git
+ - kvantum-theme-materia
+ - kvantum-theme-qogir-git
+ - picom
+ - picom-jonaburg-git
+ - picom-ibhagwan-git
+ - picom-git
diff --git a/usr/share/sofirem/yaml/netinstall-utilities.yaml b/usr/share/sofirem/yaml/netinstall-utilities.yaml
new file mode 100644
index 0000000..4b29f40
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-utilities.yaml
@@ -0,0 +1,158 @@
+- name: "Utilities"
+ description: "Utility software"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - acpilight
+ - airdroid-nativefier
+ - albert
+ - alsi
+ - android-file-transfer
+ - android-sdk-platform-tools
+ - android-tools
+ - appimagelauncher
+ - archey3
+ - aura-bin
+ - auto-cpufreq
+ - bauh
+ - betterlockscreen
+ - betterlockscreen-git
+ - bleachbit
+ - blender-benchmark
+ - bottom
+ - brightnessctl
+ - brillo
+ - btop
+ - btrbk
+ - caffeine-ng
+ - catfish
+ - ckb-next-git
+ - cpu-x
+ - cpufetch-git
+ - cpuid
+ - debtap
+ - deja-dup
+ - dmidecode
+ - downgrade
+ - droidcam
+ - duf
+ - edid-decode-git
+ - fancontrol-gui-git
+ - fastfetch
+ - fastfetch-git
+ - find-the-command-git
+ - fingerprint-gui
+ - flatpak
+ - flavours
+ - galculator
+ - gammy
+ - geekbench
+ - glances
+ - gnome-disk-utility
+ - gnome-software
+ - gnome-software-packagekit-plugin
+ - google-earth-pro
+ - gotop-bin
+ - gputest
+ - grsync
+ - grub-customizer
+ - gsmartcontrol
+ - gtop
+ - gufw
+ - gummy
+ - hardcode-fixer-git
+ - hardinfo-gtk3
+ - hddtemp
+ - htop
+ - hw-probe
+ - ifuse
+ - inxi
+ - kbackup
+ - konsave
+ - light
+ - linux-wifi-hotspot
+ - lm_sensors
+ - lshw
+ - neofetch
+ - nvtop
+ - nvtop-git
+ - octopi
+ - octopi-notifier-qt5
+ - ookla-speedtest-bin
+ - pacback
+ - pace
+ - pace-git
+ - pacseek-bin
+ - pacui
+ - pacui-git
+ - parcellite
+ - paru
+ - paru-bin
+ - paru-git
+ - pfetch
+ - phoronix-test-suite
+ - pikaur-git
+ - piper
+ - power-profiles-daemon
+ - powerpill
+ - powertop
+ - putty
+ - qtscrcpy
+ - rate-mirrors
+ - rate-mirrors-bin
+ - redshift
+ - s-tui
+ - scrcpy
+ - screenfetch
+ - shairport-sync
+ - simple-scan
+ - skippy-xd-git
+ - slimbookbattery
+ - slurm
+ - snapd
+ - solaar
+ - speedtest-cli-git
+ - stacer
+ - stacer-bin
+ - synapse
+ - sysprof
+ - system76-power
+ - systemd-manager-git
+ - tlp
+ - topgrade
+ - topgrade-bin
+ - topgrade-git
+ - trizen
+ - tuxboot
+ - tuxboot-git
+ - ufetch-git
+ - ulauncher
+ - upower
+ - vnstat
+ - wacom-settings-git
+ - waydroid
+ - wireshark-qt
+ - workrave
+ - wttr
+ - yay
+ - yay-bin
+ - yay-git
+ - yin-yang-git
+- name: "Btrfs"
+ description: "Utility software for Brfs"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: true
+ packages:
+ - btrfs-assistant
+ - btrfsmaintenance
+ - grub-btrfs
+ - snap-pac
+ - snapper
+ - snapper-support
+ - snapper-tools
+ - timeshift
+ - timeshift-autosnap
diff --git a/usr/share/sofirem/yaml/netinstall-vm.yaml b/usr/share/sofirem/yaml/netinstall-vm.yaml
new file mode 100644
index 0000000..6521ad0
--- /dev/null
+++ b/usr/share/sofirem/yaml/netinstall-vm.yaml
@@ -0,0 +1,17 @@
+- name: "Virtual Machines"
+ description: "Installs virtual Machines for Linux"
+ critical: false
+ hidden: false
+ selected: false
+ expanded: false
+ packages:
+ - virtualbox
+ - virtualbox-host-dkms
+ - open-vm-tools
+ - vmware-workstation
+ - vmware-keymaps
+ - qemu-base
+ - qemu-full
+ - quickemu
+ - quickemu-git
+ - quickgui-bin
\ No newline at end of file