From ef3602167e8c72cadfc328cf3b1bd7b47a2646cd Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Thu, 1 Feb 2024 15:28:03 +0100
Subject: [PATCH 01/16] Fix bash-completions dir

Add color to autostart-manage info
---
 autoinstall/file_command.sh    |  7 +++++--
 autostart-manage/lib/common.sh | 18 ++++++++++++++++--
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/autoinstall/file_command.sh b/autoinstall/file_command.sh
index 09ff198..bfea98f 100644
--- a/autoinstall/file_command.sh
+++ b/autoinstall/file_command.sh
@@ -33,8 +33,11 @@ then
 		if [ -n "$completions" ]
 		then
 			echo "Installing completions for $exe"
-			# shellcheck disable=SC2086
-			"$target" $completions > "$XDG_CONFIG_HOME/completionsrc.d/_$(basename "$exe")"
+
+			# path taken from "__load_completion" function
+			bash_completions_dir=${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions
+			mkdir -p "$bash_completions_dir"
+			eval "$target $completions" > "$bash_completions_dir/_$(basename "$exe")"
 		fi
 	fi
 
diff --git a/autostart-manage/lib/common.sh b/autostart-manage/lib/common.sh
index dfbbb1c..2479fe1 100644
--- a/autostart-manage/lib/common.sh
+++ b/autostart-manage/lib/common.sh
@@ -41,10 +41,24 @@ _autostart_run_graphical () {
 _echo_table () {
 	for unit in "$@"
 	do
+		if _systemctl "$unit" is-enabled --quiet
+		then
+			_enabled=$(green "enabled")
+		else
+			_enabled=$(red "disabled")
+		fi
+
+		if _systemctl "$unit" is-active --quiet
+		then
+			_active=$(green "active")
+		else
+			_active=$(red "inactive")
+		fi
+
 		printf "%s\t%s\t%s\t%s\n" \
 			"$unit" \
-			"$(_systemctl "$unit" is-enabled)" \
-			"$(_systemctl "$unit" is-active)" \
+			"$_enabled" \
+			"$_active" \
 			"$(_get_autostart_cmd "$unit")"
 	done
 }

From c5316e83185deda56844123d0760ba6da18347cc Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Thu, 1 Feb 2024 15:51:33 +0100
Subject: [PATCH 02/16] Add groups to autoinstall

---
 autoinstall/bashly.yml      | 2 +-
 autoinstall/run_command.sh  | 3 +--
 autostart-manage/bashly.yml | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/autoinstall/bashly.yml b/autoinstall/bashly.yml
index 3a382ae..dfdcba5 100644
--- a/autoinstall/bashly.yml
+++ b/autoinstall/bashly.yml
@@ -1,6 +1,6 @@
 name: autoinstall
 help: Install files, repository and else
-version: 0.1.1
+version: 0.1.2
 
 flags:
   - long: --clean
diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index 7703daf..0bbc760 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -5,11 +5,10 @@ clean=${args[--clean]:-}
 
 _config_query() {
 	tomlq -c --arg group "$group" \
-		'.autoinstall | map(select(.group == $group)) | '"$1" \
+		'.autoinstall | map(select(.groups + ["all"] | contains([$group]))) | '"$1" \
 		"$XDG_CONFIG_HOME/autoinstall.toml"
 }
 
-#length=$(_config_query "length")
 _config_query ".[]" | while read -r entry; do
 	install_args=()
 
diff --git a/autostart-manage/bashly.yml b/autostart-manage/bashly.yml
index 4c292bd..d042782 100644
--- a/autostart-manage/bashly.yml
+++ b/autostart-manage/bashly.yml
@@ -1,6 +1,6 @@
 name: autostart-manage
 help: Manage autostart
-version: 0.1.1
+version: 0.1.2
 
 dependencies:
   tomlq: please install yq (https://github.com/kislyuk/yq)

From 5dbdf3d311f158e00f36b56d6c1a9f984fe22581 Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Fri, 22 Mar 2024 22:14:13 +0100
Subject: [PATCH 03/16] Add some improvements

---
 autoinstall/bashly.yml     | 6 ++++++
 autoinstall/before.sh      | 7 +++++++
 autoinstall/run_command.sh | 5 +++--
 run.sh                     | 2 ++
 4 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/autoinstall/bashly.yml b/autoinstall/bashly.yml
index dfdcba5..526b258 100644
--- a/autoinstall/bashly.yml
+++ b/autoinstall/bashly.yml
@@ -30,6 +30,12 @@ commands:
       - name: group
         required: true
         help: The group to install
+    flags:
+      - long: --file
+        short: -f
+        help: File from which to read autoinstall-config
+        arg: file
+        default: $XDG_CONFIG_HOME/autoinstall.toml
 
   - name: git
     help: Install a git repository
diff --git a/autoinstall/before.sh b/autoinstall/before.sh
index f88899b..b5da850 100644
--- a/autoinstall/before.sh
+++ b/autoinstall/before.sh
@@ -19,5 +19,12 @@ fi
 if [ -n "$clean" ] || [ -n "${AUTOINSTALL_CLEAN:-}" ]
 then
 	echo "Cleaning $target"
+
+	# sanity checks
+	if [ -z "$target" ] || [ "$target" = "/" ] || [ "$target" = "$HOME" ] || [ "$target" = "$HOME/" ]
+	then
+		echo "Invalid target: '$target'"
+		exit 1
+	fi
 	rm -rf "$target"
 fi
diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index 0bbc760..968d4b1 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -1,12 +1,13 @@
 #!/usr/bin/env bash
 
 group=${args[group]:?}
+file=${args[--file]:-}
 clean=${args[--clean]:-}
 
 _config_query() {
 	tomlq -c --arg group "$group" \
 		'.autoinstall | map(select(.groups + ["all"] | contains([$group]))) | '"$1" \
-		"$XDG_CONFIG_HOME/autoinstall.toml"
+		"$file"
 }
 
 _config_query ".[]" | while read -r entry; do
@@ -43,5 +44,5 @@ _config_query ".[]" | while read -r entry; do
 
 	install_args+=("$(eval "echo $target")")
 
-	autoinstall "${install_args[@]}"
+	"$0" "${install_args[@]}"
 done
diff --git a/run.sh b/run.sh
index 67177b3..7cb49dc 100755
--- a/run.sh
+++ b/run.sh
@@ -6,4 +6,6 @@ target=$(cat .target)
 
 make generate
 
+printf "\nBuild complete. Running...\n==========================\n\n"
+
 "./output/$target" "$@"

From 790f3e8039b0445d0df1c2a51272cca125673211 Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Wed, 27 Mar 2024 18:58:31 +0100
Subject: [PATCH 04/16] Add systemd file generation to autostart-manage

---
 autostart-manage/before.sh            | 11 +++++++++++
 autostart-manage/lib/systemd_files.sh | 26 ++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 autostart-manage/before.sh
 create mode 100644 autostart-manage/lib/systemd_files.sh

diff --git a/autostart-manage/before.sh b/autostart-manage/before.sh
new file mode 100644
index 0000000..b2e3c84
--- /dev/null
+++ b/autostart-manage/before.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+service_file="$HOME/.config/systemd/user/autostart@.service"
+if [ ! -f "$service_file" ]; then
+  _deploy_service_file "$service_file"
+fi
+
+target_file="$HOME/.config/systemd/user/autostart.target"
+if [ ! -f "$target_file" ]; then
+  _deploy_target_file "$target_file"
+fi
diff --git a/autostart-manage/lib/systemd_files.sh b/autostart-manage/lib/systemd_files.sh
new file mode 100644
index 0000000..d5eb682
--- /dev/null
+++ b/autostart-manage/lib/systemd_files.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+_deploy_service_file() {
+  cat <<EOF > "$1"
+[Unit]
+Description=Autostart several tools and services
+StartLimitIntervalSec=120
+StartLimitBurst=10
+
+[Service]
+KillMode=process
+ExecStart=/bin/sh -c ". \$HOME/.profile && autostart-manage exec '%i'"
+Restart=on-failure
+RestartSec=5s
+EOF
+}
+
+_deploy_target_file() {
+  cat <<EOF > "$1"
+[Unit]
+Description=Current graphical user session
+Documentation=man:systemd.special(7)
+RefuseManualStart=no
+StopWhenUnneeded=no
+EOF
+}

From cadb8e01d0590dd06377d04dd021613b058eae8b Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Sun, 12 May 2024 23:50:11 +0200
Subject: [PATCH 05/16] Add autoinstall flatpak

---
 autoinstall/bashly.yml         | 10 ++++++++++
 autoinstall/before.sh          |  4 ++--
 autoinstall/flatpak_command.sh | 13 +++++++++++++
 autoinstall/run_command.sh     |  2 +-
 4 files changed, 26 insertions(+), 3 deletions(-)
 create mode 100644 autoinstall/flatpak_command.sh

diff --git a/autoinstall/bashly.yml b/autoinstall/bashly.yml
index 526b258..7a9cedc 100644
--- a/autoinstall/bashly.yml
+++ b/autoinstall/bashly.yml
@@ -115,3 +115,13 @@ commands:
       - name: target
         required: true
         help: The path to write the result to
+
+  - name: flatpak
+    help: Install a flatpak
+    args:
+      - name: flatpak
+        required: true
+        help: The flatpak to install
+      - name: mode
+        required: true
+        help: The target to install into (user or system)
diff --git a/autoinstall/before.sh b/autoinstall/before.sh
index b5da850..24b4323 100644
--- a/autoinstall/before.sh
+++ b/autoinstall/before.sh
@@ -2,8 +2,8 @@
 
 action=${action:?}
 
-# if action is run or completions, do nothing
-if [ "$action" = "run" ] || [ "$action" = "completions" ]
+# do nothing on some selected actions
+if [ "$action" = "completions" ] || [ "$action" = "flatpak" ] || [ "$action" = "run" ]
 then
 	return
 fi
diff --git a/autoinstall/flatpak_command.sh b/autoinstall/flatpak_command.sh
new file mode 100644
index 0000000..89f6e54
--- /dev/null
+++ b/autoinstall/flatpak_command.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+flatpak=${args[flatpak]:?}
+mode=${args[mode]:?}
+
+if ! flatpak info "$flatpak" &> /dev/null
+then
+	echo "Installing flatpak $flatpak"
+
+	flatpak install -y "--$mode" "$flatpak"
+
+	_run_hook
+fi
diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index 968d4b1..a45399c 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -44,5 +44,5 @@ _config_query ".[]" | while read -r entry; do
 
 	install_args+=("$(eval "echo $target")")
 
-	"$0" "${install_args[@]}"
+	"$0" "${install_args[@]}" || true # Continue on error
 done

From e81f5ab4da961b03e576f8fe906f76b639e04d4e Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Mon, 13 May 2024 13:58:40 +0200
Subject: [PATCH 06/16] Improve run command to remove tomlq depedency

---
 autoinstall/bashly.yml      |  4 +--
 autoinstall/file_command.sh |  2 +-
 autoinstall/run_command.sh  | 62 +++++++++++++++++++++++++++++--------
 autostart-manage/bashly.yml |  2 +-
 4 files changed, 53 insertions(+), 17 deletions(-)

diff --git a/autoinstall/bashly.yml b/autoinstall/bashly.yml
index 7a9cedc..bd7fb0f 100644
--- a/autoinstall/bashly.yml
+++ b/autoinstall/bashly.yml
@@ -1,6 +1,6 @@
 name: autoinstall
 help: Install files, repository and else
-version: 0.1.2
+version: 0.1.3
 
 flags:
   - long: --clean
@@ -35,7 +35,7 @@ commands:
         short: -f
         help: File from which to read autoinstall-config
         arg: file
-        default: $XDG_CONFIG_HOME/autoinstall.toml
+        default: $XDG_CONFIG_HOME/autoinstall.conf
 
   - name: git
     help: Install a git repository
diff --git a/autoinstall/file_command.sh b/autoinstall/file_command.sh
index bfea98f..08e9519 100644
--- a/autoinstall/file_command.sh
+++ b/autoinstall/file_command.sh
@@ -16,7 +16,7 @@ then
 fi
 
 
-if [ ! -f "$target" ]
+if [ ! -e "$target" ]
 then
 	echo "Installing file $url to $target"
 
diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index a45399c..e60be67 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -4,22 +4,16 @@ group=${args[group]:?}
 file=${args[--file]:-}
 clean=${args[--clean]:-}
 
-_config_query() {
-	tomlq -c --arg group "$group" \
-		'.autoinstall | map(select(.groups + ["all"] | contains([$group]))) | '"$1" \
-		"$file"
-}
+_handle_entry() {
+	type="$1"
+	source="$2"
+	target="$3"
+	hook="$4"
+	pipe="$5"
+	completions="$6"
 
-_config_query ".[]" | while read -r entry; do
 	install_args=()
 
-	type=$(echo "$entry" | jq -r '.type')
-	source=$(echo "$entry" | jq -r '.source')
-	target=$(echo "$entry" | jq -r '.target')
-	hook=$(echo "$entry" | jq -r '.hook // ""')
-	pipe=$(echo "$entry" | jq -r '.pipe // ""')
-	completions=$(echo "$entry" | jq -r '.completions // ""')
-
 	if [[ -n "$hook" ]]; then
 		install_args+=("--hook=$hook")
 	fi
@@ -45,4 +39,46 @@ _config_query ".[]" | while read -r entry; do
 	install_args+=("$(eval "echo $target")")
 
 	"$0" "${install_args[@]}" || true # Continue on error
+}
+
+file_lines=$(wc -l < "$file")
+line=0
+while [[ $line -lt $file_lines ]]; do
+	entry=$(tail -n +$line "$file" | awk '/^$/{exit} {print} ')
+	entry_len=$(echo "$entry" | wc -l)
+	line=$((line + entry_len))
+
+	if [[ $entry_len -le 1 ]]; then
+		continue
+	fi
+
+	unset AUTOINSTALL_ITEM_TYPE \
+		AUTOINSTALL_ITEM_SOURCE \
+		AUTOINSTALL_ITEM_TARGET \
+		AUTOINSTALL_ITEM_HOOK \
+		AUTOINSTALL_ITEM_PIPE \
+		AUTOINSTALL_ITEM_COMPLETIONS \
+		AUTOINSTALL_ITEM_GROUPS
+	eval "$entry"
+
+	# check if we have the required vars
+	if [[ -z "${AUTOINSTALL_ITEM_TYPE:-}" \
+		|| -z "${AUTOINSTALL_ITEM_SOURCE:-}" \
+		|| -z "${AUTOINSTALL_ITEM_TARGET:-}" \
+		|| -z "${AUTOINSTALL_ITEM_GROUPS:-}" ]]
+	then
+		continue
+	fi
+
+	if [[ "$group" != "all" ]]
+	then
+		# check if group is in groups
+		if [[ ! "${AUTOINSTALL_ITEM_GROUPS}" =~ (^|,)$group(,|$) ]]
+		then
+			continue
+		fi
+	fi
+
+	_handle_entry "$AUTOINSTALL_ITEM_TYPE" "$AUTOINSTALL_ITEM_SOURCE" \
+		"$AUTOINSTALL_ITEM_TARGET" "${AUTOINSTALL_ITEM_HOOK:-}" "${AUTOINSTALL_ITEM_PIPE:-}" "${AUTOINSTALL_ITEM_COMPLETIONS:-}"
 done
diff --git a/autostart-manage/bashly.yml b/autostart-manage/bashly.yml
index d042782..3327140 100644
--- a/autostart-manage/bashly.yml
+++ b/autostart-manage/bashly.yml
@@ -1,6 +1,6 @@
 name: autostart-manage
 help: Manage autostart
-version: 0.1.2
+version: 0.1.3
 
 dependencies:
   tomlq: please install yq (https://github.com/kislyuk/yq)

From aed681d0b0c18cc2966c9c687434cf6b4b8f90e0 Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Mon, 13 May 2024 15:01:21 +0200
Subject: [PATCH 07/16] Improve error handling in autoinstall run

---
 autoinstall/run_command.sh | 76 +++++++++++++++++++-------------------
 1 file changed, 39 insertions(+), 37 deletions(-)

diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index e60be67..f82eb34 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -4,7 +4,7 @@ group=${args[group]:?}
 file=${args[--file]:-}
 clean=${args[--clean]:-}
 
-_handle_entry() {
+_install_entry() {
 	type="$1"
 	source="$2"
 	target="$3"
@@ -30,19 +30,49 @@ _handle_entry() {
 		install_args+=("--completions=$completions")
 	fi
 
-	if [[ $source = \$* ]]
-	then
-		source=$(eval "echo $source")
-	fi
 	install_args+=("$source")
 
-	install_args+=("$(eval "echo $target")")
+	install_args+=("$target")
+
+	"$0" "${install_args[@]}"
+}
+
+_handle_entry() {
+	unset AUTOINSTALL_ITEM_TYPE \
+		AUTOINSTALL_ITEM_SOURCE \
+		AUTOINSTALL_ITEM_TARGET \
+		AUTOINSTALL_ITEM_HOOK \
+		AUTOINSTALL_ITEM_PIPE \
+		AUTOINSTALL_ITEM_COMPLETIONS \
+		AUTOINSTALL_ITEM_GROUPS
+
+	eval "$1"
+
+	# check if we have the required vars
+	if [[ -z "${AUTOINSTALL_ITEM_TYPE:-}" \
+		|| -z "${AUTOINSTALL_ITEM_SOURCE:-}" \
+		|| -z "${AUTOINSTALL_ITEM_TARGET:-}" \
+		|| -z "${AUTOINSTALL_ITEM_GROUPS:-}" ]]
+	then
+		return
+	fi
+
+	if [[ "$group" != "all" ]]
+	then
+		# check if group is in groups
+		if [[ ! "${AUTOINSTALL_ITEM_GROUPS}" =~ (^|,)$group(,|$) ]]
+		then
+			return
+		fi
+	fi
+
+	_install_entry "$AUTOINSTALL_ITEM_TYPE" "$AUTOINSTALL_ITEM_SOURCE" \
+		"$AUTOINSTALL_ITEM_TARGET" "${AUTOINSTALL_ITEM_HOOK:-}" "${AUTOINSTALL_ITEM_PIPE:-}" "${AUTOINSTALL_ITEM_COMPLETIONS:-}"
 
-	"$0" "${install_args[@]}" || true # Continue on error
 }
 
 file_lines=$(wc -l < "$file")
-line=0
+line=129
 while [[ $line -lt $file_lines ]]; do
 	entry=$(tail -n +$line "$file" | awk '/^$/{exit} {print} ')
 	entry_len=$(echo "$entry" | wc -l)
@@ -52,33 +82,5 @@ while [[ $line -lt $file_lines ]]; do
 		continue
 	fi
 
-	unset AUTOINSTALL_ITEM_TYPE \
-		AUTOINSTALL_ITEM_SOURCE \
-		AUTOINSTALL_ITEM_TARGET \
-		AUTOINSTALL_ITEM_HOOK \
-		AUTOINSTALL_ITEM_PIPE \
-		AUTOINSTALL_ITEM_COMPLETIONS \
-		AUTOINSTALL_ITEM_GROUPS
-	eval "$entry"
-
-	# check if we have the required vars
-	if [[ -z "${AUTOINSTALL_ITEM_TYPE:-}" \
-		|| -z "${AUTOINSTALL_ITEM_SOURCE:-}" \
-		|| -z "${AUTOINSTALL_ITEM_TARGET:-}" \
-		|| -z "${AUTOINSTALL_ITEM_GROUPS:-}" ]]
-	then
-		continue
-	fi
-
-	if [[ "$group" != "all" ]]
-	then
-		# check if group is in groups
-		if [[ ! "${AUTOINSTALL_ITEM_GROUPS}" =~ (^|,)$group(,|$) ]]
-		then
-			continue
-		fi
-	fi
-
-	_handle_entry "$AUTOINSTALL_ITEM_TYPE" "$AUTOINSTALL_ITEM_SOURCE" \
-		"$AUTOINSTALL_ITEM_TARGET" "${AUTOINSTALL_ITEM_HOOK:-}" "${AUTOINSTALL_ITEM_PIPE:-}" "${AUTOINSTALL_ITEM_COMPLETIONS:-}"
+	_handle_entry "$entry" || true # ignore errors
 done

From 1b891407a3eac6a36ed6395b5e1964d0c6fbb3ce Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Tue, 14 May 2024 12:20:10 +0200
Subject: [PATCH 08/16] Allow source to be evaluated only when group is matched

---
 autoinstall/run_command.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index f82eb34..30142ef 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -30,9 +30,13 @@ _install_entry() {
 		install_args+=("--completions=$completions")
 	fi
 
+	if [[ $source = \$* ]]
+	then
+    source=$(eval "echo $source")
+	fi
 	install_args+=("$source")
 
-	install_args+=("$target")
+	install_args+=("$(eval "echo $target")")
 
 	"$0" "${install_args[@]}"
 }

From 2aa4ae8b5803a0c7a2f640b7fbc4698df3bccdfb Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Thu, 23 May 2024 18:28:10 +0200
Subject: [PATCH 09/16] Fix wrong starting line (was for debugging)

---
 autoinstall/run_command.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index 30142ef..b3b77b6 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -76,7 +76,7 @@ _handle_entry() {
 }
 
 file_lines=$(wc -l < "$file")
-line=129
+line=0
 while [[ $line -lt $file_lines ]]; do
 	entry=$(tail -n +$line "$file" | awk '/^$/{exit} {print} ')
 	entry_len=$(echo "$entry" | wc -l)

From 67fed76c689451442208a6dc7872bc93675cdf7c Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Fri, 21 Jun 2024 22:35:59 +0200
Subject: [PATCH 10/16] Add faster group-detection in autoinstall (dynamic
 groups are now impossible)

Allow for absolute paths in autoinstall exe
Add timer in run.sh
---
 autoinstall/file_command.sh |  2 +-
 autoinstall/run_command.sh  | 24 +++++++++++-------------
 run.sh                      |  2 +-
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/autoinstall/file_command.sh b/autoinstall/file_command.sh
index 08e9519..f145fab 100644
--- a/autoinstall/file_command.sh
+++ b/autoinstall/file_command.sh
@@ -5,7 +5,7 @@ completions=${args[--completions]:-}
 target=${args[target]:?}
 url=${args[url]:?}
 
-if [ "${action:-file}" = "exe" ]
+if [ "${action:-file}" = "exe" ] && ! echo "$target" | grep -q "/"
 then
 	if [ -x "$(command -v "$target")" ]
 	then
diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
index b3b77b6..5ea6714 100644
--- a/autoinstall/run_command.sh
+++ b/autoinstall/run_command.sh
@@ -47,29 +47,18 @@ _handle_entry() {
 		AUTOINSTALL_ITEM_TARGET \
 		AUTOINSTALL_ITEM_HOOK \
 		AUTOINSTALL_ITEM_PIPE \
-		AUTOINSTALL_ITEM_COMPLETIONS \
-		AUTOINSTALL_ITEM_GROUPS
+		AUTOINSTALL_ITEM_COMPLETIONS
 
 	eval "$1"
 
 	# check if we have the required vars
 	if [[ -z "${AUTOINSTALL_ITEM_TYPE:-}" \
 		|| -z "${AUTOINSTALL_ITEM_SOURCE:-}" \
-		|| -z "${AUTOINSTALL_ITEM_TARGET:-}" \
-		|| -z "${AUTOINSTALL_ITEM_GROUPS:-}" ]]
+		|| -z "${AUTOINSTALL_ITEM_TARGET:-}" ]]
 	then
 		return
 	fi
 
-	if [[ "$group" != "all" ]]
-	then
-		# check if group is in groups
-		if [[ ! "${AUTOINSTALL_ITEM_GROUPS}" =~ (^|,)$group(,|$) ]]
-		then
-			return
-		fi
-	fi
-
 	_install_entry "$AUTOINSTALL_ITEM_TYPE" "$AUTOINSTALL_ITEM_SOURCE" \
 		"$AUTOINSTALL_ITEM_TARGET" "${AUTOINSTALL_ITEM_HOOK:-}" "${AUTOINSTALL_ITEM_PIPE:-}" "${AUTOINSTALL_ITEM_COMPLETIONS:-}"
 
@@ -86,5 +75,14 @@ while [[ $line -lt $file_lines ]]; do
 		continue
 	fi
 
+	if [[ "$group" != "all" ]]
+	then
+		# check if group is in groups
+		if ! echo "$entry" | grep -qE "^AUTOINSTALL_ITEM_GROUPS=\"(.*,)?$group(,.*)?\"$"
+		then
+			continue
+		fi
+	fi
+
 	_handle_entry "$entry" || true # ignore errors
 done
diff --git a/run.sh b/run.sh
index 7cb49dc..155b243 100755
--- a/run.sh
+++ b/run.sh
@@ -8,4 +8,4 @@ make generate
 
 printf "\nBuild complete. Running...\n==========================\n\n"
 
-"./output/$target" "$@"
+time "./output/$target" "$@"

From f48b7c86908e7b7af2d82349db68dfdb3c66f568 Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Wed, 23 Oct 2024 19:03:45 +0200
Subject: [PATCH 11/16] Add kill command to autostart-manage

---
 autostart-manage/bashly.yml | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/autostart-manage/bashly.yml b/autostart-manage/bashly.yml
index 3327140..229eb11 100644
--- a/autostart-manage/bashly.yml
+++ b/autostart-manage/bashly.yml
@@ -73,6 +73,15 @@ commands:
     completions:
       - $(autostart-manage list)
     filename: systemctl.sh
+  - name: kill
+    help: Kill the program from autostart
+    args:
+      - name: program
+        required: true
+        help: Program to kill
+    completions:
+      - $(autostart-manage list)
+    filename: systemctl.sh
   - name: log
     alias: logs
     help: Show the log for a single program from autostart

From ab7c74f888b21434c59ac4ef30bc252775849c6a Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Wed, 23 Oct 2024 22:32:11 +0200
Subject: [PATCH 12/16] Add syncing with extra groups

---
 Makefile                         |  2 +-
 autostart-manage/bashly.yml      |  4 ++++
 autostart-manage/exec_command.sh |  3 +--
 autostart-manage/info_command.sh |  2 +-
 autostart-manage/lib/common.sh   | 17 +++++++++++------
 autostart-manage/list_command.sh |  2 +-
 autostart-manage/sync_command.sh | 11 ++++-------
 7 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/Makefile b/Makefile
index b2a84de..35835aa 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,6 @@ generate: get-target output-dir completions
 docs: generate
 	BASHLY_SOURCE_DIR=$(TARGET) bashly render :mandoc ./output/man1
 
-deploy: generate docs
+install: generate docs
 	cp -f ./output/$(TARGET) ~/.local/bin/
 	cp -f ./output/man1/$(TARGET)*.1 ~/.local/share/man/man1/
diff --git a/autostart-manage/bashly.yml b/autostart-manage/bashly.yml
index 229eb11..72f5d1a 100644
--- a/autostart-manage/bashly.yml
+++ b/autostart-manage/bashly.yml
@@ -19,6 +19,10 @@ commands:
     help: Get the current status of all programs
   - name: sync
     help: Remove all programs from autostart and the re-enable all
+    args:
+      - name: groups
+        required: false
+        help: Extra groups to sync
   - name: enable
     help: Add a single program to autostart
     args:
diff --git a/autostart-manage/exec_command.sh b/autostart-manage/exec_command.sh
index 2842069..2e2c816 100644
--- a/autostart-manage/exec_command.sh
+++ b/autostart-manage/exec_command.sh
@@ -2,6 +2,5 @@
 
 program=${args[program]:?}
 
-cmd=$(_get_autostart_cmd "$program")
 sleep "$(_get_autostart_delay "$program")"
-bash -c "$cmd"
+bash -c "$(_get_autostart_cmd "$program")"
diff --git a/autostart-manage/info_command.sh b/autostart-manage/info_command.sh
index 1f895e3..566cdce 100644
--- a/autostart-manage/info_command.sh
+++ b/autostart-manage/info_command.sh
@@ -4,6 +4,6 @@ autostart_units=()
 while IFS='' read -r line
 do
 	autostart_units+=("$line")
-done < <(_list)
+done < <(_list "*")
 
 _echo_table "${autostart_units[@]}" | column -t -s$'\t' --table-columns 'Unit,Enabled?,Active?,Command'
diff --git a/autostart-manage/lib/common.sh b/autostart-manage/lib/common.sh
index 2479fe1..266c6e7 100644
--- a/autostart-manage/lib/common.sh
+++ b/autostart-manage/lib/common.sh
@@ -5,16 +5,21 @@ _systemctl () {
 }
 
 _query_autostart_toml() {
-	tomlq -r --arg host "$HOSTNAME" \
+	groups_json=$(echo -n "$2" | tr "," "\n" | jq -R . | jq -s .)
+	tomlq -r \
+		--arg host "$HOSTNAME" \
+		--argjson extra_groups "$groups_json" \
     '.hosts[$host].groups as $groups | .apps | to_entries[] | select(
         (.value.hosts | contains([$host])) or
-        ([.value.group] | inside($groups))
+        ([.value.group] | inside($groups)) or
+        ([.value.group] | inside($extra_groups)) or
+        $extra_groups == ["*"]
     ) | '"$1" \
     "$XDG_CONFIG_HOME/autostart.toml"
 }
 
 _list () {
-	_query_autostart_toml '.value.alias // .key'
+	_query_autostart_toml '.value.alias // .key' "$1"
 }
 
 _autostart_run_graphical () {
@@ -41,7 +46,7 @@ _autostart_run_graphical () {
 _echo_table () {
 	for unit in "$@"
 	do
-		if _systemctl "$unit" is-enabled --quiet
+		if [ "$(_systemctl "$unit" is-enabled)" = "enabled" ]
 		then
 			_enabled=$(green "enabled")
 		else
@@ -64,9 +69,9 @@ _echo_table () {
 }
 
 _get_autostart_cmd () {
-	_query_autostart_toml 'select((.key == "'"$1"'") or (.value.alias == "'"$1"'")) | .value.command'
+	_query_autostart_toml 'select((.key == "'"$1"'") or (.value.alias == "'"$1"'")) | .value.command' "*"
 }
 
 _get_autostart_delay () {
-	_query_autostart_toml 'select((.key == "'"$1"'") or (.value.alias == "'"$1"'")) | .value.delay // 0'
+	_query_autostart_toml 'select((.key == "'"$1"'") or (.value.alias == "'"$1"'")) | .value.delay // 0' "*"
 }
diff --git a/autostart-manage/list_command.sh b/autostart-manage/list_command.sh
index 0986740..c732452 100644
--- a/autostart-manage/list_command.sh
+++ b/autostart-manage/list_command.sh
@@ -1,3 +1,3 @@
 #!/usr/bin/env bash
 
-_list
+_list "*"
diff --git a/autostart-manage/sync_command.sh b/autostart-manage/sync_command.sh
index d08ac71..49dfd4e 100644
--- a/autostart-manage/sync_command.sh
+++ b/autostart-manage/sync_command.sh
@@ -1,14 +1,11 @@
 #!/usr/bin/env bash
 
-rm "$HOME/.config/systemd/user/autostart.target.wants/"*
+rm -f "$HOME/.config/systemd/user/autostart.target.wants/"*
 
 autostart_units=()
 while IFS='' read -r line
 do
-	autostart_units+=("$line")
-done < <(_list)
+	autostart_units+=("autostart@$line.service")
+done < <(_list "${args[groups]:-}")
 
-for unit in "${autostart_units[@]}"
-do
-	_systemctl "$unit" add-wants autostart.target
-done
+systemctl --user add-wants autostart.target "${autostart_units[@]}"

From ff19aeaf32b428465e4dfff65d6e78dd60253244 Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Mon, 28 Oct 2024 19:53:42 +0100
Subject: [PATCH 13/16] Split repos

---
 .envrc                                        |   2 -
 .forgejo/workflows/release.yaml               |  31 ++---
 .gitignore                                    |   7 +-
 Makefile                                      |  24 +---
 autoinstall/archive_command.sh                |  18 ---
 autoinstall/bashly.yml                        | 127 ------------------
 autoinstall/before.sh                         |  30 -----
 autoinstall/env_command.sh                    |  17 ---
 autoinstall/file_command.sh                   |  45 -------
 autoinstall/flatpak_command.sh                |  13 --
 autoinstall/git_command.sh                    |  15 ---
 autoinstall/lib/common.sh                     |  20 ---
 autoinstall/run_command.sh                    |  88 ------------
 autoinstall/text_command.sh                   |  16 ---
 autostart-manage/completions_command.sh       |   3 -
 autostart-manage/lib/colors.sh                |  42 ------
 settings.yml                                  |  49 -------
 {autostart-manage => src}/bashly.yml          |   2 +-
 {autostart-manage => src}/before.sh           |   0
 {autoinstall => src}/completions_command.sh   |   0
 {autostart-manage => src}/exec_command.sh     |   0
 {autostart-manage => src}/info_command.sh     |   0
 {autoinstall => src}/lib/colors.sh            |   0
 {autostart-manage => src}/lib/common.sh       |   0
 .../lib/systemd_files.sh                      |   0
 {autostart-manage => src}/list_command.sh     |   0
 {autostart-manage => src}/log_command.sh      |   0
 {autostart-manage => src}/run_command.sh      |   0
 .../run_wayland_command.sh                    |   0
 {autostart-manage => src}/run_xorg_command.sh |   0
 {autostart-manage => src}/sync_command.sh     |   0
 {autostart-manage => src}/systemctl.sh        |   0
 32 files changed, 19 insertions(+), 530 deletions(-)
 delete mode 100644 autoinstall/archive_command.sh
 delete mode 100644 autoinstall/bashly.yml
 delete mode 100644 autoinstall/before.sh
 delete mode 100644 autoinstall/env_command.sh
 delete mode 100644 autoinstall/file_command.sh
 delete mode 100644 autoinstall/flatpak_command.sh
 delete mode 100644 autoinstall/git_command.sh
 delete mode 100644 autoinstall/lib/common.sh
 delete mode 100644 autoinstall/run_command.sh
 delete mode 100644 autoinstall/text_command.sh
 delete mode 100644 autostart-manage/completions_command.sh
 delete mode 100644 autostart-manage/lib/colors.sh
 delete mode 100644 settings.yml
 rename {autostart-manage => src}/bashly.yml (99%)
 rename {autostart-manage => src}/before.sh (100%)
 rename {autoinstall => src}/completions_command.sh (100%)
 rename {autostart-manage => src}/exec_command.sh (100%)
 rename {autostart-manage => src}/info_command.sh (100%)
 rename {autoinstall => src}/lib/colors.sh (100%)
 rename {autostart-manage => src}/lib/common.sh (100%)
 rename {autostart-manage => src}/lib/systemd_files.sh (100%)
 rename {autostart-manage => src}/list_command.sh (100%)
 rename {autostart-manage => src}/log_command.sh (100%)
 rename {autostart-manage => src}/run_command.sh (100%)
 rename {autostart-manage => src}/run_wayland_command.sh (100%)
 rename {autostart-manage => src}/run_xorg_command.sh (100%)
 rename {autostart-manage => src}/sync_command.sh (100%)
 rename {autostart-manage => src}/systemctl.sh (100%)

diff --git a/.envrc b/.envrc
index 4857c1e..1d953f4 100644
--- a/.envrc
+++ b/.envrc
@@ -1,3 +1 @@
 use nix
-
-export BASHLY_SOURCE_DIR=$(cat .target)
diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml
index a574329..a5297ea 100644
--- a/.forgejo/workflows/release.yaml
+++ b/.forgejo/workflows/release.yaml
@@ -3,45 +3,30 @@ on:
     tags:
       - v**
 jobs:
-  build-artifacts:
+  release:
     runs-on: docker
-    strategy:
-      matrix:
-        tool:
-          - autoinstall
-          - autostart-manage
     steps:
       - uses: https://code.forgejo.org/actions/checkout@v3
       - id: install-dependencies
         run: |
           apt update
+          # TODO add pandoc for docs
           apt install -y make ruby
           gem install bashly
         shell: bash
       - id: run-bashly
         run: |
-          echo "${{ matrix.tool }}" > .target
           make generate
+          #make docs
         shell: bash
-      - uses: https://code.forgejo.org/actions/upload-artifact@v3
-        with:
-          name: ${{ matrix.tool }}
-          path: ${{ github.workspace }}/output/${{ matrix.tool }}
-  upload-release:
-    runs-on: docker
-    steps:
-      - uses: https://code.forgejo.org/actions/checkout@v3
-      - uses: https://code.forgejo.org/actions/download-artifact@v3
-        with:
-          path: /tmp/artifacts-in
-          merge-multiple: true # broken "collect-artifacts" used as workaround
-      - id: collect-artifacts
+      - id: prepare-release
         run: |
-          mkdir /tmp/artifacts-out
-          mv $(find /tmp/artifacts-in -type f) /tmp/artifacts-out
+          mkdir /tmp/release
+          cp ./autostart-manage /tmp/release
+          #cp -r ./man1 /tmp/release
         shell: bash
       - uses: https://code.forgejo.org/actions/forgejo-release@v1
         with:
           direction: upload
-          release-dir: /tmp/artifacts-out
+          release-dir: /tmp/release
           token: ${{ github.token }}
diff --git a/.gitignore b/.gitignore
index d45b622..d0fb366 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
-.target
-output/
+src/lib/send_completions.sh
 
-autoinstall/lib/send_completions.sh
-autostart-manage/lib/send_completions.sh
+autostart-manage
+man1
diff --git a/Makefile b/Makefile
index 35835aa..1fc809f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,22 +1,12 @@
-target:
-	@echo "Select target directory"
-	@echo $$(find . -name bashly.yml | sed -e 's/.\///' -e 's/\/.*//' | $$DMENU) > .target
+completions:
+	bashly add completions
 
-get-target:
-	$(eval TARGET := $(shell cat .target))
-
-output-dir:
-	mkdir -p ./output
-
-completions: get-target
-	BASHLY_SOURCE_DIR=$(TARGET) bashly add completions
-
-generate: get-target output-dir completions
-	BASHLY_SOURCE_DIR=$(TARGET) bashly generate --upgrade
+generate: completions
+	bashly generate --upgrade
 
 docs: generate
-	BASHLY_SOURCE_DIR=$(TARGET) bashly render :mandoc ./output/man1
+	bashly render :mandoc ./man1
 
 install: generate docs
-	cp -f ./output/$(TARGET) ~/.local/bin/
-	cp -f ./output/man1/$(TARGET)*.1 ~/.local/share/man/man1/
+	cp -f ./autostart-manage ~/.local/bin/
+	cp -f ./man1/autostart-manage*.1 ~/.local/share/man/man1/
diff --git a/autoinstall/archive_command.sh b/autoinstall/archive_command.sh
deleted file mode 100644
index 6019708..0000000
--- a/autoinstall/archive_command.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-
-target=${args[target]:?}
-url=${args[url]:?}
-
-if [ ! -f "$target" ]
-then
-	echo "Installing archive $url to $target"
-
-	target_dir=$(dirname "$target")
-	mkdir -p "$target_dir"
-	cd "$target_dir" || exit 1
-
-	_http_client "$url" > "$target"
-	tar xaf "$target"
-
-	_run_hook
-fi
diff --git a/autoinstall/bashly.yml b/autoinstall/bashly.yml
deleted file mode 100644
index bd7fb0f..0000000
--- a/autoinstall/bashly.yml
+++ /dev/null
@@ -1,127 +0,0 @@
-name: autoinstall
-help: Install files, repository and else
-version: 0.1.3
-
-flags:
-  - long: --clean
-    short: -c
-    help: Clean exisiting targets
-  - long: --hook
-    short: -h
-    help: Hook to run if something changed
-    arg: hook
-
-environment_variables:
-  - name: AUTOINSTALL_CLEAN
-    help: Clean exisiting targets
-
-dependencies:
-  http_client:
-    command: [curl, wget]
-    help: Please install either curl or wget
-
-commands:
-  - name: completions
-    help: Generate bash completions
-
-  - name: run
-    help: Autoinstall from file
-    args:
-      - name: group
-        required: true
-        help: The group to install
-    flags:
-      - long: --file
-        short: -f
-        help: File from which to read autoinstall-config
-        arg: file
-        default: $XDG_CONFIG_HOME/autoinstall.conf
-
-  - name: git
-    help: Install a git repository
-    args:
-      - name: repo
-        required: true
-        help: The url of the git repository
-      - name: target
-        required: true
-        help: The path to clone the repository into
-
-  - name: file
-    help: Install a file
-    args:
-      - name: url
-        required: true
-        help: The url of the file
-      - name: target
-        required: true
-        help: The file-path to download the file into
-    flags:
-      - long: --pipe
-        short: -p
-        help: Pipe file through command (e.g. "tar xzO")
-        arg: pipe
-        default: cat
-
-  - name: exe
-    help: Install an executable
-    args:
-      - name: url
-        required: true
-        help: The url of the file
-      - name: target
-        required: true
-        help: The file-path to download the file into
-    filename: file_command.sh
-    flags:
-      - long: --pipe
-        short: -f
-        help: Pipe file through command (e.g. "tar xzO")
-        arg: pipe
-        default: cat
-      - long: --completions
-        short: -c
-        help: Run a command on the new exe to install completions
-        arg: completions
-
-  - name: archive
-    help: Install an archive
-    args:
-      - name: url
-        required: true
-        help: The url of the arhive
-      - name: target
-        required: true
-        help: The path to clone the repository into
-
-  - name: env
-    help: Create a file with envsubst
-    args:
-      - name: template
-        required: true
-        help: The path to the template
-      - name: target
-        required: true
-        help: The path to write the result to
-    dependencies:
-      envsubst: This tool is usually part of the gettext package
-
-  - name: text
-    help: Create a file from text
-    args:
-      - name: text
-        required: true
-        help: The text to write to the file
-      - name: target
-        required: true
-        help: The path to write the result to
-
-  - name: flatpak
-    help: Install a flatpak
-    args:
-      - name: flatpak
-        required: true
-        help: The flatpak to install
-      - name: mode
-        required: true
-        help: The target to install into (user or system)
diff --git a/autoinstall/before.sh b/autoinstall/before.sh
deleted file mode 100644
index 24b4323..0000000
--- a/autoinstall/before.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-
-action=${action:?}
-
-# do nothing on some selected actions
-if [ "$action" = "completions" ] || [ "$action" = "flatpak" ] || [ "$action" = "run" ]
-then
-	return
-fi
-
-clean=${args[--clean]:-}
-target=${args[target]:?}
-
-if [ "$action" = "exe" ]
-then
-	target="$HOME/.local/bin/$target"
-fi
-
-if [ -n "$clean" ] || [ -n "${AUTOINSTALL_CLEAN:-}" ]
-then
-	echo "Cleaning $target"
-
-	# sanity checks
-	if [ -z "$target" ] || [ "$target" = "/" ] || [ "$target" = "$HOME" ] || [ "$target" = "$HOME/" ]
-	then
-		echo "Invalid target: '$target'"
-		exit 1
-	fi
-	rm -rf "$target"
-fi
diff --git a/autoinstall/env_command.sh b/autoinstall/env_command.sh
deleted file mode 100644
index 74d65d7..0000000
--- a/autoinstall/env_command.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-target=${args[target]:?}
-template=${args[template]:?}
-
-if [ ! -f "$target" ]
-then
-	echo "Installing env-template $template to $target"
-
-	target_dir=$(dirname "$target")
-	mkdir -p "$target_dir"
-	cd "$target_dir" || exit 1
-
-	envsubst < "$template" > "$target"
-
-	_run_hook
-fi
diff --git a/autoinstall/file_command.sh b/autoinstall/file_command.sh
deleted file mode 100644
index f145fab..0000000
--- a/autoinstall/file_command.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env bash
-
-pipe=${args[--pipe]:?}
-completions=${args[--completions]:-}
-target=${args[target]:?}
-url=${args[url]:?}
-
-if [ "${action:-file}" = "exe" ] && ! echo "$target" | grep -q "/"
-then
-	if [ -x "$(command -v "$target")" ]
-	then
-		return
-	fi
-	exe=$target
-	target="$HOME/.local/bin/$target"
-fi
-
-
-if [ ! -e "$target" ]
-then
-	echo "Installing file $url to $target"
-
-	target_dir=$(dirname "$target")
-	mkdir -p "$target_dir"
-	cd "$target_dir" || exit 1
-
-	_http_client "$url" | eval "$pipe" > "$target"
-
-	if [ "${action:-file}" = "exe" ]
-	then
-		chmod +x "$target"
-
-		if [ -n "$completions" ]
-		then
-			echo "Installing completions for $exe"
-
-			# path taken from "__load_completion" function
-			bash_completions_dir=${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions
-			mkdir -p "$bash_completions_dir"
-			eval "$target $completions" > "$bash_completions_dir/_$(basename "$exe")"
-		fi
-	fi
-
-	_run_hook
-fi
diff --git a/autoinstall/flatpak_command.sh b/autoinstall/flatpak_command.sh
deleted file mode 100644
index 89f6e54..0000000
--- a/autoinstall/flatpak_command.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-flatpak=${args[flatpak]:?}
-mode=${args[mode]:?}
-
-if ! flatpak info "$flatpak" &> /dev/null
-then
-	echo "Installing flatpak $flatpak"
-
-	flatpak install -y "--$mode" "$flatpak"
-
-	_run_hook
-fi
diff --git a/autoinstall/git_command.sh b/autoinstall/git_command.sh
deleted file mode 100644
index 33faf65..0000000
--- a/autoinstall/git_command.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-target=${args[target]:?}
-repo=${args[repo]:?}
-
-if [ ! -d "$target" ]
-then
-	echo "Installing repo $repo to $target"
-
-	mkdir -p "$target"
-
-	git clone --depth=1 "$repo" "$target" >/dev/null 2>&1
-
-	_run_hook
-fi
diff --git a/autoinstall/lib/common.sh b/autoinstall/lib/common.sh
deleted file mode 100644
index 584603a..0000000
--- a/autoinstall/lib/common.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-
-_http_client() {
-	if [ -x "$(command -v curl)" ]
-	then
-		curl -fsSL "$1"
-	elif [ -x "$(command -v wget)" ]
-	then
-		wget -qO - "$1"
-	fi
-}
-
-_run_hook() {
-	hook=${args[--hook]:-}
-	if [ -n "$hook" ]
-	then
-		yellow "Running hook: $hook"
-		bash -c "$hook"
-	fi
-}
diff --git a/autoinstall/run_command.sh b/autoinstall/run_command.sh
deleted file mode 100644
index 5ea6714..0000000
--- a/autoinstall/run_command.sh
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env bash
-
-group=${args[group]:?}
-file=${args[--file]:-}
-clean=${args[--clean]:-}
-
-_install_entry() {
-	type="$1"
-	source="$2"
-	target="$3"
-	hook="$4"
-	pipe="$5"
-	completions="$6"
-
-	install_args=()
-
-	if [[ -n "$hook" ]]; then
-		install_args+=("--hook=$hook")
-	fi
-	if [[ -n "$clean" ]]; then
-		install_args+=("--clean")
-	fi
-
-	install_args+=("$type")
-
-	if [[ -n "$pipe" ]]; then
-		install_args+=("--pipe=$pipe")
-	fi
-	if [[ -n "$completions" ]]; then
-		install_args+=("--completions=$completions")
-	fi
-
-	if [[ $source = \$* ]]
-	then
-    source=$(eval "echo $source")
-	fi
-	install_args+=("$source")
-
-	install_args+=("$(eval "echo $target")")
-
-	"$0" "${install_args[@]}"
-}
-
-_handle_entry() {
-	unset AUTOINSTALL_ITEM_TYPE \
-		AUTOINSTALL_ITEM_SOURCE \
-		AUTOINSTALL_ITEM_TARGET \
-		AUTOINSTALL_ITEM_HOOK \
-		AUTOINSTALL_ITEM_PIPE \
-		AUTOINSTALL_ITEM_COMPLETIONS
-
-	eval "$1"
-
-	# check if we have the required vars
-	if [[ -z "${AUTOINSTALL_ITEM_TYPE:-}" \
-		|| -z "${AUTOINSTALL_ITEM_SOURCE:-}" \
-		|| -z "${AUTOINSTALL_ITEM_TARGET:-}" ]]
-	then
-		return
-	fi
-
-	_install_entry "$AUTOINSTALL_ITEM_TYPE" "$AUTOINSTALL_ITEM_SOURCE" \
-		"$AUTOINSTALL_ITEM_TARGET" "${AUTOINSTALL_ITEM_HOOK:-}" "${AUTOINSTALL_ITEM_PIPE:-}" "${AUTOINSTALL_ITEM_COMPLETIONS:-}"
-
-}
-
-file_lines=$(wc -l < "$file")
-line=0
-while [[ $line -lt $file_lines ]]; do
-	entry=$(tail -n +$line "$file" | awk '/^$/{exit} {print} ')
-	entry_len=$(echo "$entry" | wc -l)
-	line=$((line + entry_len))
-
-	if [[ $entry_len -le 1 ]]; then
-		continue
-	fi
-
-	if [[ "$group" != "all" ]]
-	then
-		# check if group is in groups
-		if ! echo "$entry" | grep -qE "^AUTOINSTALL_ITEM_GROUPS=\"(.*,)?$group(,.*)?\"$"
-		then
-			continue
-		fi
-	fi
-
-	_handle_entry "$entry" || true # ignore errors
-done
diff --git a/autoinstall/text_command.sh b/autoinstall/text_command.sh
deleted file mode 100644
index 4fcd486..0000000
--- a/autoinstall/text_command.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-target=${args[target]:?}
-text=${args[text]:?}
-
-if [ ! -f "$target" ]
-then
-	echo "Installing text '$text' to $target"
-
-	target_dir=$(dirname "$target")
-	mkdir -p "$target_dir"
-
-	echo "$text" > "$target"
-
-	_run_hook
-fi
diff --git a/autostart-manage/completions_command.sh b/autostart-manage/completions_command.sh
deleted file mode 100644
index 0d10993..0000000
--- a/autostart-manage/completions_command.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-send_completions
diff --git a/autostart-manage/lib/colors.sh b/autostart-manage/lib/colors.sh
deleted file mode 100644
index cbdc015..0000000
--- a/autostart-manage/lib/colors.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-## Color functions [@bashly-upgrade colors]
-## This file is a part of Bashly standard library
-##
-## Usage:
-## Use any of the functions below to color or format a portion of a string.
-##
-##   echo "before $(red this is red) after"
-##   echo "before $(green_bold this is green_bold) after"
-##
-## Color output will be disabled if `NO_COLOR` environment variable is set
-## in compliance with https://no-color.org/
-##
-print_in_color() {
-  local color="$1"
-  shift
-  if [[ -z ${NO_COLOR+x} ]]; then
-    printf "$color%b\e[0m\n" "$*"
-  else
-    printf "%b\n" "$*"
-  fi
-}
-
-red() { print_in_color "\e[31m" "$*"; }
-green() { print_in_color "\e[32m" "$*"; }
-yellow() { print_in_color "\e[33m" "$*"; }
-blue() { print_in_color "\e[34m" "$*"; }
-magenta() { print_in_color "\e[35m" "$*"; }
-cyan() { print_in_color "\e[36m" "$*"; }
-bold() { print_in_color "\e[1m" "$*"; }
-underlined() { print_in_color "\e[4m" "$*"; }
-red_bold() { print_in_color "\e[1;31m" "$*"; }
-green_bold() { print_in_color "\e[1;32m" "$*"; }
-yellow_bold() { print_in_color "\e[1;33m" "$*"; }
-blue_bold() { print_in_color "\e[1;34m" "$*"; }
-magenta_bold() { print_in_color "\e[1;35m" "$*"; }
-cyan_bold() { print_in_color "\e[1;36m" "$*"; }
-red_underlined() { print_in_color "\e[4;31m" "$*"; }
-green_underlined() { print_in_color "\e[4;32m" "$*"; }
-yellow_underlined() { print_in_color "\e[4;33m" "$*"; }
-blue_underlined() { print_in_color "\e[4;34m" "$*"; }
-magenta_underlined() { print_in_color "\e[4;35m" "$*"; }
-cyan_underlined() { print_in_color "\e[4;36m" "$*"; }
diff --git a/settings.yml b/settings.yml
deleted file mode 100644
index 63e7150..0000000
--- a/settings.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# The path to bashly.yml
-config_path: "%{source_dir}/bashly.yml"
-
-# The path to use for creating the bash script
-target_dir: output
-
-# The path to use for common library files, relative to source_dir
-lib_dir: lib
-
-# The path to use for command files, relative to source_dir
-# When set to nil (~), command files will be placed directly under source_dir
-# When set to any other string, command files will be placed under this
-# directory, and each command will get its own subdirectory
-commands_dir: ~
-
-# Configure the bash options that will be added to the initialize function:
-# strict: true       Bash strict mode (set -euo pipefail)
-# strict: false      Only exit on errors (set -e)
-# strict: ''         Do not add any 'set' directive
-# strict: <string>   Add any other custom 'set' directive
-strict: true
-
-# When true, the generated script will use tab indentation instead of spaces
-# (every 2 leading spaces will be converted to a tab character)
-tab_indent: true
-
-# When true, the generated script will consider any argument in the form of
-# `-abc` as if it is `-a -b -c`.
-compact_short_flags: true
-
-# Set to 'production' or 'development':
-# env: production    Generate a smaller script, without file markers
-# env: development   Generate with file markers
-env: development
-
-# The extension to use when reading/writing partial script snippets
-partials_extension: sh
-
-# Display various usage elements in color by providing the name of the color
-# function. The value for each property is a name of a function that is
-# available in your script, for example: `green` or `bold`.
-# You can run `bashly add colors` to add a standard colors library.
-# This option cannot be set via environment variables.
-usage_colors:
-  caption: blue
-  command: green
-  arg: red
-  flag: yellow
-  environment_variable: cyan
diff --git a/autostart-manage/bashly.yml b/src/bashly.yml
similarity index 99%
rename from autostart-manage/bashly.yml
rename to src/bashly.yml
index 72f5d1a..a578c1b 100644
--- a/autostart-manage/bashly.yml
+++ b/src/bashly.yml
@@ -1,6 +1,6 @@
 name: autostart-manage
 help: Manage autostart
-version: 0.1.3
+version: 0.1.4
 
 dependencies:
   tomlq: please install yq (https://github.com/kislyuk/yq)
diff --git a/autostart-manage/before.sh b/src/before.sh
similarity index 100%
rename from autostart-manage/before.sh
rename to src/before.sh
diff --git a/autoinstall/completions_command.sh b/src/completions_command.sh
similarity index 100%
rename from autoinstall/completions_command.sh
rename to src/completions_command.sh
diff --git a/autostart-manage/exec_command.sh b/src/exec_command.sh
similarity index 100%
rename from autostart-manage/exec_command.sh
rename to src/exec_command.sh
diff --git a/autostart-manage/info_command.sh b/src/info_command.sh
similarity index 100%
rename from autostart-manage/info_command.sh
rename to src/info_command.sh
diff --git a/autoinstall/lib/colors.sh b/src/lib/colors.sh
similarity index 100%
rename from autoinstall/lib/colors.sh
rename to src/lib/colors.sh
diff --git a/autostart-manage/lib/common.sh b/src/lib/common.sh
similarity index 100%
rename from autostart-manage/lib/common.sh
rename to src/lib/common.sh
diff --git a/autostart-manage/lib/systemd_files.sh b/src/lib/systemd_files.sh
similarity index 100%
rename from autostart-manage/lib/systemd_files.sh
rename to src/lib/systemd_files.sh
diff --git a/autostart-manage/list_command.sh b/src/list_command.sh
similarity index 100%
rename from autostart-manage/list_command.sh
rename to src/list_command.sh
diff --git a/autostart-manage/log_command.sh b/src/log_command.sh
similarity index 100%
rename from autostart-manage/log_command.sh
rename to src/log_command.sh
diff --git a/autostart-manage/run_command.sh b/src/run_command.sh
similarity index 100%
rename from autostart-manage/run_command.sh
rename to src/run_command.sh
diff --git a/autostart-manage/run_wayland_command.sh b/src/run_wayland_command.sh
similarity index 100%
rename from autostart-manage/run_wayland_command.sh
rename to src/run_wayland_command.sh
diff --git a/autostart-manage/run_xorg_command.sh b/src/run_xorg_command.sh
similarity index 100%
rename from autostart-manage/run_xorg_command.sh
rename to src/run_xorg_command.sh
diff --git a/autostart-manage/sync_command.sh b/src/sync_command.sh
similarity index 100%
rename from autostart-manage/sync_command.sh
rename to src/sync_command.sh
diff --git a/autostart-manage/systemctl.sh b/src/systemctl.sh
similarity index 100%
rename from autostart-manage/systemctl.sh
rename to src/systemctl.sh

From db39cd30b23914d4c5ab2f450ac4c099e6a66fae Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Mon, 28 Oct 2024 21:01:39 +0100
Subject: [PATCH 14/16] Update run.sh

---
 run.sh | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/run.sh b/run.sh
index 155b243..8125377 100755
--- a/run.sh
+++ b/run.sh
@@ -1,11 +1,7 @@
 #!/usr/bin/env sh
 
-target=$(cat .target)
-
-[ -n "$target" ] || exit 1
-
 make generate
 
 printf "\nBuild complete. Running...\n==========================\n\n"
 
-time "./output/$target" "$@"
+time ./autostart-manage "$@"

From a69141f54246986c219253e774a8bad534dd572e Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Sat, 21 Dec 2024 15:03:24 +0100
Subject: [PATCH 15/16] Improve log parameters

---
 src/log_command.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/log_command.sh b/src/log_command.sh
index 7d9657c..8f8f075 100644
--- a/src/log_command.sh
+++ b/src/log_command.sh
@@ -1,3 +1,3 @@
 #!/usr/bin/env bash
 
-journalctl --user -fu "autostart@${args[program]:?}.service"
+journalctl --user -b0 -fu "autostart@${args[program]:?}.service"

From 70558a4c779b055f411795c1b91c2aa5ff67c224 Mon Sep 17 00:00:00 2001
From: Tobias Reisinger <tobias@msrg.cc>
Date: Mon, 24 Feb 2025 02:01:07 +0100
Subject: [PATCH 16/16] Add extra check for empty group

---
 src/lib/colors.sh |  9 +++++++++
 src/lib/common.sh | 18 +++++++++++-------
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/lib/colors.sh b/src/lib/colors.sh
index cbdc015..7458e2d 100644
--- a/src/lib/colors.sh
+++ b/src/lib/colors.sh
@@ -26,17 +26,26 @@ yellow() { print_in_color "\e[33m" "$*"; }
 blue() { print_in_color "\e[34m" "$*"; }
 magenta() { print_in_color "\e[35m" "$*"; }
 cyan() { print_in_color "\e[36m" "$*"; }
+black() { print_in_color "\e[30m" "$*"; }
+white() { print_in_color "\e[37m" "$*"; }
+
 bold() { print_in_color "\e[1m" "$*"; }
 underlined() { print_in_color "\e[4m" "$*"; }
+
 red_bold() { print_in_color "\e[1;31m" "$*"; }
 green_bold() { print_in_color "\e[1;32m" "$*"; }
 yellow_bold() { print_in_color "\e[1;33m" "$*"; }
 blue_bold() { print_in_color "\e[1;34m" "$*"; }
 magenta_bold() { print_in_color "\e[1;35m" "$*"; }
 cyan_bold() { print_in_color "\e[1;36m" "$*"; }
+black_bold() { print_in_color "\e[1;30m" "$*"; }
+white_bold() { print_in_color "\e[1;37m" "$*"; }
+
 red_underlined() { print_in_color "\e[4;31m" "$*"; }
 green_underlined() { print_in_color "\e[4;32m" "$*"; }
 yellow_underlined() { print_in_color "\e[4;33m" "$*"; }
 blue_underlined() { print_in_color "\e[4;34m" "$*"; }
 magenta_underlined() { print_in_color "\e[4;35m" "$*"; }
 cyan_underlined() { print_in_color "\e[4;36m" "$*"; }
+black_underlined() { print_in_color "\e[4;30m" "$*"; }
+white_underlined() { print_in_color "\e[4;37m" "$*"; }
diff --git a/src/lib/common.sh b/src/lib/common.sh
index 266c6e7..2f99562 100644
--- a/src/lib/common.sh
+++ b/src/lib/common.sh
@@ -9,13 +9,17 @@ _query_autostart_toml() {
 	tomlq -r \
 		--arg host "$HOSTNAME" \
 		--argjson extra_groups "$groups_json" \
-    '.hosts[$host].groups as $groups | .apps | to_entries[] | select(
-        (.value.hosts | contains([$host])) or
-        ([.value.group] | inside($groups)) or
-        ([.value.group] | inside($extra_groups)) or
-        $extra_groups == ["*"]
-    ) | '"$1" \
-    "$XDG_CONFIG_HOME/autostart.toml"
+		'.hosts[$host].groups as $groups | .apps | to_entries[] | select(
+			(.value.hosts | contains([$host])) or
+			(
+				(
+					([.value.group] | inside($groups)) or
+					([.value.group] | inside($extra_groups)) or
+					$extra_groups == ["*"]
+				) and (.value.group != "")
+			)
+		) | '"$1" \
+		"$XDG_CONFIG_HOME/autostart.toml"
 }
 
 _list () {