Compare commits
9 commits
da15b5a6ee
...
0a51ee40cc
| Author | SHA1 | Date | |
|---|---|---|---|
| 0a51ee40cc | |||
| 1c4e6a6bc8 | |||
| 555c71f0cb | |||
| 8da6cfcc74 | |||
| b2e6284563 | |||
| bc4fdabc29 | |||
| 2c48b47412 | |||
| 69ed2f5b89 | |||
| f79fc5deb9 |
19 changed files with 129 additions and 11 deletions
|
|
@ -15,7 +15,10 @@ enabled_modules:
|
|||
- system-packages-GuzioPadV4
|
||||
- waydroid-init
|
||||
- hyprland-sddm-autologin
|
||||
- hyprpm-update
|
||||
#- hyprpm-update
|
||||
- forgiving-power-button
|
||||
- xdg-user-dirs
|
||||
- atama-branding
|
||||
|
||||
# Module processing mode
|
||||
# parallel: Collect and install all modules at once (faster, default)
|
||||
|
|
@ -45,7 +48,7 @@ system_backups:
|
|||
|
||||
# Settings
|
||||
flatpak_scope: system
|
||||
auto_prune: true
|
||||
auto_prune: true #Note on what --prune (or this YAML option) actually does: It will NOT uninstall packages that are entirely unmanaged by DCli (as I thought it would) AND THAT'S BY DESIGN (not a bug/issue to report)! Instead, it will remove packages that once-were-in-your-DCli-config-but-were since removed. Kinda underwhelming, tbh; I'd be expecting that kind of behavior to be the default on a declarative system (and the the „extra” to be „we remove EVERYTHING that you don't actively track”), but I at least now understand what it does... Yay!(?) See: https://gitlab.com/theblackdon/dcli/-/work_items/6
|
||||
|
||||
# AUR helper to use (auto-detects paru or yay if not specified)
|
||||
aur_helper: yay # Options: paru, yay, or any AUR helper
|
||||
|
|
@ -84,7 +87,7 @@ default_apps:
|
|||
browser: app.zen_browser.zen
|
||||
text_editor: org.onlyoffice.desktopeditors
|
||||
file_manager: open_folder
|
||||
terminal: null #apparently, this is related to the xdg-terminal-exec binary, which I don't have - leaving it null for now
|
||||
terminal: null #apparently, this is related to the xdg-terminal-exec binary, which is an in-progress XDG standard - leaving it null for now
|
||||
video_player: org.videolan.VLC
|
||||
audio_player: org.videolan.VLC
|
||||
image_viewer: app.zen_browser.zen
|
||||
|
|
|
|||
14
modules/atama-branding/alg.os-release
Normal file
14
modules/atama-branding/alg.os-release
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
NAME="ALG"
|
||||
PRETTY_NAME="ALG"
|
||||
ID=alg
|
||||
ID_LIKE=arch
|
||||
BUILD_ID=rolling
|
||||
ANSI_COLOR="38;2;23;147;209"
|
||||
HOME_URL="https://arkalinuxgui.org/"
|
||||
DOCUMENTATION_URL="https://arkalinuxgui.org/docs"
|
||||
SUPPORT_URL="https://https://arkalinuxgui.org/discuss/"
|
||||
BUG_REPORT_URL="https://github.com/arch-linux-gui"
|
||||
PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/"
|
||||
LOGO=alg
|
||||
IMAGE_ID=alg-xfce
|
||||
IMAGE_VERSION=2025.10
|
||||
12
modules/atama-branding/blend.os-release
Normal file
12
modules/atama-branding/blend.os-release
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
NAME="blendOS"
|
||||
PRETTY_NAME="blendOS"
|
||||
ID=blendos
|
||||
BUILD_ID=rolling
|
||||
ANSI_COLOR="38;2;23;147;209"
|
||||
HOME_URL="https://blendos.co/"
|
||||
DOCUMENTATION_URL="https://wiki.archlinux.org/"
|
||||
SUPPORT_URL=""
|
||||
BUG_REPORT_URL=""
|
||||
LOGO=blendos-logo
|
||||
IMAGE_ID=blendOS
|
||||
IMAGE_VERSION=2026.05.01
|
||||
3
modules/atama-branding/dependencies.yaml
Normal file
3
modules/atama-branding/dependencies.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
description: Packages needed to run the module's hook.
|
||||
packages:
|
||||
- bash
|
||||
3
modules/atama-branding/hook.sh
Normal file
3
modules/atama-branding/hook.sh
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
mkdir -p /etc/
|
||||
echo -e "NAME=\"Atama\"\nPRETTY_NAME=\"AtamaOS\"\nID=atama\nID_LIKE=\"alg arch blendos\"\nBUILD_ID=rolling\nANSI_COLOR=\"38;2;23;147;209\"\nHOME_URL=\"\"\nDOCUMENTATION_URL=\"\"\nSUPPORT_URL=\"\"\nBUG_REPORT_URL=\"\"\nPRIVACY_POLICY_URL=\"\"\nLOGO=arch\nIMAGE_ID=alg-xfce\nIMAGE_VERSION=2025.10" > /etc/os-release
|
||||
12
modules/atama-branding/module.yaml
Normal file
12
modules/atama-branding/module.yaml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
description: Makes the power button put your device to sleep (instead of shutting it down) when pressed, and poweroff when long-pressed. This is especially useful for mobile devices like 2in1 tablets, Linux phones, the Steam Deck, or the GPD Win 4 because a) they are suspended often and b) Android/iOS devices gotten us used to this click-to-sleep behavior and with this module, you don't have to worry about accidentally shutting down your device when you act on this instinct (hence the name). Note that your OS must be able to understand /etc/systemd/logind.conf.d/ (which may not be that case if you're running a SystemD-free distro - please consult its manual of your init/LoginD system if you're in this situation) for this module to actually do anything, otherwise it's just writing a useless config file.
|
||||
package-files:
|
||||
- dependencies.yaml
|
||||
post_install_hook: "hook.sh"
|
||||
post_disable_hook: "unhook.sh" #No matter what I tried, I couldn't get this hook to actually trigger, so it seems to be an in-development stub that doesn't work yet (especially given how there was literally 0 documentation on this - I simply spotted it being listed in auto-generated modules). For now, the unhook script has to be run manually if you want to undo the power button setup. Nevertheless, it's listed here, so it should Just Work [TM] when DCli adds support.
|
||||
hook_behavior: always #...instead of "once" because this lets your config be self-healing (even if you mess something up, next dcli sync will restore it); ...instead of "ask" because I don't like pestering people with RUN THIS HOOK? RUN THIS HOOK? (if anything, that makes it more likely that they will "[S]kip always", thus rendering the „self-healing” non-functional)
|
||||
author: "Guzio"
|
||||
version: "1.0.0"
|
||||
category: "system"
|
||||
tags: []
|
||||
license: "MIT"
|
||||
upstream_url: "https://gitdab.com/Guzio/system/src/branch/main/modules/forgiving-power-button"
|
||||
11
modules/atama-branding/unhook.sh
Normal file
11
modules/atama-branding/unhook.sh
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
echo "========================================================";
|
||||
echo " HELLO! IT SEEMS YOU REMOVED THE atama-branding MODULE. ";
|
||||
echo;
|
||||
echo " Unfortunatley, this will not get rid of the branding";
|
||||
echo " because we have no way of knowing which OS were you";
|
||||
echo " using before (our branding literally overwrote that";
|
||||
echo " data, after all). Please manually look up your OS on";
|
||||
echo " https://github.com/chef/os_release and restore your";
|
||||
echo " /etc/os-release file to the contents you find there.";
|
||||
echo "========================================================";
|
||||
3
modules/forgiving-power-button/dependencies.yaml
Normal file
3
modules/forgiving-power-button/dependencies.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
description: Packages needed to run the module's hook.
|
||||
packages:
|
||||
- bash
|
||||
3
modules/forgiving-power-button/hook.sh
Normal file
3
modules/forgiving-power-button/hook.sh
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
mkdir -p /etc/systemd/logind.conf.d/
|
||||
echo -e "[Login]\nHandlePowerKey=suspend\nHandlePowerKeyLongPress=poweroff" > /etc/systemd/logind.conf.d/dcli-forgiving-power-button.conf
|
||||
12
modules/forgiving-power-button/module.yaml
Normal file
12
modules/forgiving-power-button/module.yaml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
description: Makes the power button put your device to sleep (instead of shutting it down) when pressed, and poweroff when long-pressed. This is especially useful for mobile devices like 2in1 tablets, Linux phones, the Steam Deck, or the GPD Win 4 because a) they are suspended often and b) Android/iOS devices gotten us used to this click-to-sleep behavior and with this module, you don't have to worry about accidentally shutting down your device when you act on this instinct (hence the name). Note that your OS must be able to understand /etc/systemd/logind.conf.d/ (which may not be that case if you're running a SystemD-free distro - please consult its manual of your init/LoginD system if you're in this situation) for this module to actually do anything, otherwise it's just writing a useless config file.
|
||||
package-files:
|
||||
- dependencies.yaml
|
||||
post_install_hook: "hook.sh"
|
||||
post_disable_hook: "unhook.sh" #No matter what I tried, I couldn't get this hook to actually trigger, so it seems to be an in-development stub that doesn't work yet (especially given how there was literally 0 documentation on this - I simply spotted it being listed in auto-generated modules). For now, the unhook script has to be run manually if you want to undo the power button setup. Nevertheless, it's listed here, so it should Just Work [TM] when DCli adds support.
|
||||
hook_behavior: always #...instead of "once" because this lets your config be self-healing (even if you mess something up, next dcli sync will restore it); ...instead of "ask" because I don't like pestering people with RUN THIS HOOK? RUN THIS HOOK? (if anything, that makes it more likely that they will "[S]kip always", thus rendering the „self-healing” non-functional)
|
||||
author: "Guzio"
|
||||
version: "1.0.1"
|
||||
category: "system"
|
||||
tags: []
|
||||
license: "MIT"
|
||||
upstream_url: "https://gitdab.com/Guzio/system/src/branch/main/modules/forgiving-power-button"
|
||||
2
modules/forgiving-power-button/unhook.sh
Normal file
2
modules/forgiving-power-button/unhook.sh
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
rm -v /etc/systemd/logind.conf.d/dcli-forgiving-power-button.conf
|
||||
|
|
@ -3,10 +3,9 @@ package-files:
|
|||
- dependencies.yaml
|
||||
post_install_hook: "hook.sh"
|
||||
post_disable_hook: "unhook.sh" #No matter what I tried, I couldn't get this hook to actually trigger, so it seems to be an in-development stub that doesn't work yet (especially given how there was literally 0 documentation on this - I simply spotted it being listed in auto-generated modules). For now, the unhook script has to be run manually if you want to undo autologin setup. Nevertheless, it's listed here, so it should Just Work [TM] when DCli adds support.
|
||||
hook_behavior: always
|
||||
post_disable_behavior: always
|
||||
hook_behavior: always #...instead of "once" because this lets your config be self-healing (even if you mess something up, next dcli sync will restore it) and also this is needed to ensure the „whoever-ran-dcli-most-recently” behavior (if X runs this and gets marked for autologin, then Y runs this and gets marked, then if X runs this again, we'd want to be sure that X will get marked for autologin again, not leave it on Y); ...instead of "ask" because I don't like pestering people with RUN THIS HOOK? RUN THIS HOOK? (if anything, that makes it more likely that they will "[S]kip always", thus rendering the „self-healing” and „whoever-ran-dcli-most-recently” non-functional)
|
||||
author: "Guzio"
|
||||
version: "1.0.0"
|
||||
version: "1.0.2"
|
||||
category: "window-managers"
|
||||
tags: []
|
||||
license: "MIT"
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
#!/bin/bash
|
||||
sudo rm -v /etc/sddm.conf.d/dcli-hyprland-autologin.conf
|
||||
rm -v /etc/sddm.conf.d/dcli-hyprland-autologin.conf
|
||||
|
|
@ -1,2 +1,6 @@
|
|||
#!/bin/bash
|
||||
hyprpm update
|
||||
if [ "$EUID" -ne 0 ] || [ -z "$SUDO_USER" ]; then
|
||||
hyprpm update
|
||||
exit;
|
||||
fi
|
||||
exec su "$SUDO_USER" $0;
|
||||
|
|
@ -3,9 +3,9 @@ package-files:
|
|||
- dependencies.yaml
|
||||
post_install_hook: "hook.sh"
|
||||
run_hooks_as_user: true
|
||||
hook_behavior: ask
|
||||
hook_behavior: ask #There is an explicit Call-to-Action in this module's description („Do this if...”), so I'll use "ask" in this case, even though I don't like it that much. But re-running this on every sync would just be too slow...
|
||||
author: "Guzio"
|
||||
version: "0.0.0"
|
||||
version: "0.0.0" #Still in-dev
|
||||
category: "window-managers"
|
||||
tags: []
|
||||
license: "MIT"
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ The final iteration doesn't break dependencies, but it accidentially nuked `yay`
|
|||
```
|
||||
alg-app-store alg-fastfetch-config alg-hooks alg-logo alg-qogir-theme alg-set-once alg-welcome alg-xfce-settings amd-ucode bcachefs-tools blueman broadcom-wl clonezilla darkhttpd ddrescue dhcpcd dmraid edk2-shell ethtool exo file-roller firefox firefox-dark-reader fsarchiver galculator garcon grml-zsh-config iwd jfsutils lftp lightdm lightdm-gtk-greeter lsb-release lsscsi lvm2 mousepad mugshot network-manager-applet nmap nvme-cli openconnect openvpn pacman-contrib parole partclone pavucontrol pulseaudio-alsa pulseaudio-bluetooth qemu-guest-agent reflector ristretto rp-pppoe sdparm sg3_utils system-config-printer systemd-resolvconf tela-circle-icon testdisk thunar thunar-archive-plugin thunar-media-tags-plugin thunar-volman ttf-ms-fonts ttf-roboto tumbler vim virtualbox-guest-utils vlc vpnc wireless_tools xdg-user-dirs xdotool xf86-video-intel xf86-video-vesa xfburn xfce4-appfinder xfce4-artwork xfce4-battery-plugin xfce4-clipman-plugin xfce4-cpufreq-plugin xfce4-cpugraph-plugin xfce4-dict xfce4-diskperf-plugin xfce4-eyes-plugin xfce4-fsguard-plugin xfce4-genmon-plugin xfce4-mailwatch-plugin xfce4-mount-plugin xfce4-mpc-plugin xfce4-netload-plugin xfce4-notes-plugin xfce4-notifyd xfce4-panel xfce4-places-plugin xfce4-power-manager xfce4-pulseaudio-plugin xfce4-screensaver xfce4-screenshooter xfce4-sensors-plugin xfce4-session xfce4-settings xfce4-smartbookmark-plugin xfce4-systemload-plugin xfce4-taskmanager xfce4-terminal xfce4-time-out-plugin xfce4-timer-plugin xfce4-verve-plugin xfce4-wavelan-plugin xfce4-weather-plugin xfce4-whiskermenu-plugin xfce4-xkb-plugin xfconf xfdesktop xfwm4 xfwm4-themes xorg-bdftopcf xorg-docs xorg-font-util xorg-fonts-100dpi xorg-fonts-75dpi xorg-iceauth xorg-mkfontscale xorg-server-devel xorg-server-xephyr xorg-server-xnest xorg-server-xvfb xorg-sessreg xorg-smproxy xorg-x11perf xorg-xbacklight xorg-xcmsdb xorg-xcursorgen xorg-xdpyinfo xorg-xdriinfo xorg-xev xorg-xgamma xorg-xhost xorg-xinput xorg-xkbevd xorg-xkbutils xorg-xkill xorg-xlsatoms xorg-xlsclients xorg-xpr xorg-xrandr xorg-xrefresh xorg-xset xorg-xsetroot xorg-xvinfo xorg-xwd xorg-xwininfo xorg-xwud zsh libxfce4ui
|
||||
```
|
||||
|
||||
### This leads to the following command
|
||||
```bash
|
||||
sudo pacman -R alg-app-store alg-fastfetch-config alg-hooks alg-logo alg-qogir-theme alg-set-once alg-welcome alg-xfce-settings amd-ucode bcachefs-tools blueman broadcom-wl clonezilla darkhttpd ddrescue dhcpcd dmraid edk2-shell ethtool exo file-roller firefox firefox-dark-reader fsarchiver galculator garcon grml-zsh-config iwd jfsutils lftp lightdm lightdm-gtk-greeter lsb-release lsscsi lvm2 mousepad mugshot network-manager-applet nmap nvme-cli openconnect openvpn pacman-contrib parole partclone pavucontrol pulseaudio-alsa pulseaudio-bluetooth qemu-guest-agent reflector ristretto rp-pppoe sdparm sg3_utils system-config-printer systemd-resolvconf tela-circle-icon testdisk thunar thunar-archive-plugin thunar-media-tags-plugin thunar-volman ttf-ms-fonts ttf-roboto tumbler vim virtualbox-guest-utils vlc vpnc wireless_tools xdg-user-dirs xdotool xf86-video-intel xf86-video-vesa xfburn xfce4-appfinder xfce4-artwork xfce4-battery-plugin xfce4-clipman-plugin xfce4-cpufreq-plugin xfce4-cpugraph-plugin xfce4-dict xfce4-diskperf-plugin xfce4-eyes-plugin xfce4-fsguard-plugin xfce4-genmon-plugin xfce4-mailwatch-plugin xfce4-mount-plugin xfce4-mpc-plugin xfce4-netload-plugin xfce4-notes-plugin xfce4-notifyd xfce4-panel xfce4-places-plugin xfce4-power-manager xfce4-pulseaudio-plugin xfce4-screensaver xfce4-screenshooter xfce4-sensors-plugin xfce4-session xfce4-settings xfce4-smartbookmark-plugin xfce4-systemload-plugin xfce4-taskmanager xfce4-terminal xfce4-time-out-plugin xfce4-timer-plugin xfce4-verve-plugin xfce4-wavelan-plugin xfce4-weather-plugin xfce4-whiskermenu-plugin xfce4-xkb-plugin xfconf xfdesktop xfwm4 xfwm4-themes xorg-bdftopcf xorg-docs xorg-font-util xorg-fonts-100dpi xorg-fonts-75dpi xorg-iceauth xorg-mkfontscale xorg-server-devel xorg-server-xephyr xorg-server-xnest xorg-server-xvfb xorg-sessreg xorg-smproxy xorg-x11perf xorg-xbacklight xorg-xcmsdb xorg-xcursorgen xorg-xdpyinfo xorg-xdriinfo xorg-xev xorg-xgamma xorg-xhost xorg-xinput xorg-xkbevd xorg-xkbutils xorg-xkill xorg-xlsatoms xorg-xlsclients xorg-xpr xorg-xrandr xorg-xrefresh xorg-xset xorg-xsetroot xorg-xvinfo xorg-xwd xorg-xwininfo xorg-xwud zsh libxfce4ui
|
||||
|
|
@ -66,6 +67,7 @@ These are packages you installed manually:
|
|||
sudo pacman -D --asdeps bluez-utils diffutils gpm gvfs pulseaudio xorg-fonts-encodings xorg-server xorg-server-common xorg-setxkbmap xorg-xauth xorg-xkbcomp xorg-xmodmap xorg-xprop xorg-xrdb xorg-xwayland
|
||||
```
|
||||
After all of this, run `sudo pacman -Rns $(pacman -Qdtq)` a couple of times (unil it can't find packages anymore), to remove all orphans that came as the result of this debacle, **and then do `dcli sync` to re-add anything that may have gotten wrongfully removed!**
|
||||
|
||||
## Service cleanup
|
||||
`dcli merge --services` gives the following list:
|
||||
```
|
||||
|
|
@ -88,5 +90,14 @@ The simplest thing to do is to run:
|
|||
```bash
|
||||
systemctl disable choose-mirror.service hv_kvp_daemon.service hv_vss_daemon.service livecd-alsa-unmuter.service livecd-talk.service ModemManager.service pacman-init.service sshd.service systemd-networkd-wait-online.service systemd-time-wait-sync.service
|
||||
```
|
||||
|
||||
## Defaults cleanup
|
||||
Nothing was needed. Yaayy!
|
||||
Nothing was needed. Yaayy!
|
||||
|
||||
## Fixing `pacman-keyring`
|
||||
For some absolutley braindead reason, ALG devs looked at [this forum post](https://bbs.archlinux.org/viewtopic.php?id=294854), saw that making `/etc/pacman.d/gnupg/` immutable-on-disk can lead to problems and thought „My golly, well wouldn't it be a splendid idea if we do that, too?” - and proceeded to ship a broken `/etc/pacman.d/gnupg/` (more specifically, the permissions are broken) that you can't perma-fix yourself (because even if you run `pacman-keyring --init` to fix the perms, any channges done to that file will not be persisted on disk and will vanish after a reboot). To make a fix that will *actually last* the following must be done:
|
||||
```bash
|
||||
sudo rm -v /etc/systemd/system/etc-pacman.d-gnupg.mount #To remove the pesky SystemD config file, that tells your OS to re-mount /etc/pacman.d/gnupg/ as a TempFS (which is what makes it immutable-on-disk)
|
||||
sudo pacman-keyring --init #To fix the broken default permissions.
|
||||
sudo pacman-keyring --populate #To install valid Arch keys. May no be necessary, but a) I think --init wipes the DB (I'm not sure, tho), and b) after all this mess, I don't trust ALG devs anymore, that they'll be competent enough to ship a valid keyring themselves.
|
||||
```
|
||||
4
modules/xdg-user-dirs/dependencies.yaml
Normal file
4
modules/xdg-user-dirs/dependencies.yaml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
description: Packages needed to run the module's hook.
|
||||
packages:
|
||||
- bash
|
||||
- xdg-user-dirs
|
||||
10
modules/xdg-user-dirs/hook.sh
Normal file
10
modules/xdg-user-dirs/hook.sh
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
# extra precautions until run_hooks_as_user: true is fixed
|
||||
if [ -n "$SUDO_USER" ] && [ "$EUID" == 0 ]; then
|
||||
exec su "$SUDO_USER" $0;
|
||||
fi
|
||||
|
||||
# An explicit „Does the .config/user-dirs.dirs file already exist” check used to be here, but it is apparently unnecessary, as it turns out that XDG it will only populate paths that weren't configured yet, or were pointing to removed folders. Keeping it for historical reference.
|
||||
|
||||
xdg-user-dirs-update
|
||||
12
modules/xdg-user-dirs/module.yaml
Normal file
12
modules/xdg-user-dirs/module.yaml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
description: Configures XDG directories the xdg-user-dirs package, if not configured already. Otherwise, it just installs the xdg-user-dirs package, which can still be useful for querying said dirs.
|
||||
package-files:
|
||||
- dependencies.yaml
|
||||
post_install_hook: "hook.sh"
|
||||
run_hooks_as_user: true
|
||||
hook_behavior: always #...instead of "once" because the XDG spec can change from time to time (eg. the recent Projects dir), and we want to make sure that the user's keeps up.; ...instead of "ask" because I don't like pestering people with RUN THIS HOOK? RUN THIS HOOK? questions; ...because running this command multiple times is safe, anyway - it only fixes/adds broken/missing entires as it encounters them instead of overwriting everything or something like that (arguably, this makes "always" safer than "once"/"ask" because it makes your config self-healing)
|
||||
author: "Guzio"
|
||||
version: "1.0.1"
|
||||
category: "media"
|
||||
tags: []
|
||||
license: "MIT"
|
||||
upstream_url: "https://gitdab.com/Guzio/system/src/branch/main/modules/xdg-user-dirs"
|
||||
Loading…
Add table
Add a link
Reference in a new issue