Page Not Found
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/404.html b/404.html index 20ff3c5b4..f4d8cc911 100644 --- a/404.html +++ b/404.html @@ -5,8 +5,8 @@
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
/etc/fstab
that is not present at boot time",id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",level:2},{value:"Incorrectly applied updates / disk changes",id:"incorrectly-applied-updates--disk-changes",level:2},{value:"Mounting your system",id:"mounting-your-system",level:3},{value:"Encrypted systems / LVM systems",id:"encrypted-systems--lvm-systems",level:4},{value:"UEFI",id:"uefi",level:4},{value:"Other partitions",id:"other-partitions",level:4},{value:"Chrooting to your Solus system",id:"chrooting-to-your-solus-system",level:3},{value:"Networking",id:"networking",level:3},{value:"Repairing packages",id:"repairing-packages",level:3},{value:"Correcting disks",id:"correcting-disks",level:3},{value:"Re-run system-wide configuration triggers",id:"re-run-system-wide-configuration-triggers",level:3},{value:"Regenerate UEFI boot entries",id:"regenerate-uefi-boot-entries",level:3},{value:"Unmounting your system",id:"unmounting-your-system",level:3}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"boot-rescue",children:"Boot Rescue"})}),"\n",(0,o.jsx)(s.p,{children:"In this document, we will walk through restoring the ability to boot Solus."}),"\n",(0,o.jsx)(s.p,{children:"The inability to boot Solus can be attributed to various issues, such as:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:'Multi-booting with an other operating system that "owns" GRUB and fails to show Solus after an upgrade of Solus is performed.'}),"\n",(0,o.jsx)(s.li,{children:'Upgrades, such as to the kernel, that may not have applied correctly. In which case this could affect "legacy boot" (non-UEFI) or UEFI systems.'}),"\n",(0,o.jsx)(s.li,{children:"If a disk is added, removed or had its UUID / mount point change."}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:'NOTE: Most examples below use sdX as the drive name. If your system has nvme drives, substitute the appropriate name, for example "nvme0n1".'}),"\n",(0,o.jsx)(s.h2,{id:"multi-booting",children:"Multi-booting"}),"\n",(0,o.jsx)(s.p,{children:'Multi-booting is when you have multiple operating systems on the same device. Also referred to as "dual-booting" when only having two operating systems on the same device.'}),"\n",(0,o.jsxs)(s.p,{children:['The inability to access Solus in a multi-boot scenario typically applies to "legacy boot" (non-UEFI), where the other operating system owns GRUB, which is used booting itself and Solus. This can be resolved by accessing the other operating system and running ',(0,o.jsx)(s.code,{children:"sudo update-grub"}),"."]}),"\n",(0,o.jsxs)(s.h2,{id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",children:["An entry is present in ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," that is not present at boot time"]}),"\n",(0,o.jsxs)(s.p,{children:["If you get to an emergency prompt when the system tries to boot, check ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),'. Look for any entries that might refer to disks not present at boot, such as a USB drive or NFS mount. Try adding "noauto" and rebooting. A USB drive entry might look like:']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"UUID=XXXXXX /mnt/mydisk exfat noauto,uid=1000,gid=1000,umask=0022 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"incorrectly-applied-updates--disk-changes",children:"Incorrectly applied updates / disk changes"}),"\n",(0,o.jsx)(s.p,{children:"In the case that updates have not been applied correctly by the system, the updates were interrupted, or the disks have changed, it may be possible to boot rescue the Solus system. To do so, you will need:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:"A Live ISO of Solus booted on your system"}),"\n",(0,o.jsx)(s.li,{children:"A terminal in that Live ISO opened"}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"mounting-your-system",children:"Mounting your system"}),"\n",(0,o.jsxs)(s.p,{children:["Whether you're using GRUB or UEFI, you will need to mount your Solus root (",(0,o.jsx)(s.code,{children:"/"}),") partition as the first step of performing a boot rescue. This is typically your primary partition, formatted as the filesystem type ",(0,o.jsx)(s.code,{children:"ext4"}),"."]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["First we need to be the root user. Type: ",(0,o.jsx)(s.code,{children:"sudo su"})]}),"\n",(0,o.jsxs)(s.li,{children:["Next we make a directory where we will mount our local Solus system: ",(0,o.jsx)(s.code,{children:"mkdir /target"})]}),"\n",(0,o.jsxs)(s.li,{children:["Now, using ",(0,o.jsx)(s.code,{children:"lsblk"}),", determine the partition of the Solus system. We recommend checking the size of the partition listed and if it matches the size of your Solus install, use that. It will likely be something along the lines of ",(0,o.jsx)(s.code,{children:"sda#"})," or ",(0,o.jsx)(s.code,{children:"sdb#"}),". For NVMe drives, the name will look like ",(0,o.jsx)(s.code,{children:"nvme0n1px"}),'\nNote: If you see "lvm" as the type, the system has LVM partitions. See the next section for how to mount them.']}),"\n",(0,o.jsxs)(s.li,{children:['If your root partition is of type sdX / nvme0n1x, replace the "sdX#" in the following command with the partition and mount to the target directory we created: ',(0,o.jsx)(s.code,{children:"mount /dev/sdX# /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"encrypted-systems--lvm-systems",children:"Encrypted systems / LVM systems"}),"\n",(0,o.jsx)(s.p,{children:"If you use LVM volumes on your system, the process for mounting the system is a little different.\nIf you use LUKS-based encryption, the process will involve decrypting your LUKS partition before mounting it to the correct location. To do this, note the sda / sdb device from the prior steps and follow the steps below:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["If the disk is encrypted, decrypt it by running ",(0,o.jsx)(s.code,{children:"cryptsetup luksOpen /dev/sdX# decrypted"}),", replacing ",(0,o.jsx)(s.code,{children:"X#"})," with the partition you identified, and enter your password when prompted."]}),"\n",(0,o.jsxs)(s.li,{children:["Next check the output of ",(0,o.jsx)(s.code,{children:"lsblk"}),". This will show you any LVM volumes. You should now see ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),".\nFor non-encrypted volumes, you may see something like this. In this example, ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' are under "sda2":']}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nsr0 11:0 1 2.7G 0 rom /run/initramfs/live\nzram0 251:0 0 7.8G 0 disk [SWAP]\nsda 252:0 0 96G 0 disk\n\u251c\u2500sda1 252:1 0 287M 0 part\n\u2514\u2500sda2 252:2 0 69.7G 0 part\n \u251c\u2500SolusSystem-Swap 253:0 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:1 0 46G 0 lvm\n...\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For decrypted volumes, the output should look similar to this, with ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' being under "decrypted":']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nloop2 7:2 0 6.2G 1 loop\n\u2514\u2500live-base 253:0 0 6.2G 1 dm\nsda 8:0 0 238.5G 0 disk\n\u251c\u2500sda1 8:1 0 488.3M 0 part\n\u2514\u2500sda2 8:2 0 238G 0 part\n \u2514\u2500decrypted 253:1 0 238G 0 crypt\n \u251c\u2500SolusSystem-Swap 253:2 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:3 0 234.3G 0 lvm\nsdb 8:16 1 7.3G 0 disk\n\u251c\u2500sdb1 8:17 1 1.4G 0 part /run/initramfs/live\n\u2514\u2500sdb2 8:18 1 40M 0 part\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Mount ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"})," by running ",(0,o.jsx)(s.code,{children:"mount /dev/mapper/SolusSystem-Root /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"uefi",children:"UEFI"}),"\n",(0,o.jsxs)(s.p,{children:["If your system uses UEFI as opposed to GRUB, you will also need to mount your EFI System Partition, otherwise referred to as ESP. If you followed our ",(0,o.jsx)(s.a,{href:"/docs/user/quick-start/installation/disks#uefi",children:"UEFI guide"}),' during installation of Solus, then in all likelihood your ESP will be about 1GB in size. For an older installation, it may be around 512MB. If you\'re unsure of the partition, run the following, replacing "X" with the same letter used during your mounting of your root file system, minus the number:']}),"\n",(0,o.jsx)(s.p,{children:"For HDD / SDD drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/sdX\n"})}),"\n",(0,o.jsx)(s.p,{children:"For nvme drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/nvme0nX\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your output may look something similar to:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"Device Size Type\n/dev/sda1 512M EFI System\n/dev/sda2 111.3G Linux filesystem\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Notice we have ",(0,o.jsx)(s.code,{children:"/dev/sda1"})," as the Device with the ",(0,o.jsx)(s.code,{children:"EFI System"})," type and roughly 500MB in size. This is the partition we will be mounting."]}),"\n",(0,o.jsxs)(s.p,{children:["With our ESP device known, let's go ahead and mount it, replacing ",(0,o.jsx)(s.code,{children:"sdX#"})," in the case below with our partition."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount /dev/sdX# /target/boot\n"})}),"\n",(0,o.jsx)(s.h4,{id:"other-partitions",children:"Other partitions"}),"\n",(0,o.jsxs)(s.p,{children:["If your system has other specific partitions, such as a separate ",(0,o.jsx)(s.code,{children:"/home"})," partition, they will also need to be mounted."]}),"\n",(0,o.jsx)(s.h3,{id:"chrooting-to-your-solus-system",children:"Chrooting to your Solus system"}),"\n",(0,o.jsx)(s.p,{children:"To access your system and perform boot rescue, you will need to mount specific directories from the host system (in this case, our Live ISO), to our Solus system, and then chroot (change root) to the Solus system."}),"\n",(0,o.jsx)(s.p,{children:"First run the following commands:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount --types proc /proc /target/proc\nmount --rbind /dev /target/dev\nmount --rbind /sys /target/sys\nmount --make-rslave /target/dev\nmount --make-rslave /target/sys\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Assuming all goes well, you should now be able to chroot into your Solus system by doing ",(0,o.jsx)(s.code,{children:"chroot /target"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"networking",children:"Networking"}),"\n",(0,o.jsxs)(s.p,{children:["To validate a working network connection (assuming a network connection is available in your live image), you can run ",(0,o.jsx)(s.code,{children:"ping google.com"})," in the chrooted environment. If you get responses from ",(0,o.jsx)(s.code,{children:"google.com"}),", you have a successful connection to the Internet. If you do not, try the following:"]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Exit the chroot by typing ",(0,o.jsx)(s.code,{children:"exit"})]}),"\n",(0,o.jsx)(s.li,{children:"Run:"}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"cp /run/systemd/resolve/stub-resolv.conf /target/run/systemd/resolve/\ncd /target/etc\nln -s ../run/systemd/resolve/stub-resolv.conf /target/etc/resolv.conf\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Chroot back into ",(0,o.jsx)(s.code,{children:"/target"})," by running ",(0,o.jsx)(s.code,{children:"chroot /target"})," again."]}),"\n",(0,o.jsx)(s.li,{children:"Retry networking."}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"repairing-packages",children:"Repairing packages"}),"\n",(0,o.jsx)(s.p,{children:"In the event you had an incomplete upgrade, try the following commands:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg rebuild-db"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg up"})}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs sudo eopkg it --reinstall"}),'\nIf you see output that starts with "Usage", this means the system has no broken packages.']}),"\n",(0,o.jsxs)(s.li,{children:['Try reverting the latest package transaction (this should only be done if the first two steps, followed by the "Re-run System-Wide Configuration Triggers", failed to produce a successful bootup). See ',(0,o.jsx)(s.a,{href:"/docs/user/package-management/history-and-rollback",children:"our documentation on history and rollback"})," for more information, followed by re-applying your updates by running ",(0,o.jsx)(s.code,{children:"sudo eopkg up"}),"."]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"correcting-disks",children:"Correcting disks"}),"\n",(0,o.jsx)(s.p,{children:"In the event that disk changes had caused the system to fail to boot, try the following in the chroot environment:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Get the UUIDs of your partitions the system expects from ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["Compare this to the output of ",(0,o.jsx)(s.code,{children:"ls -lah /dev/disk/by-uuid"})]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"re-run-system-wide-configuration-triggers",children:"Re-run system-wide configuration triggers"}),"\n",(0,o.jsx)(s.p,{children:"In the chroot environment, run the following command which will perform various configuration triggers to update your icon cache, update GRUB and EFI configuration, re-compile settings, and more:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,o.jsx)(s.h3,{id:"regenerate-uefi-boot-entries",children:"Regenerate UEFI boot entries"}),"\n",(0,o.jsx)(s.p,{children:"Run the following command, which will update the boot entries for your EFI menu:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo clr-boot-manager update\n"})}),"\n",(0,o.jsxs)(s.p,{children:["After this, you should exit your chroot with ",(0,o.jsx)(s.code,{children:"exit"})," then reboot your system. In the event you are still unable to access Solus, please ",(0,o.jsx)(s.a,{href:"/docs/user/contributing/getting-involved",children:"contact us"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"unmounting-your-system",children:"Unmounting your system"}),"\n",(0,o.jsx)(s.p,{children:"In case further partition modifications are required, there's a series of steps that must be followed."}),"\n",(0,o.jsxs)(s.p,{children:["If you are still chrooted you have to exit the chroot environment by pressing ",(0,o.jsx)(s.code,{children:"Ctrl"})," + ",(0,o.jsx)(s.code,{children:"D"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"Then proceed with unmounting the filesystem."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"umount -R /target\n"})}),"\n",(0,o.jsx)(s.p,{children:"In case of having a LUKS-based encryption you'll have to deactivate your logical volumes plus volume groups and then close your LUKS partition."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"lvchange -a n /dev/SolusSystem/Swap # `-a n` means `active: no`\nlvchange -a n /dev/SolusSystem/Root\nvgchange -a n SolusSystem\ncryptsetup luksClose decrypted\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>r});var o=t(67294);const n={},i=o.createContext(n);function r(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9397],{78118:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var o=t(85893),n=t(11151);const i={title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},r="Boot Rescue",l={id:"user/troubleshooting/boot-rescue",title:"Boot Rescue",description:"In this document, we will walk through restoring the ability to boot Solus.",source:"@site/docs/user/troubleshooting/boot-rescue.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/boot-rescue",permalink:"/docs/user/troubleshooting/boot-rescue",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/boot-rescue.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},sidebar:"userSidebar",previous:{title:"Troubleshooting",permalink:"/docs/user/troubleshooting/"},next:{title:"Installation Issues",permalink:"/docs/user/troubleshooting/installation"}},d={},a=[{value:"Multi-booting",id:"multi-booting",level:2},{value:"An entry is present in /etc/fstab
that is not present at boot time",id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",level:2},{value:"Incorrectly applied updates / disk changes",id:"incorrectly-applied-updates--disk-changes",level:2},{value:"Mounting your system",id:"mounting-your-system",level:3},{value:"Encrypted systems / LVM systems",id:"encrypted-systems--lvm-systems",level:4},{value:"UEFI",id:"uefi",level:4},{value:"Other partitions",id:"other-partitions",level:4},{value:"Chrooting to your Solus system",id:"chrooting-to-your-solus-system",level:3},{value:"Networking",id:"networking",level:3},{value:"Repairing packages",id:"repairing-packages",level:3},{value:"Correcting disks",id:"correcting-disks",level:3},{value:"Re-run system-wide configuration triggers",id:"re-run-system-wide-configuration-triggers",level:3},{value:"Regenerate UEFI boot entries",id:"regenerate-uefi-boot-entries",level:3},{value:"Unmounting your system",id:"unmounting-your-system",level:3}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"boot-rescue",children:"Boot Rescue"})}),"\n",(0,o.jsx)(s.p,{children:"In this document, we will walk through restoring the ability to boot Solus."}),"\n",(0,o.jsx)(s.p,{children:"The inability to boot Solus can be attributed to various issues, such as:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:'Multi-booting with an other operating system that "owns" GRUB and fails to show Solus after an upgrade of Solus is performed.'}),"\n",(0,o.jsx)(s.li,{children:'Upgrades, such as to the kernel, that may not have applied correctly. In which case this could affect "legacy boot" (non-UEFI) or UEFI systems.'}),"\n",(0,o.jsx)(s.li,{children:"If a disk is added, removed or had its UUID / mount point change."}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:'NOTE: Most examples below use sdX as the drive name. If your system has nvme drives, substitute the appropriate name, for example "nvme0n1".'}),"\n",(0,o.jsx)(s.h2,{id:"multi-booting",children:"Multi-booting"}),"\n",(0,o.jsx)(s.p,{children:'Multi-booting is when you have multiple operating systems on the same device. Also referred to as "dual-booting" when only having two operating systems on the same device.'}),"\n",(0,o.jsxs)(s.p,{children:['The inability to access Solus in a multi-boot scenario typically applies to "legacy boot" (non-UEFI), where the other operating system owns GRUB, which is used booting itself and Solus. This can be resolved by accessing the other operating system and running ',(0,o.jsx)(s.code,{children:"sudo update-grub"}),"."]}),"\n",(0,o.jsxs)(s.h2,{id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",children:["An entry is present in ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," that is not present at boot time"]}),"\n",(0,o.jsxs)(s.p,{children:["If you get to an emergency prompt when the system tries to boot, check ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),'. Look for any entries that might refer to disks not present at boot, such as a USB drive or NFS mount. Try adding "noauto" and rebooting. A USB drive entry might look like:']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"UUID=XXXXXX /mnt/mydisk exfat noauto,uid=1000,gid=1000,umask=0022 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"incorrectly-applied-updates--disk-changes",children:"Incorrectly applied updates / disk changes"}),"\n",(0,o.jsx)(s.p,{children:"In the case that updates have not been applied correctly by the system, the updates were interrupted, or the disks have changed, it may be possible to boot rescue the Solus system. To do so, you will need:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:"A Live ISO of Solus booted on your system"}),"\n",(0,o.jsx)(s.li,{children:"A terminal in that Live ISO opened"}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"mounting-your-system",children:"Mounting your system"}),"\n",(0,o.jsxs)(s.p,{children:["Whether you're using GRUB or UEFI, you will need to mount your Solus root (",(0,o.jsx)(s.code,{children:"/"}),") partition as the first step of performing a boot rescue. This is typically your primary partition, formatted as the filesystem type ",(0,o.jsx)(s.code,{children:"ext4"}),"."]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["First we need to be the root user. Type: ",(0,o.jsx)(s.code,{children:"sudo su"})]}),"\n",(0,o.jsxs)(s.li,{children:["Next we make a directory where we will mount our local Solus system: ",(0,o.jsx)(s.code,{children:"mkdir /target"})]}),"\n",(0,o.jsxs)(s.li,{children:["Now, using ",(0,o.jsx)(s.code,{children:"lsblk"}),", determine the partition of the Solus system. We recommend checking the size of the partition listed and if it matches the size of your Solus install, use that. It will likely be something along the lines of ",(0,o.jsx)(s.code,{children:"sda#"})," or ",(0,o.jsx)(s.code,{children:"sdb#"}),". For NVMe drives, the name will look like ",(0,o.jsx)(s.code,{children:"nvme0n1px"}),'\nNote: If you see "lvm" as the type, the system has LVM partitions. See the next section for how to mount them.']}),"\n",(0,o.jsxs)(s.li,{children:['If your root partition is of type sdX / nvme0n1x, replace the "sdX#" in the following command with the partition and mount to the target directory we created: ',(0,o.jsx)(s.code,{children:"mount /dev/sdX# /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"encrypted-systems--lvm-systems",children:"Encrypted systems / LVM systems"}),"\n",(0,o.jsx)(s.p,{children:"If you use LVM volumes on your system, the process for mounting the system is a little different.\nIf you use LUKS-based encryption, the process will involve decrypting your LUKS partition before mounting it to the correct location. To do this, note the sda / sdb device from the prior steps and follow the steps below:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["If the disk is encrypted, decrypt it by running ",(0,o.jsx)(s.code,{children:"cryptsetup luksOpen /dev/sdX# decrypted"}),", replacing ",(0,o.jsx)(s.code,{children:"X#"})," with the partition you identified, and enter your password when prompted."]}),"\n",(0,o.jsxs)(s.li,{children:["Next check the output of ",(0,o.jsx)(s.code,{children:"lsblk"}),". This will show you any LVM volumes. You should now see ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),".\nFor non-encrypted volumes, you may see something like this. In this example, ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' are under "sda2":']}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nsr0 11:0 1 2.7G 0 rom /run/initramfs/live\nzram0 251:0 0 7.8G 0 disk [SWAP]\nsda 252:0 0 96G 0 disk\n\u251c\u2500sda1 252:1 0 287M 0 part\n\u2514\u2500sda2 252:2 0 69.7G 0 part\n \u251c\u2500SolusSystem-Swap 253:0 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:1 0 46G 0 lvm\n...\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For decrypted volumes, the output should look similar to this, with ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' being under "decrypted":']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nloop2 7:2 0 6.2G 1 loop\n\u2514\u2500live-base 253:0 0 6.2G 1 dm\nsda 8:0 0 238.5G 0 disk\n\u251c\u2500sda1 8:1 0 488.3M 0 part\n\u2514\u2500sda2 8:2 0 238G 0 part\n \u2514\u2500decrypted 253:1 0 238G 0 crypt\n \u251c\u2500SolusSystem-Swap 253:2 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:3 0 234.3G 0 lvm\nsdb 8:16 1 7.3G 0 disk\n\u251c\u2500sdb1 8:17 1 1.4G 0 part /run/initramfs/live\n\u2514\u2500sdb2 8:18 1 40M 0 part\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Mount ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"})," by running ",(0,o.jsx)(s.code,{children:"mount /dev/mapper/SolusSystem-Root /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"uefi",children:"UEFI"}),"\n",(0,o.jsxs)(s.p,{children:["If your system uses UEFI as opposed to GRUB, you will also need to mount your EFI System Partition, otherwise referred to as ESP. If you followed our ",(0,o.jsx)(s.a,{href:"/docs/user/quick-start/installation/disks#uefi",children:"UEFI guide"}),' during installation of Solus, then in all likelihood your ESP will be about 1GB in size. For an older installation, it may be around 512MB. If you\'re unsure of the partition, run the following, replacing "X" with the same letter used during your mounting of your root file system, minus the number:']}),"\n",(0,o.jsx)(s.p,{children:"For HDD / SDD drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/sdX\n"})}),"\n",(0,o.jsx)(s.p,{children:"For nvme drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/nvme0nX\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your output may look something similar to:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"Device Size Type\n/dev/sda1 512M EFI System\n/dev/sda2 111.3G Linux filesystem\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Notice we have ",(0,o.jsx)(s.code,{children:"/dev/sda1"})," as the Device with the ",(0,o.jsx)(s.code,{children:"EFI System"})," type and roughly 500MB in size. This is the partition we will be mounting."]}),"\n",(0,o.jsxs)(s.p,{children:["With our ESP device known, let's go ahead and mount it, replacing ",(0,o.jsx)(s.code,{children:"sdX#"})," in the case below with our partition."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount /dev/sdX# /target/boot\n"})}),"\n",(0,o.jsx)(s.h4,{id:"other-partitions",children:"Other partitions"}),"\n",(0,o.jsxs)(s.p,{children:["If your system has other specific partitions, such as a separate ",(0,o.jsx)(s.code,{children:"/home"})," partition, they will also need to be mounted."]}),"\n",(0,o.jsx)(s.h3,{id:"chrooting-to-your-solus-system",children:"Chrooting to your Solus system"}),"\n",(0,o.jsx)(s.p,{children:"To access your system and perform boot rescue, you will need to mount specific directories from the host system (in this case, our Live ISO), to our Solus system, and then chroot (change root) to the Solus system."}),"\n",(0,o.jsx)(s.p,{children:"First run the following commands:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount --types proc /proc /target/proc\nmount --rbind /dev /target/dev\nmount --rbind /sys /target/sys\nmount --make-rslave /target/dev\nmount --make-rslave /target/sys\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Assuming all goes well, you should now be able to chroot into your Solus system by doing ",(0,o.jsx)(s.code,{children:"chroot /target"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"networking",children:"Networking"}),"\n",(0,o.jsxs)(s.p,{children:["To validate a working network connection (assuming a network connection is available in your live image), you can run ",(0,o.jsx)(s.code,{children:"ping google.com"})," in the chrooted environment. If you get responses from ",(0,o.jsx)(s.code,{children:"google.com"}),", you have a successful connection to the Internet. If you do not, try the following:"]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Exit the chroot by typing ",(0,o.jsx)(s.code,{children:"exit"})]}),"\n",(0,o.jsx)(s.li,{children:"Run:"}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"cp /run/systemd/resolve/stub-resolv.conf /target/run/systemd/resolve/\ncd /target/etc\nln -s ../run/systemd/resolve/stub-resolv.conf /target/etc/resolv.conf\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Chroot back into ",(0,o.jsx)(s.code,{children:"/target"})," by running ",(0,o.jsx)(s.code,{children:"chroot /target"})," again."]}),"\n",(0,o.jsx)(s.li,{children:"Retry networking."}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"repairing-packages",children:"Repairing packages"}),"\n",(0,o.jsx)(s.p,{children:"In the event you had an incomplete upgrade, try the following commands:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg rebuild-db"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg up"})}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs sudo eopkg it --reinstall"}),'\nIf you see output that starts with "Usage", this means the system has no broken packages.']}),"\n",(0,o.jsxs)(s.li,{children:['Try reverting the latest package transaction (this should only be done if the first two steps, followed by the "Re-run System-Wide Configuration Triggers", failed to produce a successful bootup). See ',(0,o.jsx)(s.a,{href:"/docs/user/package-management/history-and-rollback",children:"our documentation on history and rollback"})," for more information, followed by re-applying your updates by running ",(0,o.jsx)(s.code,{children:"sudo eopkg up"}),"."]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"correcting-disks",children:"Correcting disks"}),"\n",(0,o.jsx)(s.p,{children:"In the event that disk changes had caused the system to fail to boot, try the following in the chroot environment:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Get the UUIDs of your partitions the system expects from ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["Compare this to the output of ",(0,o.jsx)(s.code,{children:"ls -lah /dev/disk/by-uuid"})]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"re-run-system-wide-configuration-triggers",children:"Re-run system-wide configuration triggers"}),"\n",(0,o.jsx)(s.p,{children:"In the chroot environment, run the following command which will perform various configuration triggers to update your icon cache, update GRUB and EFI configuration, re-compile settings, and more:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,o.jsx)(s.h3,{id:"regenerate-uefi-boot-entries",children:"Regenerate UEFI boot entries"}),"\n",(0,o.jsx)(s.p,{children:"Run the following command, which will update the boot entries for your EFI menu:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo clr-boot-manager update\n"})}),"\n",(0,o.jsxs)(s.p,{children:["After this, you should exit your chroot with ",(0,o.jsx)(s.code,{children:"exit"})," then reboot your system. In the event you are still unable to access Solus, please ",(0,o.jsx)(s.a,{href:"/docs/user/contributing/getting-involved",children:"contact us"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"unmounting-your-system",children:"Unmounting your system"}),"\n",(0,o.jsx)(s.p,{children:"In case further partition modifications are required, there's a series of steps that must be followed."}),"\n",(0,o.jsxs)(s.p,{children:["If you are still chrooted you have to exit the chroot environment by pressing ",(0,o.jsx)(s.code,{children:"Ctrl"})," + ",(0,o.jsx)(s.code,{children:"D"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"Then proceed with unmounting the filesystem."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"umount -R /target\n"})}),"\n",(0,o.jsx)(s.p,{children:"In case of having a LUKS-based encryption you'll have to deactivate your logical volumes plus volume groups and then close your LUKS partition."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"lvchange -a n /dev/SolusSystem/Swap # `-a n` means `active: no`\nlvchange -a n /dev/SolusSystem/Root\nvgchange -a n SolusSystem\ncryptsetup luksClose decrypted\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>r});var o=t(67294);const n={},i=o.createContext(n);function r(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0b254e3a.b3f72544.js b/assets/js/0b254e3a.bda17182.js
similarity index 99%
rename from assets/js/0b254e3a.b3f72544.js
rename to assets/js/0b254e3a.bda17182.js
index 9fdc430b7..290c183b0 100644
--- a/assets/js/0b254e3a.b3f72544.js
+++ b/assets/js/0b254e3a.bda17182.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6726],{99528:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>l});var i=a(85893),s=a(11151);const t={title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},r="Updating an Existing Package",o={id:"packaging/updating-an-existing-package",title:"Updating an Existing Package",description:"This article will go over updating a package that is already in the Solus package repositories.",source:"@site/docs/packaging/updating-an-existing-package.md",sourceDirName:"packaging",slug:"/packaging/updating-an-existing-package",permalink:"/docs/packaging/updating-an-existing-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/updating-an-existing-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:4,frontMatter:{title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},sidebar:"packagingSidebar",previous:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"},next:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"}},c={},l=[{value:"Update your clone of the packages repository",id:"update-your-clone-of-the-packages-repository",level:3},{value:"Switch to a new git branch",id:"switch-to-a-new-git-branch",level:2},{value:"Updating a package",id:"updating-a-package",level:2},{value:"Bumping a package",id:"bumping-a-package",level:3},{value:"Using a different version",id:"using-a-different-version",level:3},{value:"The MAINTAINERS.md
file",id:"the-maintainersmd-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format",id:"commit-message-format",level:2},{value:"Package update",id:"package-update",level:3},{value:"Other commit message format examples",id:"other-commit-message-format-examples",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"updating-an-existing-package",children:"Updating an Existing Package"})}),"\n",(0,i.jsx)(n.p,{children:"This article will go over updating a package that is already in the Solus package repositories."}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," for the software update"]}),".\nIf there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software update request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-your-clone-of-the-packages-repository",children:"Update your clone of the packages repository"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages/packages/n/nano\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"switch-to-a-new-git-branch",children:"Switch to a new git branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c update_nano\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating-a-package",children:"Updating a package"}),"\n",(0,i.jsx)(n.p,{children:"There are two types of package updates: a package bump, and moving a package to a different version."}),"\n",(0,i.jsxs)(n.p,{children:["Bumping a package is typically done when rebuilding against a changed dependency, such as ",(0,i.jsx)(n.code,{children:"imagemagick"})," needing to be rebuilt if ",(0,i.jsx)(n.code,{children:"libwebp"})," changes. It is also done if changes are being made to the package, such as adding new dependencies or other modifications which aren't a version update."]}),"\n",(0,i.jsx)(n.h3,{id:"bumping-a-package",children:"Bumping a package"}),"\n",(0,i.jsxs)(n.p,{children:["Bumping can be achieved by running the ",(0,i.jsx)(n.code,{children:"bump"})," task, which increments the release number by 1."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task bump\n"})}),"\n",(0,i.jsx)(n.p,{children:"Check to make sure that the result is as expected."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git diff package.yml\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Certain packages with long descriptions might have their description messed up when this is run. Check if this happened, and fix it if necessary."})}),"\n",(0,i.jsx)(n.h3,{id:"using-a-different-version",children:"Using a different version"}),"\n",(0,i.jsxs)(n.p,{children:["To update the package to a newer version, use the ",(0,i.jsx)(n.code,{children:"update"})," task."]}),"\n",(0,i.jsx)(n.p,{children:"This task takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Version"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you're updating the package to a newer version, naturally you would change both the version and source. If you're merely changing the source URL for the existing version, just pass the same version number and the new source URL."}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task update -- 1.0 https://example.com/example-1.0.tar.xz\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"the-maintainersmd-file",children:["The ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["There must be a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Add it if it does not already exist. It should name the current maintainer(s) of the package."]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h2,{id:"commit-message-format",children:"Commit message format"}),"\n",(0,i.jsx)(n.p,{children:'With the switch to a single large package git repository, having a regular, easy-to-read, and standardized commit message format helps enable quick and efficient "at-a-glance" reading of git commit messages for packagers and Staff alike.'}),"\n",(0,i.jsx)(n.p,{children:"Each commit message should consist of a meaningful summary line (which starts with the package name), a blank line, and then the rest of the commit message body."}),"\n",(0,i.jsxs)(n.p,{children:["Note that ",(0,i.jsx)(n.code,{children:"[NFC]"}),' (listed in an example below) is an abbreviation for "No Functional Change".']}),"\n",(0,i.jsx)(n.h3,{id:"package-update",children:"Package update"}),"\n",(0,i.jsx)(n.p,{children:"The following guidelines apply to the commit message body:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsx)(n.li,{children:"Include a changelog with a brief list of updates from the upstream release notes, with no links or issue numbers."}),"\n",(0,i.jsx)(n.li,{children:"There may also be a section for Solus specific work (e.g. rebuild against x / rework to remove dependency)."}),"\n",(0,i.jsx)(n.li,{children:"Optional: A link to the upstream release notes page."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Important"}),": Do not include issue numbers in changelogs. This will incorrectly link your issue to another one in our repository."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"- #123 fixed a thing\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to intentionally link to another issue in this repository, the right way is to use our repository name:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Fixes getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"foo: Update to 1.2.3\n\n**Summary**\n\nBugfixes:\n\n- Fixed a crash\n- Something else\n\nEnhancements:\n\n- Implemented a feature\n- Error when encountering a thing\n\nFull release notes:\n\n- [1.2.3](https://github.com/foo/foo/releases/tag/v1.2.3)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"other-commit-message-format-examples",children:"Other commit message format examples"}),"\n",(0,i.jsx)(n.p,{children:"In the cases where you are not updating a package to a new version, but simply applying a patch or fixing an existing version, the following commit messages are considered suitable:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Add the ",(0,i.jsx)(n.code,{children:"homepage"})," metadata key:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Add homepage"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Fix a packaging issue (including adding a patch to fix the package)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Fix (...)"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Updating a README, ",(0,i.jsx)(n.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml file"})," or other stuff that does not directly ",(0,i.jsx)(n.em,{children:"change"})," the package, meaning the package release number didn't need a bump:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: [NFC] Add README.md and monitoring.yml"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As stated previously, ",(0,i.jsx)(n.code,{children:"[NFC]"}),' is an abbreviation of "No Functional Change".']}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>o,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6726],{99528:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>l});var i=a(85893),s=a(11151);const t={title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},r="Updating an Existing Package",o={id:"packaging/updating-an-existing-package",title:"Updating an Existing Package",description:"This article will go over updating a package that is already in the Solus package repositories.",source:"@site/docs/packaging/updating-an-existing-package.md",sourceDirName:"packaging",slug:"/packaging/updating-an-existing-package",permalink:"/docs/packaging/updating-an-existing-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/updating-an-existing-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:4,frontMatter:{title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},sidebar:"packagingSidebar",previous:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"},next:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"}},c={},l=[{value:"Update your clone of the packages repository",id:"update-your-clone-of-the-packages-repository",level:3},{value:"Switch to a new git branch",id:"switch-to-a-new-git-branch",level:2},{value:"Updating a package",id:"updating-a-package",level:2},{value:"Bumping a package",id:"bumping-a-package",level:3},{value:"Using a different version",id:"using-a-different-version",level:3},{value:"The MAINTAINERS.md
file",id:"the-maintainersmd-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format",id:"commit-message-format",level:2},{value:"Package update",id:"package-update",level:3},{value:"Other commit message format examples",id:"other-commit-message-format-examples",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"updating-an-existing-package",children:"Updating an Existing Package"})}),"\n",(0,i.jsx)(n.p,{children:"This article will go over updating a package that is already in the Solus package repositories."}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," for the software update"]}),".\nIf there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software update request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-your-clone-of-the-packages-repository",children:"Update your clone of the packages repository"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages/packages/n/nano\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"switch-to-a-new-git-branch",children:"Switch to a new git branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c update_nano\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating-a-package",children:"Updating a package"}),"\n",(0,i.jsx)(n.p,{children:"There are two types of package updates: a package bump, and moving a package to a different version."}),"\n",(0,i.jsxs)(n.p,{children:["Bumping a package is typically done when rebuilding against a changed dependency, such as ",(0,i.jsx)(n.code,{children:"imagemagick"})," needing to be rebuilt if ",(0,i.jsx)(n.code,{children:"libwebp"})," changes. It is also done if changes are being made to the package, such as adding new dependencies or other modifications which aren't a version update."]}),"\n",(0,i.jsx)(n.h3,{id:"bumping-a-package",children:"Bumping a package"}),"\n",(0,i.jsxs)(n.p,{children:["Bumping can be achieved by running the ",(0,i.jsx)(n.code,{children:"bump"})," task, which increments the release number by 1."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task bump\n"})}),"\n",(0,i.jsx)(n.p,{children:"Check to make sure that the result is as expected."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git diff package.yml\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Certain packages with long descriptions might have their description messed up when this is run. Check if this happened, and fix it if necessary."})}),"\n",(0,i.jsx)(n.h3,{id:"using-a-different-version",children:"Using a different version"}),"\n",(0,i.jsxs)(n.p,{children:["To update the package to a newer version, use the ",(0,i.jsx)(n.code,{children:"update"})," task."]}),"\n",(0,i.jsx)(n.p,{children:"This task takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Version"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you're updating the package to a newer version, naturally you would change both the version and source. If you're merely changing the source URL for the existing version, just pass the same version number and the new source URL."}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task update -- 1.0 https://example.com/example-1.0.tar.xz\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"the-maintainersmd-file",children:["The ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["There must be a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Add it if it does not already exist. It should name the current maintainer(s) of the package."]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h2,{id:"commit-message-format",children:"Commit message format"}),"\n",(0,i.jsx)(n.p,{children:'With the switch to a single large package git repository, having a regular, easy-to-read, and standardized commit message format helps enable quick and efficient "at-a-glance" reading of git commit messages for packagers and Staff alike.'}),"\n",(0,i.jsx)(n.p,{children:"Each commit message should consist of a meaningful summary line (which starts with the package name), a blank line, and then the rest of the commit message body."}),"\n",(0,i.jsxs)(n.p,{children:["Note that ",(0,i.jsx)(n.code,{children:"[NFC]"}),' (listed in an example below) is an abbreviation for "No Functional Change".']}),"\n",(0,i.jsx)(n.h3,{id:"package-update",children:"Package update"}),"\n",(0,i.jsx)(n.p,{children:"The following guidelines apply to the commit message body:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsx)(n.li,{children:"Include a changelog with a brief list of updates from the upstream release notes, with no links or issue numbers."}),"\n",(0,i.jsx)(n.li,{children:"There may also be a section for Solus specific work (e.g. rebuild against x / rework to remove dependency)."}),"\n",(0,i.jsx)(n.li,{children:"Optional: A link to the upstream release notes page."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Important"}),": Do not include issue numbers in changelogs. This will incorrectly link your issue to another one in our repository."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"- #123 fixed a thing\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to intentionally link to another issue in this repository, the right way is to use our repository name:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Fixes getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"foo: Update to 1.2.3\n\n**Summary**\n\nBugfixes:\n\n- Fixed a crash\n- Something else\n\nEnhancements:\n\n- Implemented a feature\n- Error when encountering a thing\n\nFull release notes:\n\n- [1.2.3](https://github.com/foo/foo/releases/tag/v1.2.3)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"other-commit-message-format-examples",children:"Other commit message format examples"}),"\n",(0,i.jsx)(n.p,{children:"In the cases where you are not updating a package to a new version, but simply applying a patch or fixing an existing version, the following commit messages are considered suitable:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Add the ",(0,i.jsx)(n.code,{children:"homepage"})," metadata key:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Add homepage"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Fix a packaging issue (including adding a patch to fix the package)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Fix (...)"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Updating a README, ",(0,i.jsx)(n.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml file"})," or other stuff that does not directly ",(0,i.jsx)(n.em,{children:"change"})," the package, meaning the package release number didn't need a bump:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: [NFC] Add README.md and monitoring.yml"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As stated previously, ",(0,i.jsx)(n.code,{children:"[NFC]"}),' is an abbreviation of "No Functional Change".']}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>o,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e3c5e6b.1a55516f.js b/assets/js/0e3c5e6b.b2b6a196.js
similarity index 98%
rename from assets/js/0e3c5e6b.1a55516f.js
rename to assets/js/0e3c5e6b.b2b6a196.js
index 738e9cf74..f841e27e4 100644
--- a/assets/js/0e3c5e6b.1a55516f.js
+++ b/assets/js/0e3c5e6b.b2b6a196.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4859],{5166:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(85893),i=t(11151);const r={title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},a="Plasma",o={id:"user/editions/plasma/index",title:"Plasma",description:"Solus Plasma",source:"@site/docs/user/editions/plasma/index.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/",permalink:"/docs/user/editions/plasma/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"}},l={},d=[];function c(e){const s={a:"a",em:"em",h1:"h1",header:"header",hr:"hr",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma",children:"Plasma"})}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Solus Plasma",src:t(52603).Z+"",width:"1920",height:"1080"})}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.em,{children:"Plasma"})," desktop is a graphical user interface for Linux distributions that aims to offer users an intuitive and customizable user interface to interact with their devices. The Plasma desktop is developed by KDE."]}),"\n",(0,n.jsx)(s.p,{children:"To learn more about the Plasma desktop and KDE, refer to the following pages:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/plasma-desktop/",children:"https://kde.org/plasma-desktop/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/announcements/",children:"https://kde.org/announcements/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/support/",children:"https://kde.org/support/"})}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(s.p,{children:"Learn how to customize and configure the Plasma Desktop on Solus."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(s.p,{children:"Helpful tips and tricks for using Plasma on Solus."})]})}function u(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},52603:(e,s,t)=>{t.d(s,{Z:()=>n});const n=t.p+"assets/images/plasma-32bee314c05b57e65e0b26b6bf23f14f.jpg"},11151:(e,s,t)=>{t.d(s,{Z:()=>o,a:()=>a});var n=t(67294);const i={},r=n.createContext(i);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4859],{5166:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(85893),i=t(11151);const r={title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},a="Plasma",o={id:"user/editions/plasma/index",title:"Plasma",description:"Solus Plasma",source:"@site/docs/user/editions/plasma/index.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/",permalink:"/docs/user/editions/plasma/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"}},l={},d=[];function c(e){const s={a:"a",em:"em",h1:"h1",header:"header",hr:"hr",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma",children:"Plasma"})}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Solus Plasma",src:t(52603).Z+"",width:"1920",height:"1080"})}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.em,{children:"Plasma"})," desktop is a graphical user interface for Linux distributions that aims to offer users an intuitive and customizable user interface to interact with their devices. The Plasma desktop is developed by KDE."]}),"\n",(0,n.jsx)(s.p,{children:"To learn more about the Plasma desktop and KDE, refer to the following pages:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/plasma-desktop/",children:"https://kde.org/plasma-desktop/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/announcements/",children:"https://kde.org/announcements/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/support/",children:"https://kde.org/support/"})}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(s.p,{children:"Learn how to customize and configure the Plasma Desktop on Solus."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(s.p,{children:"Helpful tips and tricks for using Plasma on Solus."})]})}function u(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},52603:(e,s,t)=>{t.d(s,{Z:()=>n});const n=t.p+"assets/images/plasma-32bee314c05b57e65e0b26b6bf23f14f.jpg"},11151:(e,s,t)=>{t.d(s,{Z:()=>o,a:()=>a});var n=t(67294);const i={},r=n.createContext(i);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0e862883.e57e73d4.js b/assets/js/0e862883.c6b8fd5f.js
similarity index 97%
rename from assets/js/0e862883.e57e73d4.js
rename to assets/js/0e862883.c6b8fd5f.js
index 53ec71944..76d989d4d 100644
--- a/assets/js/0e862883.e57e73d4.js
+++ b/assets/js/0e862883.c6b8fd5f.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[172],{24673:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(85893),i=t(11151);const r={},o="Testing an ISO",a={id:"user/contributing/testing-an-iso",title:"Testing an ISO",description:"A handy checklist anyone can use for testing an ISO.",source:"@site/docs/user/contributing/testing-an-iso.md",sourceDirName:"user/contributing",slug:"/user/contributing/testing-an-iso",permalink:"/docs/user/contributing/testing-an-iso",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/testing-an-iso.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"},next:{title:"Editions",permalink:"/docs/user/editions/"}},l={},c=[{value:"For any release",id:"for-any-release",level:2},{value:"Laptops",id:"laptops",level:3},{value:"VMs",id:"vms",level:3},{value:"For the specific release",id:"for-the-specific-release",level:2}];function d(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"testing-an-iso",children:"Testing an ISO"})}),"\n",(0,s.jsx)(n.p,{children:"A handy checklist anyone can use for testing an ISO."}),"\n",(0,s.jsx)(n.p,{children:"This is a list of some general things to check. It is not meant to be exhaustive, just enough to hit major points and hopefully uncover obvious problems. Testers are certainly not prohibited from doing more, at their discretion. Not all points will be testable by everyone (ex: docking / undocking). That is fine; this is just a reference."}),"\n",(0,s.jsx)(n.p,{children:"When testing, try to keep different types of users in mind. For instance, would a general / new user be comfortable with the experience? Would a technical user be put off by a limitation?"}),"\n",(0,s.jsx)(n.h2,{id:"for-any-release",children:"For any release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"ISO can be written to a USB, used to boot a system and install"}),"\n",(0,s.jsx)(n.li,{children:"Can unlock the device if the live ISO lock screen engages"}),"\n",(0,s.jsx)(n.li,{children:"Installer is easy to follow"}),"\n",(0,s.jsx)(n.li,{children:"Installer detects location, time and time zone properly. Bonus points if the correct timezone is shown in the picker and you don't have to manually select one."}),"\n",(0,s.jsx)(n.li,{children:"Start menu works, has search"}),"\n",(0,s.jsx)(n.li,{children:"Can scan / print / use your peripherals"}),"\n",(0,s.jsx)(n.li,{children:"Sound over speakers"}),"\n",(0,s.jsx)(n.li,{children:"Bluetooth device connects, has high fidelity and headphone modes, you can hear sound"}),"\n",(0,s.jsx)(n.li,{children:"Install your usual software and just make sure basic functionality works"}),"\n",(0,s.jsx)(n.li,{children:"Plugging in a USB drive allows user to mount the drive and access files"}),"\n",(0,s.jsx)(n.li,{children:"System can be put to sleep and woken, things still work after waking (display, keyboard, mouse, sound, network)"}),"\n",(0,s.jsxs)(n.li,{children:["Able to create and use samba shares via file manager (you must ",(0,s.jsx)(n.a,{href:"/docs/user/software/networking/samba#samba-on-solus",children:"enable smb after installation"}),")"]}),"\n",(0,s.jsx)(n.li,{children:"Anything that's been flaky in your experience (LVM, for instance)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"laptops",children:"Laptops"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Multi-monitor display behaves properly with docking and undocking."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"vms",children:"VMs"}),"\n",(0,s.jsx)(n.p,{children:"This functionality might be affected by the settings of the VM."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Copy and paste works from host to guest ",(0,s.jsx)(n.em,{children:"before"})," install, while booted into the live ISO"]}),"\n",(0,s.jsxs)(n.li,{children:["Copy and paste works ",(0,s.jsx)(n.em,{children:"after"})," installation and rebooting the VM"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"for-the-specific-release",children:"For the specific release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Any issues that have been recently fixed, or are known to be recently flaky."}),"\n",(0,s.jsx)(n.li,{children:"Check the ISO task in the tracker for other potential areas of interest."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[172],{24673:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(85893),i=t(11151);const r={},o="Testing an ISO",a={id:"user/contributing/testing-an-iso",title:"Testing an ISO",description:"A handy checklist anyone can use for testing an ISO.",source:"@site/docs/user/contributing/testing-an-iso.md",sourceDirName:"user/contributing",slug:"/user/contributing/testing-an-iso",permalink:"/docs/user/contributing/testing-an-iso",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/testing-an-iso.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"},next:{title:"Editions",permalink:"/docs/user/editions/"}},l={},c=[{value:"For any release",id:"for-any-release",level:2},{value:"Laptops",id:"laptops",level:3},{value:"VMs",id:"vms",level:3},{value:"For the specific release",id:"for-the-specific-release",level:2}];function d(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"testing-an-iso",children:"Testing an ISO"})}),"\n",(0,s.jsx)(n.p,{children:"A handy checklist anyone can use for testing an ISO."}),"\n",(0,s.jsx)(n.p,{children:"This is a list of some general things to check. It is not meant to be exhaustive, just enough to hit major points and hopefully uncover obvious problems. Testers are certainly not prohibited from doing more, at their discretion. Not all points will be testable by everyone (ex: docking / undocking). That is fine; this is just a reference."}),"\n",(0,s.jsx)(n.p,{children:"When testing, try to keep different types of users in mind. For instance, would a general / new user be comfortable with the experience? Would a technical user be put off by a limitation?"}),"\n",(0,s.jsx)(n.h2,{id:"for-any-release",children:"For any release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"ISO can be written to a USB, used to boot a system and install"}),"\n",(0,s.jsx)(n.li,{children:"Can unlock the device if the live ISO lock screen engages"}),"\n",(0,s.jsx)(n.li,{children:"Installer is easy to follow"}),"\n",(0,s.jsx)(n.li,{children:"Installer detects location, time and time zone properly. Bonus points if the correct timezone is shown in the picker and you don't have to manually select one."}),"\n",(0,s.jsx)(n.li,{children:"Start menu works, has search"}),"\n",(0,s.jsx)(n.li,{children:"Can scan / print / use your peripherals"}),"\n",(0,s.jsx)(n.li,{children:"Sound over speakers"}),"\n",(0,s.jsx)(n.li,{children:"Bluetooth device connects, has high fidelity and headphone modes, you can hear sound"}),"\n",(0,s.jsx)(n.li,{children:"Install your usual software and just make sure basic functionality works"}),"\n",(0,s.jsx)(n.li,{children:"Plugging in a USB drive allows user to mount the drive and access files"}),"\n",(0,s.jsx)(n.li,{children:"System can be put to sleep and woken, things still work after waking (display, keyboard, mouse, sound, network)"}),"\n",(0,s.jsxs)(n.li,{children:["Able to create and use samba shares via file manager (you must ",(0,s.jsx)(n.a,{href:"/docs/user/software/networking/samba#samba-on-solus",children:"enable smb after installation"}),")"]}),"\n",(0,s.jsx)(n.li,{children:"Anything that's been flaky in your experience (LVM, for instance)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"laptops",children:"Laptops"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Multi-monitor display behaves properly with docking and undocking."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"vms",children:"VMs"}),"\n",(0,s.jsx)(n.p,{children:"This functionality might be affected by the settings of the VM."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Copy and paste works from host to guest ",(0,s.jsx)(n.em,{children:"before"})," install, while booted into the live ISO"]}),"\n",(0,s.jsxs)(n.li,{children:["Copy and paste works ",(0,s.jsx)(n.em,{children:"after"})," installation and rebooting the VM"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"for-the-specific-release",children:"For the specific release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Any issues that have been recently fixed, or are known to be recently flaky."}),"\n",(0,s.jsx)(n.li,{children:"Check the ISO task in the tracker for other potential areas of interest."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/14488e92.5b7975e1.js b/assets/js/14488e92.1f235025.js
similarity index 99%
rename from assets/js/14488e92.5b7975e1.js
rename to assets/js/14488e92.1f235025.js
index e259fa0f0..2e7afc350 100644
--- a/assets/js/14488e92.5b7975e1.js
+++ b/assets/js/14488e92.1f235025.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4815],{93980:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>A,default:()=>o,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=s(85893),c=s(11151);const n={title:"Default Applications",summary:"A guide to the default applications included with Solus."},A="Default applications",r={id:"user/quick-start/default-applications",title:"Default Applications",description:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks.",source:"@site/docs/user/quick-start/default-applications.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/default-applications",permalink:"/docs/user/quick-start/default-applications",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/default-applications.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Default Applications",summary:"A guide to the default applications included with Solus."},sidebar:"userSidebar",previous:{title:"Boot Management",permalink:"/docs/user/quick-start/boot-management"},next:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"}},l={},d=[{value:"Web browser",id:"web-browser",level:2},{value:"Email client",id:"email-client",level:2},{value:"Managing your files",id:"managing-your-files",level:2},{value:"Nemo",id:"nemo",level:3},{value:"GNOME Files",id:"gnome-files",level:3},{value:"Dolphin",id:"dolphin",level:3},{value:"Office suite",id:"office-suite",level:2},{value:"Calc",id:"calc",level:3},{value:"Draw",id:"draw",level:3},{value:"Impress",id:"impress",level:3},{value:"Math",id:"math",level:3},{value:"Writer",id:"writer",level:3},{value:"Spell-checking",id:"spell-checking",level:3},{value:"Finnish",id:"finnish",level:4},{value:"Music",id:"music",level:2},{value:"Rhythmbox",id:"rhythmbox",level:3},{value:"Elisa",id:"elisa",level:3},{value:"Video",id:"video",level:2},{value:"Celluloid",id:"celluloid",level:3},{value:"Haruna",id:"haruna",level:3},{value:"Parole",id:"parole",level:3}];function a(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"default-applications",children:"Default applications"})}),"\n",(0,t.jsx)(i.p,{children:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks."}),"\n",(0,t.jsx)(i.h2,{id:"web-browser",children:"Web browser"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with Firefox, a secure and trustworthy web browser provided by the non-profit organization ",(0,t.jsx)(i.a,{href:"https://www.mozilla.org/",children:"Mozilla"}),"."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Firefox Screenshot",src:s(34133).Z+"",width:"1920",height:"1046"})}),"\n",(0,t.jsx)(i.h2,{id:"email-client",children:"Email client"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with the powerful ",(0,t.jsx)(i.a,{href:"https://www.thunderbird.net/",children:"Thunderbird"})," email, newsgroup, and feeds client."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Thunderbird Screenshot",src:s(80649).Z+"",width:"982",height:"822"})}),"\n",(0,t.jsx)(i.h2,{id:"managing-your-files",children:"Managing your files"}),"\n",(0,t.jsx)(i.p,{children:"Each Linux desktop environment has its own graphical application for managing files:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Nemo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"GNOME Files (formerly Nautilus)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Dolphin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Nemo"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"nemo",children:"Nemo"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Nemo Screenshot",src:s(80274).Z+"",width:"800",height:"586"})}),"\n",(0,t.jsx)(i.h3,{id:"gnome-files",children:"GNOME Files"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"GNOME Files Screenshot",src:s(51055).Z+"",width:"886",height:"548"})}),"\n",(0,t.jsx)(i.h3,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dolphin Screenshot",src:s(3638).Z+"",width:"1022",height:"721"})}),"\n",(0,t.jsx)(i.h2,{id:"office-suite",children:"Office suite"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with ",(0,t.jsx)(i.a,{href:"https://www.libreoffice.org",children:"LibreOffice"}),", an office suite that is capable of replacing Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office for the most common tasks."]}),"\n",(0,t.jsx)(i.p,{children:"By default, Solus provides Writer (document editor), Calc (spreadsheet editor), and Impress (presentation editor). Other applications such as Math or Draw can be installed from the Software Center."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"LibreOffice"}),(0,t.jsx)(i.th,{children:"Microsoft Office Equivalent"}),(0,t.jsx)(i.th,{children:"Apple Equivalent"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Writer"}),(0,t.jsx)(i.td,{children:"Word"}),(0,t.jsx)(i.td,{children:"Pages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Calc"}),(0,t.jsx)(i.td,{children:"Excel"}),(0,t.jsx)(i.td,{children:"Numbers"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Impress"}),(0,t.jsx)(i.td,{children:"PowerPoint"}),(0,t.jsx)(i.td,{children:"Keynote"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Draw"}),(0,t.jsx)(i.td,{children:"Visio"}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Math"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"calc",children:"Calc"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Calc Screenshot",src:s(85353).Z+"",width:"1068",height:"607"})}),"\n",(0,t.jsxs)(i.p,{children:["Calc is a spreadsheet editor. You can view, create, and edit spreadsheets as well as leverage a comprehensive range of advanced functions. Calc supports a variety of common open formats and Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"xls"}),", ",(0,t.jsx)(i.code,{children:"xlsx"}),", and ",(0,t.jsx)(i.code,{children:"ods"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"draw",children:"Draw"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Draw Screenshot",src:s(91955).Z+"",width:"1068",height:"637"})}),"\n",(0,t.jsxs)(i.p,{children:["Draw is a graphical editor that allows you to sketch diagrams, workflows and any kind of other simple to complex drawing you can imagine. You can install Draw from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-draw"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"impress",children:"Impress"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Impress Screenshot",src:s(8017).Z+"",width:"1068",height:"605"})}),"\n",(0,t.jsxs)(i.p,{children:["Impress is a presentation viewer and editor. You can view, create, edit, and export presentations in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"ppt"}),", ",(0,t.jsx)(i.code,{children:"pptx"}),", and ",(0,t.jsx)(i.code,{children:"odp"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"math",children:"Math"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Math Screenshot",src:s(56243).Z+"",width:"1068",height:"598"})}),"\n",(0,t.jsxs)(i.p,{children:["Math is a formula editor. Create your mathematical and scientific expressions and insert them with the correct formatting into your text documents, spreadsheets, presentations, or drawings. Math can be installed from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-math"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"writer",children:"Writer"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Writer Screenshot",src:s(51304).Z+"",width:"1068",height:"748"})}),"\n",(0,t.jsxs)(i.p,{children:["Writer is a document editor. You can view, create, edit, and export documents in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"doc"}),", ",(0,t.jsx)(i.code,{children:"docx"}),", and ",(0,t.jsx)(i.code,{children:"odt"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"spell-checking",children:"Spell-checking"}),"\n",(0,t.jsxs)(i.p,{children:["LibreOffice Writer users may want to install the package ",(0,t.jsx)(i.code,{children:"libreoffice-common-dictionaries"})," from Software Center to automatically enable spell-checking support."]}),"\n",(0,t.jsx)(i.h4,{id:"finnish",children:"Finnish"}),"\n",(0,t.jsxs)(i.p,{children:["Finnish language support is provided by installing ",(0,t.jsx)(i.code,{children:"libreoffice-voikko"}),". After installation of this package, there is further configuration required to properly leverage the Voikko spell-checking and Finnish dictionary support."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open up LibreOffice Writer"}),"\n",(0,t.jsxs)(i.li,{children:["In the menubar, go to ",(0,t.jsx)(i.code,{children:"Tools"})," then ",(0,t.jsx)(i.code,{children:"Options"}),". This will open up the Options dialog."]}),"\n",(0,t.jsx)(i.li,{children:"Go to the Language Settings, listed on the left of Options."}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Writing Aids and ensure the "Spellchecker (Voikko)", "Grammar checker (Voikko)", and "Hyphenator (Voikko)" are under the "Available language modules" section.'}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Voikko and ensure "standard: suomi (perussanasto)" is selected under the "Vocabulary" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"music",children:"Music"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Elisa"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"rhythmbox",children:"Rhythmbox"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Rhythmbox Screenshot",src:s(48392).Z+"",width:"789",height:"606"})}),"\n",(0,t.jsx)(i.h3,{id:"elisa",children:"Elisa"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Elisa Screenshot",src:s(92304).Z+"",width:"1020",height:"720"})}),"\n",(0,t.jsx)(i.h2,{id:"video",children:"Video"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Haruna"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Parole"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"celluloid",children:"Celluloid"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Celluloid Screenshot",src:s(18646).Z+"",width:"651",height:"491"})}),"\n",(0,t.jsx)(i.h3,{id:"haruna",children:"Haruna"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Haruna Screenshot",src:s(13289).Z+"",width:"1190",height:"749"})}),"\n",(0,t.jsx)(i.h3,{id:"parole",children:"Parole"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Parole Screenshot",src:s(22407).Z+"",width:"764",height:"450"})})]})}function o(e={}){const{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},18646:(e,i,s)=>{s.d(i,{Z:()=>t});const t="data:image/webp;base64,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"},3638:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/dolphin-06132e0261dad073f7f27bbee6bcbfba.jpg"},92304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/elisa-63e84725c74e3606d527b80a49234bdf.jpg"},34133:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/firefox-0510dce504768afbd216c0fd00abe580.jpg"},13289:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/haruna-aee9cd480cd936456de187af2cb0ecfb.jpg"},85353:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-calc-d000f05dad58cf8e0877111b52108ecb.jpg"},91955:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-draw-46b341512a31da6fdf6505368197b96e.jpg"},8017:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-impress-8851e5e8a47c676d011846d7a919f95d.jpg"},56243:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-math-0fb2b8bfd4c3f8736d107cb81b546a13.jpg"},51304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-writer-aeca166c3f0379a027c3d34f7d2c5d2c.jpg"},51055:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nautilus-33ea265420bee017f2cdad24b84e912d.jpg"},80274:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nemo-b369a1bfe8c00fd1e524e56bd0369e0c.jpg"},22407:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/parole-06df9f8c261a82dbfa968ee1482b4ec0.png"},48392:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/rhythmbox-eb6d0894497e065d9512c2c8454f25e6.jpg"},80649:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/thunderbird-95db449fb1a8d3241f691334bf0b2eb3.jpg"},11151:(e,i,s)=>{s.d(i,{Z:()=>r,a:()=>A});var t=s(67294);const c={},n=t.createContext(c);function A(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:A(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4815],{93980:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>A,default:()=>o,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=s(85893),c=s(11151);const n={title:"Default Applications",summary:"A guide to the default applications included with Solus."},A="Default applications",r={id:"user/quick-start/default-applications",title:"Default Applications",description:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks.",source:"@site/docs/user/quick-start/default-applications.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/default-applications",permalink:"/docs/user/quick-start/default-applications",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/default-applications.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Default Applications",summary:"A guide to the default applications included with Solus."},sidebar:"userSidebar",previous:{title:"Boot Management",permalink:"/docs/user/quick-start/boot-management"},next:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"}},l={},d=[{value:"Web browser",id:"web-browser",level:2},{value:"Email client",id:"email-client",level:2},{value:"Managing your files",id:"managing-your-files",level:2},{value:"Nemo",id:"nemo",level:3},{value:"GNOME Files",id:"gnome-files",level:3},{value:"Dolphin",id:"dolphin",level:3},{value:"Office suite",id:"office-suite",level:2},{value:"Calc",id:"calc",level:3},{value:"Draw",id:"draw",level:3},{value:"Impress",id:"impress",level:3},{value:"Math",id:"math",level:3},{value:"Writer",id:"writer",level:3},{value:"Spell-checking",id:"spell-checking",level:3},{value:"Finnish",id:"finnish",level:4},{value:"Music",id:"music",level:2},{value:"Rhythmbox",id:"rhythmbox",level:3},{value:"Elisa",id:"elisa",level:3},{value:"Video",id:"video",level:2},{value:"Celluloid",id:"celluloid",level:3},{value:"Haruna",id:"haruna",level:3},{value:"Parole",id:"parole",level:3}];function a(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"default-applications",children:"Default applications"})}),"\n",(0,t.jsx)(i.p,{children:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks."}),"\n",(0,t.jsx)(i.h2,{id:"web-browser",children:"Web browser"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with Firefox, a secure and trustworthy web browser provided by the non-profit organization ",(0,t.jsx)(i.a,{href:"https://www.mozilla.org/",children:"Mozilla"}),"."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Firefox Screenshot",src:s(34133).Z+"",width:"1920",height:"1046"})}),"\n",(0,t.jsx)(i.h2,{id:"email-client",children:"Email client"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with the powerful ",(0,t.jsx)(i.a,{href:"https://www.thunderbird.net/",children:"Thunderbird"})," email, newsgroup, and feeds client."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Thunderbird Screenshot",src:s(80649).Z+"",width:"982",height:"822"})}),"\n",(0,t.jsx)(i.h2,{id:"managing-your-files",children:"Managing your files"}),"\n",(0,t.jsx)(i.p,{children:"Each Linux desktop environment has its own graphical application for managing files:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Nemo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"GNOME Files (formerly Nautilus)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Dolphin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Nemo"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"nemo",children:"Nemo"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Nemo Screenshot",src:s(80274).Z+"",width:"800",height:"586"})}),"\n",(0,t.jsx)(i.h3,{id:"gnome-files",children:"GNOME Files"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"GNOME Files Screenshot",src:s(51055).Z+"",width:"886",height:"548"})}),"\n",(0,t.jsx)(i.h3,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dolphin Screenshot",src:s(3638).Z+"",width:"1022",height:"721"})}),"\n",(0,t.jsx)(i.h2,{id:"office-suite",children:"Office suite"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with ",(0,t.jsx)(i.a,{href:"https://www.libreoffice.org",children:"LibreOffice"}),", an office suite that is capable of replacing Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office for the most common tasks."]}),"\n",(0,t.jsx)(i.p,{children:"By default, Solus provides Writer (document editor), Calc (spreadsheet editor), and Impress (presentation editor). Other applications such as Math or Draw can be installed from the Software Center."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"LibreOffice"}),(0,t.jsx)(i.th,{children:"Microsoft Office Equivalent"}),(0,t.jsx)(i.th,{children:"Apple Equivalent"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Writer"}),(0,t.jsx)(i.td,{children:"Word"}),(0,t.jsx)(i.td,{children:"Pages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Calc"}),(0,t.jsx)(i.td,{children:"Excel"}),(0,t.jsx)(i.td,{children:"Numbers"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Impress"}),(0,t.jsx)(i.td,{children:"PowerPoint"}),(0,t.jsx)(i.td,{children:"Keynote"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Draw"}),(0,t.jsx)(i.td,{children:"Visio"}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Math"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"calc",children:"Calc"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Calc Screenshot",src:s(85353).Z+"",width:"1068",height:"607"})}),"\n",(0,t.jsxs)(i.p,{children:["Calc is a spreadsheet editor. You can view, create, and edit spreadsheets as well as leverage a comprehensive range of advanced functions. Calc supports a variety of common open formats and Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"xls"}),", ",(0,t.jsx)(i.code,{children:"xlsx"}),", and ",(0,t.jsx)(i.code,{children:"ods"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"draw",children:"Draw"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Draw Screenshot",src:s(91955).Z+"",width:"1068",height:"637"})}),"\n",(0,t.jsxs)(i.p,{children:["Draw is a graphical editor that allows you to sketch diagrams, workflows and any kind of other simple to complex drawing you can imagine. You can install Draw from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-draw"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"impress",children:"Impress"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Impress Screenshot",src:s(8017).Z+"",width:"1068",height:"605"})}),"\n",(0,t.jsxs)(i.p,{children:["Impress is a presentation viewer and editor. You can view, create, edit, and export presentations in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"ppt"}),", ",(0,t.jsx)(i.code,{children:"pptx"}),", and ",(0,t.jsx)(i.code,{children:"odp"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"math",children:"Math"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Math Screenshot",src:s(56243).Z+"",width:"1068",height:"598"})}),"\n",(0,t.jsxs)(i.p,{children:["Math is a formula editor. Create your mathematical and scientific expressions and insert them with the correct formatting into your text documents, spreadsheets, presentations, or drawings. Math can be installed from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-math"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"writer",children:"Writer"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Writer Screenshot",src:s(51304).Z+"",width:"1068",height:"748"})}),"\n",(0,t.jsxs)(i.p,{children:["Writer is a document editor. You can view, create, edit, and export documents in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"doc"}),", ",(0,t.jsx)(i.code,{children:"docx"}),", and ",(0,t.jsx)(i.code,{children:"odt"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"spell-checking",children:"Spell-checking"}),"\n",(0,t.jsxs)(i.p,{children:["LibreOffice Writer users may want to install the package ",(0,t.jsx)(i.code,{children:"libreoffice-common-dictionaries"})," from Software Center to automatically enable spell-checking support."]}),"\n",(0,t.jsx)(i.h4,{id:"finnish",children:"Finnish"}),"\n",(0,t.jsxs)(i.p,{children:["Finnish language support is provided by installing ",(0,t.jsx)(i.code,{children:"libreoffice-voikko"}),". After installation of this package, there is further configuration required to properly leverage the Voikko spell-checking and Finnish dictionary support."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open up LibreOffice Writer"}),"\n",(0,t.jsxs)(i.li,{children:["In the menubar, go to ",(0,t.jsx)(i.code,{children:"Tools"})," then ",(0,t.jsx)(i.code,{children:"Options"}),". This will open up the Options dialog."]}),"\n",(0,t.jsx)(i.li,{children:"Go to the Language Settings, listed on the left of Options."}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Writing Aids and ensure the "Spellchecker (Voikko)", "Grammar checker (Voikko)", and "Hyphenator (Voikko)" are under the "Available language modules" section.'}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Voikko and ensure "standard: suomi (perussanasto)" is selected under the "Vocabulary" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"music",children:"Music"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Elisa"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"rhythmbox",children:"Rhythmbox"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Rhythmbox Screenshot",src:s(48392).Z+"",width:"789",height:"606"})}),"\n",(0,t.jsx)(i.h3,{id:"elisa",children:"Elisa"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Elisa Screenshot",src:s(92304).Z+"",width:"1020",height:"720"})}),"\n",(0,t.jsx)(i.h2,{id:"video",children:"Video"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Haruna"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Parole"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"celluloid",children:"Celluloid"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Celluloid Screenshot",src:s(18646).Z+"",width:"651",height:"491"})}),"\n",(0,t.jsx)(i.h3,{id:"haruna",children:"Haruna"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Haruna Screenshot",src:s(13289).Z+"",width:"1190",height:"749"})}),"\n",(0,t.jsx)(i.h3,{id:"parole",children:"Parole"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Parole Screenshot",src:s(22407).Z+"",width:"764",height:"450"})})]})}function o(e={}){const{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},18646:(e,i,s)=>{s.d(i,{Z:()=>t});const t="data:image/webp;base64,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"},3638:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/dolphin-06132e0261dad073f7f27bbee6bcbfba.jpg"},92304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/elisa-63e84725c74e3606d527b80a49234bdf.jpg"},34133:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/firefox-0510dce504768afbd216c0fd00abe580.jpg"},13289:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/haruna-aee9cd480cd936456de187af2cb0ecfb.jpg"},85353:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-calc-d000f05dad58cf8e0877111b52108ecb.jpg"},91955:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-draw-46b341512a31da6fdf6505368197b96e.jpg"},8017:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-impress-8851e5e8a47c676d011846d7a919f95d.jpg"},56243:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-math-0fb2b8bfd4c3f8736d107cb81b546a13.jpg"},51304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-writer-aeca166c3f0379a027c3d34f7d2c5d2c.jpg"},51055:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nautilus-33ea265420bee017f2cdad24b84e912d.jpg"},80274:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nemo-b369a1bfe8c00fd1e524e56bd0369e0c.jpg"},22407:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/parole-06df9f8c261a82dbfa968ee1482b4ec0.png"},48392:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/rhythmbox-eb6d0894497e065d9512c2c8454f25e6.jpg"},80649:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/thunderbird-95db449fb1a8d3241f691334bf0b2eb3.jpg"},11151:(e,i,s)=>{s.d(i,{Z:()=>r,a:()=>A});var t=s(67294);const c={},n=t.createContext(c);function A(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:A(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1a698c37.ed861371.js b/assets/js/1a698c37.611eff98.js
similarity index 98%
rename from assets/js/1a698c37.ed861371.js
rename to assets/js/1a698c37.611eff98.js
index 5d2cad819..8dd9310c3 100644
--- a/assets/js/1a698c37.ed861371.js
+++ b/assets/js/1a698c37.611eff98.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6126],{99870:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>y,contentTitle:()=>I,default:()=>R,frontMatter:()=>E,metadata:()=>N,toc:()=>M});var n=s(85893),r=s(11151),t=s(22430),d=(s(67294),s(86010)),o=s(55361),a=s(38208),c=s(63186),l=s(42704),u=s(2734),p=s(98396),h=s(51233),m=s(56863),x=s(78146),g=s(27400),f=s(94229),j=s(39217),Z=s(23466);const k=[{name:"Budgie",url:"budgie",urlConfig:"budgie/configuration",urlTips:"budgie/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.budgie.description",children:"A feature-rich, luxurious desktop using the most modern technologies."})},{name:"Plasma",url:"plasma",urlConfig:"plasma/configuration",urlTips:"plasma/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.plasma.description",children:"A sophisticated desktop experience for the tinkerers. Simple by default, powerful when needed."})},{name:"GNOME",url:"gnome",urlConfig:"gnome/configuration",urlTips:"gnome/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.gnome.description",children:"A simple, streamlined desktop for more modern hardware."})},{name:"MATE",url:"mate",urlConfig:"mate/configuration",urlTips:"mate/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.mate.description",children:"A traditional desktop for advanced users and older hardware."})},{name:"XFCE",url:"xfce",urlConfig:"xfce/configuration",urlTips:"xfce/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.xfce.description",children:"A lightweight desktop that aims to be fast while still being friendly."})}],b=e=>{let{name:i,url:s,urlConfig:r,urlTips:t,description:k}=e;const b=(0,u.Z)(),A=(0,p.Z)(b.breakpoints.down("xl")),T=(0,Z.ZP)(`/img/${i}.jpg`);return(0,n.jsx)(g.Z,{xs:6,children:(0,n.jsxs)(h.Z,{className:(0,d.Z)("card"),height:1,children:[(0,n.jsx)(h.Z,{className:(0,d.Z)("card__image"),children:(0,n.jsx)(a.Z,{to:s,children:(0,n.jsx)(c.Z,{img:T,alt:(0,o.I)({message:"Screenshot of {name} edition",id:"edition.card.image",description:"Alt text for images of editions"})})})}),(0,n.jsxs)(h.Z,{className:"card__body",children:[(0,n.jsx)(l.Z,{as:"h3",children:(0,n.jsx)("a",{href:i,children:i})}),(0,n.jsx)("p",{children:k})]}),(0,n.jsx)(h.Z,{className:"card__footer",children:(0,n.jsxs)(m.Z,{"aria-label":"contained card button group",fullWidth:!0,sx:{borderRadius:"10px"},variant:"contained",children:[(0,n.jsx)(x.Z,{href:r,startIcon:A?void 0:(0,n.jsx)(f.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.configuration",children:"Configuration"})}),(0,n.jsx)(x.Z,{href:t,startIcon:A?void 0:(0,n.jsx)(j.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.tipsntricks",children:"Tips & Tricks"})})]})})]})})},A=()=>(0,n.jsx)(g.Z,{container:!0,columns:{xs:6,sm:6,md:6,lg:12},spacing:2,children:k.map((e=>(0,n.jsx)(b,{...e},e.name)))});var T=s(96189),w=s(21265),C=s(98391);const _=(0,w.Z)({breakpoints:{values:{xs:0,sm:600,md:900,lg:1200,xl:1536,subfullhd:1800,fullhd:1920}},palette:{primary:{light:T.Z.A700,main:T.Z.A700,dark:T.Z.A100}}}),v=(0,C.Z)(_,{breakpoints:_.breakpoints.keys,factor:2}),E={},I="Editions",N={id:"user/editions/index",title:"Editions",description:"",source:"@site/docs/user/editions/index.mdx",sourceDirName:"user/editions",slug:"/user/editions/",permalink:"/docs/user/editions/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/index.mdx",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"},next:{title:"Budgie",permalink:"/docs/user/editions/budgie/"}},y={},M=[];function S(e){const i={h1:"h1",header:"header",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"editions",children:"Editions"})}),"\n","\n",(0,n.jsx)(t.Z,{theme:v,children:(0,n.jsx)(A,{})})]})}function R(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(S,{...e})}):S(e)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6126],{99870:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>y,contentTitle:()=>I,default:()=>R,frontMatter:()=>E,metadata:()=>N,toc:()=>M});var n=s(85893),r=s(11151),t=s(22430),d=(s(67294),s(86010)),o=s(55361),a=s(38208),c=s(63186),l=s(42704),u=s(2734),p=s(98396),h=s(51233),m=s(56863),x=s(78146),g=s(27400),f=s(94229),j=s(39217),Z=s(23466);const k=[{name:"Budgie",url:"budgie",urlConfig:"budgie/configuration",urlTips:"budgie/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.budgie.description",children:"A feature-rich, luxurious desktop using the most modern technologies."})},{name:"Plasma",url:"plasma",urlConfig:"plasma/configuration",urlTips:"plasma/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.plasma.description",children:"A sophisticated desktop experience for the tinkerers. Simple by default, powerful when needed."})},{name:"GNOME",url:"gnome",urlConfig:"gnome/configuration",urlTips:"gnome/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.gnome.description",children:"A simple, streamlined desktop for more modern hardware."})},{name:"MATE",url:"mate",urlConfig:"mate/configuration",urlTips:"mate/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.mate.description",children:"A traditional desktop for advanced users and older hardware."})},{name:"XFCE",url:"xfce",urlConfig:"xfce/configuration",urlTips:"xfce/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.xfce.description",children:"A lightweight desktop that aims to be fast while still being friendly."})}],b=e=>{let{name:i,url:s,urlConfig:r,urlTips:t,description:k}=e;const b=(0,u.Z)(),A=(0,p.Z)(b.breakpoints.down("xl")),T=(0,Z.ZP)(`/img/${i}.jpg`);return(0,n.jsx)(g.Z,{xs:6,children:(0,n.jsxs)(h.Z,{className:(0,d.Z)("card"),height:1,children:[(0,n.jsx)(h.Z,{className:(0,d.Z)("card__image"),children:(0,n.jsx)(a.Z,{to:s,children:(0,n.jsx)(c.Z,{img:T,alt:(0,o.I)({message:"Screenshot of {name} edition",id:"edition.card.image",description:"Alt text for images of editions"})})})}),(0,n.jsxs)(h.Z,{className:"card__body",children:[(0,n.jsx)(l.Z,{as:"h3",children:(0,n.jsx)("a",{href:i,children:i})}),(0,n.jsx)("p",{children:k})]}),(0,n.jsx)(h.Z,{className:"card__footer",children:(0,n.jsxs)(m.Z,{"aria-label":"contained card button group",fullWidth:!0,sx:{borderRadius:"10px"},variant:"contained",children:[(0,n.jsx)(x.Z,{href:r,startIcon:A?void 0:(0,n.jsx)(f.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.configuration",children:"Configuration"})}),(0,n.jsx)(x.Z,{href:t,startIcon:A?void 0:(0,n.jsx)(j.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.tipsntricks",children:"Tips & Tricks"})})]})})]})})},A=()=>(0,n.jsx)(g.Z,{container:!0,columns:{xs:6,sm:6,md:6,lg:12},spacing:2,children:k.map((e=>(0,n.jsx)(b,{...e},e.name)))});var T=s(96189),w=s(21265),C=s(98391);const _=(0,w.Z)({breakpoints:{values:{xs:0,sm:600,md:900,lg:1200,xl:1536,subfullhd:1800,fullhd:1920}},palette:{primary:{light:T.Z.A700,main:T.Z.A700,dark:T.Z.A100}}}),v=(0,C.Z)(_,{breakpoints:_.breakpoints.keys,factor:2}),E={},I="Editions",N={id:"user/editions/index",title:"Editions",description:"",source:"@site/docs/user/editions/index.mdx",sourceDirName:"user/editions",slug:"/user/editions/",permalink:"/docs/user/editions/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/index.mdx",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"},next:{title:"Budgie",permalink:"/docs/user/editions/budgie/"}},y={},M=[];function S(e){const i={h1:"h1",header:"header",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"editions",children:"Editions"})}),"\n","\n",(0,n.jsx)(t.Z,{theme:v,children:(0,n.jsx)(A,{})})]})}function R(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(S,{...e})}):S(e)}}}]);
\ No newline at end of file
diff --git a/assets/js/1ae709a2.86ed44e0.js b/assets/js/1ae709a2.44927e04.js
similarity index 98%
rename from assets/js/1ae709a2.86ed44e0.js
rename to assets/js/1ae709a2.44927e04.js
index 047348812..019a5ec19 100644
--- a/assets/js/1ae709a2.86ed44e0.js
+++ b/assets/js/1ae709a2.44927e04.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[355],{49332:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var t=n(85893),r=n(11151);const a={title:"History and Software Rollback",summary:"History and Software Rollback"},o="History and software rollback in Solus",i={id:"user/package-management/history-and-rollback",title:"History and Software Rollback",description:"Solus offers a feature to view your history of software changes and revert your system to previous versions.",source:"@site/docs/user/package-management/history-and-rollback.md",sourceDirName:"user/package-management",slug:"/user/package-management/history-and-rollback",permalink:"/docs/user/package-management/history-and-rollback",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/history-and-rollback.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"History and Software Rollback",summary:"History and Software Rollback"},sidebar:"userSidebar",previous:{title:"Basics to Package Management",permalink:"/docs/user/package-management/basics"},next:{title:"Repository Management",permalink:"/docs/user/package-management/repo-management"}},l={},c=[{value:"History of software changes",id:"history-of-software-changes",level:2},{value:"Rollback",id:"rollback",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"history-and-software-rollback-in-solus",children:"History and software rollback in Solus"})}),"\n",(0,t.jsx)(s.p,{children:"Solus offers a feature to view your history of software changes and revert your system to previous versions."}),"\n",(0,t.jsx)(s.p,{children:"You can use this feature if you have issues after installing packages or system updates, and you need to return to a working state."}),"\n",(0,t.jsx)(s.h2,{id:"history-of-software-changes",children:"History of software changes"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"To see your history of software changes, open a terminal and execute:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n",(0,t.jsx)(s.p,{children:"The terminal displays a list of all the software changes in your system."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"eopkg history output",src:n(66082).Z+"",width:"523",height:"617"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"rollback",children:"Rollback"}),"\n",(0,t.jsxs)(s.admonition,{title:"Important",type:"warning",children:[(0,t.jsx)(s.p,{children:"Reverting software changes works if either:"}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"The Solus repository has the version of the package you need, or"}),"\n",(0,t.jsx)(s.li,{children:"You have a local copy of the package."}),"\n"]})]}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Disable any ",(0,t.jsx)(s.a,{href:"https://help.getsol.us/docs/packaging/advanced-config/local-repository#disabling-the-local-solbuild-repository-in-eopkg",children:"local repository"})," you have."]}),"\n",(0,t.jsx)(s.p,{children:"Local repositories can cause errors during rollbacks."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open a terminal."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"View the history of software changes:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Note the number of the most recent software change."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Go back to the desired state:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"sudo eopkg history -t NUMBER\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Replace ",(0,t.jsx)(s.code,{children:"NUMBER"})," with a number lower than the latest software change."]}),"\n",(0,t.jsx)(s.p,{children:"For example, if you want to revert operation 100, use 99 as the number."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"After reverting to the desired state, verify your system status. You might need to restart your system to see some of the changes."})]})}function d(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},66082:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/eopkg-history-output-628a9b5bff409bebd31bec29c3d94e37.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>i,a:()=>o});var t=n(67294);const r={},a=t.createContext(r);function o(e){const s=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[355],{49332:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var t=n(85893),r=n(11151);const a={title:"History and Software Rollback",summary:"History and Software Rollback"},o="History and software rollback in Solus",i={id:"user/package-management/history-and-rollback",title:"History and Software Rollback",description:"Solus offers a feature to view your history of software changes and revert your system to previous versions.",source:"@site/docs/user/package-management/history-and-rollback.md",sourceDirName:"user/package-management",slug:"/user/package-management/history-and-rollback",permalink:"/docs/user/package-management/history-and-rollback",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/history-and-rollback.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"History and Software Rollback",summary:"History and Software Rollback"},sidebar:"userSidebar",previous:{title:"Basics to Package Management",permalink:"/docs/user/package-management/basics"},next:{title:"Repository Management",permalink:"/docs/user/package-management/repo-management"}},l={},c=[{value:"History of software changes",id:"history-of-software-changes",level:2},{value:"Rollback",id:"rollback",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"history-and-software-rollback-in-solus",children:"History and software rollback in Solus"})}),"\n",(0,t.jsx)(s.p,{children:"Solus offers a feature to view your history of software changes and revert your system to previous versions."}),"\n",(0,t.jsx)(s.p,{children:"You can use this feature if you have issues after installing packages or system updates, and you need to return to a working state."}),"\n",(0,t.jsx)(s.h2,{id:"history-of-software-changes",children:"History of software changes"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"To see your history of software changes, open a terminal and execute:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n",(0,t.jsx)(s.p,{children:"The terminal displays a list of all the software changes in your system."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"eopkg history output",src:n(66082).Z+"",width:"523",height:"617"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"rollback",children:"Rollback"}),"\n",(0,t.jsxs)(s.admonition,{title:"Important",type:"warning",children:[(0,t.jsx)(s.p,{children:"Reverting software changes works if either:"}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"The Solus repository has the version of the package you need, or"}),"\n",(0,t.jsx)(s.li,{children:"You have a local copy of the package."}),"\n"]})]}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Disable any ",(0,t.jsx)(s.a,{href:"https://help.getsol.us/docs/packaging/advanced-config/local-repository#disabling-the-local-solbuild-repository-in-eopkg",children:"local repository"})," you have."]}),"\n",(0,t.jsx)(s.p,{children:"Local repositories can cause errors during rollbacks."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open a terminal."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"View the history of software changes:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Note the number of the most recent software change."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Go back to the desired state:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"sudo eopkg history -t NUMBER\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Replace ",(0,t.jsx)(s.code,{children:"NUMBER"})," with a number lower than the latest software change."]}),"\n",(0,t.jsx)(s.p,{children:"For example, if you want to revert operation 100, use 99 as the number."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"After reverting to the desired state, verify your system status. You might need to restart your system to see some of the changes."})]})}function d(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},66082:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/eopkg-history-output-628a9b5bff409bebd31bec29c3d94e37.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>i,a:()=>o});var t=n(67294);const r={},a=t.createContext(r);function o(e){const s=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/21944812.6adc0d53.js b/assets/js/21944812.a0a566e2.js
similarity index 99%
rename from assets/js/21944812.6adc0d53.js
rename to assets/js/21944812.a0a566e2.js
index a8ef9802f..fc481783b 100644
--- a/assets/js/21944812.6adc0d53.js
+++ b/assets/js/21944812.a0a566e2.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9873],{43042:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var o=i(85893),s=i(11151);const t={title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},a="Desktop Environments",r={id:"user/software/desktops/index",title:"Desktops",description:"Solus offers a multitude of desktop environments, ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out.",source:"@site/docs/user/software/desktops/index.md",sourceDirName:"user/software/desktops",slug:"/user/software/desktops/",permalink:"/docs/user/software/desktops/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/desktops/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},sidebar:"userSidebar",previous:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"},next:{title:"Development",permalink:"/docs/user/software/development/"}},l={},d=[{value:"Budgie",id:"budgie",level:2},{value:"GNOME Shell",id:"gnome-shell",level:2},{value:"MATE",id:"mate",level:2},{value:"XFCE",id:"xfce",level:2},{value:"Tiling window managers",id:"tiling-window-managers",level:2},{value:"i3",id:"i3",level:3},{value:"Sway",id:"sway",level:3},{value:"Stacking window manager",id:"stacking-window-manager",level:2},{value:"Labwc",id:"labwc",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"desktop-environments",children:"Desktop Environments"})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers a ",(0,o.jsx)(n.a,{href:"https://getsol.us/solus/experiences/",children:"multitude of desktop environments"}),", ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out."]}),"\n",(0,o.jsx)(n.p,{children:"WARNING: Do NOT attempt to install ANY other desktop environments next to KDE Plasma Desktop. This scenario is NOT supported and you will be told so in no uncertain terms if asking for support."}),"\n",(0,o.jsx)(n.h2,{id:"budgie",children:"Budgie"}),"\n",(0,o.jsx)(n.p,{children:"The flagship desktop environment / experience of Solus is Budgie. If you have installed either our GNOME or XFCE editions, you can try out and install Budgie by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.budgie\n"})}),"\n",(0,o.jsx)(n.h2,{id:"gnome-shell",children:"GNOME Shell"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers a GNOME Shell experience that ships out-of-the-box with a variety of extensions. If you have installed either our Budgie or XFCE editions, you can try out and install GNOME Shell by running the following commands:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install gdm gnome-shell gnome-desktop-branding\n"})}),"\n",(0,o.jsx)(n.h2,{id:"mate",children:"MATE"}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"We plan to deprecate the MATE Desktop, for a similar experience, consider XFCE."})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers the MATE desktop environment / experience, tailored to advanced users and older hardware, as well as shipping with our modern menu called ",(0,o.jsx)(n.a,{href:"https://github.com/getsolus/brisk-menu",children:"Brisk Menu"}),". If you have installed either our Budgie or GNOME editions, you can try out and install MATE by running the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.mate\n"})}),"\n",(0,o.jsx)(n.h2,{id:"xfce",children:"XFCE"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers the XFCE desktop environment for users preferring a more lightweight experience. It is recommended for existing MATE users. You can install XFCE with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.xfce\n"})}),"\n",(0,o.jsx)(n.h2,{id:"tiling-window-managers",children:"Tiling window managers"}),"\n",(0,o.jsx)(n.h3,{id:"i3",children:"i3"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers i3 as a tiling window manager. Users wanting to try i3 can install it by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install i3\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you want to use i3 with support for GNOME Settings Daemon and other GNOME functionality, follow the instructions for installation of GNOME Shell, then choose GNOME+i3 at the login screen to use it."}),"\n",(0,o.jsx)(n.h3,{id:"sway",children:"Sway"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Sway as a Wayland-only tiling window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install sway\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Sway expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://github.com/swaywm/sway/wiki",children:"Sway Wiki"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about tiling window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Tiling_window_manager",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"stacking-window-manager",children:"Stacking window manager"}),"\n",(0,o.jsx)(n.h3,{id:"labwc",children:"Labwc"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Labwc as a Wayland-only stacking window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install labwc\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Labwc expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://labwc.github.io/",children:"Labwc wiki"})]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about stacking window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Stacking_window_manager",children:"here"})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>a});var o=i(67294);const s={},t=o.createContext(s);function a(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9873],{43042:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var o=i(85893),s=i(11151);const t={title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},a="Desktop Environments",r={id:"user/software/desktops/index",title:"Desktops",description:"Solus offers a multitude of desktop environments, ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out.",source:"@site/docs/user/software/desktops/index.md",sourceDirName:"user/software/desktops",slug:"/user/software/desktops/",permalink:"/docs/user/software/desktops/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/desktops/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},sidebar:"userSidebar",previous:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"},next:{title:"Development",permalink:"/docs/user/software/development/"}},l={},d=[{value:"Budgie",id:"budgie",level:2},{value:"GNOME Shell",id:"gnome-shell",level:2},{value:"MATE",id:"mate",level:2},{value:"XFCE",id:"xfce",level:2},{value:"Tiling window managers",id:"tiling-window-managers",level:2},{value:"i3",id:"i3",level:3},{value:"Sway",id:"sway",level:3},{value:"Stacking window manager",id:"stacking-window-manager",level:2},{value:"Labwc",id:"labwc",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"desktop-environments",children:"Desktop Environments"})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers a ",(0,o.jsx)(n.a,{href:"https://getsol.us/solus/experiences/",children:"multitude of desktop environments"}),", ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out."]}),"\n",(0,o.jsx)(n.p,{children:"WARNING: Do NOT attempt to install ANY other desktop environments next to KDE Plasma Desktop. This scenario is NOT supported and you will be told so in no uncertain terms if asking for support."}),"\n",(0,o.jsx)(n.h2,{id:"budgie",children:"Budgie"}),"\n",(0,o.jsx)(n.p,{children:"The flagship desktop environment / experience of Solus is Budgie. If you have installed either our GNOME or XFCE editions, you can try out and install Budgie by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.budgie\n"})}),"\n",(0,o.jsx)(n.h2,{id:"gnome-shell",children:"GNOME Shell"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers a GNOME Shell experience that ships out-of-the-box with a variety of extensions. If you have installed either our Budgie or XFCE editions, you can try out and install GNOME Shell by running the following commands:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install gdm gnome-shell gnome-desktop-branding\n"})}),"\n",(0,o.jsx)(n.h2,{id:"mate",children:"MATE"}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"We plan to deprecate the MATE Desktop, for a similar experience, consider XFCE."})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers the MATE desktop environment / experience, tailored to advanced users and older hardware, as well as shipping with our modern menu called ",(0,o.jsx)(n.a,{href:"https://github.com/getsolus/brisk-menu",children:"Brisk Menu"}),". If you have installed either our Budgie or GNOME editions, you can try out and install MATE by running the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.mate\n"})}),"\n",(0,o.jsx)(n.h2,{id:"xfce",children:"XFCE"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers the XFCE desktop environment for users preferring a more lightweight experience. It is recommended for existing MATE users. You can install XFCE with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.xfce\n"})}),"\n",(0,o.jsx)(n.h2,{id:"tiling-window-managers",children:"Tiling window managers"}),"\n",(0,o.jsx)(n.h3,{id:"i3",children:"i3"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers i3 as a tiling window manager. Users wanting to try i3 can install it by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install i3\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you want to use i3 with support for GNOME Settings Daemon and other GNOME functionality, follow the instructions for installation of GNOME Shell, then choose GNOME+i3 at the login screen to use it."}),"\n",(0,o.jsx)(n.h3,{id:"sway",children:"Sway"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Sway as a Wayland-only tiling window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install sway\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Sway expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://github.com/swaywm/sway/wiki",children:"Sway Wiki"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about tiling window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Tiling_window_manager",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"stacking-window-manager",children:"Stacking window manager"}),"\n",(0,o.jsx)(n.h3,{id:"labwc",children:"Labwc"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Labwc as a Wayland-only stacking window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install labwc\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Labwc expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://labwc.github.io/",children:"Labwc wiki"})]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about stacking window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Stacking_window_manager",children:"here"})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>a});var o=i(67294);const s={},t=o.createContext(s);function a(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/257b9082.64a94637.js b/assets/js/257b9082.2e7b10e9.js
similarity index 98%
rename from assets/js/257b9082.64a94637.js
rename to assets/js/257b9082.2e7b10e9.js
index 6cc7159ea..5554a7bc4 100644
--- a/assets/js/257b9082.64a94637.js
+++ b/assets/js/257b9082.2e7b10e9.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3192],{31874:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var t=o(85893),r=o(11151);const s={},i="Containers",a={id:"user/software/development/containers",title:"Containers",description:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:",source:"@site/docs/user/software/development/containers.md",sourceDirName:"user/software/development",slug:"/user/software/development/containers",permalink:"/docs/user/software/development/containers",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/containers.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Development",permalink:"/docs/user/software/development/"},next:{title:"Java",permalink:"/docs/user/software/development/java"}},c={},l=[{value:"Docker",id:"docker",level:2},{value:"Podman",id:"podman",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"containers",children:"Containers"})}),"\n",(0,t.jsx)(n.p,{children:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:"}),"\n",(0,t.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Docker is a container engine developed by Docker Inc. Solus provides the command line utility ",(0,t.jsx)(n.code,{children:"docker"})," to run and manage docker containers."]}),"\n",(0,t.jsxs)(n.p,{children:["A wide variety of applications are available through the official container registry ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/search?q=",children:"Docker Hub"})]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the docker engine by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it docker"})," (you may also want to install ",(0,t.jsx)(n.code,{children:"docker-compose"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["Test your installation with ",(0,t.jsx)(n.code,{children:"sudo docker run hello-world"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: For sudo-less docker, run ",(0,t.jsx)(n.code,{children:"sudo usermod -aG docker $USER"}),". You must restart for this change to take effect"]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: Allow the docker daemon to start automatically at system startup ",(0,t.jsx)(n.code,{children:"sudo systemctl enable docker"})]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/",children:"Docker Docs"})," for further topics"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"podman",children:"Podman"}),"\n",(0,t.jsx)(n.p,{children:"Podman is a container manager by Red Hat. Podman's main advantage is the capability of running containers without root permissions, thus limiting the attack surface of the host system. Assuming an attacker will be able to escape a compromised container, they won't have full control of the machine."}),"\n",(0,t.jsxs)(n.p,{children:["Podman's command line interface is 100% compatible with Docker, to the point it's possible to replace the ",(0,t.jsx)(n.code,{children:"docker"})," command with ",(0,t.jsx)(n.code,{children:"podman"})," without any subsequent errors."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install Podman by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it podman"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optionally, add ",(0,t.jsx)(n.code,{children:"alias docker=podman"})," to your initial shell script, should you want to replace Docker with Podman while retaining your typing habits"]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://podman.io/",children:"Podman website"})," for more documentation"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,o)=>{o.d(n,{Z:()=>a,a:()=>i});var t=o(67294);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3192],{31874:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var t=o(85893),r=o(11151);const s={},i="Containers",a={id:"user/software/development/containers",title:"Containers",description:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:",source:"@site/docs/user/software/development/containers.md",sourceDirName:"user/software/development",slug:"/user/software/development/containers",permalink:"/docs/user/software/development/containers",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/containers.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Development",permalink:"/docs/user/software/development/"},next:{title:"Java",permalink:"/docs/user/software/development/java"}},c={},l=[{value:"Docker",id:"docker",level:2},{value:"Podman",id:"podman",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"containers",children:"Containers"})}),"\n",(0,t.jsx)(n.p,{children:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:"}),"\n",(0,t.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Docker is a container engine developed by Docker Inc. Solus provides the command line utility ",(0,t.jsx)(n.code,{children:"docker"})," to run and manage docker containers."]}),"\n",(0,t.jsxs)(n.p,{children:["A wide variety of applications are available through the official container registry ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/search?q=",children:"Docker Hub"})]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the docker engine by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it docker"})," (you may also want to install ",(0,t.jsx)(n.code,{children:"docker-compose"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["Test your installation with ",(0,t.jsx)(n.code,{children:"sudo docker run hello-world"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: For sudo-less docker, run ",(0,t.jsx)(n.code,{children:"sudo usermod -aG docker $USER"}),". You must restart for this change to take effect"]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: Allow the docker daemon to start automatically at system startup ",(0,t.jsx)(n.code,{children:"sudo systemctl enable docker"})]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/",children:"Docker Docs"})," for further topics"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"podman",children:"Podman"}),"\n",(0,t.jsx)(n.p,{children:"Podman is a container manager by Red Hat. Podman's main advantage is the capability of running containers without root permissions, thus limiting the attack surface of the host system. Assuming an attacker will be able to escape a compromised container, they won't have full control of the machine."}),"\n",(0,t.jsxs)(n.p,{children:["Podman's command line interface is 100% compatible with Docker, to the point it's possible to replace the ",(0,t.jsx)(n.code,{children:"docker"})," command with ",(0,t.jsx)(n.code,{children:"podman"})," without any subsequent errors."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install Podman by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it podman"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optionally, add ",(0,t.jsx)(n.code,{children:"alias docker=podman"})," to your initial shell script, should you want to replace Docker with Podman while retaining your typing habits"]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://podman.io/",children:"Podman website"})," for more documentation"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,o)=>{o.d(n,{Z:()=>a,a:()=>i});var t=o(67294);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2598a3a5.91df6f56.js b/assets/js/2598a3a5.c3208c71.js
similarity index 99%
rename from assets/js/2598a3a5.91df6f56.js
rename to assets/js/2598a3a5.c3208c71.js
index 9f773cc9f..46a17a9d4 100644
--- a/assets/js/2598a3a5.91df6f56.js
+++ b/assets/js/2598a3a5.c3208c71.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5951],{70197:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=n(85893),s=n(11151);const o={title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},a="Configuration",r={id:"user/editions/mate/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/mate/configuration.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/configuration",permalink:"/docs/user/editions/mate/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},sidebar:"userSidebar",previous:{title:"MATE",permalink:"/docs/user/editions/mate/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"}},c={},d=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(t.h2,{id:"system",children:"System"}),"\n",(0,i.jsx)(t.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, there are a couple of different ways to change the date and time. You can right click on the time in the bottom panel and click on "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Date and Time Right-Click Menu",src:n(14205).Z+"",width:"195",height:"298"})}),"\n",(0,i.jsx)(t.p,{children:"This opens the Clock Preferences window and allows you to show the date, seconds or use 24 hour time."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Clock Preferences",src:n(87653).Z+"",width:"375",height:"367"})}),"\n",(0,i.jsx)(t.p,{children:'To change the time, click on "Time Settings" at the bottom of this window.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Time Settings",src:n(11410).Z+"",width:"459",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'Once you have the correct time, you can click on "Set System Time".'}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, if you wish to change your timezone, open the Brisk Menu and then click on "Administration" followed by "Time and Date". Click on "Unlock" and input your user password so that you can alter the time zone.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Timezone Settings",src:n(89206).Z+"",width:"496",height:"380"})}),"\n",(0,i.jsx)(t.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, open the Brisk Menu and click on "Preferences" and then on "Preferred Applications".'}),"\n",(0,i.jsx)(t.p,{children:"In this section you will need to click one of the five tabs at the top to find the category you wish to change. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default image viewer from Eye of MATE to GIMP then you must first install GIMP (available in the Software Center)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Preferred Applications",src:n(33340).Z+"",width:"399",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open with other Application...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE File Context Menu",src:n(32077).Z+"",width:"302",height:"384"})}),"\n",(0,i.jsx)(t.p,{children:'Next, select the application you wish to use and make sure "Remember this application for "your file type" files" is ticked. Finish by clicking "Open". In the future, all files with the same file type will open with the same application.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Application Selection",src:n(48197).Z+"",width:"426",height:"501"})}),"\n",(0,i.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Displays".'}),"\n",(0,i.jsx)(t.p,{children:'This opens the Monitor Preferences window and your display(s) will be represented by 1 or more colored boxes. Click on the individual display you wish to configure. You will now be able to select if you wish to set this monitor as the primary display, mirror all displays by turning on "Same image in all monitors", or turn it off. This window also gives you the ability to change the aspect ratio, rotate the display, and to change the resolution.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Preferences",src:n(95067).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:"You can arrange your displays by dragging the colored boxes to your preferred positions, as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Arrangement",src:n(5229).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. If you would like to apply the changes to all the user accounts on your system, click on "Apply system-wide". You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration" within 30 seconds.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Confirm Monitor Preferences",src:n(572).Z+"",width:"483",height:"146"})}),"\n",(0,i.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,i.jsx)(t.p,{children:'To change your keyboard layout in MATE, open the Brisk Menu and click on "Preferences" and then on "Keyboard". This will open the Keyboard Preferences window, now click on the "Layouts" tab.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Preferences",src:n(91066).Z+"",width:"452",height:"527"})}),"\n",(0,i.jsx)(t.p,{children:'To add a layout, click on the "+ Add..." button. The 2 tabs at the top of the chooser window give you the option to find your layout by country or by language. The preview gives you a graphical representation of each layout. Once you are happy with your selection, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Choose Keyboard Layout",src:n(46721).Z+"",width:"800",height:"509"})}),"\n",(0,i.jsx)(t.p,{children:'You can remove a keyboard layout by selecting one of the items in your layouts list and then clicking the "- Remove" button.'}),"\n",(0,i.jsx)(t.p,{children:"If you wish to use multiple keyboard layouts, you can switch between them by left clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected. A right click allows you to open the keyboard preferences window and to see the graphical view of your current layout."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Indicator",src:n(89990).Z+"",width:"370",height:"141"})}),"\n",(0,i.jsx)(t.p,{children:'To enable keyboard shortcuts for easy switching, re-open the Keyboard Preferences window and open the "Layouts" tab again. Now click on the "Options..." button. This will open a detailed options list, look for and click on "Switching to another layout". Select one or more of the available keyboard shortcuts and then finish by clicking "X Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Layout Shortcuts",src:n(19720).Z+"",width:"552",height:"425"})}),"\n",(0,i.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,i.jsx)(t.p,{children:'By default, IBus needs to be started in MATE before it can be used. Open the Brisk Menu, click on "Preferences" and then on "IBus Preferences". You will be asked if you wish to start the IBus daemon, click "Yes".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Starting Daemon",src:n(29608).Z+"",width:"419",height:"111"})}),"\n",(0,i.jsx)(t.p,{children:'If you wish to have the IBus daemon start automatically every time you start Solus MATE, Open the Brisk Menu, click on "Preferences" and then on "Startup Applications". Under the Startup Programs tab, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Startup Applications",src:n(61690).Z+"",width:"468",height:"379"})}),"\n",(0,i.jsxs)(t.p,{children:["In the Command box, you will need to write ",(0,i.jsx)(t.code,{children:"ibus-daemon --xim"}),'. If you wish, you can also fill in a Name and Comment but these are not compulsory. Once you are happy with your inputs, click the "+ Add" button. IBus will now run each time you boot your computer.']}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add IBus Startup Entry",src:n(88955).Z+"",width:"372",height:"177"})}),"\n",(0,i.jsxs)(t.p,{children:["If you need an additional IBus IME for your language see: ",(0,i.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,i.jsxs)(t.p,{children:["Finish by closing the IBus Preferences window. You can now switch between your layouts by using the keyboard shortcut ",(0,i.jsx)(t.code,{children:"Super + Space"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Keyboard Shortcut",src:n(57540).Z+"",width:"142",height:"101"})}),"\n",(0,i.jsx)(t.p,{children:"Or by left clicking on the keyboard layout icon shown in the system tray and selecting the layout you wish to use."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Bottom Panel IBus",src:n(31132).Z+"",width:"239",height:"207"})}),"\n",(0,i.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Mouse". You can toggle between the mouse and touchpad settings using the tabs at the top of the Mouse Preferences window. Click "Close" once you have finished making changes.'}),"\n",(0,i.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Mouse Settings",src:n(39667).Z+"",width:"502",height:"611"})}),"\n",(0,i.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Left-handed or right-handed. This will change your primary button."}),"\n",(0,i.jsx)(t.li,{children:"Locate the pointer when the Control key is pressed."}),"\n",(0,i.jsx)(t.li,{children:"Mouse speed and sensitivity."}),"\n",(0,i.jsx)(t.li,{children:"Drag and Drop threshold. This is designed to prevent accidental dragging and dropping by setting the distance required to initiate a drag."}),"\n",(0,i.jsx)(t.li,{children:"Double click timeout. The length of time between 2 mouse clicks for it to register as a double click."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Touchpad Settings",src:n(92324).Z+"",width:"502",height:"605"})}),"\n",(0,i.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad whilst typing."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of mouse clicks with the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Two and three finger click emulation."}),"\n",(0,i.jsx)(t.li,{children:"Various edge and two finger scrolling options."}),"\n",(0,i.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,i.jsx)(t.li,{children:"Touchpad speed and sensitivity."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"networking",children:"Networking"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, you can manage your network settings by left or right clicking on the network icon in the bottom panel system tray. A left click will bring up any wireless or wired connections currently available whilst a right click allows you to disable networking, view your current connection information and to create new connections and networks by clicking "Edit Connections...".'}),"\n",(0,i.jsx)(t.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a network, left click on the network icon in the system tray. This will show you a selection of the networks currently available and you may need to click on "More networks" to find the one you want.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Networking Applet",src:n(35811).Z+"",width:"520",height:"475"})}),"\n",(0,i.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Network Authentication",src:n(21908).Z+"",width:"490",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,i.jsx)(t.p,{children:'Should you wish to disconnect from a network, left click on the network icon again and then click on "Disconnect" underneath the network you wish to leave.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Disconnect from Network",src:n(56120).Z+"",width:"283",height:"169"})}),"\n",(0,i.jsx)(t.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a hidden network, left click on the network icon in the system tray and then on "Connect to Hidden Wi-Fi Network...". You will now be asked for the network name and type of security (if any).'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Hidden Network",src:n(225).Z+"",width:"490",height:"247"})}),"\n",(0,i.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,i.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,i.jsx)(t.p,{children:"To alter the volume in MATE, left click on the speaker icon in the bottom panel system tray and then drag the volume slider with your mouse."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Volume Control",src:n(68146).Z+"",width:"71",height:"193"})}),"\n",(0,i.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,i.jsx)(t.p,{children:'You can access sound settings, including individual application volume controls, and a simple speaker test by right clicking on the speaker icon in the bottom panel system tray and then clicking on "Sound Preferences". Alternatively, you can open the Brisk Menu and then click on "Preferences" followed by "Sound".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Applet",src:n(13815).Z+"",width:"219",height:"113"})}),"\n",(0,i.jsx)(t.p,{children:"This will open the Sound Preferences window as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Preferences",src:n(90751).Z+"",width:"550",height:"423"})}),"\n",(0,i.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,i.jsx)(t.p,{children:'To add and remove users with MATE, open the Brisk Menu and click on "Administration" and then on "Users and Groups".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Users and Groups",src:n(92617).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,i.jsx)(t.p,{children:'To add a user, click the "+ Add" button underneath the list of users. You will be asked to input your password before you can make changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE New User",src:n(65545).Z+"",width:"307",height:"540"})}),"\n",(0,i.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "OK" in the bottom right corner.'}),"\n",(0,i.jsx)(t.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,i.jsx)(t.p,{children:'To remove a user, open the User Settings window and then click on the user you wish to remove. Now click on the "- Delete" button underneath the list of users.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE User List",src:n(43845).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keep Files Prompt",src:n(2390).Z+"",width:"540",height:"203"})}),"\n",(0,i.jsx)(t.h2,{id:"user-interface",children:"User interface"}),"\n",(0,i.jsx)(t.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,i.jsx)(t.p,{children:'If you wish to change the MATE desktop background, simply right click anywhere on the desktop and select "Change Desktop Background".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Background Right Click Menu",src:n(25408).Z+"",width:"261",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, open the Brisk Menu and click on "Preferences" and then on "Appearance". Click on the "Background" tab at the top if it isn\'t already selected.'}),"\n",(0,i.jsx)(t.p,{children:'In this section, you can choose between Solus wallpapers, solid colors, gradients or using your own pictures by clicking "Add". After choosing, click "Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Background Selection",src:n(46964).Z+"",width:"785",height:"536"})}),"\n",(0,i.jsx)(t.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,i.jsx)(t.p,{children:'MATE has desktop icons enabled by default. If you wish to disable or re-enable them, open the Brisk Menu, click on "Preferences" and then on "MATE Tweak". You can then toggle them on and off by clicking "Show Desktop Icons" under the Desktop section.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Tweak Tool",src:n(88409).Z+"",width:"626",height:"599"})}),"\n",(0,i.jsx)(t.p,{children:"You may now add things to your Desktop. This can be done by dragging an item onto the Desktop, right clicking an icon and selecting Copy to / Move to Desktop or by opening the Caja file manager and then moving the files you want to the Desktop folder (as shown in the image below)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Folder",src:n(67887).Z+"",width:"803",height:"581"})}),"\n",(0,i.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,i.jsxs)(t.p,{children:["In MATE, workspaces are enabled by default. You can move between workspaces by using the keyboard shortcuts ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Left"})," and ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Right"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switching",src:n(43433).Z+"",width:"242",height:"93"})}),"\n",(0,i.jsx)(t.p,{children:'To send an application to a different workspace, right click on the applications titlebar and then use the "Move to Another Workspace" option or "Move to Workspace Right".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Menu",src:n(86624).Z+"",width:"411",height:"385"})}),"\n",(0,i.jsx)(t.p,{children:'One of the easiest ways to view and manage your workspaces is by using the Workspace Switcher. Right click inside the bottom panel and then click on "+ Add to Panel...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Panel Configuration",src:n(23084).Z+"",width:"177",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Towards the bottom of the list you will find the Workspace Switcher. Click on it and then finish by clicking "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add Applet to Panel",src:n(87666).Z+"",width:"512",height:"351"})}),"\n",(0,i.jsx)(t.p,{children:"You should now be able to see 4 slightly darker boxes to the left of your MATE system tray in the bottom panel. The workspace you are currently viewing will be highlighted in blue."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher",src:n(77967).Z+"",width:"265",height:"48"})}),"\n",(0,i.jsx)(t.p,{children:"In addition to using keyboard shortcuts, you will now be able to switch workspaces by clicking on them in the bottom panel. You can also drag one workspace onto another in the bottom panel which will move the current active application to the new workspace."}),"\n",(0,i.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"MATE provides a variety of keyboard shortcuts for workspaces. By default, the keyboard shortcuts for switching directly to a certain workspace are disabled."}),"\n",(0,i.jsx)(t.p,{children:'To enable these and to also view all other available shortcuts open the Brisk Menu and click on "Preferences" and then on "Keyboard Shortcuts". The workspace shortcuts are listed under Windows Management.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Keyboard Shortcuts",src:n(63008).Z+"",width:"626",height:"408"})}),"\n",(0,i.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces configuration"}),"\n",(0,i.jsx)(t.p,{children:'By default, MATE provides you with 4 workspaces. If you would like to have more, less or change their names you must first add the Workspace Switcher to your bottom panel, as detailed above. You\'ll then be able to right click on the Workspace Switcher and select "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Switcher Preferences",src:n(5070).Z+"",width:"203",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Use the plus and minus icons to add or remove workspaces. You can rename workspaces by double clicking on the current names and typing in an alternative. Click "X Close" once you are happy with your changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher Preferences",src:n(3466).Z+"",width:"367",height:"409"})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},67887:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/caja-desktop-folder-4165fea2b0afc876931a10dbeb707384.jpg"},25408:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-right-click-0edaca8eb885eb54466e0a358d0f06ea.jpg"},46964:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-selection-fefc0656871c76fa23c620d99521a0ef.jpg"},31132:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-ibus-left-click-016e725ce808036efb8bc77bd7fb47d8.jpg"},89990:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-keyboard-22cf218bfdf946e6c10250af144d2166.jpg"},35811:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-network-left-click-d3520a23fb573b5b52700f97306190a9.jpg"},23084:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-right-click-83df358e1390b363d6ae99f7465d006f.jpg"},13815:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-sound-right-click-696d602e3df72f0463e5984e82964a20.jpg"},87653:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-clock-preferences-29e68150fa5526f0fbaab28c6f0ad6c2.jpg"},65545:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-create-new-user-00e085b06fb8c6899a23f90d14b50a29.jpg"},88955:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-add-startup-4f4ef3cf4e94656d727ff93c4e299432.jpg"},57540:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},29608:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-starting-daemon-84bcee7978b1d8eb7163cb0d9b964ec3.jpg"},2390:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keep-files-prompt-2aa2cbdb6a94db223d708562c884d71a.jpg"},46721:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-choose-layout-e0ca24f2aa125275817acb229a194923.jpg"},19720:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-layout-shortcuts-62aefb0c48a9d92a34c277497866e85e.jpg"},91066:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-preferences-f13098df57c42dc0259006b9ac386dde.jpg"},572:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-confirm-c9ddeb8ecc32eb0a88fc49b247bd2535.jpg"},5229:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-dragging-0fb78bb10ab52ce991b90df95a517622.jpg"},95067:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-db6d4f848b460b4278da5c95e62d4d9d.jpg"},39667:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-mouse-settings-d43911b0e7fdc6f3a196808da1e353a8.jpg"},43845:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-multiple-user-settings-112efa554f35300d772bb5ede0cc603c.jpg"},21908:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-authentication-13f522132661aa358181f94e002fcc9f.jpg"},56120:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-disconnect-eff4984eda8c49d3e42259381f0490b0.jpg"},225:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-hidden-38a73abbffc438c4c8dc66f70d38fe33.jpg"},32077:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-right-click-096ce2548d773af1ee45fceb5f2153e4.jpg"},48197:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-setting-86e0958d69c60f7b4253ac2989931023.jpg"},33340:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-preferred-applications-dcd4e02b67ec579d69171c22c1eb38d3.jpg"},92617:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-single-user-settings-a1253a12d1a7214129fe3ac5dd897e32.jpg"},90751:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-sound-preferences-e6f0a451c79339dfbc290113f63e2894.jpg"},61690:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-startup-applications-e0d8dbd51c24a2987e3b83bc758d35fc.jpg"},14205:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-right-click-792aa50841ec26d8fcd4803ebb171839.jpg"},89206:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-settings-5fd258bf8a3cd09c075789ecb72370b4.jpg"},11410:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-c6cabc4c6ccfb4d51983c582ac985445.jpg"},92324:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-touchpad-settings-d9b3577e085d2ec9f5e357263f35ef90.jpg"},88409:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-tweak-desktop-30894d02f2a10654d0b8219947f974e6.jpg"},68146:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},63008:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-keyboard-shortcuts-24395c1aa3f623b6b89284cffe6bd2e1.jpg"},87666:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switch-add-to-panel-e57ec1f9a49d5dcf52f3126805d1d110.jpg"},3466:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-preferences-55630462d2aecfc0bd0f511b4ca5cd7c.jpg"},5070:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-right-click-0660da43481f40fe6fec7d39e0ec6f06.jpg"},77967:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},43433:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switching-a0f8cff6b00100314fd9f77994b5dcc9.jpg"},86624:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-titlebar-right-click-6dfec2d387d17d6ca06de2ed728ff521.jpg"},11151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var i=n(67294);const s={},o=i.createContext(s);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5951],{70197:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=n(85893),s=n(11151);const o={title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},a="Configuration",r={id:"user/editions/mate/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/mate/configuration.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/configuration",permalink:"/docs/user/editions/mate/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},sidebar:"userSidebar",previous:{title:"MATE",permalink:"/docs/user/editions/mate/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"}},c={},d=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(t.h2,{id:"system",children:"System"}),"\n",(0,i.jsx)(t.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, there are a couple of different ways to change the date and time. You can right click on the time in the bottom panel and click on "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Date and Time Right-Click Menu",src:n(14205).Z+"",width:"195",height:"298"})}),"\n",(0,i.jsx)(t.p,{children:"This opens the Clock Preferences window and allows you to show the date, seconds or use 24 hour time."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Clock Preferences",src:n(87653).Z+"",width:"375",height:"367"})}),"\n",(0,i.jsx)(t.p,{children:'To change the time, click on "Time Settings" at the bottom of this window.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Time Settings",src:n(11410).Z+"",width:"459",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'Once you have the correct time, you can click on "Set System Time".'}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, if you wish to change your timezone, open the Brisk Menu and then click on "Administration" followed by "Time and Date". Click on "Unlock" and input your user password so that you can alter the time zone.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Timezone Settings",src:n(89206).Z+"",width:"496",height:"380"})}),"\n",(0,i.jsx)(t.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, open the Brisk Menu and click on "Preferences" and then on "Preferred Applications".'}),"\n",(0,i.jsx)(t.p,{children:"In this section you will need to click one of the five tabs at the top to find the category you wish to change. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default image viewer from Eye of MATE to GIMP then you must first install GIMP (available in the Software Center)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Preferred Applications",src:n(33340).Z+"",width:"399",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open with other Application...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE File Context Menu",src:n(32077).Z+"",width:"302",height:"384"})}),"\n",(0,i.jsx)(t.p,{children:'Next, select the application you wish to use and make sure "Remember this application for "your file type" files" is ticked. Finish by clicking "Open". In the future, all files with the same file type will open with the same application.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Application Selection",src:n(48197).Z+"",width:"426",height:"501"})}),"\n",(0,i.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Displays".'}),"\n",(0,i.jsx)(t.p,{children:'This opens the Monitor Preferences window and your display(s) will be represented by 1 or more colored boxes. Click on the individual display you wish to configure. You will now be able to select if you wish to set this monitor as the primary display, mirror all displays by turning on "Same image in all monitors", or turn it off. This window also gives you the ability to change the aspect ratio, rotate the display, and to change the resolution.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Preferences",src:n(95067).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:"You can arrange your displays by dragging the colored boxes to your preferred positions, as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Arrangement",src:n(5229).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. If you would like to apply the changes to all the user accounts on your system, click on "Apply system-wide". You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration" within 30 seconds.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Confirm Monitor Preferences",src:n(572).Z+"",width:"483",height:"146"})}),"\n",(0,i.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,i.jsx)(t.p,{children:'To change your keyboard layout in MATE, open the Brisk Menu and click on "Preferences" and then on "Keyboard". This will open the Keyboard Preferences window, now click on the "Layouts" tab.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Preferences",src:n(91066).Z+"",width:"452",height:"527"})}),"\n",(0,i.jsx)(t.p,{children:'To add a layout, click on the "+ Add..." button. The 2 tabs at the top of the chooser window give you the option to find your layout by country or by language. The preview gives you a graphical representation of each layout. Once you are happy with your selection, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Choose Keyboard Layout",src:n(46721).Z+"",width:"800",height:"509"})}),"\n",(0,i.jsx)(t.p,{children:'You can remove a keyboard layout by selecting one of the items in your layouts list and then clicking the "- Remove" button.'}),"\n",(0,i.jsx)(t.p,{children:"If you wish to use multiple keyboard layouts, you can switch between them by left clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected. A right click allows you to open the keyboard preferences window and to see the graphical view of your current layout."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Indicator",src:n(89990).Z+"",width:"370",height:"141"})}),"\n",(0,i.jsx)(t.p,{children:'To enable keyboard shortcuts for easy switching, re-open the Keyboard Preferences window and open the "Layouts" tab again. Now click on the "Options..." button. This will open a detailed options list, look for and click on "Switching to another layout". Select one or more of the available keyboard shortcuts and then finish by clicking "X Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Layout Shortcuts",src:n(19720).Z+"",width:"552",height:"425"})}),"\n",(0,i.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,i.jsx)(t.p,{children:'By default, IBus needs to be started in MATE before it can be used. Open the Brisk Menu, click on "Preferences" and then on "IBus Preferences". You will be asked if you wish to start the IBus daemon, click "Yes".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Starting Daemon",src:n(29608).Z+"",width:"419",height:"111"})}),"\n",(0,i.jsx)(t.p,{children:'If you wish to have the IBus daemon start automatically every time you start Solus MATE, Open the Brisk Menu, click on "Preferences" and then on "Startup Applications". Under the Startup Programs tab, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Startup Applications",src:n(61690).Z+"",width:"468",height:"379"})}),"\n",(0,i.jsxs)(t.p,{children:["In the Command box, you will need to write ",(0,i.jsx)(t.code,{children:"ibus-daemon --xim"}),'. If you wish, you can also fill in a Name and Comment but these are not compulsory. Once you are happy with your inputs, click the "+ Add" button. IBus will now run each time you boot your computer.']}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add IBus Startup Entry",src:n(88955).Z+"",width:"372",height:"177"})}),"\n",(0,i.jsxs)(t.p,{children:["If you need an additional IBus IME for your language see: ",(0,i.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,i.jsxs)(t.p,{children:["Finish by closing the IBus Preferences window. You can now switch between your layouts by using the keyboard shortcut ",(0,i.jsx)(t.code,{children:"Super + Space"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Keyboard Shortcut",src:n(57540).Z+"",width:"142",height:"101"})}),"\n",(0,i.jsx)(t.p,{children:"Or by left clicking on the keyboard layout icon shown in the system tray and selecting the layout you wish to use."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Bottom Panel IBus",src:n(31132).Z+"",width:"239",height:"207"})}),"\n",(0,i.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Mouse". You can toggle between the mouse and touchpad settings using the tabs at the top of the Mouse Preferences window. Click "Close" once you have finished making changes.'}),"\n",(0,i.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Mouse Settings",src:n(39667).Z+"",width:"502",height:"611"})}),"\n",(0,i.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Left-handed or right-handed. This will change your primary button."}),"\n",(0,i.jsx)(t.li,{children:"Locate the pointer when the Control key is pressed."}),"\n",(0,i.jsx)(t.li,{children:"Mouse speed and sensitivity."}),"\n",(0,i.jsx)(t.li,{children:"Drag and Drop threshold. This is designed to prevent accidental dragging and dropping by setting the distance required to initiate a drag."}),"\n",(0,i.jsx)(t.li,{children:"Double click timeout. The length of time between 2 mouse clicks for it to register as a double click."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Touchpad Settings",src:n(92324).Z+"",width:"502",height:"605"})}),"\n",(0,i.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad whilst typing."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of mouse clicks with the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Two and three finger click emulation."}),"\n",(0,i.jsx)(t.li,{children:"Various edge and two finger scrolling options."}),"\n",(0,i.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,i.jsx)(t.li,{children:"Touchpad speed and sensitivity."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"networking",children:"Networking"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, you can manage your network settings by left or right clicking on the network icon in the bottom panel system tray. A left click will bring up any wireless or wired connections currently available whilst a right click allows you to disable networking, view your current connection information and to create new connections and networks by clicking "Edit Connections...".'}),"\n",(0,i.jsx)(t.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a network, left click on the network icon in the system tray. This will show you a selection of the networks currently available and you may need to click on "More networks" to find the one you want.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Networking Applet",src:n(35811).Z+"",width:"520",height:"475"})}),"\n",(0,i.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Network Authentication",src:n(21908).Z+"",width:"490",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,i.jsx)(t.p,{children:'Should you wish to disconnect from a network, left click on the network icon again and then click on "Disconnect" underneath the network you wish to leave.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Disconnect from Network",src:n(56120).Z+"",width:"283",height:"169"})}),"\n",(0,i.jsx)(t.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a hidden network, left click on the network icon in the system tray and then on "Connect to Hidden Wi-Fi Network...". You will now be asked for the network name and type of security (if any).'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Hidden Network",src:n(225).Z+"",width:"490",height:"247"})}),"\n",(0,i.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,i.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,i.jsx)(t.p,{children:"To alter the volume in MATE, left click on the speaker icon in the bottom panel system tray and then drag the volume slider with your mouse."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Volume Control",src:n(68146).Z+"",width:"71",height:"193"})}),"\n",(0,i.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,i.jsx)(t.p,{children:'You can access sound settings, including individual application volume controls, and a simple speaker test by right clicking on the speaker icon in the bottom panel system tray and then clicking on "Sound Preferences". Alternatively, you can open the Brisk Menu and then click on "Preferences" followed by "Sound".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Applet",src:n(13815).Z+"",width:"219",height:"113"})}),"\n",(0,i.jsx)(t.p,{children:"This will open the Sound Preferences window as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Preferences",src:n(90751).Z+"",width:"550",height:"423"})}),"\n",(0,i.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,i.jsx)(t.p,{children:'To add and remove users with MATE, open the Brisk Menu and click on "Administration" and then on "Users and Groups".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Users and Groups",src:n(92617).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,i.jsx)(t.p,{children:'To add a user, click the "+ Add" button underneath the list of users. You will be asked to input your password before you can make changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE New User",src:n(65545).Z+"",width:"307",height:"540"})}),"\n",(0,i.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "OK" in the bottom right corner.'}),"\n",(0,i.jsx)(t.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,i.jsx)(t.p,{children:'To remove a user, open the User Settings window and then click on the user you wish to remove. Now click on the "- Delete" button underneath the list of users.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE User List",src:n(43845).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keep Files Prompt",src:n(2390).Z+"",width:"540",height:"203"})}),"\n",(0,i.jsx)(t.h2,{id:"user-interface",children:"User interface"}),"\n",(0,i.jsx)(t.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,i.jsx)(t.p,{children:'If you wish to change the MATE desktop background, simply right click anywhere on the desktop and select "Change Desktop Background".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Background Right Click Menu",src:n(25408).Z+"",width:"261",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, open the Brisk Menu and click on "Preferences" and then on "Appearance". Click on the "Background" tab at the top if it isn\'t already selected.'}),"\n",(0,i.jsx)(t.p,{children:'In this section, you can choose between Solus wallpapers, solid colors, gradients or using your own pictures by clicking "Add". After choosing, click "Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Background Selection",src:n(46964).Z+"",width:"785",height:"536"})}),"\n",(0,i.jsx)(t.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,i.jsx)(t.p,{children:'MATE has desktop icons enabled by default. If you wish to disable or re-enable them, open the Brisk Menu, click on "Preferences" and then on "MATE Tweak". You can then toggle them on and off by clicking "Show Desktop Icons" under the Desktop section.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Tweak Tool",src:n(88409).Z+"",width:"626",height:"599"})}),"\n",(0,i.jsx)(t.p,{children:"You may now add things to your Desktop. This can be done by dragging an item onto the Desktop, right clicking an icon and selecting Copy to / Move to Desktop or by opening the Caja file manager and then moving the files you want to the Desktop folder (as shown in the image below)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Folder",src:n(67887).Z+"",width:"803",height:"581"})}),"\n",(0,i.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,i.jsxs)(t.p,{children:["In MATE, workspaces are enabled by default. You can move between workspaces by using the keyboard shortcuts ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Left"})," and ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Right"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switching",src:n(43433).Z+"",width:"242",height:"93"})}),"\n",(0,i.jsx)(t.p,{children:'To send an application to a different workspace, right click on the applications titlebar and then use the "Move to Another Workspace" option or "Move to Workspace Right".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Menu",src:n(86624).Z+"",width:"411",height:"385"})}),"\n",(0,i.jsx)(t.p,{children:'One of the easiest ways to view and manage your workspaces is by using the Workspace Switcher. Right click inside the bottom panel and then click on "+ Add to Panel...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Panel Configuration",src:n(23084).Z+"",width:"177",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Towards the bottom of the list you will find the Workspace Switcher. Click on it and then finish by clicking "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add Applet to Panel",src:n(87666).Z+"",width:"512",height:"351"})}),"\n",(0,i.jsx)(t.p,{children:"You should now be able to see 4 slightly darker boxes to the left of your MATE system tray in the bottom panel. The workspace you are currently viewing will be highlighted in blue."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher",src:n(77967).Z+"",width:"265",height:"48"})}),"\n",(0,i.jsx)(t.p,{children:"In addition to using keyboard shortcuts, you will now be able to switch workspaces by clicking on them in the bottom panel. You can also drag one workspace onto another in the bottom panel which will move the current active application to the new workspace."}),"\n",(0,i.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"MATE provides a variety of keyboard shortcuts for workspaces. By default, the keyboard shortcuts for switching directly to a certain workspace are disabled."}),"\n",(0,i.jsx)(t.p,{children:'To enable these and to also view all other available shortcuts open the Brisk Menu and click on "Preferences" and then on "Keyboard Shortcuts". The workspace shortcuts are listed under Windows Management.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Keyboard Shortcuts",src:n(63008).Z+"",width:"626",height:"408"})}),"\n",(0,i.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces configuration"}),"\n",(0,i.jsx)(t.p,{children:'By default, MATE provides you with 4 workspaces. If you would like to have more, less or change their names you must first add the Workspace Switcher to your bottom panel, as detailed above. You\'ll then be able to right click on the Workspace Switcher and select "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Switcher Preferences",src:n(5070).Z+"",width:"203",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Use the plus and minus icons to add or remove workspaces. You can rename workspaces by double clicking on the current names and typing in an alternative. Click "X Close" once you are happy with your changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher Preferences",src:n(3466).Z+"",width:"367",height:"409"})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},67887:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/caja-desktop-folder-4165fea2b0afc876931a10dbeb707384.jpg"},25408:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-right-click-0edaca8eb885eb54466e0a358d0f06ea.jpg"},46964:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-selection-fefc0656871c76fa23c620d99521a0ef.jpg"},31132:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-ibus-left-click-016e725ce808036efb8bc77bd7fb47d8.jpg"},89990:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-keyboard-22cf218bfdf946e6c10250af144d2166.jpg"},35811:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-network-left-click-d3520a23fb573b5b52700f97306190a9.jpg"},23084:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-right-click-83df358e1390b363d6ae99f7465d006f.jpg"},13815:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-sound-right-click-696d602e3df72f0463e5984e82964a20.jpg"},87653:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-clock-preferences-29e68150fa5526f0fbaab28c6f0ad6c2.jpg"},65545:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-create-new-user-00e085b06fb8c6899a23f90d14b50a29.jpg"},88955:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-add-startup-4f4ef3cf4e94656d727ff93c4e299432.jpg"},57540:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},29608:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-starting-daemon-84bcee7978b1d8eb7163cb0d9b964ec3.jpg"},2390:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keep-files-prompt-2aa2cbdb6a94db223d708562c884d71a.jpg"},46721:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-choose-layout-e0ca24f2aa125275817acb229a194923.jpg"},19720:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-layout-shortcuts-62aefb0c48a9d92a34c277497866e85e.jpg"},91066:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-preferences-f13098df57c42dc0259006b9ac386dde.jpg"},572:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-confirm-c9ddeb8ecc32eb0a88fc49b247bd2535.jpg"},5229:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-dragging-0fb78bb10ab52ce991b90df95a517622.jpg"},95067:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-db6d4f848b460b4278da5c95e62d4d9d.jpg"},39667:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-mouse-settings-d43911b0e7fdc6f3a196808da1e353a8.jpg"},43845:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-multiple-user-settings-112efa554f35300d772bb5ede0cc603c.jpg"},21908:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-authentication-13f522132661aa358181f94e002fcc9f.jpg"},56120:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-disconnect-eff4984eda8c49d3e42259381f0490b0.jpg"},225:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-hidden-38a73abbffc438c4c8dc66f70d38fe33.jpg"},32077:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-right-click-096ce2548d773af1ee45fceb5f2153e4.jpg"},48197:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-setting-86e0958d69c60f7b4253ac2989931023.jpg"},33340:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-preferred-applications-dcd4e02b67ec579d69171c22c1eb38d3.jpg"},92617:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-single-user-settings-a1253a12d1a7214129fe3ac5dd897e32.jpg"},90751:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-sound-preferences-e6f0a451c79339dfbc290113f63e2894.jpg"},61690:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-startup-applications-e0d8dbd51c24a2987e3b83bc758d35fc.jpg"},14205:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-right-click-792aa50841ec26d8fcd4803ebb171839.jpg"},89206:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-settings-5fd258bf8a3cd09c075789ecb72370b4.jpg"},11410:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-c6cabc4c6ccfb4d51983c582ac985445.jpg"},92324:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-touchpad-settings-d9b3577e085d2ec9f5e357263f35ef90.jpg"},88409:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-tweak-desktop-30894d02f2a10654d0b8219947f974e6.jpg"},68146:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},63008:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-keyboard-shortcuts-24395c1aa3f623b6b89284cffe6bd2e1.jpg"},87666:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switch-add-to-panel-e57ec1f9a49d5dcf52f3126805d1d110.jpg"},3466:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-preferences-55630462d2aecfc0bd0f511b4ca5cd7c.jpg"},5070:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-right-click-0660da43481f40fe6fec7d39e0ec6f06.jpg"},77967:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},43433:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switching-a0f8cff6b00100314fd9f77994b5dcc9.jpg"},86624:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-titlebar-right-click-6dfec2d387d17d6ca06de2ed728ff521.jpg"},11151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var i=n(67294);const s={},o=i.createContext(s);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2609550e.8431025b.js b/assets/js/2609550e.ae2836f2.js
similarity index 99%
rename from assets/js/2609550e.8431025b.js
rename to assets/js/2609550e.ae2836f2.js
index 885d2aa22..2386698c9 100644
--- a/assets/js/2609550e.8431025b.js
+++ b/assets/js/2609550e.ae2836f2.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3206],{23394:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var a=s(85893),i=s(11151);const t={title:"Samba File Sharing",summary:"A quick start guide to Samba on Solus"},o="Samba file sharing",r={id:"user/software/networking/samba",title:"Samba File Sharing",description:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol.",source:"@site/docs/user/software/networking/samba.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/samba",permalink:"/docs/user/software/networking/samba",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/samba.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Samba File Sharing",summary:"A quick start guide to Samba on Solus"},sidebar:"userSidebar",previous:{title:"Networking",permalink:"/docs/category/networking"},next:{title:"TigerVNC",permalink:"/docs/user/software/networking/tigervnc"}},l={},d=[{value:"Samba on Solus",id:"samba-on-solus",level:2},{value:"How to start/stop Samba",id:"how-to-startstop-samba",level:3},{value:"Enabling Windows 7+ network discovery support",id:"enabling-windows-7-network-discovery-support",level:3},{value:"Accessing Samba via IPv6",id:"accessing-samba-via-ipv6",level:3},{value:"A brief introduction to the Samba usershare functionality",id:"a-brief-introduction-to-the-samba-usershare-functionality",level:2},{value:"GUI - configuring shares via file manager plugins",id:"gui---configuring-shares-via-file-manager-plugins",level:3},{value:"CLI - using the net usershare command",id:"cli---using-the-net-usershare-command",level:3},{value:"Managing Samba authentication for named users",id:"managing-samba-authentication-for-named-users",level:2},{value:"Debugging Samba authentication issues",id:"debugging-samba-authentication-issues",level:3},{value:"Adding custom configuration parameters via /etc/samba/smb.conf
",id:"adding-custom-configuration-parameters-via-etcsambasmbconf",level:2},{value:"Example -- anonymous, read-write share outside of $HOME",id:"example----anonymous-read-write-share-outside-of-home",level:3},{value:"Links to the official Samba documentation",id:"links-to-the-official-samba-documentation",level:3},{value:"Full manual control of Samba (recommended only for experienced Samba admins)",id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"samba-file-sharing",children:"Samba file sharing"})}),"\n",(0,a.jsx)(n.p,{children:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol."}),"\n",(0,a.jsx)(n.h2,{id:"samba-on-solus",children:"Samba on Solus"}),"\n",(0,a.jsx)(n.p,{children:"To enable convenient file-sharing on Solus, we maintain a Solus-specific Samba configuration that out-of-the-box:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Supports Samba usershare functionality"}),"\n",(0,a.jsxs)(n.li,{children:["Enables sharing of ",(0,a.jsx)(n.em,{children:"$HOME"})," folders (manual user account activation needed)"]}),"\n",(0,a.jsx)(n.li,{children:"Is set up as a standalone server using the SMB2.0.2 protocol and up (>= Windows Vista/Server 2008)"}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"Avahi"})," aka ",(0,a.jsx)(n.em,{children:"Apple Bonjour"})," / ",(0,a.jsx)(n.em,{children:"mDNS"})," / ",(0,a.jsx)(n.em,{children:"zeroconf"})," for macOS compatibility"]}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"wsdd"})," aka ",(0,a.jsx)(n.em,{children:"Web Services Discovery Daemon"})," for Windows 7+ compatibility"]}),"\n",(0,a.jsx)(n.li,{children:"Disables sharing of printers via Samba (use IPP via CUPS instead)"}),"\n",(0,a.jsx)(n.li,{children:"Allows access only from IPv4 and IPv6 private and link-local (non-internet-routable) addresses"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.7.x, Solus disables the old, deprecated and insecure original SMB1/CIFS protocol by default."}),"\n",(0,a.jsxs)(n.p,{children:["For more information on this choice, please read ",(0,a.jsx)(n.a,{href:"https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858",children:"this post regarding SMB1"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.11.x, the SMB1/CIFS protocol is officially deprecated upstream."}),"\n",(0,a.jsx)(n.h3,{id:"how-to-startstop-samba",children:"How to start/stop Samba"}),"\n",(0,a.jsx)(n.p,{children:"Please note that Samba does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start Samba manually\nsudo systemctl start smb\n\n# Configure Samba to start automatically on each boot and immediately start the service\nsudo systemctl enable --now smb\n\n# Check whether Samba is running\nsudo systemctl status smb\n\n# Restart Samba manually\nsudo systemctl restart smb\n\n# Stop Samba manually\nsudo systemctl stop smb\n\n# Configure Samba to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now smb\n"})}),"\n",(0,a.jsx)(n.h3,{id:"enabling-windows-7-network-discovery-support",children:"Enabling Windows 7+ network discovery support"}),"\n",(0,a.jsxs)(n.p,{children:["The Web Services Discovery protocol is used by Windows 7+ clients to discover shares on other computers. Solus now includes the ",(0,a.jsx)(n.em,{children:"wsdd"})," service which provides support for the Web Services Discovery protocol."]}),"\n",(0,a.jsx)(n.p,{children:"When restarting wsdd, it may be necessary to also restart Samba."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start wsdd manually (depends on the smb service)\nsudo systemctl start wsdd\n\n# Configure wsdd to start automatically on each boot and immediately start the service\nsudo systemctl enable --now wsdd\n\n# Check whether wsdd is running\nsudo systemctl status wsdd\n\n# Restart wsdd and Samba\nsudo systemctl restart wsdd smb\n\n# Stop wsdd manually\nsudo systemctl stop wsdd\n\n# Configure wsdd to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now wsdd\n"})}),"\n",(0,a.jsxs)(n.p,{children:["For more details on managing services on Solus with ",(0,a.jsx)(n.em,{children:"systemctl"}),", see ",(0,a.jsx)(n.code,{children:"man systemctl"})," which is part of the systemd system and service manager."]}),"\n",(0,a.jsx)(n.h3,{id:"accessing-samba-via-ipv6",children:"Accessing Samba via IPv6"}),"\n",(0,a.jsx)(n.p,{children:"In order to access a running Solus Samba server instance via IPv6, first verify that all relevant hosts (including the Samba host) are configured with an IPv6 link-local address."}),"\n",(0,a.jsx)(n.p,{children:"This can be verified in a terminal:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ ip addr\n\n2: enp2s0: /etc/samba/smb.conf
",id:"adding-custom-configuration-parameters-via-etcsambasmbconf",level:2},{value:"Example -- anonymous, read-write share outside of $HOME",id:"example----anonymous-read-write-share-outside-of-home",level:3},{value:"Links to the official Samba documentation",id:"links-to-the-official-samba-documentation",level:3},{value:"Full manual control of Samba (recommended only for experienced Samba admins)",id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"samba-file-sharing",children:"Samba file sharing"})}),"\n",(0,a.jsx)(n.p,{children:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol."}),"\n",(0,a.jsx)(n.h2,{id:"samba-on-solus",children:"Samba on Solus"}),"\n",(0,a.jsx)(n.p,{children:"To enable convenient file-sharing on Solus, we maintain a Solus-specific Samba configuration that out-of-the-box:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Supports Samba usershare functionality"}),"\n",(0,a.jsxs)(n.li,{children:["Enables sharing of ",(0,a.jsx)(n.em,{children:"$HOME"})," folders (manual user account activation needed)"]}),"\n",(0,a.jsx)(n.li,{children:"Is set up as a standalone server using the SMB2.0.2 protocol and up (>= Windows Vista/Server 2008)"}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"Avahi"})," aka ",(0,a.jsx)(n.em,{children:"Apple Bonjour"})," / ",(0,a.jsx)(n.em,{children:"mDNS"})," / ",(0,a.jsx)(n.em,{children:"zeroconf"})," for macOS compatibility"]}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"wsdd"})," aka ",(0,a.jsx)(n.em,{children:"Web Services Discovery Daemon"})," for Windows 7+ compatibility"]}),"\n",(0,a.jsx)(n.li,{children:"Disables sharing of printers via Samba (use IPP via CUPS instead)"}),"\n",(0,a.jsx)(n.li,{children:"Allows access only from IPv4 and IPv6 private and link-local (non-internet-routable) addresses"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.7.x, Solus disables the old, deprecated and insecure original SMB1/CIFS protocol by default."}),"\n",(0,a.jsxs)(n.p,{children:["For more information on this choice, please read ",(0,a.jsx)(n.a,{href:"https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858",children:"this post regarding SMB1"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.11.x, the SMB1/CIFS protocol is officially deprecated upstream."}),"\n",(0,a.jsx)(n.h3,{id:"how-to-startstop-samba",children:"How to start/stop Samba"}),"\n",(0,a.jsx)(n.p,{children:"Please note that Samba does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start Samba manually\nsudo systemctl start smb\n\n# Configure Samba to start automatically on each boot and immediately start the service\nsudo systemctl enable --now smb\n\n# Check whether Samba is running\nsudo systemctl status smb\n\n# Restart Samba manually\nsudo systemctl restart smb\n\n# Stop Samba manually\nsudo systemctl stop smb\n\n# Configure Samba to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now smb\n"})}),"\n",(0,a.jsx)(n.h3,{id:"enabling-windows-7-network-discovery-support",children:"Enabling Windows 7+ network discovery support"}),"\n",(0,a.jsxs)(n.p,{children:["The Web Services Discovery protocol is used by Windows 7+ clients to discover shares on other computers. Solus now includes the ",(0,a.jsx)(n.em,{children:"wsdd"})," service which provides support for the Web Services Discovery protocol."]}),"\n",(0,a.jsx)(n.p,{children:"When restarting wsdd, it may be necessary to also restart Samba."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start wsdd manually (depends on the smb service)\nsudo systemctl start wsdd\n\n# Configure wsdd to start automatically on each boot and immediately start the service\nsudo systemctl enable --now wsdd\n\n# Check whether wsdd is running\nsudo systemctl status wsdd\n\n# Restart wsdd and Samba\nsudo systemctl restart wsdd smb\n\n# Stop wsdd manually\nsudo systemctl stop wsdd\n\n# Configure wsdd to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now wsdd\n"})}),"\n",(0,a.jsxs)(n.p,{children:["For more details on managing services on Solus with ",(0,a.jsx)(n.em,{children:"systemctl"}),", see ",(0,a.jsx)(n.code,{children:"man systemctl"})," which is part of the systemd system and service manager."]}),"\n",(0,a.jsx)(n.h3,{id:"accessing-samba-via-ipv6",children:"Accessing Samba via IPv6"}),"\n",(0,a.jsx)(n.p,{children:"In order to access a running Solus Samba server instance via IPv6, first verify that all relevant hosts (including the Samba host) are configured with an IPv6 link-local address."}),"\n",(0,a.jsx)(n.p,{children:"This can be verified in a terminal:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ ip addr\n\n2: enp2s0: eopkg check
shows broken packages",id:"eopkg-check-shows-broken-packages",level:3},{value:"Updated system and having issues",id:"updated-system-and-having-issues",level:2},{value:"Broken UI with Chromium applications",id:"broken-ui-with-chromium-applications",level:3},{value:"Boot into previous kernel",id:"boot-into-previous-kernel",level:3},{value:"Reverting updates",id:"reverting-updates",level:3},{value:"Boot failure",id:"boot-failure",level:2},{value:"Display manager won't start",id:"display-manager-wont-start",level:3},{value:"No Solus boot loader",id:"no-solus-boot-loader",level:3},{value:"Long boot time",id:"long-boot-time",level:2},{value:"Timeout on partition mount (90s)",id:"timeout-on-partition-mount-90s",level:3}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"troubleshooting-common-issues",children:"Troubleshooting Common Issues"})}),"\n",(0,s.jsx)(o.p,{children:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed."}),"\n",(0,s.jsxs)(o.p,{children:["First, perform a full system update on command line with ",(0,s.jsx)(o.code,{children:"sudo eopkg up"})," (or using the Software Center)."]}),"\n",(0,s.jsx)(o.p,{children:"Next, validate that packages are installed correctly and aren't missing files. Run this once, it will take some time. If there are no broken packages on your system, there will be no output. Otherwise, you will see packages be reinstalled."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs -r sudo eopkg it --reinstall\n"})}),"\n",(0,s.jsx)(o.p,{children:"Reboot the system and see if the issue is resolved."}),"\n",(0,s.jsx)(o.h2,{id:"issues-with-software-center-or-eopkg",children:"Issues with Software Center or eopkg"}),"\n",(0,s.jsx)(o.h3,{id:"cant-install-updates",children:"Can't install updates"}),"\n",(0,s.jsx)(o.p,{children:"If eopkg is interrupted, the database may become corrupted. When updating you will see a message similar to:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.code,{children:"30973, 'BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery - BDB0061 PANIC: Invalid argument'"})}),"\n",(0,s.jsxs)(o.p,{children:["To run database recovery, run ",(0,s.jsx)(o.code,{children:"sudo eopkg rdb"})," in the terminal and then updates should function correctly."]}),"\n",(0,s.jsxs)(o.h3,{id:"eopkg-check-shows-broken-packages",children:[(0,s.jsx)(o.code,{children:"eopkg check"})," shows broken packages"]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg check"})," checks the sha256 checksums of files on disk versus what was originally installed by the original ",(0,s.jsx)(o.code,{children:".eopkg"})," file. In some cases (for example ",(0,s.jsx)(o.code,{children:".pyc"})," files), these files will be modified in the normal operation of Solus. If after reinstalling a package it remains broken, then it's likely nothing to worry about (there are no exceptions made in ",(0,s.jsx)(o.code,{children:"eopkg check"})," for files that are expected to change from use). When reinstalling broken packages, (per above) it only needs to be run once."]}),"\n",(0,s.jsx)(o.h2,{id:"updated-system-and-having-issues",children:"Updated system and having issues"}),"\n",(0,s.jsx)(o.h3,{id:"broken-ui-with-chromium-applications",children:"Broken UI with Chromium applications"}),"\n",(0,s.jsxs)(o.p,{children:["There is an ",(0,s.jsx)(o.a,{href:"https://issues.chromium.org/issues/40267041",children:"upstream bug"})," with Chromium that causes it to try to use an invalid shader cache instead of rebuilding it, crashing the GPU process. The issue is now fixed in Chromium, but it may take some time for applications to update their Chromium version."]}),"\n",(0,s.jsx)(o.p,{children:"To fix applications exhibiting this problem, run these commands to remove the shader cache:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"find ~/.cache -name GPUCache -exec rm -rv {} +\nfind ~/.config -name GPUCache -exec rm -rv {} +\n"})}),"\n",(0,s.jsx)(o.p,{children:"And restart the application."}),"\n",(0,s.jsx)(o.h3,{id:"boot-into-previous-kernel",children:"Boot into previous kernel"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"clr-boot-manager"})," by default retains the latest installed kernel, plus the currently running kernel. This means that when you receive a kernel update, there are two kernels to boot into. Sometimes there are regressions that occur in the kernel, so you are able to boot into the previous kernel if the update has caused any hardware issues (for example failing to suspend when it worked previously). When booting via EFI, the boot menu can be shown by hitting space (repeatedly) during boot."]}),"\n",(0,s.jsx)(o.h3,{id:"reverting-updates",children:"Reverting updates"}),"\n",(0,s.jsxs)(o.p,{children:["If booting into the previous kernel doesn't solve the issue, there may be an issue with the package updates. It is possible to ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"revert the updates"})," (this would also confirm that the issue is in the selected updates)."]}),"\n",(0,s.jsx)(o.h2,{id:"boot-failure",children:"Boot failure"}),"\n",(0,s.jsxs)(o.p,{children:["If Solus partially boots, you can generally get to a TTY using ",(0,s.jsx)(o.code,{children:"Ctrl+Alt+F2"})," to login and be able to run commands just like using a terminal. This enables you to run some commands to identify or resolve the issue."]}),"\n",(0,s.jsx)(o.h3,{id:"display-manager-wont-start",children:"Display manager won't start"}),"\n",(0,s.jsx)(o.p,{children:"A common cause of not being able to boot is due to installing the NVIDIA drivers, but not booting into the latest kernel (the only kernel which has the drivers installed). Also ensure you have the correct driver version installed for your kernel. You can check if you have booted into the latest kernel by comparing the installed package with the booted kernel (instructions for both kernels)"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-lts | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-current | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.p,{children:"If the kernel version and release don't match from lines 2 and 3 of the output, then you aren't booting into the latest kernel and this is the likely cause of X not loading (particularly if you just installed the drivers). A couple of common reasons are:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["On a GRUB machine, a common cause for not booting the latest kernel is due to Solus not being the boot loader on the MBR. Make sure you are booting via the Solus boot loader (if possible), or update GRUB on the distro that own the boot loader, see ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/installation#legacybios-installation",children:"Legacy/BIOS installation"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Another possibility is that the ",(0,s.jsx)(o.code,{children:"ESP"})," has run out of space so the kernel cannot be copied over to it. You can debug why this isn't happening via ",(0,s.jsx)(o.code,{children:"sudo CBM_DEBUG=1 clr-boot-manager update"}),". This will output all information on the process, where it may be failing, or that it is working correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["If these two steps fail, you can't revert the installation of the drivers via ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"History and Rollback"})]}),"\n",(0,s.jsx)(o.h3,{id:"no-solus-boot-loader",children:"No Solus boot loader"}),"\n",(0,s.jsxs)(o.p,{children:["If the Solus boot loader is not functioning (this has been known to be broken by the odd update of a certain OS), the boot loader can be recreated via ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/boot-rescue",children:"Boot Rescue"})]}),"\n",(0,s.jsx)(o.h2,{id:"long-boot-time",children:"Long boot time"}),"\n",(0,s.jsx)(o.p,{children:"There are a number of factors that can contribute to a long boot time. The boot up messages can be viewed to look for any timeouts by looking at the timestamped journal."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo journalctl -b\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Notable commands to check the boot time are: ",(0,s.jsx)(o.code,{children:"systemd-analyze"})," (note that the firmware time is prior to Solus boot, so outside of our control) and ",(0,s.jsx)(o.code,{children:"systemd-analyze critical-chain"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"timeout-on-partition-mount-90s",children:"Timeout on partition mount (90s)"}),"\n",(0,s.jsxs)(o.p,{children:["If information about a device changes (UUID or mount path ",(0,s.jsx)(o.code,{children:"/dev/sda"}),"), this can cause ",(0,s.jsx)(o.code,{children:"systemd"})," to time out for 90 seconds creating a long boot process. Most frequently this happens with the swap file which can be shared across distros. Most of the devices mounted on boot will appear in ",(0,s.jsx)(o.code,{children:"/etc/fstab"})," or be a parameter in a file where configuring resume ",(0,s.jsx)(o.code,{children:"cat /etc/kernel/cmdline.d/*"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"cat /proc/cmdline"})," will show what parameters the kernel has booted with."]}),"\n",(0,s.jsxs)(o.p,{children:["If the devices don't match up with what's listed in ",(0,s.jsx)(o.code,{children:"ls /dev/disk/*/*"})," then it will cause a 90s timeout while it waits to see if it can be found. To fix this, you will need to remove the reference to the UUID or device path that no longer exists, or correct it to the new UUID label."]})]})}function d(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var s=t(67294);const n={},i=s.createContext(n);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2413],{45427:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>h});var s=t(85893),n=t(11151);const i={title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},r="Troubleshooting Common Issues",a={id:"user/troubleshooting/index",title:"Troubleshooting",description:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed.",source:"@site/docs/user/troubleshooting/index.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/",permalink:"/docs/user/troubleshooting/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},sidebar:"userSidebar",previous:{title:"Open Broadcaster Software (OBS)",permalink:"/docs/user/software/web/obs"},next:{title:"Boot Rescue",permalink:"/docs/user/troubleshooting/boot-rescue"}},l={},h=[{value:"Issues with Software Center or eopkg",id:"issues-with-software-center-or-eopkg",level:2},{value:"Can't install updates",id:"cant-install-updates",level:3},{value:"eopkg check
shows broken packages",id:"eopkg-check-shows-broken-packages",level:3},{value:"Updated system and having issues",id:"updated-system-and-having-issues",level:2},{value:"Broken UI with Chromium applications",id:"broken-ui-with-chromium-applications",level:3},{value:"Boot into previous kernel",id:"boot-into-previous-kernel",level:3},{value:"Reverting updates",id:"reverting-updates",level:3},{value:"Boot failure",id:"boot-failure",level:2},{value:"Display manager won't start",id:"display-manager-wont-start",level:3},{value:"No Solus boot loader",id:"no-solus-boot-loader",level:3},{value:"Long boot time",id:"long-boot-time",level:2},{value:"Timeout on partition mount (90s)",id:"timeout-on-partition-mount-90s",level:3}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"troubleshooting-common-issues",children:"Troubleshooting Common Issues"})}),"\n",(0,s.jsx)(o.p,{children:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed."}),"\n",(0,s.jsxs)(o.p,{children:["First, perform a full system update on command line with ",(0,s.jsx)(o.code,{children:"sudo eopkg up"})," (or using the Software Center)."]}),"\n",(0,s.jsx)(o.p,{children:"Next, validate that packages are installed correctly and aren't missing files. Run this once, it will take some time. If there are no broken packages on your system, there will be no output. Otherwise, you will see packages be reinstalled."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs -r sudo eopkg it --reinstall\n"})}),"\n",(0,s.jsx)(o.p,{children:"Reboot the system and see if the issue is resolved."}),"\n",(0,s.jsx)(o.h2,{id:"issues-with-software-center-or-eopkg",children:"Issues with Software Center or eopkg"}),"\n",(0,s.jsx)(o.h3,{id:"cant-install-updates",children:"Can't install updates"}),"\n",(0,s.jsx)(o.p,{children:"If eopkg is interrupted, the database may become corrupted. When updating you will see a message similar to:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.code,{children:"30973, 'BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery - BDB0061 PANIC: Invalid argument'"})}),"\n",(0,s.jsxs)(o.p,{children:["To run database recovery, run ",(0,s.jsx)(o.code,{children:"sudo eopkg rdb"})," in the terminal and then updates should function correctly."]}),"\n",(0,s.jsxs)(o.h3,{id:"eopkg-check-shows-broken-packages",children:[(0,s.jsx)(o.code,{children:"eopkg check"})," shows broken packages"]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg check"})," checks the sha256 checksums of files on disk versus what was originally installed by the original ",(0,s.jsx)(o.code,{children:".eopkg"})," file. In some cases (for example ",(0,s.jsx)(o.code,{children:".pyc"})," files), these files will be modified in the normal operation of Solus. If after reinstalling a package it remains broken, then it's likely nothing to worry about (there are no exceptions made in ",(0,s.jsx)(o.code,{children:"eopkg check"})," for files that are expected to change from use). When reinstalling broken packages, (per above) it only needs to be run once."]}),"\n",(0,s.jsx)(o.h2,{id:"updated-system-and-having-issues",children:"Updated system and having issues"}),"\n",(0,s.jsx)(o.h3,{id:"broken-ui-with-chromium-applications",children:"Broken UI with Chromium applications"}),"\n",(0,s.jsxs)(o.p,{children:["There is an ",(0,s.jsx)(o.a,{href:"https://issues.chromium.org/issues/40267041",children:"upstream bug"})," with Chromium that causes it to try to use an invalid shader cache instead of rebuilding it, crashing the GPU process. The issue is now fixed in Chromium, but it may take some time for applications to update their Chromium version."]}),"\n",(0,s.jsx)(o.p,{children:"To fix applications exhibiting this problem, run these commands to remove the shader cache:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"find ~/.cache -name GPUCache -exec rm -rv {} +\nfind ~/.config -name GPUCache -exec rm -rv {} +\n"})}),"\n",(0,s.jsx)(o.p,{children:"And restart the application."}),"\n",(0,s.jsx)(o.h3,{id:"boot-into-previous-kernel",children:"Boot into previous kernel"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"clr-boot-manager"})," by default retains the latest installed kernel, plus the currently running kernel. This means that when you receive a kernel update, there are two kernels to boot into. Sometimes there are regressions that occur in the kernel, so you are able to boot into the previous kernel if the update has caused any hardware issues (for example failing to suspend when it worked previously). When booting via EFI, the boot menu can be shown by hitting space (repeatedly) during boot."]}),"\n",(0,s.jsx)(o.h3,{id:"reverting-updates",children:"Reverting updates"}),"\n",(0,s.jsxs)(o.p,{children:["If booting into the previous kernel doesn't solve the issue, there may be an issue with the package updates. It is possible to ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"revert the updates"})," (this would also confirm that the issue is in the selected updates)."]}),"\n",(0,s.jsx)(o.h2,{id:"boot-failure",children:"Boot failure"}),"\n",(0,s.jsxs)(o.p,{children:["If Solus partially boots, you can generally get to a TTY using ",(0,s.jsx)(o.code,{children:"Ctrl+Alt+F2"})," to login and be able to run commands just like using a terminal. This enables you to run some commands to identify or resolve the issue."]}),"\n",(0,s.jsx)(o.h3,{id:"display-manager-wont-start",children:"Display manager won't start"}),"\n",(0,s.jsx)(o.p,{children:"A common cause of not being able to boot is due to installing the NVIDIA drivers, but not booting into the latest kernel (the only kernel which has the drivers installed). Also ensure you have the correct driver version installed for your kernel. You can check if you have booted into the latest kernel by comparing the installed package with the booted kernel (instructions for both kernels)"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-lts | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-current | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.p,{children:"If the kernel version and release don't match from lines 2 and 3 of the output, then you aren't booting into the latest kernel and this is the likely cause of X not loading (particularly if you just installed the drivers). A couple of common reasons are:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["On a GRUB machine, a common cause for not booting the latest kernel is due to Solus not being the boot loader on the MBR. Make sure you are booting via the Solus boot loader (if possible), or update GRUB on the distro that own the boot loader, see ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/installation#legacybios-installation",children:"Legacy/BIOS installation"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Another possibility is that the ",(0,s.jsx)(o.code,{children:"ESP"})," has run out of space so the kernel cannot be copied over to it. You can debug why this isn't happening via ",(0,s.jsx)(o.code,{children:"sudo CBM_DEBUG=1 clr-boot-manager update"}),". This will output all information on the process, where it may be failing, or that it is working correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["If these two steps fail, you can't revert the installation of the drivers via ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"History and Rollback"})]}),"\n",(0,s.jsx)(o.h3,{id:"no-solus-boot-loader",children:"No Solus boot loader"}),"\n",(0,s.jsxs)(o.p,{children:["If the Solus boot loader is not functioning (this has been known to be broken by the odd update of a certain OS), the boot loader can be recreated via ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/boot-rescue",children:"Boot Rescue"})]}),"\n",(0,s.jsx)(o.h2,{id:"long-boot-time",children:"Long boot time"}),"\n",(0,s.jsx)(o.p,{children:"There are a number of factors that can contribute to a long boot time. The boot up messages can be viewed to look for any timeouts by looking at the timestamped journal."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo journalctl -b\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Notable commands to check the boot time are: ",(0,s.jsx)(o.code,{children:"systemd-analyze"})," (note that the firmware time is prior to Solus boot, so outside of our control) and ",(0,s.jsx)(o.code,{children:"systemd-analyze critical-chain"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"timeout-on-partition-mount-90s",children:"Timeout on partition mount (90s)"}),"\n",(0,s.jsxs)(o.p,{children:["If information about a device changes (UUID or mount path ",(0,s.jsx)(o.code,{children:"/dev/sda"}),"), this can cause ",(0,s.jsx)(o.code,{children:"systemd"})," to time out for 90 seconds creating a long boot process. Most frequently this happens with the swap file which can be shared across distros. Most of the devices mounted on boot will appear in ",(0,s.jsx)(o.code,{children:"/etc/fstab"})," or be a parameter in a file where configuring resume ",(0,s.jsx)(o.code,{children:"cat /etc/kernel/cmdline.d/*"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"cat /proc/cmdline"})," will show what parameters the kernel has booted with."]}),"\n",(0,s.jsxs)(o.p,{children:["If the devices don't match up with what's listed in ",(0,s.jsx)(o.code,{children:"ls /dev/disk/*/*"})," then it will cause a 90s timeout while it waits to see if it can be found. To fix this, you will need to remove the reference to the UUID or device path that no longer exists, or correct it to the new UUID label."]})]})}function d(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var s=t(67294);const n={},i=s.createContext(n);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2b61a93c.cf6aa1b4.js b/assets/js/2b61a93c.c529ff35.js
similarity index 96%
rename from assets/js/2b61a93c.cf6aa1b4.js
rename to assets/js/2b61a93c.c529ff35.js
index 0e893135d..8619d833c 100644
--- a/assets/js/2b61a93c.cf6aa1b4.js
+++ b/assets/js/2b61a93c.c529ff35.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9897],{23065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=n(85893),s=n(11151);const o={title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},r="MATE Desktop",d={id:"user/editions/mate/index",title:"MATE",description:"The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post here",source:"@site/docs/user/editions/mate/index.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/",permalink:"/docs/user/editions/mate/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"}},a={},c=[];function l(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"mate-desktop",children:"MATE Desktop"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post ",(0,i.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"here"})]})}),"\n",(0,i.jsx)(t.p,{children:"MATE Desktop is provided by the MATE Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"The MATE Desktop Environment is the continuation of GNOME 2. It provides an intuitive and attractive desktop environment using traditional metaphors for Linux and other Unix-like operating\xa0systems."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/",children:"Homepage"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/blog/",children:"News"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/community/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"configuration",children:"Go to MATE Configuration"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"tips-and-tricks",children:"Go to MATE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var i=n(67294);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9897],{23065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=n(85893),s=n(11151);const o={title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},r="MATE Desktop",d={id:"user/editions/mate/index",title:"MATE",description:"The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post here",source:"@site/docs/user/editions/mate/index.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/",permalink:"/docs/user/editions/mate/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"}},a={},c=[];function l(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"mate-desktop",children:"MATE Desktop"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post ",(0,i.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"here"})]})}),"\n",(0,i.jsx)(t.p,{children:"MATE Desktop is provided by the MATE Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"The MATE Desktop Environment is the continuation of GNOME 2. It provides an intuitive and attractive desktop environment using traditional metaphors for Linux and other Unix-like operating\xa0systems."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/",children:"Homepage"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/blog/",children:"News"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/community/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"configuration",children:"Go to MATE Configuration"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"tips-and-tricks",children:"Go to MATE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var i=n(67294);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2c3e84bd.d8e1bbcf.js b/assets/js/2c3e84bd.cc61acc1.js
similarity index 98%
rename from assets/js/2c3e84bd.d8e1bbcf.js
rename to assets/js/2c3e84bd.cc61acc1.js
index 3f351b7ff..e49dd582d 100644
--- a/assets/js/2c3e84bd.d8e1bbcf.js
+++ b/assets/js/2c3e84bd.cc61acc1.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8157],{12359:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=i(85893),s=i(11151);const o={title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},r="Disk Partitioning",a={id:"user/quick-start/installation/disks",title:"Disk Partitioning",description:"Solus provides multiple ways you can install onto your system.",source:"@site/docs/user/quick-start/installation/disks.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/disks",permalink:"/docs/user/quick-start/installation/disks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/disks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},sidebar:"userSidebar",previous:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"},next:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"}},l={},c=[{value:"UEFI",id:"uefi",level:2}];function u(e){const t={br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"disk-partitioning",children:"Disk Partitioning"})}),"\n",(0,n.jsx)(t.p,{children:"Solus provides multiple ways you can install onto your system."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Whole Drive"}),(0,n.jsx)(t.br,{}),"\n","Solus can take up the entire drive, using traditional root partitions, or with LVM-managed root partitions."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Multi-boot"}),(0,n.jsx)(t.br,{}),"\n","You can install Solus next to your existing operating system, such as Windows. ",(0,n.jsx)(t.em,{children:"If you have multiple operating systems installed, we will choose the largest option."})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Manual Partitioning"}),(0,n.jsx)(t.br,{}),"\n","You can manually configure your system. This is only recommend for advanced users which may desire to have a dedicated ",(0,n.jsx)(t.code,{children:"/home"})," partition. Note that if you manually configure your system, you will need to restart the Installer for those changes to apply appropriately.\n",(0,n.jsx)(t.strong,{children:"Note:"})," Legacy (BIOS) must use MBR partition table while Unified EFI (UEFI) must use GPT partition table."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Alongside these options, we also provide the ability to use full-disk encryption. For the obvious reason of it being full-disk, this assumes you are installing Solus onto the entire drive."}),"\n",(0,n.jsx)(t.h2,{id:"uefi",children:"UEFI"}),"\n",(0,n.jsx)(t.p,{children:"If you are using a system with UEFI, you may need to create an EFI System Partition, also referred to as an ESP. This is not necessary if you are enabling Solus to install onto the entire disk."}),"\n",(0,n.jsxs)(t.p,{children:["To create an EFI System Partition, open up GParted and create a FAT32 partition that is 1\xa0GB in size. Next, right-click on the partition and click Manage Flags. On the Manage Flags section, enable the ",(0,n.jsx)(t.code,{children:"boot"})," and ",(0,n.jsx)(t.code,{children:"esp"})," flags."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Notes:"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:'Your system must be booted using Unified EFI (UEFI) mode, as opposed to a "legacy (BIOS) mode".'}),"\n",(0,n.jsx)(t.li,{children:"Your disk is required to be GPT formatted."}),"\n",(0,n.jsx)(t.li,{children:"If you cannot see your SSD drive, set the SATA configuration to AHCI."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8157],{12359:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=i(85893),s=i(11151);const o={title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},r="Disk Partitioning",a={id:"user/quick-start/installation/disks",title:"Disk Partitioning",description:"Solus provides multiple ways you can install onto your system.",source:"@site/docs/user/quick-start/installation/disks.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/disks",permalink:"/docs/user/quick-start/installation/disks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/disks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},sidebar:"userSidebar",previous:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"},next:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"}},l={},c=[{value:"UEFI",id:"uefi",level:2}];function u(e){const t={br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"disk-partitioning",children:"Disk Partitioning"})}),"\n",(0,n.jsx)(t.p,{children:"Solus provides multiple ways you can install onto your system."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Whole Drive"}),(0,n.jsx)(t.br,{}),"\n","Solus can take up the entire drive, using traditional root partitions, or with LVM-managed root partitions."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Multi-boot"}),(0,n.jsx)(t.br,{}),"\n","You can install Solus next to your existing operating system, such as Windows. ",(0,n.jsx)(t.em,{children:"If you have multiple operating systems installed, we will choose the largest option."})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Manual Partitioning"}),(0,n.jsx)(t.br,{}),"\n","You can manually configure your system. This is only recommend for advanced users which may desire to have a dedicated ",(0,n.jsx)(t.code,{children:"/home"})," partition. Note that if you manually configure your system, you will need to restart the Installer for those changes to apply appropriately.\n",(0,n.jsx)(t.strong,{children:"Note:"})," Legacy (BIOS) must use MBR partition table while Unified EFI (UEFI) must use GPT partition table."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Alongside these options, we also provide the ability to use full-disk encryption. For the obvious reason of it being full-disk, this assumes you are installing Solus onto the entire drive."}),"\n",(0,n.jsx)(t.h2,{id:"uefi",children:"UEFI"}),"\n",(0,n.jsx)(t.p,{children:"If you are using a system with UEFI, you may need to create an EFI System Partition, also referred to as an ESP. This is not necessary if you are enabling Solus to install onto the entire disk."}),"\n",(0,n.jsxs)(t.p,{children:["To create an EFI System Partition, open up GParted and create a FAT32 partition that is 1\xa0GB in size. Next, right-click on the partition and click Manage Flags. On the Manage Flags section, enable the ",(0,n.jsx)(t.code,{children:"boot"})," and ",(0,n.jsx)(t.code,{children:"esp"})," flags."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Notes:"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:'Your system must be booted using Unified EFI (UEFI) mode, as opposed to a "legacy (BIOS) mode".'}),"\n",(0,n.jsx)(t.li,{children:"Your disk is required to be GPT formatted."}),"\n",(0,n.jsx)(t.li,{children:"If you cannot see your SSD drive, set the SATA configuration to AHCI."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/38920c38.c3bb4798.js b/assets/js/38920c38.aa4aa254.js
similarity index 99%
rename from assets/js/38920c38.c3bb4798.js
rename to assets/js/38920c38.aa4aa254.js
index 4f8fde502..e7fdbf712 100644
--- a/assets/js/38920c38.c3bb4798.js
+++ b/assets/js/38920c38.aa4aa254.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5481],{50:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>h});var s=n(85893),t=n(11151);const i={title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},l="Printers and Scanners",o={id:"user/hardware/peripherals/printers-and-scanners",title:"Printers and Scanners",description:"Drivers",source:"@site/docs/user/hardware/peripherals/printers-and-scanners.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/printers-and-scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/printers-and-scanners.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},sidebar:"userSidebar",previous:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"},next:{title:"Package Management",permalink:"/docs/category/package-management"}},d={},h=[{value:"Drivers",id:"drivers",level:2},{value:"Brother",id:"brother",level:3},{value:"Compatibility",id:"compatibility",level:2},{value:"Brother",id:"brother-1",level:3},{value:"Brother",id:"brother-2",level:2},{value:"Network scanner",id:"network-scanner",level:3}];function a(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"printers-and-scanners",children:"Printers and Scanners"})}),"\n",(0,s.jsx)(r.h1,{id:"printers",children:"Printers"}),"\n",(0,s.jsx)(r.h2,{id:"drivers",children:"Drivers"}),"\n",(0,s.jsx)(r.p,{children:"Many printers will work out-of the box on Solus. If yours doesn't, you should try installing additional drivers."}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Brand"}),(0,s.jsx)(r.th,{children:"Driver Package(s)"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Canon"}),(0,s.jsx)(r.td,{children:"canon-ufriilt-common"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Dymo"}),(0,s.jsx)(r.td,{children:"dymo-cups-driver"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Epson"}),(0,s.jsx)(r.td,{children:"epson-inkjet-printer-escpr"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"HP"}),(0,s.jsx)(r.td,{children:"hplip"})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"brother",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["The Solus repositories include ",(0,s.jsx)(r.code,{children:"brlaser"}),", an open-source driver for many Brother monochrome laser printers and multi-function devices. Compatible models are listed ",(0,s.jsx)(r.a,{href:"https://github.com/Owl-Maintain/brlaser#supported-printers",children:"here"})]}),"\n",(0,s.jsx)(r.p,{children:"Other Brother drivers are distributed by Brother for a single printer only. Because of this, you will need to install the package for your specific printer."}),"\n",(0,s.jsxs)(r.p,{children:["For example, ",(0,s.jsx)(r.code,{children:"brother-mfc1910w"})," provides drivers for the MFC-1910w."]}),"\n",(0,s.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,s.jsx)(r.p,{children:"The following printers have been tested and/or suggested to function correctly by our users."}),"\n",(0,s.jsxs)(r.p,{children:["This list should not suggest that ",(0,s.jsx)(r.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,s.jsx)(r.h3,{id:"brother-1",children:"Brother"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"Brother DCP-135C"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1510"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1512"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1610W"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7010"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7060D"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-L2520DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1210W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1212W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-2220"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2315DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2320D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2360D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2375DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-1910W"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-440CN"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9130CW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9330CDW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J220"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J480DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2700DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2703DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2740DW"}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["Should your printer not be on this list, and the generic ",(0,s.jsx)(r.code,{children:"brlaser"})," driver does not work, you can request your printer here for inclusion ",(0,s.jsx)(r.a,{href:"https://github.com/getsolus/packages/issues/212",children:"here"})]}),"\n",(0,s.jsx)(r.h1,{id:"scanners",children:"Scanners"}),"\n",(0,s.jsx)(r.h2,{id:"brother-2",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["You can connect your Brother scanner via USB or LAN to be able to scan. To get newer Brother scanners to work you will have to install the package ",(0,s.jsx)(r.code,{children:"brscan4"})]}),"\n",(0,s.jsx)(r.h3,{id:"network-scanner",children:"Network scanner"}),"\n",(0,s.jsxs)(r.p,{children:["If your scanner is networked, you need to tell ",(0,s.jsx)(r.code,{children:"saned"})," the IP of your printer. It's advised to always give your printer the same IP inside your network (that is, a static IP address). Run the following command to accomplish this:"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"brsaneconfig4 -a name=SCANNER model=$MODEL ip=$IPOFYOURSCANNER\n"})})]})}function c(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,r,n)=>{n.d(r,{Z:()=>o,a:()=>l});var s=n(67294);const t={},i=s.createContext(t);function l(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5481],{50:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>h});var s=n(85893),t=n(11151);const i={title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},l="Printers and Scanners",o={id:"user/hardware/peripherals/printers-and-scanners",title:"Printers and Scanners",description:"Drivers",source:"@site/docs/user/hardware/peripherals/printers-and-scanners.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/printers-and-scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/printers-and-scanners.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},sidebar:"userSidebar",previous:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"},next:{title:"Package Management",permalink:"/docs/category/package-management"}},d={},h=[{value:"Drivers",id:"drivers",level:2},{value:"Brother",id:"brother",level:3},{value:"Compatibility",id:"compatibility",level:2},{value:"Brother",id:"brother-1",level:3},{value:"Brother",id:"brother-2",level:2},{value:"Network scanner",id:"network-scanner",level:3}];function a(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"printers-and-scanners",children:"Printers and Scanners"})}),"\n",(0,s.jsx)(r.h1,{id:"printers",children:"Printers"}),"\n",(0,s.jsx)(r.h2,{id:"drivers",children:"Drivers"}),"\n",(0,s.jsx)(r.p,{children:"Many printers will work out-of the box on Solus. If yours doesn't, you should try installing additional drivers."}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Brand"}),(0,s.jsx)(r.th,{children:"Driver Package(s)"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Canon"}),(0,s.jsx)(r.td,{children:"canon-ufriilt-common"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Dymo"}),(0,s.jsx)(r.td,{children:"dymo-cups-driver"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Epson"}),(0,s.jsx)(r.td,{children:"epson-inkjet-printer-escpr"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"HP"}),(0,s.jsx)(r.td,{children:"hplip"})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"brother",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["The Solus repositories include ",(0,s.jsx)(r.code,{children:"brlaser"}),", an open-source driver for many Brother monochrome laser printers and multi-function devices. Compatible models are listed ",(0,s.jsx)(r.a,{href:"https://github.com/Owl-Maintain/brlaser#supported-printers",children:"here"})]}),"\n",(0,s.jsx)(r.p,{children:"Other Brother drivers are distributed by Brother for a single printer only. Because of this, you will need to install the package for your specific printer."}),"\n",(0,s.jsxs)(r.p,{children:["For example, ",(0,s.jsx)(r.code,{children:"brother-mfc1910w"})," provides drivers for the MFC-1910w."]}),"\n",(0,s.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,s.jsx)(r.p,{children:"The following printers have been tested and/or suggested to function correctly by our users."}),"\n",(0,s.jsxs)(r.p,{children:["This list should not suggest that ",(0,s.jsx)(r.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,s.jsx)(r.h3,{id:"brother-1",children:"Brother"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"Brother DCP-135C"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1510"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1512"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1610W"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7010"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7060D"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-L2520DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1210W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1212W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-2220"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2315DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2320D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2360D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2375DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-1910W"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-440CN"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9130CW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9330CDW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J220"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J480DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2700DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2703DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2740DW"}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["Should your printer not be on this list, and the generic ",(0,s.jsx)(r.code,{children:"brlaser"})," driver does not work, you can request your printer here for inclusion ",(0,s.jsx)(r.a,{href:"https://github.com/getsolus/packages/issues/212",children:"here"})]}),"\n",(0,s.jsx)(r.h1,{id:"scanners",children:"Scanners"}),"\n",(0,s.jsx)(r.h2,{id:"brother-2",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["You can connect your Brother scanner via USB or LAN to be able to scan. To get newer Brother scanners to work you will have to install the package ",(0,s.jsx)(r.code,{children:"brscan4"})]}),"\n",(0,s.jsx)(r.h3,{id:"network-scanner",children:"Network scanner"}),"\n",(0,s.jsxs)(r.p,{children:["If your scanner is networked, you need to tell ",(0,s.jsx)(r.code,{children:"saned"})," the IP of your printer. It's advised to always give your printer the same IP inside your network (that is, a static IP address). Run the following command to accomplish this:"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"brsaneconfig4 -a name=SCANNER model=$MODEL ip=$IPOFYOURSCANNER\n"})})]})}function c(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,r,n)=>{n.d(r,{Z:()=>o,a:()=>l});var s=n(67294);const t={},i=s.createContext(t);function l(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3a2db09e.844e4be4.js b/assets/js/3a2db09e.844e4be4.js
new file mode 100644
index 000000000..1579f695f
--- /dev/null
+++ b/assets/js/3a2db09e.844e4be4.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9361],{57588:l=>{l.exports=JSON.parse('{"tags":[{"label":"housekeeping","permalink":"/blog/tags/housekeeping","count":1},{"label":"cleanup","permalink":"/blog/tags/cleanup","count":1},{"label":"devlog","permalink":"/blog/tags/devlog","count":4},{"label":"solus","permalink":"/blog/tags/solus","count":5},{"label":"pgo","permalink":"/blog/tags/pgo","count":1},{"label":"lto","permalink":"/blog/tags/lto","count":1},{"label":"packaging","permalink":"/blog/tags/packaging","count":1},{"label":"optimization","permalink":"/blog/tags/optimization","count":1},{"label":"3","permalink":"/blog/tags/3","count":1},{"label":"clang","permalink":"/blog/tags/clang","count":1},{"label":"gnu","permalink":"/blog/tags/gnu","count":1},{"label":"llvm","permalink":"/blog/tags/llvm","count":1},{"label":"glibc","permalink":"/blog/tags/glibc","count":1},{"label":"hwcaps","permalink":"/blog/tags/hwcaps","count":1},{"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3","count":1},{"label":"MATE","permalink":"/blog/tags/mate","count":1},{"label":"eopkg","permalink":"/blog/tags/eopkg","count":1},{"label":"moss","permalink":"/blog/tags/moss","count":1},{"label":"hello","permalink":"/blog/tags/hello","count":1},{"label":"firstpost","permalink":"/blog/tags/firstpost","count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/3a2db09e.bd0b6bc5.js b/assets/js/3a2db09e.bd0b6bc5.js
deleted file mode 100644
index a0e9c275c..000000000
--- a/assets/js/3a2db09e.bd0b6bc5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9361],{57588:l=>{l.exports=JSON.parse('{"tags":[{"label":"pgo","permalink":"/blog/tags/pgo","count":1},{"label":"lto","permalink":"/blog/tags/lto","count":1},{"label":"solus","permalink":"/blog/tags/solus","count":4},{"label":"packaging","permalink":"/blog/tags/packaging","count":1},{"label":"optimization","permalink":"/blog/tags/optimization","count":1},{"label":"3","permalink":"/blog/tags/3","count":1},{"label":"clang","permalink":"/blog/tags/clang","count":1},{"label":"gnu","permalink":"/blog/tags/gnu","count":1},{"label":"llvm","permalink":"/blog/tags/llvm","count":1},{"label":"glibc","permalink":"/blog/tags/glibc","count":1},{"label":"hwcaps","permalink":"/blog/tags/hwcaps","count":1},{"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3","count":1},{"label":"MATE","permalink":"/blog/tags/mate","count":1},{"label":"devlog","permalink":"/blog/tags/devlog","count":3},{"label":"eopkg","permalink":"/blog/tags/eopkg","count":1},{"label":"moss","permalink":"/blog/tags/moss","count":1},{"label":"hello","permalink":"/blog/tags/hello","count":1},{"label":"firstpost","permalink":"/blog/tags/firstpost","count":1}]}')}}]);
\ No newline at end of file
diff --git a/assets/js/3fdfc7ff.faa6fafd.js b/assets/js/3fdfc7ff.0f2beccb.js
similarity index 98%
rename from assets/js/3fdfc7ff.faa6fafd.js
rename to assets/js/3fdfc7ff.0f2beccb.js
index 3bbf2d50f..59a6db19a 100644
--- a/assets/js/3fdfc7ff.faa6fafd.js
+++ b/assets/js/3fdfc7ff.0f2beccb.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4608],{57884:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>i});var t=n(85893),a=n(11151);const c={title:"Basics to Package Management",summary:"Basics to Package Management"},o="Basics of package management in Solus",r={id:"user/package-management/basics",title:"Basics to Package Management",description:"Solus uses the eopkg package manager. You can use eopkg to install, update, and remove software packages on your Solus system.",source:"@site/docs/user/package-management/basics.md",sourceDirName:"user/package-management",slug:"/user/package-management/basics",permalink:"/docs/user/package-management/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/basics.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Basics to Package Management",summary:"Basics to Package Management"},sidebar:"userSidebar",previous:{title:"Package Management",permalink:"/docs/category/package-management"},next:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"}},d={},i=[];function l(e){const s={code:"code",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"basics-of-package-management-in-solus",children:"Basics of package management in Solus"})}),"\n",(0,t.jsxs)(s.p,{children:["Solus uses the eopkg package manager. You can use ",(0,t.jsx)(s.code,{children:"eopkg"})," to install, update, and remove software packages on your Solus system."]}),"\n",(0,t.jsxs)(s.p,{children:["The following table lists the most common ",(0,t.jsx)(s.code,{children:"eopkg"})," commands:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Action"}),(0,t.jsx)(s.th,{children:"Command"}),(0,t.jsx)(s.th,{children:"Example"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Install software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Reinstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Uninstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update your system"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade"})}),(0,t.jsx)(s.td,{children:"-"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update specific software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade firefox"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Search for software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search KEYWORD"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search documents"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Get information on software, such as description or version"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info gnome-documents"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>r,a:()=>o});var t=n(67294);const a={},c=t.createContext(a);function o(e){const s=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(c.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4608],{57884:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>i});var t=n(85893),a=n(11151);const c={title:"Basics to Package Management",summary:"Basics to Package Management"},o="Basics of package management in Solus",r={id:"user/package-management/basics",title:"Basics to Package Management",description:"Solus uses the eopkg package manager. You can use eopkg to install, update, and remove software packages on your Solus system.",source:"@site/docs/user/package-management/basics.md",sourceDirName:"user/package-management",slug:"/user/package-management/basics",permalink:"/docs/user/package-management/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/basics.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Basics to Package Management",summary:"Basics to Package Management"},sidebar:"userSidebar",previous:{title:"Package Management",permalink:"/docs/category/package-management"},next:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"}},d={},i=[];function l(e){const s={code:"code",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"basics-of-package-management-in-solus",children:"Basics of package management in Solus"})}),"\n",(0,t.jsxs)(s.p,{children:["Solus uses the eopkg package manager. You can use ",(0,t.jsx)(s.code,{children:"eopkg"})," to install, update, and remove software packages on your Solus system."]}),"\n",(0,t.jsxs)(s.p,{children:["The following table lists the most common ",(0,t.jsx)(s.code,{children:"eopkg"})," commands:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Action"}),(0,t.jsx)(s.th,{children:"Command"}),(0,t.jsx)(s.th,{children:"Example"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Install software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Reinstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Uninstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update your system"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade"})}),(0,t.jsx)(s.td,{children:"-"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update specific software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade firefox"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Search for software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search KEYWORD"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search documents"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Get information on software, such as description or version"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info gnome-documents"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>r,a:()=>o});var t=n(67294);const a={},c=t.createContext(a);function o(e){const s=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(c.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/3ff05326.9f3e5519.js b/assets/js/3ff05326.f1df6790.js
similarity index 99%
rename from assets/js/3ff05326.9f3e5519.js
rename to assets/js/3ff05326.f1df6790.js
index 09749113c..7058f94a4 100644
--- a/assets/js/3ff05326.9f3e5519.js
+++ b/assets/js/3ff05326.f1df6790.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2775],{17430:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>a,frontMatter:()=>d,metadata:()=>c,toc:()=>o});var i=n(85893),r=n(11151);const d={title:"Package YAML",summary:"Learning the package.yml packaging format"},l="package.yml",c={id:"packaging/package.yml",title:"Package YAML",description:'Each package is generated from a single build file named package.yml. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.',source:"@site/docs/packaging/package.yml.md",sourceDirName:"packaging",slug:"/packaging/package.yml",permalink:"/docs/packaging/package.yml",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/package.yml.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Package YAML",summary:"Learning the package.yml packaging format"},sidebar:"packagingSidebar",previous:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"},next:{title:"Packaging Practices",permalink:"/docs/packaging/packaging-practices"}},t={},o=[{value:"Format",id:"format",level:2},{value:"Keys",id:"keys",level:2},{value:"Mandatory keys",id:"mandatory-keys",level:3},{value:""source" key",id:"source-key",level:4},{value:"Optional, supported keys",id:"optional-supported-keys",level:3},{value:"Packaging step keys, optional",id:"packaging-step-keys-optional",level:3},{value:"Optimize values",id:"optimize-values",level:2},{value:"Macros",id:"macros",level:2},{value:"Usage",id:"usage",level:3},{value:"Actionable macros",id:"actionable-macros",level:3},{value:"Haskell actionable macros",id:"haskell-actionable-macros",level:3},{value:"Ninja actionable macros",id:"ninja-actionable-macros",level:3},{value:"Perl actionable macros",id:"perl-actionable-macros",level:3},{value:"Python actionable macros",id:"python-actionable-macros",level:3},{value:"Ruby actionable macros",id:"ruby-actionable-macros",level:3},{value:"Rust (cargo) actionable macros",id:"rust-cargo-actionable-macros",level:3},{value:"Qt actionable macros",id:"qt-actionable-macros",level:3},{value:"Waf actionable macros",id:"waf-actionable-macros",level:3},{value:"BOLT actionable macros",id:"bolt-actionable-macros",level:3},{value:"Variable macros",id:"variable-macros",level:3},{value:"Variables",id:"variables",level:2},{value:"Types",id:"types",level:2},{value:"string",id:"string",level:3},{value:"string(s)",id:"strings",level:3},{value:"integer",id:"integer",level:3},{value:"list",id:"list",level:3},{value:"dict",id:"dict",level:3},{value:"dict(s)",id:"dicts",level:3},{value:"Packaging practices",id:"packaging-practices",level:2}];function h(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"packageyml",children:(0,i.jsx)(s.code,{children:"package.yml"})})}),"\n",(0,i.jsxs)(s.p,{children:["Each package is generated from a single build file named ",(0,i.jsx)(s.code,{children:"package.yml"}),'. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.']}),"\n",(0,i.jsx)(s.h2,{id:"format",children:"Format"}),"\n",(0,i.jsxs)(s.p,{children:["All ",(0,i.jsx)(s.code,{children:"package.yml"})," files ",(0,i.jsx)(s.strong,{children:"must"})," be valid YAML."]}),"\n",(0,i.jsxs)(s.p,{children:["The file is organised into a key\u2192value hierarchy. The ",(0,i.jsx)(s.code,{children:"ypkg"})," tool parses a ",(0,i.jsx)(s.code,{children:"package.yml"})," file to build the corresponding package in a declarative manner. As such, most of the keys are simple strings, lists or nested key\u2192value pairs. A special case consists in the packaging steps, which are scripts."]}),"\n",(0,i.jsx)(s.p,{children:"An example file follows:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"name : nano\nversion : 2.9.5\nrelease : 96\nsource :\n - https://www.nano-editor.org/dist/v2.9/nano-2.9.5.tar.xz: 7b8d181cb57f42fa86a380bb9ad46abab859b60383607f731b65a9077f4b4e19\nhomepage : https://www.nano-editor.org\nlicense : GPL-3.0-or-later\nsummary : Small, friendly text editor inspired by Pico\ncomponent : system.devel\ndescription: |\n GNU nano is an easy-to-use text editor originally designed as a replacement for Pico, the ncurses-based editor from the non-free mailer package Pine (itself now available under the Apache License as Alpine).\nsetup : |\n %patch -p1 -i $pkgfiles/0001-Use-a-stateless-configuration.patch\n %reconfigure --enable-utf8 --docdir=/usr/share/doc/nano\nbuild : |\n %make\ninstall : |\n %make_install\n install -D -m 00644 $pkgfiles/nanorc $installdir/usr/share/defaults/nano/nanorc\n install -D -m 00644 $pkgfiles/git.nanorc $installdir/usr/share/nano/git.nanorc\n # https://github.com/scopatz/nanorc\n for rcFile in $pkgfiles/nanorc-extras/*.nanorc; do\n install -m 00644 $rcFile $installdir/usr/share/nano\n done\n"})}),"\n",(0,i.jsx)(s.h2,{id:"keys",children:"Keys"}),"\n",(0,i.jsxs)(s.p,{children:["Not all fields in ",(0,i.jsx)(s.code,{children:"package.yml"})," are mandatory, but a small selection are. Below is the complete list of the available fields."]}),"\n",(0,i.jsx)(s.h3,{id:"mandatory-keys",children:"Mandatory keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"name"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The name of the package. This is also used as the base of all sub-package names. Unless unavoidable, this should match the upstream name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"version"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The version of the currently packaged software. This is taken from the tarball in most cases."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"release"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"integer"})}),(0,i.jsxs)(s.td,{children:["Specifies the current release number. Updates in the package number are based on this ",(0,i.jsx)(s.code,{children:"release"})," number, ",(0,i.jsx)(s.em,{children:"not"})," the ",(0,i.jsx)(s.code,{children:"version"})," number. As such, to release an update to users, this number must be incremented by one."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"source"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["See ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#source-key",children:"source key"})," below."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"homepage"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Provides a link to the package's homepage, used in the Software Center."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"license"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsxs)(s.td,{children:["Valid upstream license(s). Try to ensure these use ",(0,i.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX identifiers"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"summary"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Brief package summary, or display name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"component"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsxs)(s.td,{children:["Component / group of packages this package belongs to. Check available components via ",(0,i.jsx)(s.code,{children:"eopkg lc"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"description"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"More extensive description of the software, usually taken from the vendor website."})]})]})]}),"\n",(0,i.jsx)(s.h4,{id:"source-key",children:'"source" key'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Tarball source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:['Upstream source URL to the source code archive (often called the "tarball"), followed by the ',(0,i.jsx)(s.code,{children:"sha256sum"})," for the tarball, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526"})]}),"\n",(0,i.jsx)(s.li,{children:"Tarball sources are preferred over git sources, whenever possible, because git tags can be changed to point to different commits."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Git source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Git repository URL prefixed with ",(0,i.jsx)(s.code,{children:"git|"}),", followed by the git tag or commit hash, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"git|https://github.com/getsolus/solus-sc.git : 6e786b3e86982272717ca4bed4f783fc43a678f3"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Multiple sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If multiple sources are listed, only the first source will be copied from the ",(0,i.jsx)(s.code,{children:"$sources"})," directory to the ",(0,i.jsx)(s.code,{children:"$workdir"})," directory."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Renaming sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"If the file resulting from the source download needs to be renamed (often to avoid a name that would conflict with another source), add the preferred name to the URL as a URI fragment."}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://github.com/docker/cli/archive/refs/tags/v25.0.3.tar.gz#docker-cli.tar.gz : 04ad0cea992a65db20cb1b0dbf6d1ce32c705ce879de51b22095fe8d28030815"})]}),"\n",(0,i.jsxs)(s.li,{children:["This renames the downloaded file from ",(0,i.jsx)(s.code,{children:"v25.0.3.tar.gz"})," to ",(0,i.jsx)(s.code,{children:"docker-cli.tar.gz"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["SourceForge sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["A proper SourceForge source looks like this, using ",(0,i.jsx)(s.code,{children:"hplip"})," as an example: ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/projects/hplip/files/hplip/3.24.4/hplip-3.24.4.tar.gz"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["This URL begins with ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/"}),", not ",(0,i.jsx)(s.code,{children:"https://downloads.sourceforge.net/"}),", or some other mirror."]}),"\n",(0,i.jsxs)(s.li,{children:["This URL has a path beginning with ",(0,i.jsx)(s.code,{children:"/projects/$project_name/"})]}),"\n",(0,i.jsxs)(s.li,{children:["This URL does ",(0,i.jsx)(s.em,{children:"not"})," have a trailing ",(0,i.jsx)(s.code,{children:"/download"}),", you may have to remove this by hand."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:'The correct SourceForge tarball URLs are found under the "Files" tab, then often within a directory, when starting from a project homepage on SourceForge.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"optional-supported-keys",children:"Optional, supported keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"clang"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," if this package benefits from being built with Clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"extract"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic source extraction."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"autodep"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic binary dependency resolution at build time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emul32"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable an ",(0,i.jsx)(s.code,{children:"-m32"})," build (32-bit libs)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"libsplit"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable splitting of libraries into ",(0,i.jsx)(s.code,{children:"devel"})," sub-packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"conflicts"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsx)(s.td,{children:"Specify packages that cannot be installed together with this one."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"optimize"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify preset keys to modify compiler and linker flags during build. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#optimize-values",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"builddeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#build-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"rundeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify further runtime dependencies for the packages. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#runtime-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"checkdeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package which will ",(0,i.jsx)(s.em,{children:"not"})," be considered when determining build order for automatic builds. These dependencies should only be used during the ",(0,i.jsx)(s.code,{children:"check"})," build phase. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#check-dependencies",children:"here"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"replaces"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsx)(s.td,{children:"Replace one package with another, used when renaming or deprecating packages for clean upgrade paths."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"patterns"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Allows fine grained control over file placement within the package or sub-packages. Useful for packages that are development only (i.e. ",(0,i.jsx)(s.code,{children:"/usr/bin"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"environment"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"unicode"})}),(0,i.jsx)(s.td,{children:"Specify code that will be exported to all packaging steps of the build (i.e. exporting variables for the entire build)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"networking"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable networking within solbuild."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"packaging-step-keys-optional",children:"Packaging step keys, optional"}),"\n",(0,i.jsxs)(s.p,{children:["The packaging steps are all considered optional, however the absence of the ",(0,i.jsx)(s.code,{children:"install"})," step will result in no package generated. Each of these keys contains content that will be placed within a script and executed within a controlled environment to perform the package build. For all intents and purposes, they are Bash scripts with a predefined environment."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Step Name"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"setup"})}),(0,i.jsxs)(s.td,{children:["Performed after the source extraction. This is the correct place to perform any ",(0,i.jsx)(s.code,{children:"configure"})," routine, or to ",(0,i.jsx)(s.code,{children:"patch"})," the sources."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"build"})}),(0,i.jsxs)(s.td,{children:["Use this step to run the build portion, for example, ",(0,i.jsx)(s.code,{children:"make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"install"})}),(0,i.jsxs)(s.td,{children:["This is where you should install the files into the final packaging directory, for example, ",(0,i.jsx)(s.code,{children:"make install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"check"})}),(0,i.jsxs)(s.td,{children:["This is where tests / checking should occur, for example, ",(0,i.jsx)(s.code,{children:"make check"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"profile"})}),(0,i.jsxs)(s.td,{children:["This is where profiling tests should be specified. ",(0,i.jsx)(s.code,{children:"ypkg"})," will handle setting flags to generate profiling data and using that data for an optimized build."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"optimize-values",children:"Optimize values"}),"\n",(0,i.jsxs)(s.p,{children:["One or more optimize values can be specified in a list with the ",(0,i.jsx)(s.code,{children:"optimize"})," key in the ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Several values can override or conflict with each other and should be used only where they provide a performance benefit, or fix a bug in the package or build."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Optimize Value"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"speed"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package for performance ",(0,i.jsx)(s.code,{children:"-O3"})," plus other flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"size"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package build to minimize size ",(0,i.jsx)(s.code,{children:"-Os"}),". Not supported with clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-bind-now"})}),(0,i.jsx)(s.td,{children:"Configures the package to disable certain flags, where RELRO is unsupported."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-symbolic"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-Wl,-Bsymbolic-functions"})," linker flag."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"unroll-loops"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-funroll-loops"}),". Use this sparingly, only when it provides proven benefit."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"runpath"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-Wl,--enable-new-dtags"})," to make linker use RUNPATH's instead of RPATH's."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"avx256"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-mprefer-vector-width=128"})," in avx2 builds."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"thin-lto"})}),(0,i.jsxs)(s.td,{children:["Enables Thin Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto=thin"})," with a supported linker."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"lto"})}),(0,i.jsxs)(s.td,{children:["Enables Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-safe"})}),(0,i.jsxs)(s.td,{children:["Enables safe Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=safe"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-all"})}),(0,i.jsxs)(s.td,{children:["Enables Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=all"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"polly"})}),(0,i.jsx)(s.td,{children:"Enables polyhedral optimizations for the clang toolchain."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"function-sections"})}),(0,i.jsx)(s.td,{children:"Generate a separate ELF section for each function. Recommended with ICF when not using clang."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-reorder-blocks-partition"})}),(0,i.jsx)(s.td,{children:"Disables block partition reordering with the gcc toolchain. Provided to facilitate BOLT'ed binaries/libraries."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emit-relocs"})}),(0,i.jsx)(s.td,{children:"Instructs the linker to emit relocations. Provided to facilitate BOLT'ed binaries/libraries."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"macros",children:"Macros"}),"\n",(0,i.jsx)(s.p,{children:"To further assist in packaging, a number of macros are available. These are simply shorthand ways to perform a normal build operation. They also ensure that the resulting package is consistent. These macros are only available in our packaging steps, as they are substituted within the script before execution."}),"\n",(0,i.jsx)(s.h3,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(s.p,{children:["Macros are prefixed with ",(0,i.jsx)(s.code,{children:"%"}),", and are substituted before your script is executed. Macros ending with ",(0,i.jsx)(s.code,{children:"%"})," are used to provide directory names or build values to the script."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"# Run the configure macro with the given arguments\n%configure --disable-static\n"})}),"\n",(0,i.jsx)(s.h3,{id:"actionable-macros",children:"Actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%autogen"})}),(0,i.jsxs)(s.td,{children:["Runs autogen with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," to create a configure script then proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake"})}),(0,i.jsx)(s.td,{children:"Configures a CMake project with the distribution specific options, such as prefix and release type."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake_ninja"})}),(0,i.jsxs)(s.td,{children:["Configures a CMake project with ninja so it can be used with ",(0,i.jsx)(s.code,{children:"%ninja_build"}),", ",(0,i.jsx)(s.code,{children:"%ninja_install"})," and ",(0,i.jsx)(s.code,{children:"%ninja_check"})," macros."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"./configure"})," with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," variable macro."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure_no_runstatedir"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"%configure"})," without the ",(0,i.jsx)(s.code,{children:"--runstatedir"})," option. Use if you encounter ",(0,i.jsx)(s.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make"})}),(0,i.jsxs)(s.td,{children:["Runs the ",(0,i.jsx)(s.code,{children:"make"})," command with the job count specified in ",(0,i.jsx)(s.code,{children:"eopkg.conf"})," (",(0,i.jsx)(s.a,{href:"/docs/packaging/advanced-config/eopkg-configuration",children:"more info"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make_install"})}),(0,i.jsxs)(s.td,{children:["Performs a ",(0,i.jsx)(s.code,{children:"make install"}),", using the ",(0,i.jsx)(s.code,{children:"DESTDIR"})," variant. Should work for the vast majority of packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%patch"})}),(0,i.jsx)(s.td,{children:"Sane patch macro to run in batch mode and not contaminate source tree on failure."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%apply_patches"})}),(0,i.jsxs)(s.td,{children:["Applies all patches listed in the ",(0,i.jsx)(s.code,{children:"series"})," file in ",(0,i.jsx)(s.code,{children:"./files"})," folder."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%reconfigure"})}),(0,i.jsxs)(s.td,{children:["Updates build scripts such as ",(0,i.jsx)(s.code,{children:"./configure"})," and proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%symlink_check"})}),(0,i.jsx)(s.td,{children:"Checks for broken symlinks in the install directory and aborts the build if any are found. Must run after install macros."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"haskell-actionable-macros",children:"Haskell actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cabal_configure"})}),(0,i.jsx)(s.td,{children:"Configures a Cabal project that requires online dependencies, like a Cargo-style build"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell configure"})," with prefix, libdir, etc. and ensures the necessary package.conf.d is copied to the correct location."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell build"})," with ",(0,i.jsx)(s.code,{children:"%JOBS%"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell copy"})," to ",(0,i.jsx)(s.code,{children:"$installdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_register"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell register"})," to generate a pkg-config for package and version, then installs the conf file."]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Existing Haskell packages may use the old ",(0,i.jsx)(s.code,{children:"cabal_build"}),", ",(0,i.jsx)(s.code,{children:"cabal_install"}),", ",(0,i.jsx)(s.code,{children:"cabal_register"})," macros. Please use the new ",(0,i.jsx)(s.code,{children:"haskell_*"})," macros instead."]}),"\n",(0,i.jsx)(s.h3,{id:"ninja-actionable-macros",children:"Ninja actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%meson_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"meson"})," with our CFLAGS and appropriate flags such as ",(0,i.jsx)(s.code,{children:"libdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"DESTDIR"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_check"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja test"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_check"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"perl-actionable-macros",children:"Perl actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_setup"})}),(0,i.jsxs)(s.td,{children:["Runs Perl setup scripts ",(0,i.jsx)(s.code,{children:"Build.pl"})," or ",(0,i.jsx)(s.code,{children:"Makefile.pl"})," with the appropriate variable flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_build"})}),(0,i.jsxs)(s.td,{children:["Runs Perl build scripts or attempts ",(0,i.jsx)(s.code,{children:"%make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_install"})}),(0,i.jsxs)(s.td,{children:["Runs Perl install scripts or attempts ",(0,i.jsx)(s.code,{children:"%make_install"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"python-actionable-macros",children:"Python actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python2. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python2. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python3. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python3. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"ruby-actionable-macros",children:"Ruby actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem install"})," with the appropriate parameters."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"rust-cargo-actionable-macros",children:"Rust (cargo) actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_fetch"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo fetch --locked"})," to get dependencies."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo build"})," with some additional flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_install"})}),(0,i.jsxs)(s.td,{children:["Installs the built binary to ",(0,i.jsx)(s.code,{children:"/usr/bin/PACKAGE-NAME"}),", OR to ",(0,i.jsx)(s.code,{children:"/usr/bin/ARGUMENT"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_test"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo test"})," with some additional flags."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"qt-actionable-macros",children:"Qt actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt5 with the appropriate make flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake4"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt4, as well as adding the necessary MOC, RCC, and UIC flags since those Qt4 executables end in -qt4."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml_cache"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.qml"})," files into ",(0,i.jsx)(s.code,{children:"*.qmlc"})," so they are compiled ahead of time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml6_cache"})}),(0,i.jsxs)(s.td,{children:["Same as ",(0,i.jsx)(s.code,{children:"%qml_cache"}),", but for Qt6."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"waf-actionable-macros",children:"Waf actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf configure"})," with prefix."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"destdir"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"bolt-actionable-macros",children:"BOLT actionable macros"}),"\n",(0,i.jsx)(s.p,{children:"BOLT is a post-link optimizer developed to speed up large applications. You will need to run a workload after instrumenting a binary or library. Think of it as post-link profile guided optimization."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_instr"})}),(0,i.jsxs)(s.td,{children:["Instrument a binary or library with llvm-bolt. Requires it to be built with ",(0,i.jsx)(s.code,{children:"emit-relocs"}),", as well as ",(0,i.jsx)(s.code,{children:"no-reorder-blocks-partition"})," if not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_merge"})}),(0,i.jsx)(s.td,{children:"Merge fdata profiles into a single file after running a workload with a BOLT instrumented binary."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_opt"})}),(0,i.jsxs)(s.td,{children:["Optimize a binary using BOLT after running ",(0,i.jsx)(s.code,{children:"%bolt_merge"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"variable-macros",children:"Variable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ARCH%"})}),(0,i.jsx)(s.td,{children:"Indicates the current build architecture."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CC%"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CONFOPTS%"})}),(0,i.jsxs)(s.td,{children:["Flags / options for configuration, such as ",(0,i.jsx)(s.code,{children:"--prefix=%PREFIX%"}),". ",(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/blob/v33/ypkg2/rc.yml#L446-L458",children:"Full List."})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXX%"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXXFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%JOBS%"})}),(0,i.jsxs)(s.td,{children:["jobs, as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LDFLAGS%"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LIBSUFFIX%"})}),(0,i.jsx)(s.td,{children:"Library suffix (either 32 for 32-bit or 64 for 64-bit)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%PREFIX%"})}),(0,i.jsxs)(s.td,{children:["Hard-coded prefix ",(0,i.jsx)(s.code,{children:"/usr"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%YJOBS%"})}),(0,i.jsxs)(s.td,{children:["Job count without ",(0,i.jsx)(s.code,{children:"-j"})," as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%installroot%"})}),(0,i.jsx)(s.td,{children:"Hard-coded install directory."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%libdir%"})}),(0,i.jsxs)(s.td,{children:["The distribution\u2019s default library directory, i.e. ",(0,i.jsx)(s.code,{children:"/usr/lib64"})," (Alters for ",(0,i.jsx)(s.code,{children:"emul32"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%version%"})}),(0,i.jsxs)(s.td,{children:["Version of the package, as specified in the ",(0,i.jsx)(s.code,{children:"version"})," key."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%workdir%"})}),(0,i.jsx)(s.td,{children:"Hard-coded work directory (source tree)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_lts%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-lts"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_current%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-current"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python2_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python"})," (Python 2) distribution."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python3"})," distribution."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"variables",children:"Variables"}),"\n",(0,i.jsx)(s.p,{children:"A set of variables are exported in our build stages. These are used to provide context and structure to the scripts."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Variable"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CFLAGS"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXXFLAGS"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$LDFLAGS"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CC"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXX"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$EMUL32BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"emul32"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$AVX2BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"avx2"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_GEN_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the instrumentation phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_USE_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the use phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$installdir"})}),(0,i.jsx)(s.td,{children:"The install directory, i.e. where files are installed to for packaging."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$pkgfiles"})}),(0,i.jsxs)(s.td,{children:["Refers to the ",(0,i.jsx)(s.code,{children:"./files"})," directory relative to the ",(0,i.jsx)(s.code,{children:"package.yml"})," file."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$sources"})}),(0,i.jsxs)(s.td,{children:["Refers to the directory where your source files are stored, for example, ",(0,i.jsx)(s.code,{children:"$sources/nano.tar.gz"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$workdir"})}),(0,i.jsx)(s.td,{children:"The work, or source, directory of the package build."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"types",children:"Types"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"package.yml"})," file uses native YAML types, however it follows syntactic conventions and may accept multiple value types for a given key."]}),"\n",(0,i.jsx)(s.h3,{id:"string",children:"string"}),"\n",(0,i.jsx)(s.p,{children:"This is simply text, which does not need to be quoted."}),"\n",(0,i.jsx)(s.h3,{id:"strings",children:"string(s)"}),"\n",(0,i.jsxs)(s.p,{children:["Indicates that it is possible to use a ",(0,i.jsx)(s.code,{children:"list"})," of strings, or one single ",(0,i.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"integer",children:"integer"}),"\n",(0,i.jsxs)(s.p,{children:["Whole, positive number, used in the ",(0,i.jsx)(s.code,{children:"release"})," field."]}),"\n",(0,i.jsx)(s.h3,{id:"list",children:"list"}),"\n",(0,i.jsx)(s.p,{children:"A YAML list (or array) can be expressed in multiple ways. A short array-notation would look like this:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"[one, two, three]"})}),"\n",(0,i.jsx)(s.p,{children:"They can also be expressed like this:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- First Value\n- Second Value\n- Third Value\n"})}),"\n",(0,i.jsx)(s.h3,{id:"dict",children:"dict"}),"\n",(0,i.jsxs)(s.p,{children:["Known as an associative array, this is key to value mapping. These are separated by a colon (",(0,i.jsx)(s.code,{children:":"}),"), the token on the left is taken to be a key, and the token on the right is the value."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"SomeKey: Some Value"})}),"\n",(0,i.jsxs)(s.p,{children:["Note that each ",(0,i.jsx)(s.code,{children:"ypkg key"})," in the YAML file is actually a dict."]}),"\n",(0,i.jsx)(s.h3,{id:"dicts",children:"dict(s)"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"dict(s)"})," consists of a list of ",(0,i.jsx)(s.code,{children:"dict"}),"s and some assumptions. We primarily make use of this to express advanced information within the package. These permit you to provide no key, and a value only.\nIn this instance, the key is implicitly assumed to be the package name (for example, ",(0,i.jsx)(s.code,{children:"nano"}),"):"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- some value"})}),"\n",(0,i.jsx)(s.p,{children:"An explicit key, usually a sub-package name:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- somekey: somevalue"})}),"\n",(0,i.jsx)(s.p,{children:"A mix of both:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- somevalue\n- somekey: another value\n"})}),"\n",(0,i.jsx)(s.p,{children:"The values may also be expressed in list form, still using the same default key logic:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- [one, two, three]\n- somekey: [one, two, three]\n- key:\n - value one\n - value two\n - value three\n"})}),"\n",(0,i.jsx)(s.h2,{id:"packaging-practices",children:"Packaging practices"}),"\n",(0,i.jsxs)(s.p,{children:["The concepts in this document merely expose the syntax of a ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Solus adheres to strict packaging practices and conventions which packagers must follow. They are explained in the ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"})," article."]})]})}function a(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>c,a:()=>l});var i=n(67294);const r={},d=i.createContext(r);function l(e){const s=i.useContext(d);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(d.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2775],{17430:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>a,frontMatter:()=>d,metadata:()=>c,toc:()=>o});var i=n(85893),r=n(11151);const d={title:"Package YAML",summary:"Learning the package.yml packaging format"},l="package.yml",c={id:"packaging/package.yml",title:"Package YAML",description:'Each package is generated from a single build file named package.yml. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.',source:"@site/docs/packaging/package.yml.md",sourceDirName:"packaging",slug:"/packaging/package.yml",permalink:"/docs/packaging/package.yml",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/package.yml.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Package YAML",summary:"Learning the package.yml packaging format"},sidebar:"packagingSidebar",previous:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"},next:{title:"Packaging Practices",permalink:"/docs/packaging/packaging-practices"}},t={},o=[{value:"Format",id:"format",level:2},{value:"Keys",id:"keys",level:2},{value:"Mandatory keys",id:"mandatory-keys",level:3},{value:""source" key",id:"source-key",level:4},{value:"Optional, supported keys",id:"optional-supported-keys",level:3},{value:"Packaging step keys, optional",id:"packaging-step-keys-optional",level:3},{value:"Optimize values",id:"optimize-values",level:2},{value:"Macros",id:"macros",level:2},{value:"Usage",id:"usage",level:3},{value:"Actionable macros",id:"actionable-macros",level:3},{value:"Haskell actionable macros",id:"haskell-actionable-macros",level:3},{value:"Ninja actionable macros",id:"ninja-actionable-macros",level:3},{value:"Perl actionable macros",id:"perl-actionable-macros",level:3},{value:"Python actionable macros",id:"python-actionable-macros",level:3},{value:"Ruby actionable macros",id:"ruby-actionable-macros",level:3},{value:"Rust (cargo) actionable macros",id:"rust-cargo-actionable-macros",level:3},{value:"Qt actionable macros",id:"qt-actionable-macros",level:3},{value:"Waf actionable macros",id:"waf-actionable-macros",level:3},{value:"BOLT actionable macros",id:"bolt-actionable-macros",level:3},{value:"Variable macros",id:"variable-macros",level:3},{value:"Variables",id:"variables",level:2},{value:"Types",id:"types",level:2},{value:"string",id:"string",level:3},{value:"string(s)",id:"strings",level:3},{value:"integer",id:"integer",level:3},{value:"list",id:"list",level:3},{value:"dict",id:"dict",level:3},{value:"dict(s)",id:"dicts",level:3},{value:"Packaging practices",id:"packaging-practices",level:2}];function h(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"packageyml",children:(0,i.jsx)(s.code,{children:"package.yml"})})}),"\n",(0,i.jsxs)(s.p,{children:["Each package is generated from a single build file named ",(0,i.jsx)(s.code,{children:"package.yml"}),'. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.']}),"\n",(0,i.jsx)(s.h2,{id:"format",children:"Format"}),"\n",(0,i.jsxs)(s.p,{children:["All ",(0,i.jsx)(s.code,{children:"package.yml"})," files ",(0,i.jsx)(s.strong,{children:"must"})," be valid YAML."]}),"\n",(0,i.jsxs)(s.p,{children:["The file is organised into a key\u2192value hierarchy. The ",(0,i.jsx)(s.code,{children:"ypkg"})," tool parses a ",(0,i.jsx)(s.code,{children:"package.yml"})," file to build the corresponding package in a declarative manner. As such, most of the keys are simple strings, lists or nested key\u2192value pairs. A special case consists in the packaging steps, which are scripts."]}),"\n",(0,i.jsx)(s.p,{children:"An example file follows:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"name : nano\nversion : 2.9.5\nrelease : 96\nsource :\n - https://www.nano-editor.org/dist/v2.9/nano-2.9.5.tar.xz: 7b8d181cb57f42fa86a380bb9ad46abab859b60383607f731b65a9077f4b4e19\nhomepage : https://www.nano-editor.org\nlicense : GPL-3.0-or-later\nsummary : Small, friendly text editor inspired by Pico\ncomponent : system.devel\ndescription: |\n GNU nano is an easy-to-use text editor originally designed as a replacement for Pico, the ncurses-based editor from the non-free mailer package Pine (itself now available under the Apache License as Alpine).\nsetup : |\n %patch -p1 -i $pkgfiles/0001-Use-a-stateless-configuration.patch\n %reconfigure --enable-utf8 --docdir=/usr/share/doc/nano\nbuild : |\n %make\ninstall : |\n %make_install\n install -D -m 00644 $pkgfiles/nanorc $installdir/usr/share/defaults/nano/nanorc\n install -D -m 00644 $pkgfiles/git.nanorc $installdir/usr/share/nano/git.nanorc\n # https://github.com/scopatz/nanorc\n for rcFile in $pkgfiles/nanorc-extras/*.nanorc; do\n install -m 00644 $rcFile $installdir/usr/share/nano\n done\n"})}),"\n",(0,i.jsx)(s.h2,{id:"keys",children:"Keys"}),"\n",(0,i.jsxs)(s.p,{children:["Not all fields in ",(0,i.jsx)(s.code,{children:"package.yml"})," are mandatory, but a small selection are. Below is the complete list of the available fields."]}),"\n",(0,i.jsx)(s.h3,{id:"mandatory-keys",children:"Mandatory keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"name"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The name of the package. This is also used as the base of all sub-package names. Unless unavoidable, this should match the upstream name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"version"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The version of the currently packaged software. This is taken from the tarball in most cases."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"release"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"integer"})}),(0,i.jsxs)(s.td,{children:["Specifies the current release number. Updates in the package number are based on this ",(0,i.jsx)(s.code,{children:"release"})," number, ",(0,i.jsx)(s.em,{children:"not"})," the ",(0,i.jsx)(s.code,{children:"version"})," number. As such, to release an update to users, this number must be incremented by one."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"source"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["See ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#source-key",children:"source key"})," below."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"homepage"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Provides a link to the package's homepage, used in the Software Center."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"license"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsxs)(s.td,{children:["Valid upstream license(s). Try to ensure these use ",(0,i.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX identifiers"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"summary"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Brief package summary, or display name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"component"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsxs)(s.td,{children:["Component / group of packages this package belongs to. Check available components via ",(0,i.jsx)(s.code,{children:"eopkg lc"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"description"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"More extensive description of the software, usually taken from the vendor website."})]})]})]}),"\n",(0,i.jsx)(s.h4,{id:"source-key",children:'"source" key'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Tarball source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:['Upstream source URL to the source code archive (often called the "tarball"), followed by the ',(0,i.jsx)(s.code,{children:"sha256sum"})," for the tarball, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526"})]}),"\n",(0,i.jsx)(s.li,{children:"Tarball sources are preferred over git sources, whenever possible, because git tags can be changed to point to different commits."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Git source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Git repository URL prefixed with ",(0,i.jsx)(s.code,{children:"git|"}),", followed by the git tag or commit hash, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"git|https://github.com/getsolus/solus-sc.git : 6e786b3e86982272717ca4bed4f783fc43a678f3"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Multiple sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If multiple sources are listed, only the first source will be copied from the ",(0,i.jsx)(s.code,{children:"$sources"})," directory to the ",(0,i.jsx)(s.code,{children:"$workdir"})," directory."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Renaming sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"If the file resulting from the source download needs to be renamed (often to avoid a name that would conflict with another source), add the preferred name to the URL as a URI fragment."}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://github.com/docker/cli/archive/refs/tags/v25.0.3.tar.gz#docker-cli.tar.gz : 04ad0cea992a65db20cb1b0dbf6d1ce32c705ce879de51b22095fe8d28030815"})]}),"\n",(0,i.jsxs)(s.li,{children:["This renames the downloaded file from ",(0,i.jsx)(s.code,{children:"v25.0.3.tar.gz"})," to ",(0,i.jsx)(s.code,{children:"docker-cli.tar.gz"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["SourceForge sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["A proper SourceForge source looks like this, using ",(0,i.jsx)(s.code,{children:"hplip"})," as an example: ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/projects/hplip/files/hplip/3.24.4/hplip-3.24.4.tar.gz"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["This URL begins with ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/"}),", not ",(0,i.jsx)(s.code,{children:"https://downloads.sourceforge.net/"}),", or some other mirror."]}),"\n",(0,i.jsxs)(s.li,{children:["This URL has a path beginning with ",(0,i.jsx)(s.code,{children:"/projects/$project_name/"})]}),"\n",(0,i.jsxs)(s.li,{children:["This URL does ",(0,i.jsx)(s.em,{children:"not"})," have a trailing ",(0,i.jsx)(s.code,{children:"/download"}),", you may have to remove this by hand."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:'The correct SourceForge tarball URLs are found under the "Files" tab, then often within a directory, when starting from a project homepage on SourceForge.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"optional-supported-keys",children:"Optional, supported keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"clang"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," if this package benefits from being built with Clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"extract"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic source extraction."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"autodep"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic binary dependency resolution at build time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emul32"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable an ",(0,i.jsx)(s.code,{children:"-m32"})," build (32-bit libs)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"libsplit"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable splitting of libraries into ",(0,i.jsx)(s.code,{children:"devel"})," sub-packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"conflicts"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsx)(s.td,{children:"Specify packages that cannot be installed together with this one."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"optimize"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify preset keys to modify compiler and linker flags during build. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#optimize-values",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"builddeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#build-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"rundeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify further runtime dependencies for the packages. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#runtime-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"checkdeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package which will ",(0,i.jsx)(s.em,{children:"not"})," be considered when determining build order for automatic builds. These dependencies should only be used during the ",(0,i.jsx)(s.code,{children:"check"})," build phase. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#check-dependencies",children:"here"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"replaces"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsx)(s.td,{children:"Replace one package with another, used when renaming or deprecating packages for clean upgrade paths."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"patterns"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Allows fine grained control over file placement within the package or sub-packages. Useful for packages that are development only (i.e. ",(0,i.jsx)(s.code,{children:"/usr/bin"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"environment"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"unicode"})}),(0,i.jsx)(s.td,{children:"Specify code that will be exported to all packaging steps of the build (i.e. exporting variables for the entire build)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"networking"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable networking within solbuild."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"packaging-step-keys-optional",children:"Packaging step keys, optional"}),"\n",(0,i.jsxs)(s.p,{children:["The packaging steps are all considered optional, however the absence of the ",(0,i.jsx)(s.code,{children:"install"})," step will result in no package generated. Each of these keys contains content that will be placed within a script and executed within a controlled environment to perform the package build. For all intents and purposes, they are Bash scripts with a predefined environment."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Step Name"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"setup"})}),(0,i.jsxs)(s.td,{children:["Performed after the source extraction. This is the correct place to perform any ",(0,i.jsx)(s.code,{children:"configure"})," routine, or to ",(0,i.jsx)(s.code,{children:"patch"})," the sources."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"build"})}),(0,i.jsxs)(s.td,{children:["Use this step to run the build portion, for example, ",(0,i.jsx)(s.code,{children:"make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"install"})}),(0,i.jsxs)(s.td,{children:["This is where you should install the files into the final packaging directory, for example, ",(0,i.jsx)(s.code,{children:"make install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"check"})}),(0,i.jsxs)(s.td,{children:["This is where tests / checking should occur, for example, ",(0,i.jsx)(s.code,{children:"make check"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"profile"})}),(0,i.jsxs)(s.td,{children:["This is where profiling tests should be specified. ",(0,i.jsx)(s.code,{children:"ypkg"})," will handle setting flags to generate profiling data and using that data for an optimized build."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"optimize-values",children:"Optimize values"}),"\n",(0,i.jsxs)(s.p,{children:["One or more optimize values can be specified in a list with the ",(0,i.jsx)(s.code,{children:"optimize"})," key in the ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Several values can override or conflict with each other and should be used only where they provide a performance benefit, or fix a bug in the package or build."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Optimize Value"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"speed"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package for performance ",(0,i.jsx)(s.code,{children:"-O3"})," plus other flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"size"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package build to minimize size ",(0,i.jsx)(s.code,{children:"-Os"}),". Not supported with clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-bind-now"})}),(0,i.jsx)(s.td,{children:"Configures the package to disable certain flags, where RELRO is unsupported."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-symbolic"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-Wl,-Bsymbolic-functions"})," linker flag."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"unroll-loops"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-funroll-loops"}),". Use this sparingly, only when it provides proven benefit."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"runpath"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-Wl,--enable-new-dtags"})," to make linker use RUNPATH's instead of RPATH's."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"avx256"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-mprefer-vector-width=128"})," in avx2 builds."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"thin-lto"})}),(0,i.jsxs)(s.td,{children:["Enables Thin Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto=thin"})," with a supported linker."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"lto"})}),(0,i.jsxs)(s.td,{children:["Enables Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-safe"})}),(0,i.jsxs)(s.td,{children:["Enables safe Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=safe"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-all"})}),(0,i.jsxs)(s.td,{children:["Enables Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=all"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"polly"})}),(0,i.jsx)(s.td,{children:"Enables polyhedral optimizations for the clang toolchain."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"function-sections"})}),(0,i.jsx)(s.td,{children:"Generate a separate ELF section for each function. Recommended with ICF when not using clang."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-reorder-blocks-partition"})}),(0,i.jsx)(s.td,{children:"Disables block partition reordering with the gcc toolchain. Provided to facilitate BOLT'ed binaries/libraries."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emit-relocs"})}),(0,i.jsx)(s.td,{children:"Instructs the linker to emit relocations. Provided to facilitate BOLT'ed binaries/libraries."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"macros",children:"Macros"}),"\n",(0,i.jsx)(s.p,{children:"To further assist in packaging, a number of macros are available. These are simply shorthand ways to perform a normal build operation. They also ensure that the resulting package is consistent. These macros are only available in our packaging steps, as they are substituted within the script before execution."}),"\n",(0,i.jsx)(s.h3,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(s.p,{children:["Macros are prefixed with ",(0,i.jsx)(s.code,{children:"%"}),", and are substituted before your script is executed. Macros ending with ",(0,i.jsx)(s.code,{children:"%"})," are used to provide directory names or build values to the script."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"# Run the configure macro with the given arguments\n%configure --disable-static\n"})}),"\n",(0,i.jsx)(s.h3,{id:"actionable-macros",children:"Actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%autogen"})}),(0,i.jsxs)(s.td,{children:["Runs autogen with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," to create a configure script then proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake"})}),(0,i.jsx)(s.td,{children:"Configures a CMake project with the distribution specific options, such as prefix and release type."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake_ninja"})}),(0,i.jsxs)(s.td,{children:["Configures a CMake project with ninja so it can be used with ",(0,i.jsx)(s.code,{children:"%ninja_build"}),", ",(0,i.jsx)(s.code,{children:"%ninja_install"})," and ",(0,i.jsx)(s.code,{children:"%ninja_check"})," macros."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"./configure"})," with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," variable macro."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure_no_runstatedir"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"%configure"})," without the ",(0,i.jsx)(s.code,{children:"--runstatedir"})," option. Use if you encounter ",(0,i.jsx)(s.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make"})}),(0,i.jsxs)(s.td,{children:["Runs the ",(0,i.jsx)(s.code,{children:"make"})," command with the job count specified in ",(0,i.jsx)(s.code,{children:"eopkg.conf"})," (",(0,i.jsx)(s.a,{href:"/docs/packaging/advanced-config/eopkg-configuration",children:"more info"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make_install"})}),(0,i.jsxs)(s.td,{children:["Performs a ",(0,i.jsx)(s.code,{children:"make install"}),", using the ",(0,i.jsx)(s.code,{children:"DESTDIR"})," variant. Should work for the vast majority of packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%patch"})}),(0,i.jsx)(s.td,{children:"Sane patch macro to run in batch mode and not contaminate source tree on failure."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%apply_patches"})}),(0,i.jsxs)(s.td,{children:["Applies all patches listed in the ",(0,i.jsx)(s.code,{children:"series"})," file in ",(0,i.jsx)(s.code,{children:"./files"})," folder."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%reconfigure"})}),(0,i.jsxs)(s.td,{children:["Updates build scripts such as ",(0,i.jsx)(s.code,{children:"./configure"})," and proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%symlink_check"})}),(0,i.jsx)(s.td,{children:"Checks for broken symlinks in the install directory and aborts the build if any are found. Must run after install macros."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"haskell-actionable-macros",children:"Haskell actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cabal_configure"})}),(0,i.jsx)(s.td,{children:"Configures a Cabal project that requires online dependencies, like a Cargo-style build"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell configure"})," with prefix, libdir, etc. and ensures the necessary package.conf.d is copied to the correct location."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell build"})," with ",(0,i.jsx)(s.code,{children:"%JOBS%"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell copy"})," to ",(0,i.jsx)(s.code,{children:"$installdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_register"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell register"})," to generate a pkg-config for package and version, then installs the conf file."]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Existing Haskell packages may use the old ",(0,i.jsx)(s.code,{children:"cabal_build"}),", ",(0,i.jsx)(s.code,{children:"cabal_install"}),", ",(0,i.jsx)(s.code,{children:"cabal_register"})," macros. Please use the new ",(0,i.jsx)(s.code,{children:"haskell_*"})," macros instead."]}),"\n",(0,i.jsx)(s.h3,{id:"ninja-actionable-macros",children:"Ninja actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%meson_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"meson"})," with our CFLAGS and appropriate flags such as ",(0,i.jsx)(s.code,{children:"libdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"DESTDIR"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_check"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja test"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_check"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"perl-actionable-macros",children:"Perl actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_setup"})}),(0,i.jsxs)(s.td,{children:["Runs Perl setup scripts ",(0,i.jsx)(s.code,{children:"Build.pl"})," or ",(0,i.jsx)(s.code,{children:"Makefile.pl"})," with the appropriate variable flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_build"})}),(0,i.jsxs)(s.td,{children:["Runs Perl build scripts or attempts ",(0,i.jsx)(s.code,{children:"%make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_install"})}),(0,i.jsxs)(s.td,{children:["Runs Perl install scripts or attempts ",(0,i.jsx)(s.code,{children:"%make_install"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"python-actionable-macros",children:"Python actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python2. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python2. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python3. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python3. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"ruby-actionable-macros",children:"Ruby actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem install"})," with the appropriate parameters."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"rust-cargo-actionable-macros",children:"Rust (cargo) actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_fetch"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo fetch --locked"})," to get dependencies."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo build"})," with some additional flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_install"})}),(0,i.jsxs)(s.td,{children:["Installs the built binary to ",(0,i.jsx)(s.code,{children:"/usr/bin/PACKAGE-NAME"}),", OR to ",(0,i.jsx)(s.code,{children:"/usr/bin/ARGUMENT"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_test"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo test"})," with some additional flags."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"qt-actionable-macros",children:"Qt actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt5 with the appropriate make flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake4"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt4, as well as adding the necessary MOC, RCC, and UIC flags since those Qt4 executables end in -qt4."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml_cache"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.qml"})," files into ",(0,i.jsx)(s.code,{children:"*.qmlc"})," so they are compiled ahead of time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml6_cache"})}),(0,i.jsxs)(s.td,{children:["Same as ",(0,i.jsx)(s.code,{children:"%qml_cache"}),", but for Qt6."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"waf-actionable-macros",children:"Waf actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf configure"})," with prefix."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"destdir"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"bolt-actionable-macros",children:"BOLT actionable macros"}),"\n",(0,i.jsx)(s.p,{children:"BOLT is a post-link optimizer developed to speed up large applications. You will need to run a workload after instrumenting a binary or library. Think of it as post-link profile guided optimization."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_instr"})}),(0,i.jsxs)(s.td,{children:["Instrument a binary or library with llvm-bolt. Requires it to be built with ",(0,i.jsx)(s.code,{children:"emit-relocs"}),", as well as ",(0,i.jsx)(s.code,{children:"no-reorder-blocks-partition"})," if not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_merge"})}),(0,i.jsx)(s.td,{children:"Merge fdata profiles into a single file after running a workload with a BOLT instrumented binary."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_opt"})}),(0,i.jsxs)(s.td,{children:["Optimize a binary using BOLT after running ",(0,i.jsx)(s.code,{children:"%bolt_merge"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"variable-macros",children:"Variable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ARCH%"})}),(0,i.jsx)(s.td,{children:"Indicates the current build architecture."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CC%"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CONFOPTS%"})}),(0,i.jsxs)(s.td,{children:["Flags / options for configuration, such as ",(0,i.jsx)(s.code,{children:"--prefix=%PREFIX%"}),". ",(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/blob/v33/ypkg2/rc.yml#L446-L458",children:"Full List."})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXX%"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXXFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%JOBS%"})}),(0,i.jsxs)(s.td,{children:["jobs, as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LDFLAGS%"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LIBSUFFIX%"})}),(0,i.jsx)(s.td,{children:"Library suffix (either 32 for 32-bit or 64 for 64-bit)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%PREFIX%"})}),(0,i.jsxs)(s.td,{children:["Hard-coded prefix ",(0,i.jsx)(s.code,{children:"/usr"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%YJOBS%"})}),(0,i.jsxs)(s.td,{children:["Job count without ",(0,i.jsx)(s.code,{children:"-j"})," as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%installroot%"})}),(0,i.jsx)(s.td,{children:"Hard-coded install directory."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%libdir%"})}),(0,i.jsxs)(s.td,{children:["The distribution\u2019s default library directory, i.e. ",(0,i.jsx)(s.code,{children:"/usr/lib64"})," (Alters for ",(0,i.jsx)(s.code,{children:"emul32"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%version%"})}),(0,i.jsxs)(s.td,{children:["Version of the package, as specified in the ",(0,i.jsx)(s.code,{children:"version"})," key."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%workdir%"})}),(0,i.jsx)(s.td,{children:"Hard-coded work directory (source tree)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_lts%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-lts"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_current%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-current"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python2_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python"})," (Python 2) distribution."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python3"})," distribution."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"variables",children:"Variables"}),"\n",(0,i.jsx)(s.p,{children:"A set of variables are exported in our build stages. These are used to provide context and structure to the scripts."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Variable"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CFLAGS"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXXFLAGS"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$LDFLAGS"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CC"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXX"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$EMUL32BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"emul32"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$AVX2BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"avx2"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_GEN_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the instrumentation phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_USE_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the use phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$installdir"})}),(0,i.jsx)(s.td,{children:"The install directory, i.e. where files are installed to for packaging."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$pkgfiles"})}),(0,i.jsxs)(s.td,{children:["Refers to the ",(0,i.jsx)(s.code,{children:"./files"})," directory relative to the ",(0,i.jsx)(s.code,{children:"package.yml"})," file."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$sources"})}),(0,i.jsxs)(s.td,{children:["Refers to the directory where your source files are stored, for example, ",(0,i.jsx)(s.code,{children:"$sources/nano.tar.gz"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$workdir"})}),(0,i.jsx)(s.td,{children:"The work, or source, directory of the package build."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"types",children:"Types"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"package.yml"})," file uses native YAML types, however it follows syntactic conventions and may accept multiple value types for a given key."]}),"\n",(0,i.jsx)(s.h3,{id:"string",children:"string"}),"\n",(0,i.jsx)(s.p,{children:"This is simply text, which does not need to be quoted."}),"\n",(0,i.jsx)(s.h3,{id:"strings",children:"string(s)"}),"\n",(0,i.jsxs)(s.p,{children:["Indicates that it is possible to use a ",(0,i.jsx)(s.code,{children:"list"})," of strings, or one single ",(0,i.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"integer",children:"integer"}),"\n",(0,i.jsxs)(s.p,{children:["Whole, positive number, used in the ",(0,i.jsx)(s.code,{children:"release"})," field."]}),"\n",(0,i.jsx)(s.h3,{id:"list",children:"list"}),"\n",(0,i.jsx)(s.p,{children:"A YAML list (or array) can be expressed in multiple ways. A short array-notation would look like this:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"[one, two, three]"})}),"\n",(0,i.jsx)(s.p,{children:"They can also be expressed like this:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- First Value\n- Second Value\n- Third Value\n"})}),"\n",(0,i.jsx)(s.h3,{id:"dict",children:"dict"}),"\n",(0,i.jsxs)(s.p,{children:["Known as an associative array, this is key to value mapping. These are separated by a colon (",(0,i.jsx)(s.code,{children:":"}),"), the token on the left is taken to be a key, and the token on the right is the value."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"SomeKey: Some Value"})}),"\n",(0,i.jsxs)(s.p,{children:["Note that each ",(0,i.jsx)(s.code,{children:"ypkg key"})," in the YAML file is actually a dict."]}),"\n",(0,i.jsx)(s.h3,{id:"dicts",children:"dict(s)"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"dict(s)"})," consists of a list of ",(0,i.jsx)(s.code,{children:"dict"}),"s and some assumptions. We primarily make use of this to express advanced information within the package. These permit you to provide no key, and a value only.\nIn this instance, the key is implicitly assumed to be the package name (for example, ",(0,i.jsx)(s.code,{children:"nano"}),"):"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- some value"})}),"\n",(0,i.jsx)(s.p,{children:"An explicit key, usually a sub-package name:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- somekey: somevalue"})}),"\n",(0,i.jsx)(s.p,{children:"A mix of both:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- somevalue\n- somekey: another value\n"})}),"\n",(0,i.jsx)(s.p,{children:"The values may also be expressed in list form, still using the same default key logic:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- [one, two, three]\n- somekey: [one, two, three]\n- key:\n - value one\n - value two\n - value three\n"})}),"\n",(0,i.jsx)(s.h2,{id:"packaging-practices",children:"Packaging practices"}),"\n",(0,i.jsxs)(s.p,{children:["The concepts in this document merely expose the syntax of a ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Solus adheres to strict packaging practices and conventions which packagers must follow. They are explained in the ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"})," article."]})]})}function a(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>c,a:()=>l});var i=n(67294);const r={},d=i.createContext(r);function l(e){const s=i.useContext(d);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(d.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/418a6276.42385bff.js b/assets/js/418a6276.42385bff.js
new file mode 100644
index 000000000..13ead6417
--- /dev/null
+++ b/assets/js/418a6276.42385bff.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6160],{71697:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>g});var s=t(85893),n=t(11151);const l={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},a=void 0,i={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},g=[];function c(e){const o={a:"a",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(o.p,{children:["Close watchers of our ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"It's a long story."})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>a});var s=t(67294);const n={},l=s.createContext(n);function a(e){const o=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(l.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/418a6276.bc82d44b.js b/assets/js/418a6276.bc82d44b.js
deleted file mode 100644
index 18241611c..000000000
--- a/assets/js/418a6276.bc82d44b.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6160],{71697:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>g});var s=t(85893),n=t(11151);const l={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},a=void 0,i={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},g=[];function c(e){const o={a:"a",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(o.p,{children:["Close watchers of our ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"It's a long story."})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>a});var s=t(67294);const n={},l=s.createContext(n);function a(e){const o=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(l.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/41a4de91.c6e74657.js b/assets/js/41a4de91.ae57e1b1.js
similarity index 99%
rename from assets/js/41a4de91.c6e74657.js
rename to assets/js/41a4de91.ae57e1b1.js
index 61461b800..663f53aa0 100644
--- a/assets/js/41a4de91.c6e74657.js
+++ b/assets/js/41a4de91.ae57e1b1.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7682],{31593:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>t,metadata:()=>a,toc:()=>l});var r=o(85893),n=o(11151);const t={title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},i="Third Party",a={id:"user/software/third-party/index",title:"Third Party",description:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues.",source:"@site/docs/user/software/third-party/index.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/",permalink:"/docs/user/software/third-party/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},sidebar:"userSidebar",previous:{title:"Sound",permalink:"/docs/user/software/sound/"},next:{title:"Snap",permalink:"/docs/user/software/third-party/snap"}},d={},l=[{value:"Browsers",id:"browsers",level:2},{value:"Google Chrome",id:"google-chrome",level:3},{value:"Google Chrome (Beta)",id:"google-chrome-beta",level:3},{value:"Google Chrome (Dev/Unstable)",id:"google-chrome-devunstable",level:3},{value:"Communication",id:"communication",level:2},{value:"Franz",id:"franz",level:3},{value:"Slack",id:"slack",level:3},{value:"Viber",id:"viber",level:3},{value:"Multimedia",id:"multimedia",level:2},{value:"Bitwig Studio",id:"bitwig-studio",level:3},{value:"Ocenaudio",id:"ocenaudio",level:3},{value:"Plex Media Server",id:"plex-media-server",level:3},{value:"SunVox",id:"sunvox",level:3},{value:"Spotify",id:"spotify",level:3},{value:"Network",id:"network",level:2},{value:"AnyDesk",id:"anydesk",level:3},{value:"Insync",id:"insync",level:3},{value:"Spideroak",id:"spideroak",level:3},{value:"Synology Cloud Station Drive",id:"synology-cloud-station-drive",level:3},{value:"TeamViewer",id:"teamviewer",level:3},{value:"Office",id:"office",level:2},{value:"Mendeley Desktop",id:"mendeley-desktop",level:3},{value:"Microsoft Core Fonts",id:"microsoft-core-fonts",level:3},{value:"Moneydance",id:"moneydance",level:3},{value:"PomoDoneApp",id:"pomodoneapp",level:3},{value:"Scrivener",id:"scrivener",level:3},{value:"Programming",id:"programming",level:2},{value:"Android Studio",id:"android-studio",level:3},{value:"CLion",id:"clion",level:3},{value:"DataGrip",id:"datagrip",level:3},{value:"GitKraken",id:"gitkraken",level:3},{value:"IDEA",id:"idea",level:3},{value:"PhpStorm",id:"phpstorm",level:3},{value:"PyCharm",id:"pycharm",level:3},{value:"Rider",id:"rider",level:3},{value:"RubyMine",id:"rubymine",level:3},{value:"Sublime Text",id:"sublime-text",level:3},{value:"WebStorm",id:"webstorm",level:3},{value:"Security",id:"security",level:2},{value:"Enpass",id:"enpass",level:3},{value:"Other",id:"other",level:2},{value:"Google Earth",id:"google-earth",level:3}];function p(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"third-party",children:"Third Party"})}),"\n",(0,r.jsx)(s.p,{children:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues."}),"\n",(0,r.jsx)(s.p,{children:"Alongside the following commands, you may also find some of these applications via the Third Party section on our Software Center."}),"\n",(0,r.jsxs)(s.p,{children:["If these instructions fail to work please ",(0,r.jsx)(s.a,{href:"https://github.com/getsolus/3rd-party/issues",children:"file an issue"}),". To upgrade once installed simply run the commands again. If there is a new version it will be installed."]}),"\n",(0,r.jsx)(s.h2,{id:"browsers",children:"Browsers"}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome",children:"Google Chrome"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-stable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-beta",children:"Google Chrome (Beta)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-beta/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-devunstable",children:"Google Chrome (Dev/Unstable)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-unstable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"communication",children:"Communication"}),"\n",(0,r.jsx)(s.h3,{id:"franz",children:"Franz"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/franz/pspec.xml\nsudo eopkg it franz*.eopkg;sudo rm franz*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"slack",children:"Slack"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/slack-desktop/pspec.xml\nsudo eopkg it slack-desktop*.eopkg;sudo rm slack-desktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"viber",children:"Viber"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/viber/pspec.xml\nsudo eopkg it viber*.eopkg;sudo rm *.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"multimedia",children:"Multimedia"}),"\n",(0,r.jsx)(s.h3,{id:"bitwig-studio",children:"Bitwig Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/bitwig-studio/pspec.xml\nsudo eopkg it bitwig-studio*.eopkg;sudo rm bitwig-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"ocenaudio",children:"Ocenaudio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/ocenaudio/pspec.xml\nsudo eopkg it ocenaudio*.eopkg;sudo rm ocenaudio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"plex-media-server",children:"Plex Media Server"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/video/plexmediaserver/pspec.xml\nsudo eopkg it plexmediaserver-*.eopkg;sudo rm plexmediaserver-*.eopkg\nsudo systemd-tmpfiles --create\nsudo systemctl start plexmediaserver.service\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note:"})," Optionally have it start on boot:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable plexmediaserver.service\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sunvox",children:"SunVox"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/sunvox/pspec.xml\nsudo eopkg it sunvox*.eopkg;sudo rm sunvox*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spotify",children:"Spotify"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/spotify/pspec.xml\nsudo eopkg it spotify*.eopkg;sudo rm spotify*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"network",children:"Network"}),"\n",(0,r.jsx)(s.h3,{id:"anydesk",children:"AnyDesk"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/anydesk/pspec.xml\nsudo eopkg it anydesk*.eopkg;sudo rm anydesk*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"insync",children:"Insync"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/insync/pspec.xml\nsudo eopkg it insync*.eopkg;sudo rm insync*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spideroak",children:"Spideroak"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/spideroak/pspec.xml\nsudo eopkg it spideroak*.eopkg;sudo rm spideroak*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"synology-cloud-station-drive",children:"Synology Cloud Station Drive"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/synology-cloud-station-drive/pspec.xml\nsudo eopkg it synology-cloud-station-drive*.eopkg;sudo rm synology-cloud-station-drive*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"teamviewer",children:"TeamViewer"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/teamviewer/pspec.xml\nsudo eopkg it teamviewer*.eopkg;sudo rm teamviewer*.eopkg\nsudo systemctl start teamviewerd.service\n"})}),"\n",(0,r.jsx)(s.h2,{id:"office",children:"Office"}),"\n",(0,r.jsx)(s.h3,{id:"mendeley-desktop",children:"Mendeley Desktop"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/mendeleydesktop/pspec.xml\nsudo eopkg it mendeleydesktop*.eopkg;sudo rm mendeleydesktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"microsoft-core-fonts",children:"Microsoft Core Fonts"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/desktop/font/mscorefonts/pspec.xml\nsudo eopkg it mscorefonts*.eopkg;sudo rm mscorefonts*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"moneydance",children:"Moneydance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/moneydance/pspec.xml\nsudo eopkg it moneydance*.eopkg;sudo rm moneydance*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pomodoneapp",children:"PomoDoneApp"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/pomodoneapp/pspec.xml\nsudo eopkg it pomodoneapp*.eopkg;sudo rm pomodoneapp*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"scrivener",children:"Scrivener"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/scrivener/pspec.xml\nsudo eopkg it scrivener*.eopkg;sudo rm scrivener*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"programming",children:"Programming"}),"\n",(0,r.jsx)(s.h3,{id:"android-studio",children:"Android Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/android-studio/pspec.xml\nsudo eopkg it android-studio*.eopkg;sudo rm android-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"clion",children:"CLion"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/clion/pspec.xml\nsudo eopkg it clion*.eopkg;sudo rm clion*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"datagrip",children:"DataGrip"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/datagrip/pspec.xml\nsudo eopkg it datagrip*.eopkg;sudo rm datagrip*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"gitkraken",children:"GitKraken"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/gitkraken/pspec.xml\nsudo eopkg it gitkraken*.eopkg;sudo rm gitkraken*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"idea",children:"IDEA"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/idea/pspec.xml\nsudo eopkg it idea*.eopkg;sudo rm idea*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"phpstorm",children:"PhpStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/phpstorm/pspec.xml\nsudo eopkg it phpstorm*.eopkg;sudo rm phpstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pycharm",children:"PyCharm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/pycharm/pspec.xml\nsudo eopkg it pycharm*.eopkg;sudo rm pycharm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rider",children:"Rider"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rider/pspec.xml\nsudo eopkg it rider*.eopkg;sudo rm rider*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rubymine",children:"RubyMine"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rubymine/pspec.xml\nsudo eopkg it rubymine*.eopkg;sudo rm rubymine*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sublime-text",children:"Sublime Text"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/sublime-text/pspec.xml\nsudo eopkg it sublime*.eopkg;sudo rm sublime*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"webstorm",children:"WebStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/webstorm/pspec.xml\nsudo eopkg it webstorm*.eopkg;sudo rm webstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"security",children:"Security"}),"\n",(0,r.jsx)(s.h3,{id:"enpass",children:"Enpass"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/security/enpass/pspec.xml\nsudo eopkg it enpass*.eopkg;sudo rm enpass*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"other",children:"Other"}),"\n",(0,r.jsx)(s.h3,{id:"google-earth",children:"Google Earth"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/google-earth/pspec.xml\nsudo eopkg it google-earth*.eopkg;sudo rm google-earth*.eopkg\n"})})]})}function c(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>a,a:()=>i});var r=o(67294);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7682],{31593:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>t,metadata:()=>a,toc:()=>l});var r=o(85893),n=o(11151);const t={title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},i="Third Party",a={id:"user/software/third-party/index",title:"Third Party",description:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues.",source:"@site/docs/user/software/third-party/index.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/",permalink:"/docs/user/software/third-party/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},sidebar:"userSidebar",previous:{title:"Sound",permalink:"/docs/user/software/sound/"},next:{title:"Snap",permalink:"/docs/user/software/third-party/snap"}},d={},l=[{value:"Browsers",id:"browsers",level:2},{value:"Google Chrome",id:"google-chrome",level:3},{value:"Google Chrome (Beta)",id:"google-chrome-beta",level:3},{value:"Google Chrome (Dev/Unstable)",id:"google-chrome-devunstable",level:3},{value:"Communication",id:"communication",level:2},{value:"Franz",id:"franz",level:3},{value:"Slack",id:"slack",level:3},{value:"Viber",id:"viber",level:3},{value:"Multimedia",id:"multimedia",level:2},{value:"Bitwig Studio",id:"bitwig-studio",level:3},{value:"Ocenaudio",id:"ocenaudio",level:3},{value:"Plex Media Server",id:"plex-media-server",level:3},{value:"SunVox",id:"sunvox",level:3},{value:"Spotify",id:"spotify",level:3},{value:"Network",id:"network",level:2},{value:"AnyDesk",id:"anydesk",level:3},{value:"Insync",id:"insync",level:3},{value:"Spideroak",id:"spideroak",level:3},{value:"Synology Cloud Station Drive",id:"synology-cloud-station-drive",level:3},{value:"TeamViewer",id:"teamviewer",level:3},{value:"Office",id:"office",level:2},{value:"Mendeley Desktop",id:"mendeley-desktop",level:3},{value:"Microsoft Core Fonts",id:"microsoft-core-fonts",level:3},{value:"Moneydance",id:"moneydance",level:3},{value:"PomoDoneApp",id:"pomodoneapp",level:3},{value:"Scrivener",id:"scrivener",level:3},{value:"Programming",id:"programming",level:2},{value:"Android Studio",id:"android-studio",level:3},{value:"CLion",id:"clion",level:3},{value:"DataGrip",id:"datagrip",level:3},{value:"GitKraken",id:"gitkraken",level:3},{value:"IDEA",id:"idea",level:3},{value:"PhpStorm",id:"phpstorm",level:3},{value:"PyCharm",id:"pycharm",level:3},{value:"Rider",id:"rider",level:3},{value:"RubyMine",id:"rubymine",level:3},{value:"Sublime Text",id:"sublime-text",level:3},{value:"WebStorm",id:"webstorm",level:3},{value:"Security",id:"security",level:2},{value:"Enpass",id:"enpass",level:3},{value:"Other",id:"other",level:2},{value:"Google Earth",id:"google-earth",level:3}];function p(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"third-party",children:"Third Party"})}),"\n",(0,r.jsx)(s.p,{children:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues."}),"\n",(0,r.jsx)(s.p,{children:"Alongside the following commands, you may also find some of these applications via the Third Party section on our Software Center."}),"\n",(0,r.jsxs)(s.p,{children:["If these instructions fail to work please ",(0,r.jsx)(s.a,{href:"https://github.com/getsolus/3rd-party/issues",children:"file an issue"}),". To upgrade once installed simply run the commands again. If there is a new version it will be installed."]}),"\n",(0,r.jsx)(s.h2,{id:"browsers",children:"Browsers"}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome",children:"Google Chrome"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-stable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-beta",children:"Google Chrome (Beta)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-beta/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-devunstable",children:"Google Chrome (Dev/Unstable)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-unstable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"communication",children:"Communication"}),"\n",(0,r.jsx)(s.h3,{id:"franz",children:"Franz"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/franz/pspec.xml\nsudo eopkg it franz*.eopkg;sudo rm franz*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"slack",children:"Slack"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/slack-desktop/pspec.xml\nsudo eopkg it slack-desktop*.eopkg;sudo rm slack-desktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"viber",children:"Viber"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/viber/pspec.xml\nsudo eopkg it viber*.eopkg;sudo rm *.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"multimedia",children:"Multimedia"}),"\n",(0,r.jsx)(s.h3,{id:"bitwig-studio",children:"Bitwig Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/bitwig-studio/pspec.xml\nsudo eopkg it bitwig-studio*.eopkg;sudo rm bitwig-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"ocenaudio",children:"Ocenaudio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/ocenaudio/pspec.xml\nsudo eopkg it ocenaudio*.eopkg;sudo rm ocenaudio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"plex-media-server",children:"Plex Media Server"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/video/plexmediaserver/pspec.xml\nsudo eopkg it plexmediaserver-*.eopkg;sudo rm plexmediaserver-*.eopkg\nsudo systemd-tmpfiles --create\nsudo systemctl start plexmediaserver.service\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note:"})," Optionally have it start on boot:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable plexmediaserver.service\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sunvox",children:"SunVox"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/sunvox/pspec.xml\nsudo eopkg it sunvox*.eopkg;sudo rm sunvox*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spotify",children:"Spotify"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/spotify/pspec.xml\nsudo eopkg it spotify*.eopkg;sudo rm spotify*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"network",children:"Network"}),"\n",(0,r.jsx)(s.h3,{id:"anydesk",children:"AnyDesk"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/anydesk/pspec.xml\nsudo eopkg it anydesk*.eopkg;sudo rm anydesk*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"insync",children:"Insync"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/insync/pspec.xml\nsudo eopkg it insync*.eopkg;sudo rm insync*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spideroak",children:"Spideroak"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/spideroak/pspec.xml\nsudo eopkg it spideroak*.eopkg;sudo rm spideroak*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"synology-cloud-station-drive",children:"Synology Cloud Station Drive"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/synology-cloud-station-drive/pspec.xml\nsudo eopkg it synology-cloud-station-drive*.eopkg;sudo rm synology-cloud-station-drive*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"teamviewer",children:"TeamViewer"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/teamviewer/pspec.xml\nsudo eopkg it teamviewer*.eopkg;sudo rm teamviewer*.eopkg\nsudo systemctl start teamviewerd.service\n"})}),"\n",(0,r.jsx)(s.h2,{id:"office",children:"Office"}),"\n",(0,r.jsx)(s.h3,{id:"mendeley-desktop",children:"Mendeley Desktop"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/mendeleydesktop/pspec.xml\nsudo eopkg it mendeleydesktop*.eopkg;sudo rm mendeleydesktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"microsoft-core-fonts",children:"Microsoft Core Fonts"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/desktop/font/mscorefonts/pspec.xml\nsudo eopkg it mscorefonts*.eopkg;sudo rm mscorefonts*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"moneydance",children:"Moneydance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/moneydance/pspec.xml\nsudo eopkg it moneydance*.eopkg;sudo rm moneydance*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pomodoneapp",children:"PomoDoneApp"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/pomodoneapp/pspec.xml\nsudo eopkg it pomodoneapp*.eopkg;sudo rm pomodoneapp*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"scrivener",children:"Scrivener"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/scrivener/pspec.xml\nsudo eopkg it scrivener*.eopkg;sudo rm scrivener*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"programming",children:"Programming"}),"\n",(0,r.jsx)(s.h3,{id:"android-studio",children:"Android Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/android-studio/pspec.xml\nsudo eopkg it android-studio*.eopkg;sudo rm android-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"clion",children:"CLion"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/clion/pspec.xml\nsudo eopkg it clion*.eopkg;sudo rm clion*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"datagrip",children:"DataGrip"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/datagrip/pspec.xml\nsudo eopkg it datagrip*.eopkg;sudo rm datagrip*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"gitkraken",children:"GitKraken"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/gitkraken/pspec.xml\nsudo eopkg it gitkraken*.eopkg;sudo rm gitkraken*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"idea",children:"IDEA"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/idea/pspec.xml\nsudo eopkg it idea*.eopkg;sudo rm idea*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"phpstorm",children:"PhpStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/phpstorm/pspec.xml\nsudo eopkg it phpstorm*.eopkg;sudo rm phpstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pycharm",children:"PyCharm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/pycharm/pspec.xml\nsudo eopkg it pycharm*.eopkg;sudo rm pycharm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rider",children:"Rider"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rider/pspec.xml\nsudo eopkg it rider*.eopkg;sudo rm rider*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rubymine",children:"RubyMine"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rubymine/pspec.xml\nsudo eopkg it rubymine*.eopkg;sudo rm rubymine*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sublime-text",children:"Sublime Text"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/sublime-text/pspec.xml\nsudo eopkg it sublime*.eopkg;sudo rm sublime*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"webstorm",children:"WebStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/webstorm/pspec.xml\nsudo eopkg it webstorm*.eopkg;sudo rm webstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"security",children:"Security"}),"\n",(0,r.jsx)(s.h3,{id:"enpass",children:"Enpass"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/security/enpass/pspec.xml\nsudo eopkg it enpass*.eopkg;sudo rm enpass*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"other",children:"Other"}),"\n",(0,r.jsx)(s.h3,{id:"google-earth",children:"Google Earth"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/google-earth/pspec.xml\nsudo eopkg it google-earth*.eopkg;sudo rm google-earth*.eopkg\n"})})]})}function c(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>a,a:()=>i});var r=o(67294);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/424f562c.8c8592ca.js b/assets/js/424f562c.8c8592ca.js
deleted file mode 100644
index 66f62be1c..000000000
--- a/assets/js/424f562c.8c8592ca.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3122],{15054:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var a=t(85893),l=t(11151);const n={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},c={authorsImageUrls:[void 0]},p=[];function r(e){const o={code:"code",p:"p",...(0,l.a)(),...e.components};return(0,a.jsxs)(o.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,a.jsx)(o.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]})}function g(e={}){const{wrapper:o}={...(0,l.a)(),...e.components};return o?(0,a.jsx)(o,{...e,children:(0,a.jsx)(r,{...e})}):r(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>s,a:()=>i});var a=t(67294);const l={},n=a.createContext(l);function i(e){const o=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),a.createElement(n.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/424f562c.af0382ed.js b/assets/js/424f562c.af0382ed.js
new file mode 100644
index 000000000..cdbc99440
--- /dev/null
+++ b/assets/js/424f562c.af0382ed.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3122],{15054:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var l=o(85893),a=o(11151);const n={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Clean, clean, clean!",permalink:"/blog/clean-clean-clean"},nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},c={authorsImageUrls:[void 0]},p=[];function r(e){const t={code:"code",p:"p",...(0,a.a)(),...e.components};return(0,l.jsxs)(t.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,l.jsx)(t.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]})}function g(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(r,{...e})}):r(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>s,a:()=>i});var l=o(67294);const a={},n=l.createContext(a);function i(e){const t=l.useContext(n);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),l.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/45e9d313.1a78f7ac.js b/assets/js/45e9d313.43558a74.js
similarity index 98%
rename from assets/js/45e9d313.1a78f7ac.js
rename to assets/js/45e9d313.43558a74.js
index 048a42c50..4e79d9525 100644
--- a/assets/js/45e9d313.1a78f7ac.js
+++ b/assets/js/45e9d313.43558a74.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6114],{47124:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=a(85893),n=a(11151);const o={title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},i="Testing a Package",r={id:"packaging/testing-a-package",title:"Testing a Package",description:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected.",source:"@site/docs/packaging/testing-a-package.md",sourceDirName:"packaging",slug:"/packaging/testing-a-package",permalink:"/docs/packaging/testing-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/testing-a-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:5,frontMatter:{title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},sidebar:"packagingSidebar",previous:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"},next:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"}},l={},c=[{value:"Install the .eopkg
files",id:"install-the-eopkg-files",level:2},{value:"For updated packages: Return to the repository version",id:"for-updated-packages-return-to-the-repository-version",level:2},{value:"Remove the .eopkg
files",id:"remove-the-eopkg-files",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"testing-a-package",children:"Testing a Package"})}),"\n",(0,s.jsx)(t.p,{children:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected."}),"\n",(0,s.jsxs)(t.p,{children:["You will use the ",(0,s.jsx)(t.code,{children:".eopkg"})," file(s) created by the build process for testing."]}),"\n",(0,s.jsxs)(t.h2,{id:"install-the-eopkg-files",children:["Install the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["To install your new package, run the following command in the directory where you built the package. Include ",(0,s.jsx)(t.strong,{children:"all"})," ",(0,s.jsx)(t.code,{children:".eopkg"})," files that were built."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it *.eopkg\n"})}),"\n",(0,s.jsx)(t.p,{children:"Testing need not be very complicated. The goal is to ensure the package will reliably work for our users. Testing effort will depend on how complex the software is. At minimum, you want to ensure the application launches, and performs basic functionality as expected."}),"\n",(0,s.jsx)(t.p,{children:"For example, if you were updating a text editor, you would want to make sure you can open, create and save files. If you know of issues the package has had in the past, it's a good idea to test that as well to make sure there are no regressions. There are plenty of historical pull requests to review if you want more detail."}),"\n",(0,s.jsx)(t.h2,{id:"for-updated-packages-return-to-the-repository-version",children:"For updated packages: Return to the repository version"}),"\n",(0,s.jsxs)(t.p,{children:["It is a good idea to uninstall the package you built, and return to the repository version, once you are done testing. To do this, run the following command on the main application. For example, if you just built and tested ",(0,s.jsx)(t.code,{children:"tree"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it --reinstall tree\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"remove-the-eopkg-files",children:["Remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["Before you can submit your pull request, you need to remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files. All repository packages are built by a dedicated build server from the source files provided in your pull request."]}),"\n",(0,s.jsx)(t.p,{children:"To remove these files, run:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"go-task clean\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>r,a:()=>i});var s=a(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6114],{47124:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=a(85893),n=a(11151);const o={title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},i="Testing a Package",r={id:"packaging/testing-a-package",title:"Testing a Package",description:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected.",source:"@site/docs/packaging/testing-a-package.md",sourceDirName:"packaging",slug:"/packaging/testing-a-package",permalink:"/docs/packaging/testing-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/testing-a-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:5,frontMatter:{title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},sidebar:"packagingSidebar",previous:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"},next:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"}},l={},c=[{value:"Install the .eopkg
files",id:"install-the-eopkg-files",level:2},{value:"For updated packages: Return to the repository version",id:"for-updated-packages-return-to-the-repository-version",level:2},{value:"Remove the .eopkg
files",id:"remove-the-eopkg-files",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"testing-a-package",children:"Testing a Package"})}),"\n",(0,s.jsx)(t.p,{children:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected."}),"\n",(0,s.jsxs)(t.p,{children:["You will use the ",(0,s.jsx)(t.code,{children:".eopkg"})," file(s) created by the build process for testing."]}),"\n",(0,s.jsxs)(t.h2,{id:"install-the-eopkg-files",children:["Install the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["To install your new package, run the following command in the directory where you built the package. Include ",(0,s.jsx)(t.strong,{children:"all"})," ",(0,s.jsx)(t.code,{children:".eopkg"})," files that were built."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it *.eopkg\n"})}),"\n",(0,s.jsx)(t.p,{children:"Testing need not be very complicated. The goal is to ensure the package will reliably work for our users. Testing effort will depend on how complex the software is. At minimum, you want to ensure the application launches, and performs basic functionality as expected."}),"\n",(0,s.jsx)(t.p,{children:"For example, if you were updating a text editor, you would want to make sure you can open, create and save files. If you know of issues the package has had in the past, it's a good idea to test that as well to make sure there are no regressions. There are plenty of historical pull requests to review if you want more detail."}),"\n",(0,s.jsx)(t.h2,{id:"for-updated-packages-return-to-the-repository-version",children:"For updated packages: Return to the repository version"}),"\n",(0,s.jsxs)(t.p,{children:["It is a good idea to uninstall the package you built, and return to the repository version, once you are done testing. To do this, run the following command on the main application. For example, if you just built and tested ",(0,s.jsx)(t.code,{children:"tree"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it --reinstall tree\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"remove-the-eopkg-files",children:["Remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["Before you can submit your pull request, you need to remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files. All repository packages are built by a dedicated build server from the source files provided in your pull request."]}),"\n",(0,s.jsx)(t.p,{children:"To remove these files, run:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"go-task clean\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>r,a:()=>i});var s=a(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/46a65d96.99a6e32d.js b/assets/js/46a65d96.97bfd57f.js
similarity index 98%
rename from assets/js/46a65d96.99a6e32d.js
rename to assets/js/46a65d96.97bfd57f.js
index 7c43e432c..242d01d2d 100644
--- a/assets/js/46a65d96.99a6e32d.js
+++ b/assets/js/46a65d96.97bfd57f.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8092],{82758:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=r(85893),t=r(11151);const n={title:"Repository Management",summary:"Repository Management"},d="Repository management",a={id:"user/package-management/repo-management",title:"Repository Management",description:"Solus offers two main software sources: stable (shannon) and unstable. The eopkg package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor.",source:"@site/docs/user/package-management/repo-management.md",sourceDirName:"user/package-management",slug:"/user/package-management/repo-management",permalink:"/docs/user/package-management/repo-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/repo-management.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Repository Management",summary:"Repository Management"},sidebar:"userSidebar",previous:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"},next:{title:"Privacy Policy",permalink:"/docs/user/privacy"}},i={},c=[{value:"Official repositories",id:"official-repositories",level:2},{value:"Repository management commands",id:"repository-management-commands",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"repository-management",children:"Repository management"})}),"\n",(0,o.jsxs)(s.p,{children:["Solus offers two main software sources: stable (shannon) and unstable. The ",(0,o.jsx)(s.code,{children:"eopkg"})," package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor."]}),"\n",(0,o.jsx)(s.h2,{id:"official-repositories",children:"Official repositories"}),"\n",(0,o.jsx)(s.p,{children:"The official Solus repositories are:"}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Repository"}),(0,o.jsx)(s.th,{children:"URL"}),(0,o.jsx)(s.th,{children:"Notes"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Stable (shannon)"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Default software source."})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Unstable"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Only use this source if build Solus packages or you test new software before it moves to the stable source."})]})]})]}),"\n",(0,o.jsxs)(s.admonition,{type:"danger",children:[(0,o.jsxs)(s.p,{children:["Updating your system while using the ",(0,o.jsx)(s.strong,{children:"unstable"})," source might be risky."]}),(0,o.jsxs)(s.p,{children:["Before updating, check the ",(0,o.jsx)(s.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:"#solus-packaging"})," Matrix room."]})]}),"\n",(0,o.jsx)(s.h2,{id:"repository-management-commands",children:"Repository management commands"}),"\n",(0,o.jsxs)(s.p,{children:["The following table lists the ",(0,o.jsx)(s.code,{children:"eopkg"})," commands you can use to manage your software sources."]}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Action"}),(0,o.jsx)(s.th,{children:"Command"}),(0,o.jsx)(s.th,{children:"Example"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Add a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo NAME URL"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo Example https://example.com/repo/eopkg-index.xml.xz"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Remove a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Enable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Disable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update all repositories"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"List repositories added to your system"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},11151:(e,s,r)=>{r.d(s,{Z:()=>a,a:()=>d});var o=r(67294);const t={},n=o.createContext(t);function d(e){const s=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8092],{82758:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=r(85893),t=r(11151);const n={title:"Repository Management",summary:"Repository Management"},d="Repository management",a={id:"user/package-management/repo-management",title:"Repository Management",description:"Solus offers two main software sources: stable (shannon) and unstable. The eopkg package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor.",source:"@site/docs/user/package-management/repo-management.md",sourceDirName:"user/package-management",slug:"/user/package-management/repo-management",permalink:"/docs/user/package-management/repo-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/repo-management.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Repository Management",summary:"Repository Management"},sidebar:"userSidebar",previous:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"},next:{title:"Privacy Policy",permalink:"/docs/user/privacy"}},i={},c=[{value:"Official repositories",id:"official-repositories",level:2},{value:"Repository management commands",id:"repository-management-commands",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"repository-management",children:"Repository management"})}),"\n",(0,o.jsxs)(s.p,{children:["Solus offers two main software sources: stable (shannon) and unstable. The ",(0,o.jsx)(s.code,{children:"eopkg"})," package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor."]}),"\n",(0,o.jsx)(s.h2,{id:"official-repositories",children:"Official repositories"}),"\n",(0,o.jsx)(s.p,{children:"The official Solus repositories are:"}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Repository"}),(0,o.jsx)(s.th,{children:"URL"}),(0,o.jsx)(s.th,{children:"Notes"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Stable (shannon)"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Default software source."})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Unstable"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Only use this source if build Solus packages or you test new software before it moves to the stable source."})]})]})]}),"\n",(0,o.jsxs)(s.admonition,{type:"danger",children:[(0,o.jsxs)(s.p,{children:["Updating your system while using the ",(0,o.jsx)(s.strong,{children:"unstable"})," source might be risky."]}),(0,o.jsxs)(s.p,{children:["Before updating, check the ",(0,o.jsx)(s.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:"#solus-packaging"})," Matrix room."]})]}),"\n",(0,o.jsx)(s.h2,{id:"repository-management-commands",children:"Repository management commands"}),"\n",(0,o.jsxs)(s.p,{children:["The following table lists the ",(0,o.jsx)(s.code,{children:"eopkg"})," commands you can use to manage your software sources."]}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Action"}),(0,o.jsx)(s.th,{children:"Command"}),(0,o.jsx)(s.th,{children:"Example"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Add a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo NAME URL"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo Example https://example.com/repo/eopkg-index.xml.xz"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Remove a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Enable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Disable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update all repositories"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"List repositories added to your system"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},11151:(e,s,r)=>{r.d(s,{Z:()=>a,a:()=>d});var o=r(67294);const t={},n=o.createContext(t);function d(e){const s=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4802fa93.42ab49a1.js b/assets/js/4802fa93.42ab49a1.js
deleted file mode 100644
index 3c3d0839c..000000000
--- a/assets/js/4802fa93.42ab49a1.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1774],{48815:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var n=o(85893),s=o(11151);const i={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},h=[{value:"The problem",id:"the-problem",level:2},{value:"Introducing the Solus MATE Transition Tool",id:"introducing-the-solus-mate-transition-tool",level:2},{value:"How the Mate Transition Tool is actually part of our Python2 work",id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]}),"\n",(0,n.jsx)(t.h2,{id:"the-problem",children:"The problem"}),"\n",(0,n.jsxs)(t.p,{children:["MATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of ",(0,n.jsx)(t.code,{children:"eopkg"})," commands. We're pretty sure our resident ",(0,n.jsx)(t.code,{children:"bash"})," script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know ",(0,n.jsx)(t.em,{children:"you"})," follow Solus news; after all, you're reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?"]}),"\n",(0,n.jsx)(t.h2,{id:"introducing-the-solus-mate-transition-tool",children:"Introducing the Solus MATE Transition Tool"}),"\n",(0,n.jsxs)(t.p,{children:["We're pleased to show off the ",(0,n.jsx)(t.em,{children:"MATE Transition Tool"}),", which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here's how MATE users will encounter the tool:"]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsx)(t.p,{children:"These screenshots are current as of the publishing of this post, we may change things as we continue testing."})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Users will get a notification on every start-up informing them that they need to transition away from MATE."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Notification: Solus Transition Service",src:o(64792).Z+"",width:"812",height:"333"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsx)(t.li,{children:"Clicking on that notification will launch the Solus MATE Transition Tool."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"MATE Transition Tool Launch",src:o(46311).Z+"",width:"1134",height:"673"})}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsx)(t.li,{children:"Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot"}),"\n",(0,n.jsx)(t.li,{children:"The tool removes itself after a successful transition."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Simple. At least, that's what we want users to think."}),"\n",(0,n.jsx)(t.h2,{id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",children:"How the Mate Transition Tool is actually part of our Python2 work"}),"\n",(0,n.jsxs)(t.p,{children:["The story of the MATE Transition Tool is actually tied up in our fight to drag ",(0,n.jsx)(t.code,{children:"eopkg"})," into the current decade. As I wrote previously, we're somewhat embarrassed by the amount of Solus tooling which ",(0,n.jsx)(t.em,{children:"still"})," relies on Python2. One such tool is the Solus Software Center ",(0,n.jsx)(t.code,{children:"solus-sc"}),". A while back, the team decided the sane thing to do was to ditch ",(0,n.jsx)(t.code,{children:"solus-sc"})," in favor of ",(0,n.jsx)(t.em,{children:"KDE Discover"})," and ",(0,n.jsx)(t.em,{children:"GNOME Software"})," . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is ",(0,n.jsx)(t.em,{children:"Discover"})," and ",(0,n.jsx)(t.em,{children:"Software"})," have no way to talk to our package manager ",(0,n.jsx)(t.code,{children:"eopkg"}),". We need an API. Luckily, other projects have encountered the same issue, leading to ",(0,n.jsx)(t.a,{href:"https://www.freedesktop.org/software/PackageKit/pk-intro.html",children:(0,n.jsx)(t.code,{children:"packagekit"})}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Joey has been doing the dirty work of bolting ",(0,n.jsx)(t.code,{children:"packagekit"})," support onto ",(0,n.jsx)(t.code,{children:"eopkg"}),", and saw an opportunity: If ",(0,n.jsx)(t.code,{children:"eopkg"})," could be upgraded to understand some of ",(0,n.jsx)(t.code,{children:"packagekit"}),", then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We're rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking ",(0,n.jsx)(t.code,{children:"solus-sc"})," off ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"the list."})]})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},46311:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/MTT-launch-9408fee2f5bfdf5d356638dab8047dd0.png"},64792:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/notification-1be98b16b9621bf36eac8d89defb71e6.png"},11151:(e,t,o)=>{o.d(t,{Z:()=>l,a:()=>a});var n=o(67294);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4802fa93.68b985c8.js b/assets/js/4802fa93.68b985c8.js
new file mode 100644
index 000000000..4503975c0
--- /dev/null
+++ b/assets/js/4802fa93.68b985c8.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1774],{48815:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var n=o(85893),s=o(11151);const i={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},h=[{value:"The problem",id:"the-problem",level:2},{value:"Introducing the Solus MATE Transition Tool",id:"introducing-the-solus-mate-transition-tool",level:2},{value:"How the Mate Transition Tool is actually part of our Python2 work",id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]}),"\n",(0,n.jsx)(t.h2,{id:"the-problem",children:"The problem"}),"\n",(0,n.jsxs)(t.p,{children:["MATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of ",(0,n.jsx)(t.code,{children:"eopkg"})," commands. We're pretty sure our resident ",(0,n.jsx)(t.code,{children:"bash"})," script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know ",(0,n.jsx)(t.em,{children:"you"})," follow Solus news; after all, you're reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?"]}),"\n",(0,n.jsx)(t.h2,{id:"introducing-the-solus-mate-transition-tool",children:"Introducing the Solus MATE Transition Tool"}),"\n",(0,n.jsxs)(t.p,{children:["We're pleased to show off the ",(0,n.jsx)(t.em,{children:"MATE Transition Tool"}),", which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here's how MATE users will encounter the tool:"]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsx)(t.p,{children:"These screenshots are current as of the publishing of this post, we may change things as we continue testing."})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Users will get a notification on every start-up informing them that they need to transition away from MATE."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Notification: Solus Transition Service",src:o(64792).Z+"",width:"812",height:"333"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsx)(t.li,{children:"Clicking on that notification will launch the Solus MATE Transition Tool."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"MATE Transition Tool Launch",src:o(46311).Z+"",width:"1134",height:"673"})}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsx)(t.li,{children:"Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot"}),"\n",(0,n.jsx)(t.li,{children:"The tool removes itself after a successful transition."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Simple. At least, that's what we want users to think."}),"\n",(0,n.jsx)(t.h2,{id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",children:"How the Mate Transition Tool is actually part of our Python2 work"}),"\n",(0,n.jsxs)(t.p,{children:["The story of the MATE Transition Tool is actually tied up in our fight to drag ",(0,n.jsx)(t.code,{children:"eopkg"})," into the current decade. As I wrote previously, we're somewhat embarrassed by the amount of Solus tooling which ",(0,n.jsx)(t.em,{children:"still"})," relies on Python2. One such tool is the Solus Software Center ",(0,n.jsx)(t.code,{children:"solus-sc"}),". A while back, the team decided the sane thing to do was to ditch ",(0,n.jsx)(t.code,{children:"solus-sc"})," in favor of ",(0,n.jsx)(t.em,{children:"KDE Discover"})," and ",(0,n.jsx)(t.em,{children:"GNOME Software"})," . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is ",(0,n.jsx)(t.em,{children:"Discover"})," and ",(0,n.jsx)(t.em,{children:"Software"})," have no way to talk to our package manager ",(0,n.jsx)(t.code,{children:"eopkg"}),". We need an API. Luckily, other projects have encountered the same issue, leading to ",(0,n.jsx)(t.a,{href:"https://www.freedesktop.org/software/PackageKit/pk-intro.html",children:(0,n.jsx)(t.code,{children:"packagekit"})}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Joey has been doing the dirty work of bolting ",(0,n.jsx)(t.code,{children:"packagekit"})," support onto ",(0,n.jsx)(t.code,{children:"eopkg"}),", and saw an opportunity: If ",(0,n.jsx)(t.code,{children:"eopkg"})," could be upgraded to understand some of ",(0,n.jsx)(t.code,{children:"packagekit"}),", then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We're rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking ",(0,n.jsx)(t.code,{children:"solus-sc"})," off ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"the list."})]})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},46311:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/MTT-launch-9408fee2f5bfdf5d356638dab8047dd0.png"},64792:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/notification-1be98b16b9621bf36eac8d89defb71e6.png"},11151:(e,t,o)=>{o.d(t,{Z:()=>l,a:()=>a});var n=o(67294);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/49b71c16.14dff61b.js b/assets/js/49b71c16.dfd61da5.js
similarity index 99%
rename from assets/js/49b71c16.14dff61b.js
rename to assets/js/49b71c16.dfd61da5.js
index 77615463a..64ca26419 100644
--- a/assets/js/49b71c16.14dff61b.js
+++ b/assets/js/49b71c16.dfd61da5.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3783],{99937:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>d,toc:()=>r});var s=i(85893),a=i(11151);const c={title:"Packaging Practices",summary:"Learning the best packaging practices"},t="Packaging Practices",d={id:"packaging/packaging-practices",title:"Packaging Practices",description:"The primary goal of ypkg is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices.",source:"@site/docs/packaging/packaging-practices.md",sourceDirName:"packaging",slug:"/packaging/packaging-practices",permalink:"/docs/packaging/packaging-practices",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-practices.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Packaging Practices",summary:"Learning the best packaging practices"},sidebar:"packagingSidebar",previous:{title:"Package YAML",permalink:"/docs/packaging/package.yml"},next:{title:"Procedures",permalink:"/docs/category/procedures"}},l={},r=[{value:"Package naming",id:"package-naming",level:2},{value:"The devel subpackage",id:"the-devel-subpackage",level:3},{value:"The docs subpackage",id:"the-docs-subpackage",level:3},{value:"The 32bit subpackage",id:"the-32bit-subpackage",level:3},{value:"The utils subpackage",id:"the-utils-subpackage",level:3},{value:"Maintenance",id:"maintenance",level:2},{value:"Licenses",id:"licenses",level:2},{value:"Build dependencies",id:"build-dependencies",level:2},{value:"Background",id:"background",level:3},{value:"Finding what package provides a pkgconfig dependency (if any)",id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",level:3},{value:"Using pkgconfig dependencies",id:"using-pkgconfig-dependencies",level:3},{value:"Using explicitly named dependencies",id:"using-explicitly-named-dependencies",level:3},{value:"Runtime dependencies",id:"runtime-dependencies",level:2},{value:"Check dependencies",id:"check-dependencies",level:2},{value:"Example",id:"example",level:3},{value:"Patching / extra files",id:"patching--extra-files",level:2},{value:"Applying a patch",id:"applying-a-patch",level:3},{value:"Handling multiple patches",id:"handling-multiple-patches",level:4},{value:"Installing extra files",id:"installing-extra-files",level:2},{value:"Patterns",id:"patterns",level:2},{value:"Replace / rename",id:"replace--rename",level:2}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"packaging-practices",children:"Packaging Practices"})}),"\n",(0,s.jsxs)(n.p,{children:["The primary goal of ",(0,s.jsx)(n.code,{children:"ypkg"})," is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices."]}),"\n",(0,s.jsx)(n.p,{children:"The next few sections will detail these."}),"\n",(0,s.jsx)(n.h2,{id:"package-naming",children:"Package naming"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"ypkg"})," tool does not allow for custom subpackages or subpackage naming, and will enforce its own policy. This can be eased somewhat through the use of ",(0,s.jsx)(n.code,{children:"patterns"}),", however the available subpackage names are limited."]}),"\n",(0,s.jsxs)(n.p,{children:["We request you use (where possible) the upstream source name for your package. Subpackage names (when generated) are constructed by using the ",(0,s.jsx)(n.code,{children:"name"})," value first, then applying the subpackage name as such:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"pkgname-$subpackage"})}),"\n",(0,s.jsxs)(n.p,{children:["Subpackages are fully automatic with ",(0,s.jsx)(n.code,{children:"ypkg"}),", and are created based on file patterns. All subpackages automatically depend on the main package, to ensure correct operation. In the following explanations, ",(0,s.jsx)(n.code,{children:"$lib"})," is used to refer to the host library directory, i.e. ",(0,s.jsx)(n.code,{children:"lib"})," or ",(0,s.jsx)(n.code,{children:"lib64"})," (or ",(0,s.jsx)(n.code,{children:"lib32"})," on ",(0,s.jsx)(n.code,{children:"emul32"})," builds)."]}),"\n",(0,s.jsx)(n.p,{children:"For the libraries / packages of the following programming languages, you should typically use the following template for it."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Language"}),(0,s.jsx)(n.th,{children:"Prefix"}),(0,s.jsx)(n.th,{children:"Example"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Haskell"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"haskell-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"text-binary"})," would be ",(0,s.jsx)(n.code,{children:"haskell-text-binary"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Perl"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"perl-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"algorithm-diff"})," would be ",(0,s.jsx)(n.code,{children:"perl-algorithm-diff"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Python"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"python-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"wikipedia"})," would be ",(0,s.jsx)(n.code,{children:"python-wikipedia"})," ",(0,s.jsx)(n.strong,{children:"even if only Python3 is enabled"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Ruby"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ruby-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"gssapi"})," would be ",(0,s.jsx)(n.code,{children:"ruby-gssapi"})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"the-devel-subpackage",children:"The devel subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is invariably created for packages that provide libraries and development headers. The following rules will result in files being placed in a ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/include\n/usr/$lib/lib*.so\n/usr/$lib/lib*.a\n/usr/share/man/man3\n/usr/share/pkgconfig\n/usr/$lib/pkgconfig\n/usr/share/cmake\n/usr/share/vala\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that for some packages, ",(0,s.jsx)(n.code,{children:"/usr/$lib/lib*.so"})," files are not symlinks. In this instance, the main package will be broken with no library files present. This can quickly be determined by looking at the resulting ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file generated after running the build.\nIf this happens, simply override with ",(0,s.jsx)(n.code,{children:"patterns"})," or set ",(0,s.jsx)(n.code,{children:"libsplit"})," to \u201cno\u201d."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"A note on static archives"}),": Unless it is absolutely unavoidable, you should disable static libraries within your build. This is usually fixed by adding ",(0,s.jsx)(n.code,{children:"--disable-static"})," to your configure routine. If ",(0,s.jsx)(n.code,{children:"*.a"})," files are shown in your packaging request, it will be questioned, as they can pose a greater security risk if packages link against these static archives."]}),"\n",(0,s.jsx)(n.h3,{id:"the-docs-subpackage",children:"The docs subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["Currently there is only one pattern which is forced into a ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/share/gtk-doc/html\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If required, you can use ",(0,s.jsx)(n.code,{children:"patterns"})," to move other files into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage, reducing the size of the main package."]}),"\n",(0,s.jsx)(n.h3,{id:"the-32bit-subpackage",children:"The 32bit subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This subpackage is only generated during an ",(0,s.jsx)(n.code,{children:"emul32"})," build. The following paths will automatically be placed into a ",(0,s.jsx)(n.code,{children:"32bit"})," subpackage"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/lib32/lib*.so\n/usr/lib32/lib*.so.*\n/usr/lib32/lib*.a\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note the same static archive rules apply to ",(0,s.jsx)(n.code,{children:"32bit"})," packages. These packages aren\u2019t as heavily split as we try to discourage their use, though they must be provided in some instances."]}),"\n",(0,s.jsx)(n.h3,{id:"the-utils-subpackage",children:"The utils subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is not an automatic subpackage, you must use ",(0,s.jsx)(n.code,{children:"patterns"})," to utilize it. It is provided for instances that it may not be suitable to have binaries present, i.e. for a library package."]}),"\n",(0,s.jsx)(n.h2,{id:"maintenance",children:"Maintenance"}),"\n",(0,s.jsxs)(n.p,{children:["When submitting a changed ",(0,s.jsx)(n.code,{children:"package.yml"}),", it must be accompanied by its corresponding ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file, which was generated at build time. This machine file allows the repository maintainers to evaluate the package condition."]}),"\n",(0,s.jsxs)(n.p,{children:["When providing a new version of a package, or a fix, always ensure you increment the ",(0,s.jsx)(n.code,{children:"release"})," number by 1. This ensures that users of your package are correctly updated to the latest version."]}),"\n",(0,s.jsxs)(n.p,{children:["Never submit a package without having first tested it, and ensuring it builds within ",(0,s.jsx)(n.code,{children:"solbuild"}),", a clean chroot environment."]}),"\n",(0,s.jsx)(n.h2,{id:"licenses",children:"Licenses"}),"\n",(0,s.jsxs)(n.p,{children:["All new packages or updates to packages should abide by the ",(0,s.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX 3.x"})," definitions, with the following policy:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-only"})," licenses, such as ",(0,s.jsx)(n.code,{children:"GPL-2.0-only"}),", should ",(0,s.jsx)(n.strong,{children:"only be declared"}),' as such when the upstream explicitly states "only", otherwise it should always be ',(0,s.jsx)(n.code,{children:"-or-later"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"build-dependencies",children:"Build dependencies"}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:["Build dependencies should be ordered according to the following rules in ",(0,s.jsx)(n.code,{children:"package.yml"}),":"]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies before explicitly named dependencies"]}),"\n",(0,s.jsxs)(n.li,{children:["Each of these two groups in so-called ASCIIbetical order (that is, alphabetical order with all uppercase letters before lowercase letters, and digits/punctuation before letters, ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ASCII#Character_order",children:"see here"}),")"]}),"\n"]}),(0,s.jsx)(n.p,{children:"Example:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps :\n - pkgconfig(MYGUI)\n - pkgconfig(Qt5Core)\n - pkgconfig(ayatana-appindicator-0.1)\n - pkgconfig(dri)\n - pkgconfig(gtk+-3.0)\n - The-Powder-Toy\n - abcMIDI\n - abcm2ps\n - git\n - python-poetry\n - swig\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"background",children:"Background"}),"\n",(0,s.jsx)(n.p,{children:"Most software packages that you build will, in one way or another, depend on another software package to provide specific functionality. This is usually achieved by using a library."}),"\n",(0,s.jsx)(n.p,{children:"Any package that is submitted to our repositories is always built in a clean chroot environment. Therefore, any dependencies required to build that package in a reproducible and sane fashion must be listed."}),"\n",(0,s.jsxs)(n.p,{children:["This is achieved by populating the ",(0,s.jsx)(n.code,{children:"builddeps"})," key with a list of build dependencies. We support two kinds of build dependencies: explicitly named, or ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies."]}),"\n",(0,s.jsxs)(n.p,{children:["We prefer the use of ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. Most modern software will use the ",(0,s.jsx)(n.code,{children:"pkg-config"})," tool (package configuration) to determine which files are required to build the current software. This may include compiler flags, library to link against and where the package headers are located."]}),"\n",(0,s.jsxs)(n.p,{children:["An obvious advantage to supporting ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies is that there is a 1:1 mapping between the name requested by the build and the name used within the ",(0,s.jsx)(n.code,{children:"package.yml"}),". Instead of trying to hunt down the package providing that dependency, you simply list the same name. Any package in the repository will export information about the ",(0,s.jsx)(n.code,{children:".pc"})," files (for ",(0,s.jsx)(n.code,{children:"pkg-config"}),") it contains, enabling you to use those as a build dependency."]}),"\n",(0,s.jsxs)(n.p,{children:["A secondary advantage is that this allows for easily switching or replacing a providing package. When no ",(0,s.jsx)(n.code,{children:"pkgconfig"})," name is available (some packages do not provide these, or it doesn\u2019t make sense for them to), you may use the explicit package name. Always ensure you select the correct package, i.e. the ",(0,s.jsx)(n.code,{children:"-devel"})," subpackage. This provides the necessary symlinks and headers to build packages."]}),"\n",(0,s.jsx)(n.h3,{id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",children:"Finding what package provides a pkgconfig dependency (if any)"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.code,{children:"go-task"})," to find packages that satisfy ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. It can search for multiple dependencies at once."]}),"\n",(0,s.jsxs)(n.p,{children:["As an example, if you know a package has the build dependencies ",(0,s.jsx)(n.code,{children:"Qt5Core"})," and ",(0,s.jsx)(n.code,{children:"Qt6Core"}),", you would run:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task pkgconfig -- Qt5Core Qt6Core\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pkgconfig(Qt5Core) found in: qt5-base-devel\npkgconfig(Qt6Core) found in: qt6-base-devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can also determine if there are ",(0,s.jsx)(n.code,{children:"pkgconfigs"})," available from a ",(0,s.jsx)(n.code,{children:"-devel"})," package by doing ",(0,s.jsx)(n.code,{children:"eopkg info (name)"})," and looking for the ",(0,s.jsx)(n.code,{children:"Provides"})," key."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"eopkg info libgtk-3-devel\n"})}),"\n",(0,s.jsx)(n.p,{children:"In output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Provides: pkgconfig(gtk+-3.0) pkgconfig(gdk-3.0) pkgconfig(gdk-wayland-3.0) pkgconfig(gail-3.0) pkgconfig(gdk-x11-3.0) pkgconfig(gtk+-unix-print-3.0)\npkgconfig(gtk+-wayland-3.0) pkgconfig(gtk+-x11-3.0)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-pkgconfig-dependencies",children:"Using pkgconfig dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"builddeps"})," list, use the ",(0,s.jsx)(n.code,{children:"pkgconfig(name)"})," syntax. For example, to add ",(0,s.jsx)(n.code,{children:"gtk+-3.0"})," to the build dependencies, you would do the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - pkgconfig(gtk+-3.0)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["At build time the appropriate provider package is selected, in this instance ",(0,s.jsx)(n.code,{children:"libgtk-3-devel"})]}),"\n",(0,s.jsx)(n.h3,{id:"using-explicitly-named-dependencies",children:"Using explicitly named dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["When there is not a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency available, use an explicitly named dependency.\nSimply list the package name."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency is available you will be asked to use that instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - stk-devel\n"})}),"\n",(0,s.jsx)(n.h2,{id:"runtime-dependencies",children:"Runtime dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Runtime dependencies are extra packages that a package needs in order to function correctly. A common example of this is other libraries. Solus ",(0,s.jsx)(n.code,{children:"eopkg"})," packages will automatically add any binary dependencies at runtime, so that you do not have to."]}),"\n",(0,s.jsxs)(n.p,{children:["All ",(0,s.jsx)(n.code,{children:"devel"})," subpackages automatically depend on their parent package. On top of this, if they provide a ",(0,s.jsx)(n.code,{children:".pc"})," pkg-config file, we export this information, and automatically determine the packages this particular package would need to be able to build against correctly. As such, the majority of dependencies for builds are automatically resolved."]}),"\n",(0,s.jsx)(n.p,{children:"In certain instances, binary dependencies aren\u2019t enough. An example of this might be an extra Python package, or a font, something that is not accounted for by binary checks."}),"\n",(0,s.jsxs)(n.p,{children:["To account for this, you may add extra explicit runtime dependencies to your package. These are taken from the optional ",(0,s.jsx)(n.code,{children:"rundeps"})," ypkg key."]}),"\n",(0,s.jsxs)(n.p,{children:["This key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is the current package ",(0,s.jsx)(n.code,{children:"name"}),". You may express a different subpackage to apply dependencies to by using that name as a key, i.e. ",(0,s.jsx)(n.code,{children:"devel"}),", or ",(0,s.jsx)(n.code,{children:"docs"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This would add the \u201cpython-gobject\u201d runtime dependency to the main package:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This would add the same dependency, as well as adding it to the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel: python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Remember this uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, which is very flexible. You can equally express this as follows (adding more deps as an example):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel:\n - somepackage\n - someotherpackage\n"})}),"\n",(0,s.jsx)(n.h2,{id:"check-dependencies",children:"Check dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Check dependencies are a special kind of build dependency reserved for automatic package testing by ",(0,s.jsx)(n.code,{children:"solbuild"}),". Check dependencies should only be used during the ",(0,s.jsx)(n.code,{children:"check"})," build phase.\nWhen a package is part of an automatic build sequence, these dependencies will ",(0,s.jsx)(n.strong,{children:"not"})," be considered when determining build order."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["The package ",(0,s.jsx)(n.code,{children:"cbindgen"})," includes ",(0,s.jsx)(n.code,{children:"cython"})," in ",(0,s.jsx)(n.code,{children:"checkdeps"})," to run tests in the ",(0,s.jsx)(n.code,{children:"check"})," phase."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/blob/main/packages/c/cbindgen/package.yml",children:"cbindgen package.yml file"})}),"\n",(0,s.jsx)(n.h2,{id:"patching--extra-files",children:"Patching / extra files"}),"\n",(0,s.jsxs)(n.p,{children:["Files that may be required during the build can be accessed via the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. Note that you must store your files in the ",(0,s.jsx)(n.code,{children:"./files"})," directory relative to your ",(0,s.jsx)(n.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(n.p,{children:["Both patches and extra files (such as systemd units) are stored in this directory. Note that if your patch is to address a ",(0,s.jsx)(n.strong,{children:"CVE"}),", you must use the following naming scheme: ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.patch"})]}),"\n",(0,s.jsxs)(n.p,{children:["Where ",(0,s.jsx)(n.code,{children:"xxxx-xxxx"})," is replaced with the full CVE ID. Complying with this simple rule ensures that we can know at any time the security status of packages when using tools such as ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),"\nkept\nSolus tooling allows the use of ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.nopatch"})," (which isn't applied in the build) to indicate that a CVE has been validated as not applicable to the Solus package. This can be because another patch resolves this CVE, or there is a false positive via ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),". The contents of the file can describe why it doesn't apply without requiring a patch (i.e. Resolved by cve-xxxx-xxxx.patch)."]}),"\n",(0,s.jsx)(n.h3,{id:"applying-a-patch",children:"Applying a patch"}),"\n",(0,s.jsxs)(n.p,{children:["It is common practice to apply the patch file(s) within the ",(0,s.jsx)(n.code,{children:"setup"})," section of your build staging. We can achieve this using the ",(0,s.jsx)(n.code,{children:"%patch"})," macro, and the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. In this example, the required file is located at ",(0,s.jsx)(n.code,{children:"./files/0002-Sample-commit-2.patch"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"%patch -p1 -i $pkgfiles/0002-Sample-commit-2.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note you use the macro as you would normally use the ",(0,s.jsx)(n.code,{children:"patch"})," command, however use of the macro ensures it performs a clean batch-mode patch."]}),"\n",(0,s.jsxs)(n.p,{children:["If you are using compressed patches, i.e. for the ",(0,s.jsx)(n.code,{children:"bash"})," or ",(0,s.jsx)(n.code,{children:"readline"})," packages, you can pipe the call through ",(0,s.jsx)(n.code,{children:"zcat"})," or similar:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zcat $pkgfiles/bash43-032.gz | %patch -p0\n"})}),"\n",(0,s.jsx)(n.h4,{id:"handling-multiple-patches",children:"Handling multiple patches"}),"\n",(0,s.jsxs)(n.p,{children:["In the event you need to apply multiple patches, such as a multitude of CVE patches, it may be sensible to use our ",(0,s.jsx)(n.code,{children:"%apply_patches"})," macro, which will apply all the patches listed in a ",(0,s.jsx)(n.code,{children:"series"})," file in your package's ",(0,s.jsx)(n.code,{children:"./files"})," folder. Example below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch\nfix-silliness.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Both of the files above will be applied using stripping number ",(0,s.jsx)(n.code,{children:"-p1"}),". If you need to use a different stripping number, like ",(0,s.jsx)(n.code,{children:"-p4"}),", you can write:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch -p4\nfix-silliness.patch\n"})}),"\n",(0,s.jsx)(n.h2,{id:"installing-extra-files",children:"Installing extra files"}),"\n",(0,s.jsxs)(n.p,{children:["We recommend using patches where possible first, as they ensure correct maintenance and will be updated across package versions. If you must install extra files into the directory, please use the ",(0,s.jsx)(n.code,{children:"install"})," command, ensuring you set the correct permissions. Again, files are accessible from the ",(0,s.jsx)(n.code,{children:"./files"})," directory, relative to ",(0,s.jsx)(n.code,{children:"package.yml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["This is an example of installing a custom profile file, seen in the ",(0,s.jsx)(n.code,{children:"bash"})," package:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"install -m 0644 $pkgfiles/profile $installdir/etc/profile\n"})}),"\n",(0,s.jsx)(n.h2,{id:"patterns",children:"Patterns"}),"\n",(0,s.jsxs)(n.p,{children:["In most instances, ",(0,s.jsx)(n.code,{children:"ypkg"})," will assign the correct location for files, whether it be in the main ",(0,s.jsx)(n.code,{children:"name"})," package, or a subpackage. However there may be instances where the default does not match the intended behaviour."]}),"\n",(0,s.jsx)(n.p,{children:"In these instances it is possible to override the default assignment by way of patterns. These are simply a list of paths or globs to ensure a particular file, or set of files, end up in the desired location."}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"patterns"})," key expects a ",(0,s.jsx)(n.code,{children:"dict(s)"})," argument. The default key for each pattern is assumed to be the ",(0,s.jsx)(n.code,{children:"name"})," of the package, so omitting the name would place files into the main package. The value should be a path or pattern you wish to match, ensuring files go to a specific location."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example from ",(0,s.jsx)(n.code,{children:"libjpeg-turbo"}),", we move all documentation into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - docs: [/usr/share/man]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This example, taken from the ",(0,s.jsx)(n.code,{children:"wayland"})," package, ensures the binaries from ",(0,s.jsx)(n.code,{children:"/usr/bin"})," and the directory ",(0,s.jsx)(n.code,{children:"/usr/share/wayland"})," are located in the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - devel:\n - /usr/bin\n - /usr/share/wayland\n"})}),"\n",(0,s.jsx)(n.h2,{id:"replace--rename",children:"Replace / rename"}),"\n",(0,s.jsxs)(n.p,{children:["In some situations, it may be required to replace one package with another, or to rename an existing package. In these instances you should coordinate with a repository maintainer to ensure the replaced package is marked ",(0,s.jsx)(n.strong,{children:"Obsolete"})," within the index. This will ensure correct upgrade paths for users."]}),"\n",(0,s.jsxs)(n.p,{children:["Note that to retire a package, you must also coordinate with a repository maintainer. An ",(0,s.jsx)(n.strong,{children:"Obsolete"})," package is removed by the package manager when the user upgrades. As such, correct upgrade paths need to be established."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"replaces"})," ypkg key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is assumed to be the current package ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example, we rename the ",(0,s.jsx)(n.code,{children:"libgeoclue*"})," packages to use the correct names, and ensure a working upgrade path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"replaces:\n - devel: libgeoclue-devel\n - libgeoclue\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"name"})," of this package is ",(0,s.jsx)(n.code,{children:"geoclue"}),", and the new package names are now:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue-devel"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Given the ",(0,s.jsx)(n.code,{children:"replaces"})," values above, ",(0,s.jsx)(n.code,{children:"geoclue"})," now replaces ",(0,s.jsx)(n.code,{children:"libgeoclue"}),", and ",(0,s.jsx)(n.code,{children:"geoclue-devel"})," replaces ",(0,s.jsx)(n.code,{children:"libgeoclue-devel"}),". This is entirely transparent to the user, with a seamless update replacing the old packages with the new renamed packages."]}),"\n",(0,s.jsxs)(n.p,{children:["The repository maintainer marked the old names as ",(0,s.jsx)(n.strong,{children:"Obsolete"})," in the index."]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(67294);const a={},c=s.createContext(a);function t(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3783],{99937:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>d,toc:()=>r});var s=i(85893),a=i(11151);const c={title:"Packaging Practices",summary:"Learning the best packaging practices"},t="Packaging Practices",d={id:"packaging/packaging-practices",title:"Packaging Practices",description:"The primary goal of ypkg is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices.",source:"@site/docs/packaging/packaging-practices.md",sourceDirName:"packaging",slug:"/packaging/packaging-practices",permalink:"/docs/packaging/packaging-practices",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-practices.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Packaging Practices",summary:"Learning the best packaging practices"},sidebar:"packagingSidebar",previous:{title:"Package YAML",permalink:"/docs/packaging/package.yml"},next:{title:"Procedures",permalink:"/docs/category/procedures"}},l={},r=[{value:"Package naming",id:"package-naming",level:2},{value:"The devel subpackage",id:"the-devel-subpackage",level:3},{value:"The docs subpackage",id:"the-docs-subpackage",level:3},{value:"The 32bit subpackage",id:"the-32bit-subpackage",level:3},{value:"The utils subpackage",id:"the-utils-subpackage",level:3},{value:"Maintenance",id:"maintenance",level:2},{value:"Licenses",id:"licenses",level:2},{value:"Build dependencies",id:"build-dependencies",level:2},{value:"Background",id:"background",level:3},{value:"Finding what package provides a pkgconfig dependency (if any)",id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",level:3},{value:"Using pkgconfig dependencies",id:"using-pkgconfig-dependencies",level:3},{value:"Using explicitly named dependencies",id:"using-explicitly-named-dependencies",level:3},{value:"Runtime dependencies",id:"runtime-dependencies",level:2},{value:"Check dependencies",id:"check-dependencies",level:2},{value:"Example",id:"example",level:3},{value:"Patching / extra files",id:"patching--extra-files",level:2},{value:"Applying a patch",id:"applying-a-patch",level:3},{value:"Handling multiple patches",id:"handling-multiple-patches",level:4},{value:"Installing extra files",id:"installing-extra-files",level:2},{value:"Patterns",id:"patterns",level:2},{value:"Replace / rename",id:"replace--rename",level:2}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"packaging-practices",children:"Packaging Practices"})}),"\n",(0,s.jsxs)(n.p,{children:["The primary goal of ",(0,s.jsx)(n.code,{children:"ypkg"})," is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices."]}),"\n",(0,s.jsx)(n.p,{children:"The next few sections will detail these."}),"\n",(0,s.jsx)(n.h2,{id:"package-naming",children:"Package naming"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"ypkg"})," tool does not allow for custom subpackages or subpackage naming, and will enforce its own policy. This can be eased somewhat through the use of ",(0,s.jsx)(n.code,{children:"patterns"}),", however the available subpackage names are limited."]}),"\n",(0,s.jsxs)(n.p,{children:["We request you use (where possible) the upstream source name for your package. Subpackage names (when generated) are constructed by using the ",(0,s.jsx)(n.code,{children:"name"})," value first, then applying the subpackage name as such:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"pkgname-$subpackage"})}),"\n",(0,s.jsxs)(n.p,{children:["Subpackages are fully automatic with ",(0,s.jsx)(n.code,{children:"ypkg"}),", and are created based on file patterns. All subpackages automatically depend on the main package, to ensure correct operation. In the following explanations, ",(0,s.jsx)(n.code,{children:"$lib"})," is used to refer to the host library directory, i.e. ",(0,s.jsx)(n.code,{children:"lib"})," or ",(0,s.jsx)(n.code,{children:"lib64"})," (or ",(0,s.jsx)(n.code,{children:"lib32"})," on ",(0,s.jsx)(n.code,{children:"emul32"})," builds)."]}),"\n",(0,s.jsx)(n.p,{children:"For the libraries / packages of the following programming languages, you should typically use the following template for it."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Language"}),(0,s.jsx)(n.th,{children:"Prefix"}),(0,s.jsx)(n.th,{children:"Example"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Haskell"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"haskell-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"text-binary"})," would be ",(0,s.jsx)(n.code,{children:"haskell-text-binary"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Perl"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"perl-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"algorithm-diff"})," would be ",(0,s.jsx)(n.code,{children:"perl-algorithm-diff"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Python"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"python-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"wikipedia"})," would be ",(0,s.jsx)(n.code,{children:"python-wikipedia"})," ",(0,s.jsx)(n.strong,{children:"even if only Python3 is enabled"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Ruby"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ruby-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"gssapi"})," would be ",(0,s.jsx)(n.code,{children:"ruby-gssapi"})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"the-devel-subpackage",children:"The devel subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is invariably created for packages that provide libraries and development headers. The following rules will result in files being placed in a ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/include\n/usr/$lib/lib*.so\n/usr/$lib/lib*.a\n/usr/share/man/man3\n/usr/share/pkgconfig\n/usr/$lib/pkgconfig\n/usr/share/cmake\n/usr/share/vala\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that for some packages, ",(0,s.jsx)(n.code,{children:"/usr/$lib/lib*.so"})," files are not symlinks. In this instance, the main package will be broken with no library files present. This can quickly be determined by looking at the resulting ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file generated after running the build.\nIf this happens, simply override with ",(0,s.jsx)(n.code,{children:"patterns"})," or set ",(0,s.jsx)(n.code,{children:"libsplit"})," to \u201cno\u201d."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"A note on static archives"}),": Unless it is absolutely unavoidable, you should disable static libraries within your build. This is usually fixed by adding ",(0,s.jsx)(n.code,{children:"--disable-static"})," to your configure routine. If ",(0,s.jsx)(n.code,{children:"*.a"})," files are shown in your packaging request, it will be questioned, as they can pose a greater security risk if packages link against these static archives."]}),"\n",(0,s.jsx)(n.h3,{id:"the-docs-subpackage",children:"The docs subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["Currently there is only one pattern which is forced into a ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/share/gtk-doc/html\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If required, you can use ",(0,s.jsx)(n.code,{children:"patterns"})," to move other files into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage, reducing the size of the main package."]}),"\n",(0,s.jsx)(n.h3,{id:"the-32bit-subpackage",children:"The 32bit subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This subpackage is only generated during an ",(0,s.jsx)(n.code,{children:"emul32"})," build. The following paths will automatically be placed into a ",(0,s.jsx)(n.code,{children:"32bit"})," subpackage"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/lib32/lib*.so\n/usr/lib32/lib*.so.*\n/usr/lib32/lib*.a\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note the same static archive rules apply to ",(0,s.jsx)(n.code,{children:"32bit"})," packages. These packages aren\u2019t as heavily split as we try to discourage their use, though they must be provided in some instances."]}),"\n",(0,s.jsx)(n.h3,{id:"the-utils-subpackage",children:"The utils subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is not an automatic subpackage, you must use ",(0,s.jsx)(n.code,{children:"patterns"})," to utilize it. It is provided for instances that it may not be suitable to have binaries present, i.e. for a library package."]}),"\n",(0,s.jsx)(n.h2,{id:"maintenance",children:"Maintenance"}),"\n",(0,s.jsxs)(n.p,{children:["When submitting a changed ",(0,s.jsx)(n.code,{children:"package.yml"}),", it must be accompanied by its corresponding ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file, which was generated at build time. This machine file allows the repository maintainers to evaluate the package condition."]}),"\n",(0,s.jsxs)(n.p,{children:["When providing a new version of a package, or a fix, always ensure you increment the ",(0,s.jsx)(n.code,{children:"release"})," number by 1. This ensures that users of your package are correctly updated to the latest version."]}),"\n",(0,s.jsxs)(n.p,{children:["Never submit a package without having first tested it, and ensuring it builds within ",(0,s.jsx)(n.code,{children:"solbuild"}),", a clean chroot environment."]}),"\n",(0,s.jsx)(n.h2,{id:"licenses",children:"Licenses"}),"\n",(0,s.jsxs)(n.p,{children:["All new packages or updates to packages should abide by the ",(0,s.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX 3.x"})," definitions, with the following policy:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-only"})," licenses, such as ",(0,s.jsx)(n.code,{children:"GPL-2.0-only"}),", should ",(0,s.jsx)(n.strong,{children:"only be declared"}),' as such when the upstream explicitly states "only", otherwise it should always be ',(0,s.jsx)(n.code,{children:"-or-later"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"build-dependencies",children:"Build dependencies"}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:["Build dependencies should be ordered according to the following rules in ",(0,s.jsx)(n.code,{children:"package.yml"}),":"]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies before explicitly named dependencies"]}),"\n",(0,s.jsxs)(n.li,{children:["Each of these two groups in so-called ASCIIbetical order (that is, alphabetical order with all uppercase letters before lowercase letters, and digits/punctuation before letters, ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ASCII#Character_order",children:"see here"}),")"]}),"\n"]}),(0,s.jsx)(n.p,{children:"Example:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps :\n - pkgconfig(MYGUI)\n - pkgconfig(Qt5Core)\n - pkgconfig(ayatana-appindicator-0.1)\n - pkgconfig(dri)\n - pkgconfig(gtk+-3.0)\n - The-Powder-Toy\n - abcMIDI\n - abcm2ps\n - git\n - python-poetry\n - swig\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"background",children:"Background"}),"\n",(0,s.jsx)(n.p,{children:"Most software packages that you build will, in one way or another, depend on another software package to provide specific functionality. This is usually achieved by using a library."}),"\n",(0,s.jsx)(n.p,{children:"Any package that is submitted to our repositories is always built in a clean chroot environment. Therefore, any dependencies required to build that package in a reproducible and sane fashion must be listed."}),"\n",(0,s.jsxs)(n.p,{children:["This is achieved by populating the ",(0,s.jsx)(n.code,{children:"builddeps"})," key with a list of build dependencies. We support two kinds of build dependencies: explicitly named, or ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies."]}),"\n",(0,s.jsxs)(n.p,{children:["We prefer the use of ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. Most modern software will use the ",(0,s.jsx)(n.code,{children:"pkg-config"})," tool (package configuration) to determine which files are required to build the current software. This may include compiler flags, library to link against and where the package headers are located."]}),"\n",(0,s.jsxs)(n.p,{children:["An obvious advantage to supporting ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies is that there is a 1:1 mapping between the name requested by the build and the name used within the ",(0,s.jsx)(n.code,{children:"package.yml"}),". Instead of trying to hunt down the package providing that dependency, you simply list the same name. Any package in the repository will export information about the ",(0,s.jsx)(n.code,{children:".pc"})," files (for ",(0,s.jsx)(n.code,{children:"pkg-config"}),") it contains, enabling you to use those as a build dependency."]}),"\n",(0,s.jsxs)(n.p,{children:["A secondary advantage is that this allows for easily switching or replacing a providing package. When no ",(0,s.jsx)(n.code,{children:"pkgconfig"})," name is available (some packages do not provide these, or it doesn\u2019t make sense for them to), you may use the explicit package name. Always ensure you select the correct package, i.e. the ",(0,s.jsx)(n.code,{children:"-devel"})," subpackage. This provides the necessary symlinks and headers to build packages."]}),"\n",(0,s.jsx)(n.h3,{id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",children:"Finding what package provides a pkgconfig dependency (if any)"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.code,{children:"go-task"})," to find packages that satisfy ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. It can search for multiple dependencies at once."]}),"\n",(0,s.jsxs)(n.p,{children:["As an example, if you know a package has the build dependencies ",(0,s.jsx)(n.code,{children:"Qt5Core"})," and ",(0,s.jsx)(n.code,{children:"Qt6Core"}),", you would run:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task pkgconfig -- Qt5Core Qt6Core\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pkgconfig(Qt5Core) found in: qt5-base-devel\npkgconfig(Qt6Core) found in: qt6-base-devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can also determine if there are ",(0,s.jsx)(n.code,{children:"pkgconfigs"})," available from a ",(0,s.jsx)(n.code,{children:"-devel"})," package by doing ",(0,s.jsx)(n.code,{children:"eopkg info (name)"})," and looking for the ",(0,s.jsx)(n.code,{children:"Provides"})," key."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"eopkg info libgtk-3-devel\n"})}),"\n",(0,s.jsx)(n.p,{children:"In output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Provides: pkgconfig(gtk+-3.0) pkgconfig(gdk-3.0) pkgconfig(gdk-wayland-3.0) pkgconfig(gail-3.0) pkgconfig(gdk-x11-3.0) pkgconfig(gtk+-unix-print-3.0)\npkgconfig(gtk+-wayland-3.0) pkgconfig(gtk+-x11-3.0)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-pkgconfig-dependencies",children:"Using pkgconfig dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"builddeps"})," list, use the ",(0,s.jsx)(n.code,{children:"pkgconfig(name)"})," syntax. For example, to add ",(0,s.jsx)(n.code,{children:"gtk+-3.0"})," to the build dependencies, you would do the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - pkgconfig(gtk+-3.0)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["At build time the appropriate provider package is selected, in this instance ",(0,s.jsx)(n.code,{children:"libgtk-3-devel"})]}),"\n",(0,s.jsx)(n.h3,{id:"using-explicitly-named-dependencies",children:"Using explicitly named dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["When there is not a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency available, use an explicitly named dependency.\nSimply list the package name."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency is available you will be asked to use that instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - stk-devel\n"})}),"\n",(0,s.jsx)(n.h2,{id:"runtime-dependencies",children:"Runtime dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Runtime dependencies are extra packages that a package needs in order to function correctly. A common example of this is other libraries. Solus ",(0,s.jsx)(n.code,{children:"eopkg"})," packages will automatically add any binary dependencies at runtime, so that you do not have to."]}),"\n",(0,s.jsxs)(n.p,{children:["All ",(0,s.jsx)(n.code,{children:"devel"})," subpackages automatically depend on their parent package. On top of this, if they provide a ",(0,s.jsx)(n.code,{children:".pc"})," pkg-config file, we export this information, and automatically determine the packages this particular package would need to be able to build against correctly. As such, the majority of dependencies for builds are automatically resolved."]}),"\n",(0,s.jsx)(n.p,{children:"In certain instances, binary dependencies aren\u2019t enough. An example of this might be an extra Python package, or a font, something that is not accounted for by binary checks."}),"\n",(0,s.jsxs)(n.p,{children:["To account for this, you may add extra explicit runtime dependencies to your package. These are taken from the optional ",(0,s.jsx)(n.code,{children:"rundeps"})," ypkg key."]}),"\n",(0,s.jsxs)(n.p,{children:["This key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is the current package ",(0,s.jsx)(n.code,{children:"name"}),". You may express a different subpackage to apply dependencies to by using that name as a key, i.e. ",(0,s.jsx)(n.code,{children:"devel"}),", or ",(0,s.jsx)(n.code,{children:"docs"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This would add the \u201cpython-gobject\u201d runtime dependency to the main package:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This would add the same dependency, as well as adding it to the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel: python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Remember this uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, which is very flexible. You can equally express this as follows (adding more deps as an example):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel:\n - somepackage\n - someotherpackage\n"})}),"\n",(0,s.jsx)(n.h2,{id:"check-dependencies",children:"Check dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Check dependencies are a special kind of build dependency reserved for automatic package testing by ",(0,s.jsx)(n.code,{children:"solbuild"}),". Check dependencies should only be used during the ",(0,s.jsx)(n.code,{children:"check"})," build phase.\nWhen a package is part of an automatic build sequence, these dependencies will ",(0,s.jsx)(n.strong,{children:"not"})," be considered when determining build order."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["The package ",(0,s.jsx)(n.code,{children:"cbindgen"})," includes ",(0,s.jsx)(n.code,{children:"cython"})," in ",(0,s.jsx)(n.code,{children:"checkdeps"})," to run tests in the ",(0,s.jsx)(n.code,{children:"check"})," phase."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/blob/main/packages/c/cbindgen/package.yml",children:"cbindgen package.yml file"})}),"\n",(0,s.jsx)(n.h2,{id:"patching--extra-files",children:"Patching / extra files"}),"\n",(0,s.jsxs)(n.p,{children:["Files that may be required during the build can be accessed via the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. Note that you must store your files in the ",(0,s.jsx)(n.code,{children:"./files"})," directory relative to your ",(0,s.jsx)(n.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(n.p,{children:["Both patches and extra files (such as systemd units) are stored in this directory. Note that if your patch is to address a ",(0,s.jsx)(n.strong,{children:"CVE"}),", you must use the following naming scheme: ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.patch"})]}),"\n",(0,s.jsxs)(n.p,{children:["Where ",(0,s.jsx)(n.code,{children:"xxxx-xxxx"})," is replaced with the full CVE ID. Complying with this simple rule ensures that we can know at any time the security status of packages when using tools such as ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),"\nkept\nSolus tooling allows the use of ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.nopatch"})," (which isn't applied in the build) to indicate that a CVE has been validated as not applicable to the Solus package. This can be because another patch resolves this CVE, or there is a false positive via ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),". The contents of the file can describe why it doesn't apply without requiring a patch (i.e. Resolved by cve-xxxx-xxxx.patch)."]}),"\n",(0,s.jsx)(n.h3,{id:"applying-a-patch",children:"Applying a patch"}),"\n",(0,s.jsxs)(n.p,{children:["It is common practice to apply the patch file(s) within the ",(0,s.jsx)(n.code,{children:"setup"})," section of your build staging. We can achieve this using the ",(0,s.jsx)(n.code,{children:"%patch"})," macro, and the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. In this example, the required file is located at ",(0,s.jsx)(n.code,{children:"./files/0002-Sample-commit-2.patch"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"%patch -p1 -i $pkgfiles/0002-Sample-commit-2.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note you use the macro as you would normally use the ",(0,s.jsx)(n.code,{children:"patch"})," command, however use of the macro ensures it performs a clean batch-mode patch."]}),"\n",(0,s.jsxs)(n.p,{children:["If you are using compressed patches, i.e. for the ",(0,s.jsx)(n.code,{children:"bash"})," or ",(0,s.jsx)(n.code,{children:"readline"})," packages, you can pipe the call through ",(0,s.jsx)(n.code,{children:"zcat"})," or similar:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zcat $pkgfiles/bash43-032.gz | %patch -p0\n"})}),"\n",(0,s.jsx)(n.h4,{id:"handling-multiple-patches",children:"Handling multiple patches"}),"\n",(0,s.jsxs)(n.p,{children:["In the event you need to apply multiple patches, such as a multitude of CVE patches, it may be sensible to use our ",(0,s.jsx)(n.code,{children:"%apply_patches"})," macro, which will apply all the patches listed in a ",(0,s.jsx)(n.code,{children:"series"})," file in your package's ",(0,s.jsx)(n.code,{children:"./files"})," folder. Example below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch\nfix-silliness.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Both of the files above will be applied using stripping number ",(0,s.jsx)(n.code,{children:"-p1"}),". If you need to use a different stripping number, like ",(0,s.jsx)(n.code,{children:"-p4"}),", you can write:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch -p4\nfix-silliness.patch\n"})}),"\n",(0,s.jsx)(n.h2,{id:"installing-extra-files",children:"Installing extra files"}),"\n",(0,s.jsxs)(n.p,{children:["We recommend using patches where possible first, as they ensure correct maintenance and will be updated across package versions. If you must install extra files into the directory, please use the ",(0,s.jsx)(n.code,{children:"install"})," command, ensuring you set the correct permissions. Again, files are accessible from the ",(0,s.jsx)(n.code,{children:"./files"})," directory, relative to ",(0,s.jsx)(n.code,{children:"package.yml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["This is an example of installing a custom profile file, seen in the ",(0,s.jsx)(n.code,{children:"bash"})," package:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"install -m 0644 $pkgfiles/profile $installdir/etc/profile\n"})}),"\n",(0,s.jsx)(n.h2,{id:"patterns",children:"Patterns"}),"\n",(0,s.jsxs)(n.p,{children:["In most instances, ",(0,s.jsx)(n.code,{children:"ypkg"})," will assign the correct location for files, whether it be in the main ",(0,s.jsx)(n.code,{children:"name"})," package, or a subpackage. However there may be instances where the default does not match the intended behaviour."]}),"\n",(0,s.jsx)(n.p,{children:"In these instances it is possible to override the default assignment by way of patterns. These are simply a list of paths or globs to ensure a particular file, or set of files, end up in the desired location."}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"patterns"})," key expects a ",(0,s.jsx)(n.code,{children:"dict(s)"})," argument. The default key for each pattern is assumed to be the ",(0,s.jsx)(n.code,{children:"name"})," of the package, so omitting the name would place files into the main package. The value should be a path or pattern you wish to match, ensuring files go to a specific location."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example from ",(0,s.jsx)(n.code,{children:"libjpeg-turbo"}),", we move all documentation into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - docs: [/usr/share/man]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This example, taken from the ",(0,s.jsx)(n.code,{children:"wayland"})," package, ensures the binaries from ",(0,s.jsx)(n.code,{children:"/usr/bin"})," and the directory ",(0,s.jsx)(n.code,{children:"/usr/share/wayland"})," are located in the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - devel:\n - /usr/bin\n - /usr/share/wayland\n"})}),"\n",(0,s.jsx)(n.h2,{id:"replace--rename",children:"Replace / rename"}),"\n",(0,s.jsxs)(n.p,{children:["In some situations, it may be required to replace one package with another, or to rename an existing package. In these instances you should coordinate with a repository maintainer to ensure the replaced package is marked ",(0,s.jsx)(n.strong,{children:"Obsolete"})," within the index. This will ensure correct upgrade paths for users."]}),"\n",(0,s.jsxs)(n.p,{children:["Note that to retire a package, you must also coordinate with a repository maintainer. An ",(0,s.jsx)(n.strong,{children:"Obsolete"})," package is removed by the package manager when the user upgrades. As such, correct upgrade paths need to be established."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"replaces"})," ypkg key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is assumed to be the current package ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example, we rename the ",(0,s.jsx)(n.code,{children:"libgeoclue*"})," packages to use the correct names, and ensure a working upgrade path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"replaces:\n - devel: libgeoclue-devel\n - libgeoclue\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"name"})," of this package is ",(0,s.jsx)(n.code,{children:"geoclue"}),", and the new package names are now:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue-devel"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Given the ",(0,s.jsx)(n.code,{children:"replaces"})," values above, ",(0,s.jsx)(n.code,{children:"geoclue"})," now replaces ",(0,s.jsx)(n.code,{children:"libgeoclue"}),", and ",(0,s.jsx)(n.code,{children:"geoclue-devel"})," replaces ",(0,s.jsx)(n.code,{children:"libgeoclue-devel"}),". This is entirely transparent to the user, with a seamless update replacing the old packages with the new renamed packages."]}),"\n",(0,s.jsxs)(n.p,{children:["The repository maintainer marked the old names as ",(0,s.jsx)(n.strong,{children:"Obsolete"})," in the index."]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(67294);const a={},c=s.createContext(a);function t(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/513b6405.07a2f1ca.js b/assets/js/513b6405.4ada61ee.js
similarity index 99%
rename from assets/js/513b6405.07a2f1ca.js
rename to assets/js/513b6405.4ada61ee.js
index fd2045351..9c4be8f5e 100644
--- a/assets/js/513b6405.07a2f1ca.js
+++ b/assets/js/513b6405.4ada61ee.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4278],{38033:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=s(85893),n=s(11151);const o={title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},r="Prepare for packaging",a={id:"packaging/prepare-for-packaging",title:"Prepare for Packaging",description:"Switch to the Unstable repository",source:"@site/docs/packaging/prepare-for-packaging.md",sourceDirName:"packaging",slug:"/packaging/prepare-for-packaging",permalink:"/docs/packaging/prepare-for-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/prepare-for-packaging.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:1,frontMatter:{title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},sidebar:"packagingSidebar",previous:{title:"Packaging Overview",permalink:"/docs/packaging/"},next:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"}},l={},c=[{value:"Switch to the Unstable repository",id:"switch-to-the-unstable-repository",level:2},{value:"Setting up the packager file",id:"setting-up-the-packager-file",level:2},{value:"Installing development tools",id:"installing-development-tools",level:2},{value:"Setting up a GitHub account and Git",id:"setting-up-a-github-account-and-git",level:2},{value:"Configure github-cli
.",id:"configure-github-cli",level:3},{value:"Git identity setup",id:"git-identity-setup",level:3},{value:"Setting up solbuild",id:"setting-up-solbuild",level:2},{value:"Updating solbuild",id:"updating-solbuild",level:3},{value:"Fork the getsolus/packages repository",id:"fork-the-getsoluspackages-repository",level:2},{value:"Clone your forked package repository",id:"clone-your-forked-package-repository",level:2},{value:"Initialize git hooks",id:"initialize-git-hooks",level:2},{value:"Set up repository helper functions (optional)",id:"set-up-repository-helper-functions-optional",level:2},{value:"bash",id:"bash",level:3},{value:"fish",id:"fish",level:3},{value:"zsh",id:"zsh",level:3},{value:"Building packages",id:"building-packages",level:2}];function d(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"prepare-for-packaging",children:"Prepare for packaging"})}),"\n",(0,t.jsx)(i.h2,{id:"switch-to-the-unstable-repository",children:"Switch to the Unstable repository"}),"\n",(0,t.jsx)(i.p,{children:'Packages need to be built and tested against the "unstable" repository. If you don\'t want to switch your primary system to unstable, you can do your packaging work in a VM. We have Virtual Machine Manager and other similar tools in the Solus repository.'}),"\n",(0,t.jsxs)(i.p,{children:["Refer to ",(0,t.jsx)(i.a,{href:"/docs/user/package-management/repo-management",children:"Repository Management"})," to see how to add and switch to unstable."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-the-packager-file",children:"Setting up the packager file"}),"\n",(0,t.jsx)(i.p,{children:"In order to utilize the build system, you must first set up a configuration file that has your packager details."}),"\n",(0,t.jsxs)(i.p,{children:["This file lives in the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder of your home directory. You will need to create the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder as well as the inner ",(0,t.jsx)(i.code,{children:"packager"})," file. Inside the packager file, you need two keys, ",(0,t.jsx)(i.code,{children:"Name"})," and ",(0,t.jsx)(i.code,{children:"Email"}),". This is used when generating the machine file so that the packager details are stored within the resulting binary package."]}),"\n",(0,t.jsxs)(i.p,{children:["Name and email address are mandatory. You must use your real first and last name(s) for accountability purposes.\nA ",(0,t.jsx)(i.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-ini",children:"[Packager]\nName=Your Name Here\nEmail=your.email@address\nMatrix=@username:matrix.org\n"})}),"\n",(0,t.jsx)(i.h2,{id:"installing-development-tools",children:"Installing development tools"}),"\n",(0,t.jsx)(i.p,{children:"We need to install a few things in order to get started with packaging:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"git"})," is used for version control of the Solus sources"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"github-cli"})," is used to make working with GitHub easier"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"go-task"})," is used by our build tools for scripting"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"jq"})," is used by our optional ",(0,t.jsx)(i.a,{href:"#set-up-repository-helper-functions-optional",children:"Helper Functions"})]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild"})," is a lightweight container environment for building packages repeatably"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild-config-unstable"})," sets up solbuild for working with the ",(0,t.jsx)(i.code,{children:"unstable"})," repository"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"ypkg"})," is the program that actually builds packages"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"yq"})," is used by the ",(0,t.jsx)(i.code,{children:"go-task add-monitoring"})," command to create new ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," files"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it git github-cli go-task jq solbuild solbuild-config-unstable ypkg yq\n"})}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-a-github-account-and-git",children:"Setting up a GitHub account and Git"}),"\n",(0,t.jsxs)(i.p,{children:["The Solus source repositories for the package repository currently reside on ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"}),". You will need a GitHub account to submit patches and file issues. You can create a GitHub account ",(0,t.jsx)(i.a,{href:"https://github.com/signup",children:"here"}),". Note that you will also need to set up ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa",children:"2FA"})," (two-factor authentication) for your account."]}),"\n",(0,t.jsxs)(i.h3,{id:"configure-github-cli",children:["Configure ",(0,t.jsx)(i.code,{children:"github-cli"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Once you have a GitHub account, you need to configure ",(0,t.jsx)(i.code,{children:"github-cli"})," to work with it. At minimum, you need to run ",(0,t.jsx)(i.code,{children:"gh auth login"}),". Have your GitHub credentials and 2FA (two-factor authentication) mechanism at hand."]}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/github-cli/github-cli/quickstart",children:"GitHub CLI quickstart"})," for some common uses of the tool."]}),"\n",(0,t.jsx)(i.h3,{id:"git-identity-setup",children:"Git identity setup"}),"\n",(0,t.jsxs)(i.p,{children:["If you have not used git before, you should set your git identity in your global git config file (",(0,t.jsx)(i.code,{children:"~/.gitconfig"}),"). Use the following commands:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'git config --global user.name "John Doe"\ngit config --global user.email johndoe@example.com\n'})}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup",children:"Git Book"})," for more first-time setup options."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-solbuild",children:"Setting up solbuild"}),"\n",(0,t.jsxs)(i.p,{children:["The ",(0,t.jsx)(i.code,{children:"solbuild"})," tool must first be initialized with a base image. All builds thereafter will use this as a base, and construct a temporary overlay root to save on time and disk space in builds."]}),"\n",(0,t.jsx)(i.p,{children:"Initialize solbuild via:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will take some time as it downloads and prepares the image."}),"\n",(0,t.jsx)(i.h3,{id:"updating-solbuild",children:"Updating solbuild"}),"\n",(0,t.jsx)(i.p,{children:"It is a good idea to keep the base image updated. It will help reduce build times by not having to repeatedly download updates to packages in the base image, and will strictly need to pull down the packages your build needs."}),"\n",(0,t.jsx)(i.p,{children:"To update solbuild, run:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild update\n"})}),"\n",(0,t.jsx)(i.h2,{id:"fork-the-getsoluspackages-repository",children:"Fork the getsolus/packages repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create your own fork of ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," using the GitHub web UI or ",(0,t.jsxs)(i.a,{href:"https://cli.github.com/manual/gh_repo_fork",children:[(0,t.jsx)(i.code,{children:"gh"})," cli tool"]})," from the ",(0,t.jsx)(i.code,{children:"github-cli"})," package. It will be forked to ",(0,t.jsx)(i.code,{children:"github.com/yourgithubaccount/packages"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"clone-your-forked-package-repository",children:"Clone your forked package repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create a local clone of the package repository you just forked. Here we are using the name ",(0,t.jsx)(i.code,{children:"solus-packages"})," and cloning it into our home directoy. The rest of the documentation will presume this structure. You can choose a different name and path but will have to make sure to replace it in every command that refers to the ",(0,t.jsx)(i.code,{children:"solus-packages"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gh repo clone packages ~/solus-packages\n"})}),"\n",(0,t.jsx)(i.h2,{id:"initialize-git-hooks",children:"Initialize git hooks"}),"\n",(0,t.jsx)(i.p,{children:"Initialize Git hooks for working with the repository by running:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"go-task -d ~/solus-packages init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This makes it easy to create commits in the correct format, and will warn you about issues with changes you commit."}),"\n",(0,t.jsx)(i.h2,{id:"set-up-repository-helper-functions-optional",children:"Set up repository helper functions (optional)"}),"\n",(0,t.jsx)(i.p,{children:"The helper functions are a collection of shell scripts that help you navigate the packages repository more quickly, and perform some specialized searches."}),"\n",(0,t.jsx)(i.p,{children:"After cloning your repository, create a symlink to source the helper functions for your shell. Then, start a new instance of the shell."}),"\n",(0,t.jsx)(i.h3,{id:"bash",children:"bash"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.bashrc.d\nln -s ~/solus-packages/common/Scripts/helpers.sh ~/.bashrc.d/solus-monorepo-helpers.sh\n"})}),"\n",(0,t.jsx)(i.h3,{id:"fish",children:"fish"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.config/fish/conf.d\nln -s ~/solus-packages/common/Scripts/helpers.fish ~/.config/fish/conf.d/solus.fish\n"})}),"\n",(0,t.jsx)(i.h3,{id:"zsh",children:"zsh"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'mkdir -p ~/.zshrc.d\nprintf "\\nfpath=(~/.zshrc.d \\$fpath)" >> ~/.zshrc\nsource ~/.zshrc\nln -s ~/solus-packages/common/Scripts/helpers.zsh ~/.zshrc.d/solus-monorepo-helpers.zsh\n'})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.p,{children:"You should now have the following available from your shell:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Function"}),(0,t.jsx)(i.th,{children:"Description"}),(0,t.jsx)(i.th,{children:"Usage"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"cpesearch"})}),(0,t.jsxs)(i.td,{children:["Search for CPE Names for packages. For use when writing the ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," file for a package"]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"cpesearch search-term"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"goroot"})}),(0,t.jsx)(i.td,{children:"When in the Solus packages repository, change directory to the root directory."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"goroot"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotopkg"})}),(0,t.jsxs)(i.td,{children:["Change directory to any Solus package. You can type part of the package name then double press ",(0,t.jsx)(i.code,{children:"Tab"})," to get autocompletion for this function."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotopkg firefox"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotosoluspkgs"})}),(0,t.jsx)(i.td,{children:"Change directory to the Solus packages repository from anywhere on the filesystem."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotosoluspkgs"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatprovides"})}),(0,t.jsxs)(i.td,{children:["Find out what package provides a library by reading the ",(0,t.jsx)(i.code,{children:"abi_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatprovides libfoobar.so.1"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatuses"})}),(0,t.jsxs)(i.td,{children:["Find out what packages use a library by reading the ",(0,t.jsx)(i.code,{children:"abi_used_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatuses libfoobar.so.1"})})]})]})]}),"\n",(0,t.jsx)(i.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,t.jsxs)(i.p,{children:["Your system is now set up for package work.\nIf you are new to packaging, see ",(0,t.jsx)(i.a,{href:"/docs/packaging/your-first-package-update",children:"Your First Package Update"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var t=s(67294);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4278],{38033:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=s(85893),n=s(11151);const o={title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},r="Prepare for packaging",a={id:"packaging/prepare-for-packaging",title:"Prepare for Packaging",description:"Switch to the Unstable repository",source:"@site/docs/packaging/prepare-for-packaging.md",sourceDirName:"packaging",slug:"/packaging/prepare-for-packaging",permalink:"/docs/packaging/prepare-for-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/prepare-for-packaging.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:1,frontMatter:{title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},sidebar:"packagingSidebar",previous:{title:"Packaging Overview",permalink:"/docs/packaging/"},next:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"}},l={},c=[{value:"Switch to the Unstable repository",id:"switch-to-the-unstable-repository",level:2},{value:"Setting up the packager file",id:"setting-up-the-packager-file",level:2},{value:"Installing development tools",id:"installing-development-tools",level:2},{value:"Setting up a GitHub account and Git",id:"setting-up-a-github-account-and-git",level:2},{value:"Configure github-cli
.",id:"configure-github-cli",level:3},{value:"Git identity setup",id:"git-identity-setup",level:3},{value:"Setting up solbuild",id:"setting-up-solbuild",level:2},{value:"Updating solbuild",id:"updating-solbuild",level:3},{value:"Fork the getsolus/packages repository",id:"fork-the-getsoluspackages-repository",level:2},{value:"Clone your forked package repository",id:"clone-your-forked-package-repository",level:2},{value:"Initialize git hooks",id:"initialize-git-hooks",level:2},{value:"Set up repository helper functions (optional)",id:"set-up-repository-helper-functions-optional",level:2},{value:"bash",id:"bash",level:3},{value:"fish",id:"fish",level:3},{value:"zsh",id:"zsh",level:3},{value:"Building packages",id:"building-packages",level:2}];function d(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"prepare-for-packaging",children:"Prepare for packaging"})}),"\n",(0,t.jsx)(i.h2,{id:"switch-to-the-unstable-repository",children:"Switch to the Unstable repository"}),"\n",(0,t.jsx)(i.p,{children:'Packages need to be built and tested against the "unstable" repository. If you don\'t want to switch your primary system to unstable, you can do your packaging work in a VM. We have Virtual Machine Manager and other similar tools in the Solus repository.'}),"\n",(0,t.jsxs)(i.p,{children:["Refer to ",(0,t.jsx)(i.a,{href:"/docs/user/package-management/repo-management",children:"Repository Management"})," to see how to add and switch to unstable."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-the-packager-file",children:"Setting up the packager file"}),"\n",(0,t.jsx)(i.p,{children:"In order to utilize the build system, you must first set up a configuration file that has your packager details."}),"\n",(0,t.jsxs)(i.p,{children:["This file lives in the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder of your home directory. You will need to create the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder as well as the inner ",(0,t.jsx)(i.code,{children:"packager"})," file. Inside the packager file, you need two keys, ",(0,t.jsx)(i.code,{children:"Name"})," and ",(0,t.jsx)(i.code,{children:"Email"}),". This is used when generating the machine file so that the packager details are stored within the resulting binary package."]}),"\n",(0,t.jsxs)(i.p,{children:["Name and email address are mandatory. You must use your real first and last name(s) for accountability purposes.\nA ",(0,t.jsx)(i.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-ini",children:"[Packager]\nName=Your Name Here\nEmail=your.email@address\nMatrix=@username:matrix.org\n"})}),"\n",(0,t.jsx)(i.h2,{id:"installing-development-tools",children:"Installing development tools"}),"\n",(0,t.jsx)(i.p,{children:"We need to install a few things in order to get started with packaging:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"git"})," is used for version control of the Solus sources"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"github-cli"})," is used to make working with GitHub easier"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"go-task"})," is used by our build tools for scripting"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"jq"})," is used by our optional ",(0,t.jsx)(i.a,{href:"#set-up-repository-helper-functions-optional",children:"Helper Functions"})]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild"})," is a lightweight container environment for building packages repeatably"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild-config-unstable"})," sets up solbuild for working with the ",(0,t.jsx)(i.code,{children:"unstable"})," repository"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"ypkg"})," is the program that actually builds packages"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"yq"})," is used by the ",(0,t.jsx)(i.code,{children:"go-task add-monitoring"})," command to create new ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," files"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it git github-cli go-task jq solbuild solbuild-config-unstable ypkg yq\n"})}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-a-github-account-and-git",children:"Setting up a GitHub account and Git"}),"\n",(0,t.jsxs)(i.p,{children:["The Solus source repositories for the package repository currently reside on ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"}),". You will need a GitHub account to submit patches and file issues. You can create a GitHub account ",(0,t.jsx)(i.a,{href:"https://github.com/signup",children:"here"}),". Note that you will also need to set up ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa",children:"2FA"})," (two-factor authentication) for your account."]}),"\n",(0,t.jsxs)(i.h3,{id:"configure-github-cli",children:["Configure ",(0,t.jsx)(i.code,{children:"github-cli"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Once you have a GitHub account, you need to configure ",(0,t.jsx)(i.code,{children:"github-cli"})," to work with it. At minimum, you need to run ",(0,t.jsx)(i.code,{children:"gh auth login"}),". Have your GitHub credentials and 2FA (two-factor authentication) mechanism at hand."]}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/github-cli/github-cli/quickstart",children:"GitHub CLI quickstart"})," for some common uses of the tool."]}),"\n",(0,t.jsx)(i.h3,{id:"git-identity-setup",children:"Git identity setup"}),"\n",(0,t.jsxs)(i.p,{children:["If you have not used git before, you should set your git identity in your global git config file (",(0,t.jsx)(i.code,{children:"~/.gitconfig"}),"). Use the following commands:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'git config --global user.name "John Doe"\ngit config --global user.email johndoe@example.com\n'})}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup",children:"Git Book"})," for more first-time setup options."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-solbuild",children:"Setting up solbuild"}),"\n",(0,t.jsxs)(i.p,{children:["The ",(0,t.jsx)(i.code,{children:"solbuild"})," tool must first be initialized with a base image. All builds thereafter will use this as a base, and construct a temporary overlay root to save on time and disk space in builds."]}),"\n",(0,t.jsx)(i.p,{children:"Initialize solbuild via:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will take some time as it downloads and prepares the image."}),"\n",(0,t.jsx)(i.h3,{id:"updating-solbuild",children:"Updating solbuild"}),"\n",(0,t.jsx)(i.p,{children:"It is a good idea to keep the base image updated. It will help reduce build times by not having to repeatedly download updates to packages in the base image, and will strictly need to pull down the packages your build needs."}),"\n",(0,t.jsx)(i.p,{children:"To update solbuild, run:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild update\n"})}),"\n",(0,t.jsx)(i.h2,{id:"fork-the-getsoluspackages-repository",children:"Fork the getsolus/packages repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create your own fork of ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," using the GitHub web UI or ",(0,t.jsxs)(i.a,{href:"https://cli.github.com/manual/gh_repo_fork",children:[(0,t.jsx)(i.code,{children:"gh"})," cli tool"]})," from the ",(0,t.jsx)(i.code,{children:"github-cli"})," package. It will be forked to ",(0,t.jsx)(i.code,{children:"github.com/yourgithubaccount/packages"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"clone-your-forked-package-repository",children:"Clone your forked package repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create a local clone of the package repository you just forked. Here we are using the name ",(0,t.jsx)(i.code,{children:"solus-packages"})," and cloning it into our home directoy. The rest of the documentation will presume this structure. You can choose a different name and path but will have to make sure to replace it in every command that refers to the ",(0,t.jsx)(i.code,{children:"solus-packages"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gh repo clone packages ~/solus-packages\n"})}),"\n",(0,t.jsx)(i.h2,{id:"initialize-git-hooks",children:"Initialize git hooks"}),"\n",(0,t.jsx)(i.p,{children:"Initialize Git hooks for working with the repository by running:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"go-task -d ~/solus-packages init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This makes it easy to create commits in the correct format, and will warn you about issues with changes you commit."}),"\n",(0,t.jsx)(i.h2,{id:"set-up-repository-helper-functions-optional",children:"Set up repository helper functions (optional)"}),"\n",(0,t.jsx)(i.p,{children:"The helper functions are a collection of shell scripts that help you navigate the packages repository more quickly, and perform some specialized searches."}),"\n",(0,t.jsx)(i.p,{children:"After cloning your repository, create a symlink to source the helper functions for your shell. Then, start a new instance of the shell."}),"\n",(0,t.jsx)(i.h3,{id:"bash",children:"bash"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.bashrc.d\nln -s ~/solus-packages/common/Scripts/helpers.sh ~/.bashrc.d/solus-monorepo-helpers.sh\n"})}),"\n",(0,t.jsx)(i.h3,{id:"fish",children:"fish"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.config/fish/conf.d\nln -s ~/solus-packages/common/Scripts/helpers.fish ~/.config/fish/conf.d/solus.fish\n"})}),"\n",(0,t.jsx)(i.h3,{id:"zsh",children:"zsh"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'mkdir -p ~/.zshrc.d\nprintf "\\nfpath=(~/.zshrc.d \\$fpath)" >> ~/.zshrc\nsource ~/.zshrc\nln -s ~/solus-packages/common/Scripts/helpers.zsh ~/.zshrc.d/solus-monorepo-helpers.zsh\n'})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.p,{children:"You should now have the following available from your shell:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Function"}),(0,t.jsx)(i.th,{children:"Description"}),(0,t.jsx)(i.th,{children:"Usage"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"cpesearch"})}),(0,t.jsxs)(i.td,{children:["Search for CPE Names for packages. For use when writing the ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," file for a package"]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"cpesearch search-term"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"goroot"})}),(0,t.jsx)(i.td,{children:"When in the Solus packages repository, change directory to the root directory."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"goroot"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotopkg"})}),(0,t.jsxs)(i.td,{children:["Change directory to any Solus package. You can type part of the package name then double press ",(0,t.jsx)(i.code,{children:"Tab"})," to get autocompletion for this function."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotopkg firefox"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotosoluspkgs"})}),(0,t.jsx)(i.td,{children:"Change directory to the Solus packages repository from anywhere on the filesystem."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotosoluspkgs"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatprovides"})}),(0,t.jsxs)(i.td,{children:["Find out what package provides a library by reading the ",(0,t.jsx)(i.code,{children:"abi_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatprovides libfoobar.so.1"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatuses"})}),(0,t.jsxs)(i.td,{children:["Find out what packages use a library by reading the ",(0,t.jsx)(i.code,{children:"abi_used_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatuses libfoobar.so.1"})})]})]})]}),"\n",(0,t.jsx)(i.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,t.jsxs)(i.p,{children:["Your system is now set up for package work.\nIf you are new to packaging, see ",(0,t.jsx)(i.a,{href:"/docs/packaging/your-first-package-update",children:"Your First Package Update"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var t=s(67294);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/528b6a6b.6bd7ed5f.js b/assets/js/528b6a6b.37e18ccf.js
similarity index 98%
rename from assets/js/528b6a6b.6bd7ed5f.js
rename to assets/js/528b6a6b.37e18ccf.js
index efd32f17a..2340ccc81 100644
--- a/assets/js/528b6a6b.6bd7ed5f.js
+++ b/assets/js/528b6a6b.37e18ccf.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7822],{61661:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var r=t(85893),a=t(11151);const n={title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},o="KSysGuard",i={id:"user/software/utilities/ksysguard",title:"KSysGuard",description:"KSysGuard, also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup.",source:"@site/docs/user/software/utilities/ksysguard.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/ksysguard",permalink:"/docs/user/software/utilities/ksysguard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/ksysguard.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},sidebar:"userSidebar",previous:{title:"Utilities",permalink:"/docs/category/utilities"},next:{title:"KDE Wallet",permalink:"/docs/user/software/utilities/kwallet"}},u={},l=[{value:"Installation",id:"installation",level:2},{value:"Use KSysGuard as a non-root user",id:"use-ksysguard-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"ksysguard",children:"KSysGuard"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"KSysGuard"}),", also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup."]}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:"KSysGuard is usually installed as part of the KDE Plasma Desktop environment, but can be installed from the Software Center or via terminal:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it ksysguard\n"})}),"\n",(0,r.jsx)(s.h2,{id:"use-ksysguard-as-a-non-root-user",children:"Use KSysGuard as a non-root user"}),"\n",(0,r.jsx)(s.p,{children:"The per process networking plugin requires elevated access to your system. To enable the plugin as non-root user, execute these commands:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'sudo setcap "CAP_NET_RAW=+ep" "/usr/lib64/kf5/ksysguard/ksgrd_network_helper"\n'})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(s.p,{children:["KSysGuard ",(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"User\u2019s Guide"})," or the KDE Help Centre (open khelp on your Plasma Desktop)."]})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>o});var r=t(67294);const a={},n=r.createContext(a);function o(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7822],{61661:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var r=t(85893),a=t(11151);const n={title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},o="KSysGuard",i={id:"user/software/utilities/ksysguard",title:"KSysGuard",description:"KSysGuard, also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup.",source:"@site/docs/user/software/utilities/ksysguard.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/ksysguard",permalink:"/docs/user/software/utilities/ksysguard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/ksysguard.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},sidebar:"userSidebar",previous:{title:"Utilities",permalink:"/docs/category/utilities"},next:{title:"KDE Wallet",permalink:"/docs/user/software/utilities/kwallet"}},u={},l=[{value:"Installation",id:"installation",level:2},{value:"Use KSysGuard as a non-root user",id:"use-ksysguard-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"ksysguard",children:"KSysGuard"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"KSysGuard"}),", also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup."]}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:"KSysGuard is usually installed as part of the KDE Plasma Desktop environment, but can be installed from the Software Center or via terminal:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it ksysguard\n"})}),"\n",(0,r.jsx)(s.h2,{id:"use-ksysguard-as-a-non-root-user",children:"Use KSysGuard as a non-root user"}),"\n",(0,r.jsx)(s.p,{children:"The per process networking plugin requires elevated access to your system. To enable the plugin as non-root user, execute these commands:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'sudo setcap "CAP_NET_RAW=+ep" "/usr/lib64/kf5/ksysguard/ksgrd_network_helper"\n'})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(s.p,{children:["KSysGuard ",(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"User\u2019s Guide"})," or the KDE Help Centre (open khelp on your Plasma Desktop)."]})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>o});var r=t(67294);const a={},n=r.createContext(a);function o(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/533eefa9.2deb3749.js b/assets/js/533eefa9.69b673fa.js
similarity index 99%
rename from assets/js/533eefa9.2deb3749.js
rename to assets/js/533eefa9.69b673fa.js
index 3cd6128ef..ac25d52b5 100644
--- a/assets/js/533eefa9.2deb3749.js
+++ b/assets/js/533eefa9.69b673fa.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4002],{99023:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>a});var s=n(85893),t=n(11151);const l={title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},r="Preparing to install",o={id:"user/quick-start/installation/index",title:"Preparing to Install",description:"Before you start, make sure your system meets the minimum requirements.",source:"@site/docs/user/quick-start/installation/index.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/",permalink:"/docs/user/quick-start/installation/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},sidebar:"userSidebar",previous:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"},next:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"}},d={},a=[{value:"Getting the ISO",id:"getting-the-iso",level:2},{value:"Verifying the ISO",id:"verifying-the-iso",level:2},{value:"Linux and macOS",id:"linux-and-macos",level:3},{value:"Verifying the SHA256SUMS file signature",id:"verifying-the-sha256sums-file-signature",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum",level:4},{value:"Windows",id:"windows",level:3},{value:"Verifying signed SHA256SUM file",id:"verifying-signed-sha256sum-file",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum-1",level:4},{value:"Creating bootable media",id:"creating-bootable-media",level:2},{value:"Linux",id:"linux",level:3},{value:"DVD",id:"dvd",level:4},{value:"USB",id:"usb",level:4},{value:"GNOME MultiWriter",id:"gnome-multiwriter",level:5},{value:"KDE ISO Image Writer",id:"kde-iso-image-writer",level:4},{value:"Command-line",id:"command-line",level:5},{value:"Windows",id:"windows-1",level:3},{value:"DVD",id:"dvd-1",level:4},{value:"USB",id:"usb-1",level:4},{value:"macOS",id:"macos",level:3},{value:"DVD",id:"dvd-2",level:4},{value:"USB",id:"usb-2",level:4},{value:"Graphical tool",id:"graphical-tool",level:5},{value:"Command-line",id:"command-line-1",level:5},{value:"Boot the media",id:"boot-the-media",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"preparing-to-install",children:"Preparing to install"})}),"\n",(0,s.jsxs)(i.p,{children:["Before you start, make sure your system meets the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/system-requirements",children:"minimum requirements"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"The first step to installing Solus is getting the correct media. The Solus Project provides ISO images, which contain the contents of Solus for installing."}),"\n",(0,s.jsx)(i.h2,{id:"getting-the-iso",children:"Getting the ISO"}),"\n",(0,s.jsxs)(i.p,{children:["Download a Solus ISO by going to our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"})," and picking an edition."]}),"\n",(0,s.jsx)(i.h2,{id:"verifying-the-iso",children:"Verifying the ISO"}),"\n",(0,s.jsx)(i.h3,{id:"linux-and-macos",children:"Linux and macOS"}),"\n",(0,s.jsxs)(i.p,{children:["Download the SHA256SUMS files for your chosen ISO edition: ",(0,s.jsx)(i.em,{children:"File"}),", ",(0,s.jsx)(i.em,{children:"Signed File"})," and ",(0,s.jsx)(i.em,{children:"Public Key"})," from the links next to the ",(0,s.jsx)(i.em,{children:"Download"})," buttons on our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Note:"})," You should download all these files to the same directory."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-sha256sums-file-signature",children:"Verifying the SHA256SUMS file signature"}),"\n",(0,s.jsx)(i.p,{children:"Import the Solus public key:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/path/to/download/directory\ngpg --import solus-releng-pub.gpg\n"})}),"\n",(0,s.jsx)(i.p,{children:"Verify the signed checksum file:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"gpg --verify Solus-Budgie-Release-2024-10-14.iso.sha256sum.sign Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Check that the computed hash of the downloaded ISO file matches the hash supplied by Solus:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sha256sum -c Solus-Budgie-Release-2024-10-14.iso.sha256sum | grep OK\n"})}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"verifying-signed-sha256sum-file",children:"Verifying signed SHA256SUM file"}),"\n",(0,s.jsxs)(i.p,{children:["On Windows, first install ",(0,s.jsx)(i.a,{href:"https://www.gpg4win.org/",children:"Gpg4win"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Now you can run the same ",(0,s.jsx)(i.code,{children:"gpg"})," commands from the the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/#verifying-the-sha256sums-file-signature",children:(0,s.jsx)(i.em,{children:"Verifyng the SHA256SUMS file signature"})})," section above."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum-1",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Launch powershell and compute the hash of the ISO file you just downloaded. You will have to manually compare the result to the hash in the SHA256SUMS file."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-powershell",children:"Get-FileHash C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso\ncat C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Alternatively, you can use a graphical program that can calculate SHA256 hashes like ",(0,s.jsx)(i.em,{children:"Rufus"})," or ",(0,s.jsx)(i.em,{children:"7-Zip"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-bootable-media",children:"Creating bootable media"}),"\n",(0,s.jsx)(i.p,{children:"To make boot media, you will need:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Either a blank DVD or a USB drive larger than 2 GB."}),"\n",(0,s.jsx)(i.li,{children:"If using a USB, the ability to boot from the USB."}),"\n",(0,s.jsxs)(i.li,{children:["ISO file from the ",(0,s.jsx)(i.a,{href:"#getting-the-iso",children:"Getting the ISO"})," section."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"There are many tools which can write our ISO image to DVDs or USB thumb drives. Chose from an option below."}),"\n",(0,s.jsx)(i.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(i.h4,{id:"dvd",children:"DVD"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/Brasero",children:"Brasero"})," for writing the ISO to a DVD."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert blank DVD (DVD-R or DVD+RW is suitable) into your DVD writer."}),"\n",(0,s.jsx)(i.li,{children:"Open Brasero."}),"\n",(0,s.jsx)(i.li,{children:"Select the option \u201cBurn image\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Click the \u201cClick here to select a disc image\u201d button and using the file dialog, choose the ISO."}),"\n",(0,s.jsx)(i.li,{children:"Ensure the correct DVD is selected in the \u201cSelect a disc to write to\u201d."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn" and wait.'}),"\n",(0,s.jsx)(i.li,{children:'Upon seeing \u201cImage successfully burned to DVD\u201d, click "Close".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/MultiWriter",children:"GNOME MultiWriter"})," or ",(0,s.jsx)(i.a,{href:"https://apps.kde.org/isoimagewriter/",children:"ISO Image Writer"})," for KDE. Please note that UNetbootin will ",(0,s.jsx)(i.strong,{children:"not"})," work."]}),"\n",(0,s.jsx)(i.h5,{id:"gnome-multiwriter",children:"GNOME MultiWriter"}),"\n",(0,s.jsx)(i.p,{children:"Upon opening GNOME MultiWriter, you will likely be shown a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["The ISO image will be written to ",(0,s.jsx)(i.em,{children:"all mounted USB drives"}),". Ensure that the only USB drive that is connected is the one you wish to write the ISO to."]})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Start",src:n(7173).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"If your USB drive is not mounted, you will be prompted with an image indicating to plug it in."}),"\n",(0,s.jsx)(i.p,{children:'Next, click the "Start Copying" button, and you will be prompted to select the ISO. Choose the ISO you downloaded in the "Getting the ISO" section. The USB will automatically be written to.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Writing",src:n(39115).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"Upon completion, you will be prompted with the following dialog and your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Done",src:n(69064).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.h4,{id:"kde-iso-image-writer",children:"KDE ISO Image Writer"}),"\n",(0,s.jsx)(i.admonition,{type:"info",children:(0,s.jsx)(i.p,{children:"You will need both the ISO and sha256sums file for it saved in the same directory."})}),"\n",(0,s.jsx)(i.p,{children:"When you open ISO Image Writer, you will see a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Start",src:n(8234).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.p,{children:"If there is no USB drive mounted, the USB drive field will be greyed out. Simply plug in the USB drive you want to use for the ISO, it will be auto-detected."}),"\n",(0,s.jsx)(i.p,{children:'Click on the top field "Write this ISO image:". Select the ISO image you downloaded in the "Getting the ISO" section.'}),"\n",(0,s.jsx)(i.p,{children:'You may see "Downloading ISO image". When this is done, click the Create button.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Writing",src:n(51213).Z+"",width:"551",height:"430"})}),"\n",(0,s.jsx)(i.p,{children:"When the operation is finished, you will see the confirmation dialog. Your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Done",src:n(46368).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the command-line / terminal, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["First, insert the USB drive into your computer and open your Terminal. Proceed to type ",(0,s.jsx)(i.code,{children:"lsblk"})," into your Terminal. It should output something along the lines of:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 111.8G 0 disk\n\u251c\u2500sda1 8:1 0 350M 0 part\n\u251c\u2500sda2 8:2 0 39.7G 0 part\n\u2514\u2500sda3 8:3 0 71.8G 0 part /\nsdb 8:64 1 7.5G 0 disk\n\u251c\u2500sdb1 8:65 1 712M 0 part\n\u2514\u2500sdb2 8:66 1 17.2M 0 part\n"})}),"\n",(0,s.jsxs)(i.p,{children:["You will see one disk, in this case ",(0,s.jsx)(i.code,{children:"/dev/sdb"}),", that is roughly the size of the USB drive. Yours should be similar (difference being in size). Write this device down somewhere."]}),"\n",(0,s.jsxs)(i.p,{children:["Next, locate the downloaded ISO. It will most likely be in your Downloads folder. In the event that it is, type: ",(0,s.jsx)(i.code,{children:"cd ~/Downloads"})]}),"\n",(0,s.jsxs)(i.p,{children:["If it is ",(0,s.jsx)(i.strong,{children:"not"})," in your Downloads folder, use ",(0,s.jsx)(i.code,{children:"cd"})," to navigate to the correct directory."]}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsxs)(i.p,{children:["This is where we overwrite the contents of your USB drive so please ensure you identified the correct drive in the ",(0,s.jsx)(i.code,{children:"lsblk"})," stage above. Selecting the wrong drive here will lead to its contents being overwritten. An example command is below, however you may need to replace ",(0,s.jsx)(i.code,{children:"sdb"})," with the drive we located above:"]})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/sdb bs=4M status=progress oflag=sync && sudo eject /dev/sdb\n"})}),"\n",(0,s.jsx)(i.p,{children:"This will write the contents of the ISO to the thumb drive so you can boot it and also make sure the data is synchronized so you can eject the USB safely."}),"\n",(0,s.jsx)(i.h3,{id:"windows-1",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-1",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"You can easily burn an ISO image to a DVD, on Windows 7 and newer, by using Window's built-in file manager (Explorer)."}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Windows' built-in file manager (Explorer)."}),"\n",(0,s.jsx)(i.li,{children:'Right click on the ISO image file and click "Burn disk image".'}),"\n",(0,s.jsx)(i.li,{children:"Select the correct disc burner."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb-1",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["You can easily burn an ISO image to a USB by using graphical tool ",(0,s.jsx)(i.a,{href:"https://rufus.ie/",children:"Rufus"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Rufus."}),"\n",(0,s.jsx)(i.li,{children:"Ensure your device is correct by checking the contents of the Device dropdown."}),"\n",(0,s.jsx)(i.li,{children:"Click the CD icon found in the image below, and select the ISO."}),"\n",(0,s.jsx)(i.li,{children:'Untick all options except "Create a bootable disk using" and use the dropdown to select "DD Image".'}),"\n",(0,s.jsx)(i.li,{children:'Click "Start".'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Rufus",src:n(93093).Z+"",width:"365",height:"518"})}),"\n",(0,s.jsx)(i.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-2",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"Since OS X El Capitan (10.11), the easiest way to burn a DVD is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert your DVD and open Finder."}),"\n",(0,s.jsx)(i.li,{children:"Right click on the ISO image."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cBurn Disk Image \u2018Solus-Budgie-Release-2024-10-14.iso\u2019 to Disc\u2026\u201d"}),"\n",(0,s.jsx)(i.li,{children:"Then click \u201cBurn\u201d."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Burn DVD",src:n(54725).Z+"",width:"638",height:"343"})}),"\n",(0,s.jsx)(i.h4,{id:"usb-2",children:"USB"}),"\n",(0,s.jsx)(i.h5,{id:"graphical-tool",children:"Graphical tool"}),"\n",(0,s.jsxs)(i.p,{children:["One of the easiest ways to burn an ISO image to a USB thumb drive is by using a graphical tool called ",(0,s.jsx)(i.a,{href:"https://etcher.balena.io/",children:"Etcher"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Etcher."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cSelect image\u201d and then select the ISO and click \u201cOpen\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Etcher will automatically select your USB drive. If it has selected the wrong one, click \u201cChange\u201d and select the correct one."}),"\n",(0,s.jsx)(i.li,{children:"Click \u201cFlash!\u201d."}),"\n",(0,s.jsx)(i.li,{children:"You may be prompted for your macOS user password."}),"\n",(0,s.jsx)(i.li,{children:"Once Etcher has finished it is safe to remove the USB drive."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You may see a message stating \u201cThe disk you inserted was not readable by this computer.\u201d once Etcher finishes. This can be ignored."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Etcher",src:n(74020).Z+"",width:"800",height:"380"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line-1",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the macOS Terminal app, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"First, insert the USB drive into your computer and open Terminal (found in Applications/Utilities)."}),"\n",(0,s.jsx)(i.p,{children:"Now you'll need to identify your USB drive by listing your storage devices with the following command:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil list\n"})}),"\n",(0,s.jsx)(i.p,{children:"You should see output similar to this:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"/dev/disk0 (internal, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *1.0 TB disk0\n 1: EFI EFI 209.7 MB disk0s1\n 2: Apple_HFS Macintosh HD 999.3 GB disk0s2\n 3: Apple_Boot Recovery HD 650.0 MB disk0s3\n\n/dev/disk1 (external, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *15.6 GB disk1\n 1: EFI EFI 209.7 MB disk1s1\n 2: Apple_HFS Ultra 15.3 GB disk1s2\n"})}),"\n",(0,s.jsxs)(i.p,{children:["From this output, we can see the USB drive is listed as ",(0,s.jsx)(i.code,{children:"/dev/disk1 (external, physical)"}),". In this example, the IDENTIFIER is ",(0,s.jsx)(i.code,{children:"disk1"}),". Please note, your USB drive may have a different identifier. You should be able to tell which is your USB drive by checking the name and size."]}),"\n",(0,s.jsxs)(i.p,{children:["macOS usually auto-mounts USB drives so you\u2019ll need to unmount it first before proceeding. Use the following command and replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," with the correct identifier we found in the ",(0,s.jsx)(i.code,{children:"diskutil list"})," step."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil unmountDisk /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.p,{children:"Now navigate to the folder that has the downloaded ISO. This could be your Mac\u2019s Downloads folder. The following command will get you there:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/Downloads\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"This next step is dangerous. Using the wrong drive identifier could result in data loss."})})}),"\n",(0,s.jsxs)(i.p,{children:["We will use the ",(0,s.jsx)(i.code,{children:"dd"})," command to write the contents of the ISO to the thumb drive. Replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," in the command below with your drive identifier. Note the extra ",(0,s.jsx)(i.code,{children:"r"})," before the identifier (i.e ",(0,s.jsx)(i.code,{children:"rdisk1"}),"). This is for raw mode, which along with bs=1m, makes the transfer faster."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/rIDENTIFIER bs=1m\n"})}),"\n",(0,s.jsx)(i.p,{children:"Be patient! After a few minutes you\u2019ll receive a message saying how much data was transferred. You can now safely eject the usb drive."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil eject /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.h2,{id:"boot-the-media",children:"Boot the media"}),"\n",(0,s.jsx)(i.p,{children:"Now it is time to restart your computer to boot the DVD or USB. Most computers will automatically boot from DVDs and USB, however if you experience issues booting the media, you may need to select to boot from DVD or USB."}),"\n",(0,s.jsxs)(i.p,{children:["This is usually accessible by pressing ",(0,s.jsx)(i.code,{children:"F9"})," or ",(0,s.jsx)(i.code,{children:"F12"})," while your computer is booting. On some devices it may also be ",(0,s.jsx)(i.code,{children:"ESC"}),"."]}),"\n",(0,s.jsx)(i.p,{children:'Macs will boot to the "Startup Manager" by holding down the Option (Alt) key. The DVD or USB drive will most likely show up as "EFI Boot".'})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},69064:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_done-fdbb3bda7061afd0ca7f97b85c1cef18.jpg"},7173:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_start-c8e10b8e6f627b862f8f6344260db698.jpg"},39115:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_writing-1a2eb065ba3c61dd1371f89b2ab9f7c1.jpg"},8234:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_1_start-0457fdcee59f063744233653c88022f7.png"},51213:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_2_writing-61d90705ea2038df803e806657f7e20f.png"},46368:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_3_done-de4e8501e47d1073f945ae1aceb13995.png"},54725:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-burn-dvd-0bef9578a58d61610854fc7c25e3496f.jpg"},74020:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-etcher-2d28aaeb19eda12c960c6b09e81eceb2.jpg"},93093:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/rufus-6f16a561298400882bff901d61064e58.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>o,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4002],{99023:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>a});var s=n(85893),t=n(11151);const l={title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},r="Preparing to install",o={id:"user/quick-start/installation/index",title:"Preparing to Install",description:"Before you start, make sure your system meets the minimum requirements.",source:"@site/docs/user/quick-start/installation/index.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/",permalink:"/docs/user/quick-start/installation/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},sidebar:"userSidebar",previous:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"},next:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"}},d={},a=[{value:"Getting the ISO",id:"getting-the-iso",level:2},{value:"Verifying the ISO",id:"verifying-the-iso",level:2},{value:"Linux and macOS",id:"linux-and-macos",level:3},{value:"Verifying the SHA256SUMS file signature",id:"verifying-the-sha256sums-file-signature",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum",level:4},{value:"Windows",id:"windows",level:3},{value:"Verifying signed SHA256SUM file",id:"verifying-signed-sha256sum-file",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum-1",level:4},{value:"Creating bootable media",id:"creating-bootable-media",level:2},{value:"Linux",id:"linux",level:3},{value:"DVD",id:"dvd",level:4},{value:"USB",id:"usb",level:4},{value:"GNOME MultiWriter",id:"gnome-multiwriter",level:5},{value:"KDE ISO Image Writer",id:"kde-iso-image-writer",level:4},{value:"Command-line",id:"command-line",level:5},{value:"Windows",id:"windows-1",level:3},{value:"DVD",id:"dvd-1",level:4},{value:"USB",id:"usb-1",level:4},{value:"macOS",id:"macos",level:3},{value:"DVD",id:"dvd-2",level:4},{value:"USB",id:"usb-2",level:4},{value:"Graphical tool",id:"graphical-tool",level:5},{value:"Command-line",id:"command-line-1",level:5},{value:"Boot the media",id:"boot-the-media",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"preparing-to-install",children:"Preparing to install"})}),"\n",(0,s.jsxs)(i.p,{children:["Before you start, make sure your system meets the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/system-requirements",children:"minimum requirements"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"The first step to installing Solus is getting the correct media. The Solus Project provides ISO images, which contain the contents of Solus for installing."}),"\n",(0,s.jsx)(i.h2,{id:"getting-the-iso",children:"Getting the ISO"}),"\n",(0,s.jsxs)(i.p,{children:["Download a Solus ISO by going to our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"})," and picking an edition."]}),"\n",(0,s.jsx)(i.h2,{id:"verifying-the-iso",children:"Verifying the ISO"}),"\n",(0,s.jsx)(i.h3,{id:"linux-and-macos",children:"Linux and macOS"}),"\n",(0,s.jsxs)(i.p,{children:["Download the SHA256SUMS files for your chosen ISO edition: ",(0,s.jsx)(i.em,{children:"File"}),", ",(0,s.jsx)(i.em,{children:"Signed File"})," and ",(0,s.jsx)(i.em,{children:"Public Key"})," from the links next to the ",(0,s.jsx)(i.em,{children:"Download"})," buttons on our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Note:"})," You should download all these files to the same directory."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-sha256sums-file-signature",children:"Verifying the SHA256SUMS file signature"}),"\n",(0,s.jsx)(i.p,{children:"Import the Solus public key:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/path/to/download/directory\ngpg --import solus-releng-pub.gpg\n"})}),"\n",(0,s.jsx)(i.p,{children:"Verify the signed checksum file:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"gpg --verify Solus-Budgie-Release-2024-10-14.iso.sha256sum.sign Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Check that the computed hash of the downloaded ISO file matches the hash supplied by Solus:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sha256sum -c Solus-Budgie-Release-2024-10-14.iso.sha256sum | grep OK\n"})}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"verifying-signed-sha256sum-file",children:"Verifying signed SHA256SUM file"}),"\n",(0,s.jsxs)(i.p,{children:["On Windows, first install ",(0,s.jsx)(i.a,{href:"https://www.gpg4win.org/",children:"Gpg4win"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Now you can run the same ",(0,s.jsx)(i.code,{children:"gpg"})," commands from the the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/#verifying-the-sha256sums-file-signature",children:(0,s.jsx)(i.em,{children:"Verifyng the SHA256SUMS file signature"})})," section above."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum-1",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Launch powershell and compute the hash of the ISO file you just downloaded. You will have to manually compare the result to the hash in the SHA256SUMS file."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-powershell",children:"Get-FileHash C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso\ncat C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Alternatively, you can use a graphical program that can calculate SHA256 hashes like ",(0,s.jsx)(i.em,{children:"Rufus"})," or ",(0,s.jsx)(i.em,{children:"7-Zip"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-bootable-media",children:"Creating bootable media"}),"\n",(0,s.jsx)(i.p,{children:"To make boot media, you will need:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Either a blank DVD or a USB drive larger than 2 GB."}),"\n",(0,s.jsx)(i.li,{children:"If using a USB, the ability to boot from the USB."}),"\n",(0,s.jsxs)(i.li,{children:["ISO file from the ",(0,s.jsx)(i.a,{href:"#getting-the-iso",children:"Getting the ISO"})," section."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"There are many tools which can write our ISO image to DVDs or USB thumb drives. Chose from an option below."}),"\n",(0,s.jsx)(i.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(i.h4,{id:"dvd",children:"DVD"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/Brasero",children:"Brasero"})," for writing the ISO to a DVD."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert blank DVD (DVD-R or DVD+RW is suitable) into your DVD writer."}),"\n",(0,s.jsx)(i.li,{children:"Open Brasero."}),"\n",(0,s.jsx)(i.li,{children:"Select the option \u201cBurn image\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Click the \u201cClick here to select a disc image\u201d button and using the file dialog, choose the ISO."}),"\n",(0,s.jsx)(i.li,{children:"Ensure the correct DVD is selected in the \u201cSelect a disc to write to\u201d."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn" and wait.'}),"\n",(0,s.jsx)(i.li,{children:'Upon seeing \u201cImage successfully burned to DVD\u201d, click "Close".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/MultiWriter",children:"GNOME MultiWriter"})," or ",(0,s.jsx)(i.a,{href:"https://apps.kde.org/isoimagewriter/",children:"ISO Image Writer"})," for KDE. Please note that UNetbootin will ",(0,s.jsx)(i.strong,{children:"not"})," work."]}),"\n",(0,s.jsx)(i.h5,{id:"gnome-multiwriter",children:"GNOME MultiWriter"}),"\n",(0,s.jsx)(i.p,{children:"Upon opening GNOME MultiWriter, you will likely be shown a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["The ISO image will be written to ",(0,s.jsx)(i.em,{children:"all mounted USB drives"}),". Ensure that the only USB drive that is connected is the one you wish to write the ISO to."]})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Start",src:n(7173).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"If your USB drive is not mounted, you will be prompted with an image indicating to plug it in."}),"\n",(0,s.jsx)(i.p,{children:'Next, click the "Start Copying" button, and you will be prompted to select the ISO. Choose the ISO you downloaded in the "Getting the ISO" section. The USB will automatically be written to.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Writing",src:n(39115).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"Upon completion, you will be prompted with the following dialog and your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Done",src:n(69064).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.h4,{id:"kde-iso-image-writer",children:"KDE ISO Image Writer"}),"\n",(0,s.jsx)(i.admonition,{type:"info",children:(0,s.jsx)(i.p,{children:"You will need both the ISO and sha256sums file for it saved in the same directory."})}),"\n",(0,s.jsx)(i.p,{children:"When you open ISO Image Writer, you will see a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Start",src:n(8234).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.p,{children:"If there is no USB drive mounted, the USB drive field will be greyed out. Simply plug in the USB drive you want to use for the ISO, it will be auto-detected."}),"\n",(0,s.jsx)(i.p,{children:'Click on the top field "Write this ISO image:". Select the ISO image you downloaded in the "Getting the ISO" section.'}),"\n",(0,s.jsx)(i.p,{children:'You may see "Downloading ISO image". When this is done, click the Create button.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Writing",src:n(51213).Z+"",width:"551",height:"430"})}),"\n",(0,s.jsx)(i.p,{children:"When the operation is finished, you will see the confirmation dialog. Your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Done",src:n(46368).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the command-line / terminal, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["First, insert the USB drive into your computer and open your Terminal. Proceed to type ",(0,s.jsx)(i.code,{children:"lsblk"})," into your Terminal. It should output something along the lines of:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 111.8G 0 disk\n\u251c\u2500sda1 8:1 0 350M 0 part\n\u251c\u2500sda2 8:2 0 39.7G 0 part\n\u2514\u2500sda3 8:3 0 71.8G 0 part /\nsdb 8:64 1 7.5G 0 disk\n\u251c\u2500sdb1 8:65 1 712M 0 part\n\u2514\u2500sdb2 8:66 1 17.2M 0 part\n"})}),"\n",(0,s.jsxs)(i.p,{children:["You will see one disk, in this case ",(0,s.jsx)(i.code,{children:"/dev/sdb"}),", that is roughly the size of the USB drive. Yours should be similar (difference being in size). Write this device down somewhere."]}),"\n",(0,s.jsxs)(i.p,{children:["Next, locate the downloaded ISO. It will most likely be in your Downloads folder. In the event that it is, type: ",(0,s.jsx)(i.code,{children:"cd ~/Downloads"})]}),"\n",(0,s.jsxs)(i.p,{children:["If it is ",(0,s.jsx)(i.strong,{children:"not"})," in your Downloads folder, use ",(0,s.jsx)(i.code,{children:"cd"})," to navigate to the correct directory."]}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsxs)(i.p,{children:["This is where we overwrite the contents of your USB drive so please ensure you identified the correct drive in the ",(0,s.jsx)(i.code,{children:"lsblk"})," stage above. Selecting the wrong drive here will lead to its contents being overwritten. An example command is below, however you may need to replace ",(0,s.jsx)(i.code,{children:"sdb"})," with the drive we located above:"]})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/sdb bs=4M status=progress oflag=sync && sudo eject /dev/sdb\n"})}),"\n",(0,s.jsx)(i.p,{children:"This will write the contents of the ISO to the thumb drive so you can boot it and also make sure the data is synchronized so you can eject the USB safely."}),"\n",(0,s.jsx)(i.h3,{id:"windows-1",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-1",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"You can easily burn an ISO image to a DVD, on Windows 7 and newer, by using Window's built-in file manager (Explorer)."}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Windows' built-in file manager (Explorer)."}),"\n",(0,s.jsx)(i.li,{children:'Right click on the ISO image file and click "Burn disk image".'}),"\n",(0,s.jsx)(i.li,{children:"Select the correct disc burner."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb-1",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["You can easily burn an ISO image to a USB by using graphical tool ",(0,s.jsx)(i.a,{href:"https://rufus.ie/",children:"Rufus"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Rufus."}),"\n",(0,s.jsx)(i.li,{children:"Ensure your device is correct by checking the contents of the Device dropdown."}),"\n",(0,s.jsx)(i.li,{children:"Click the CD icon found in the image below, and select the ISO."}),"\n",(0,s.jsx)(i.li,{children:'Untick all options except "Create a bootable disk using" and use the dropdown to select "DD Image".'}),"\n",(0,s.jsx)(i.li,{children:'Click "Start".'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Rufus",src:n(93093).Z+"",width:"365",height:"518"})}),"\n",(0,s.jsx)(i.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-2",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"Since OS X El Capitan (10.11), the easiest way to burn a DVD is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert your DVD and open Finder."}),"\n",(0,s.jsx)(i.li,{children:"Right click on the ISO image."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cBurn Disk Image \u2018Solus-Budgie-Release-2024-10-14.iso\u2019 to Disc\u2026\u201d"}),"\n",(0,s.jsx)(i.li,{children:"Then click \u201cBurn\u201d."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Burn DVD",src:n(54725).Z+"",width:"638",height:"343"})}),"\n",(0,s.jsx)(i.h4,{id:"usb-2",children:"USB"}),"\n",(0,s.jsx)(i.h5,{id:"graphical-tool",children:"Graphical tool"}),"\n",(0,s.jsxs)(i.p,{children:["One of the easiest ways to burn an ISO image to a USB thumb drive is by using a graphical tool called ",(0,s.jsx)(i.a,{href:"https://etcher.balena.io/",children:"Etcher"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Etcher."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cSelect image\u201d and then select the ISO and click \u201cOpen\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Etcher will automatically select your USB drive. If it has selected the wrong one, click \u201cChange\u201d and select the correct one."}),"\n",(0,s.jsx)(i.li,{children:"Click \u201cFlash!\u201d."}),"\n",(0,s.jsx)(i.li,{children:"You may be prompted for your macOS user password."}),"\n",(0,s.jsx)(i.li,{children:"Once Etcher has finished it is safe to remove the USB drive."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You may see a message stating \u201cThe disk you inserted was not readable by this computer.\u201d once Etcher finishes. This can be ignored."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Etcher",src:n(74020).Z+"",width:"800",height:"380"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line-1",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the macOS Terminal app, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"First, insert the USB drive into your computer and open Terminal (found in Applications/Utilities)."}),"\n",(0,s.jsx)(i.p,{children:"Now you'll need to identify your USB drive by listing your storage devices with the following command:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil list\n"})}),"\n",(0,s.jsx)(i.p,{children:"You should see output similar to this:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"/dev/disk0 (internal, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *1.0 TB disk0\n 1: EFI EFI 209.7 MB disk0s1\n 2: Apple_HFS Macintosh HD 999.3 GB disk0s2\n 3: Apple_Boot Recovery HD 650.0 MB disk0s3\n\n/dev/disk1 (external, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *15.6 GB disk1\n 1: EFI EFI 209.7 MB disk1s1\n 2: Apple_HFS Ultra 15.3 GB disk1s2\n"})}),"\n",(0,s.jsxs)(i.p,{children:["From this output, we can see the USB drive is listed as ",(0,s.jsx)(i.code,{children:"/dev/disk1 (external, physical)"}),". In this example, the IDENTIFIER is ",(0,s.jsx)(i.code,{children:"disk1"}),". Please note, your USB drive may have a different identifier. You should be able to tell which is your USB drive by checking the name and size."]}),"\n",(0,s.jsxs)(i.p,{children:["macOS usually auto-mounts USB drives so you\u2019ll need to unmount it first before proceeding. Use the following command and replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," with the correct identifier we found in the ",(0,s.jsx)(i.code,{children:"diskutil list"})," step."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil unmountDisk /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.p,{children:"Now navigate to the folder that has the downloaded ISO. This could be your Mac\u2019s Downloads folder. The following command will get you there:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/Downloads\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"This next step is dangerous. Using the wrong drive identifier could result in data loss."})})}),"\n",(0,s.jsxs)(i.p,{children:["We will use the ",(0,s.jsx)(i.code,{children:"dd"})," command to write the contents of the ISO to the thumb drive. Replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," in the command below with your drive identifier. Note the extra ",(0,s.jsx)(i.code,{children:"r"})," before the identifier (i.e ",(0,s.jsx)(i.code,{children:"rdisk1"}),"). This is for raw mode, which along with bs=1m, makes the transfer faster."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/rIDENTIFIER bs=1m\n"})}),"\n",(0,s.jsx)(i.p,{children:"Be patient! After a few minutes you\u2019ll receive a message saying how much data was transferred. You can now safely eject the usb drive."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil eject /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.h2,{id:"boot-the-media",children:"Boot the media"}),"\n",(0,s.jsx)(i.p,{children:"Now it is time to restart your computer to boot the DVD or USB. Most computers will automatically boot from DVDs and USB, however if you experience issues booting the media, you may need to select to boot from DVD or USB."}),"\n",(0,s.jsxs)(i.p,{children:["This is usually accessible by pressing ",(0,s.jsx)(i.code,{children:"F9"})," or ",(0,s.jsx)(i.code,{children:"F12"})," while your computer is booting. On some devices it may also be ",(0,s.jsx)(i.code,{children:"ESC"}),"."]}),"\n",(0,s.jsx)(i.p,{children:'Macs will boot to the "Startup Manager" by holding down the Option (Alt) key. The DVD or USB drive will most likely show up as "EFI Boot".'})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},69064:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_done-fdbb3bda7061afd0ca7f97b85c1cef18.jpg"},7173:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_start-c8e10b8e6f627b862f8f6344260db698.jpg"},39115:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_writing-1a2eb065ba3c61dd1371f89b2ab9f7c1.jpg"},8234:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_1_start-0457fdcee59f063744233653c88022f7.png"},51213:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_2_writing-61d90705ea2038df803e806657f7e20f.png"},46368:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_3_done-de4e8501e47d1073f945ae1aceb13995.png"},54725:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-burn-dvd-0bef9578a58d61610854fc7c25e3496f.jpg"},74020:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-etcher-2d28aaeb19eda12c960c6b09e81eceb2.jpg"},93093:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/rufus-6f16a561298400882bff901d61064e58.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>o,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5685b4d8.779151ba.js b/assets/js/5685b4d8.096f851a.js
similarity index 96%
rename from assets/js/5685b4d8.779151ba.js
rename to assets/js/5685b4d8.096f851a.js
index 53e0c0bf0..86b364a7c 100644
--- a/assets/js/5685b4d8.779151ba.js
+++ b/assets/js/5685b4d8.096f851a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1540],{17599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(85893),i=t(11151);const r={title:"Configuration",summary:"Help for configuring XFCE on Solus"},s="Configuration",c={id:"user/editions/xfce/configuration",title:"Configuration",description:"TODO: Add configuration snippets for XFCE",source:"@site/docs/user/editions/xfce/configuration.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/configuration",permalink:"/docs/user/editions/xfce/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring XFCE on Solus"},sidebar:"userSidebar",previous:{title:"XFCE",permalink:"/docs/user/editions/xfce/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"}},u={},a=[];function d(e){const n={h1:"h1",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.p,{children:"TODO: Add configuration snippets for XFCE"})]})}function f(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(67294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1540],{17599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(85893),i=t(11151);const r={title:"Configuration",summary:"Help for configuring XFCE on Solus"},s="Configuration",c={id:"user/editions/xfce/configuration",title:"Configuration",description:"TODO: Add configuration snippets for XFCE",source:"@site/docs/user/editions/xfce/configuration.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/configuration",permalink:"/docs/user/editions/xfce/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring XFCE on Solus"},sidebar:"userSidebar",previous:{title:"XFCE",permalink:"/docs/user/editions/xfce/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"}},u={},a=[];function d(e){const n={h1:"h1",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.p,{children:"TODO: Add configuration snippets for XFCE"})]})}function f(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(67294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5b7f3753.1a9fe7e9.js b/assets/js/5b7f3753.dd9a94b3.js
similarity index 98%
rename from assets/js/5b7f3753.1a9fe7e9.js
rename to assets/js/5b7f3753.dd9a94b3.js
index de7b4083c..cb70d9ee2 100644
--- a/assets/js/5b7f3753.1a9fe7e9.js
+++ b/assets/js/5b7f3753.dd9a94b3.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6413],{47512:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=n(85893),s=n(11151);const a={title:"Git Basics",summary:"Basic git commands for packaging"},r="Git Basics",c={id:"packaging/git-basics",title:"Git Basics",description:"Working with branches",source:"@site/docs/packaging/git-basics.md",sourceDirName:"packaging",slug:"/packaging/git-basics",permalink:"/docs/packaging/git-basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/git-basics.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Git Basics",summary:"Basic git commands for packaging"},sidebar:"packagingSidebar",previous:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"},next:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"}},o={},h=[{value:"Working with branches",id:"working-with-branches",level:2},{value:"Keeping your branch up to date with the main branch",id:"keeping-your-branch-up-to-date-with-the-main-branch",level:2},{value:"Adding files",id:"adding-files",level:2},{value:"Removing files",id:"removing-files",level:2},{value:"Renaming files",id:"renaming-files",level:2},{value:"Check the changes in your files",id:"check-the-changes-in-your-files",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Deleting your branch after a pull request is merged",id:"deleting-your-branch-after-a-pull-request-is-merged",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"git-basics",children:"Git Basics"})}),"\n",(0,t.jsx)(i.h2,{id:"working-with-branches",children:"Working with branches"}),"\n",(0,t.jsxs)(i.p,{children:["The recommended way to switch branches is ",(0,t.jsx)(i.code,{children:"git switch"}),".\nTo create a new branch use ",(0,t.jsx)(i.code,{children:"git switch -c"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"keeping-your-branch-up-to-date-with-the-main-branch",children:"Keeping your branch up to date with the main branch"}),"\n",(0,t.jsxs)(i.p,{children:["If there any new changes to the repository whilst you are still working on your branch you need to ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork",children:"sync your fork"}),".\nRun ",(0,t.jsx)(i.code,{children:"git fetch"}),", and ",(0,t.jsx)(i.code,{children:"git rebase origin/main"})," to pull the changes in.\nYou will need to fix any conflicts manually.\nYou can check your branch against main with ",(0,t.jsx)(i.code,{children:"git diff origin/main..my-branch"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"adding-files",children:"Adding files"}),"\n",(0,t.jsxs)(i.p,{children:["For every file you change or add, you must let git know about it: ",(0,t.jsx)(i.code,{children:"git add someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"removing-files",children:"Removing files"}),"\n",(0,t.jsxs)(i.p,{children:["For files that need to be removed, you must do so using git: ",(0,t.jsx)(i.code,{children:"git rm someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"renaming-files",children:"Renaming files"}),"\n",(0,t.jsxs)(i.p,{children:["Likewise, for renaming a file, you must do so via git: ",(0,t.jsx)(i.code,{children:"git mv someFile someFileName2"})]}),"\n",(0,t.jsx)(i.h2,{id:"check-the-changes-in-your-files",children:"Check the changes in your files"}),"\n",(0,t.jsx)(i.p,{children:"It's a good idea to review the changes you have made to each file. This is to make sure you're committing what you intend and to make sure it looks good. Do this before adding changed files."}),"\n",(0,t.jsxs)(i.p,{children:["To diff them all at once, useful for small changes, use ",(0,t.jsx)(i.code,{children:"git diff"}),".\nTo diff each file one at a time run ",(0,t.jsx)(i.code,{children:"git diff filename"})," on each one."]}),"\n",(0,t.jsx)(i.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Check your branch"})}),"\n",(0,t.jsxs)(i.p,{children:["Get the status of the branch with ",(0,t.jsx)(i.code,{children:"git status"}),". Make sure all the files you changed are staged, and that there are no untracked files. The git status should say your branch is clean."]}),"\n",(0,t.jsxs)(i.p,{children:["Now that you've tested and reviewed your change, when you're happy with it, it's time to commit your changes with ",(0,t.jsx)(i.code,{children:"git commit"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"deleting-your-branch-after-a-pull-request-is-merged",children:"Deleting your branch after a pull request is merged"}),"\n",(0,t.jsx)(i.p,{children:"Once your pull request has been accepted you can delete your working branches.\nFirst, change to the package directory, switch to the main branch, then delete your local and the remote branches."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit branch -D my-branch\ngit push -d origin my-branch\n"})})]})}function d(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var t=n(67294);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6413],{47512:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=n(85893),s=n(11151);const a={title:"Git Basics",summary:"Basic git commands for packaging"},r="Git Basics",c={id:"packaging/git-basics",title:"Git Basics",description:"Working with branches",source:"@site/docs/packaging/git-basics.md",sourceDirName:"packaging",slug:"/packaging/git-basics",permalink:"/docs/packaging/git-basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/git-basics.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Git Basics",summary:"Basic git commands for packaging"},sidebar:"packagingSidebar",previous:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"},next:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"}},o={},h=[{value:"Working with branches",id:"working-with-branches",level:2},{value:"Keeping your branch up to date with the main branch",id:"keeping-your-branch-up-to-date-with-the-main-branch",level:2},{value:"Adding files",id:"adding-files",level:2},{value:"Removing files",id:"removing-files",level:2},{value:"Renaming files",id:"renaming-files",level:2},{value:"Check the changes in your files",id:"check-the-changes-in-your-files",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Deleting your branch after a pull request is merged",id:"deleting-your-branch-after-a-pull-request-is-merged",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"git-basics",children:"Git Basics"})}),"\n",(0,t.jsx)(i.h2,{id:"working-with-branches",children:"Working with branches"}),"\n",(0,t.jsxs)(i.p,{children:["The recommended way to switch branches is ",(0,t.jsx)(i.code,{children:"git switch"}),".\nTo create a new branch use ",(0,t.jsx)(i.code,{children:"git switch -c"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"keeping-your-branch-up-to-date-with-the-main-branch",children:"Keeping your branch up to date with the main branch"}),"\n",(0,t.jsxs)(i.p,{children:["If there any new changes to the repository whilst you are still working on your branch you need to ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork",children:"sync your fork"}),".\nRun ",(0,t.jsx)(i.code,{children:"git fetch"}),", and ",(0,t.jsx)(i.code,{children:"git rebase origin/main"})," to pull the changes in.\nYou will need to fix any conflicts manually.\nYou can check your branch against main with ",(0,t.jsx)(i.code,{children:"git diff origin/main..my-branch"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"adding-files",children:"Adding files"}),"\n",(0,t.jsxs)(i.p,{children:["For every file you change or add, you must let git know about it: ",(0,t.jsx)(i.code,{children:"git add someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"removing-files",children:"Removing files"}),"\n",(0,t.jsxs)(i.p,{children:["For files that need to be removed, you must do so using git: ",(0,t.jsx)(i.code,{children:"git rm someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"renaming-files",children:"Renaming files"}),"\n",(0,t.jsxs)(i.p,{children:["Likewise, for renaming a file, you must do so via git: ",(0,t.jsx)(i.code,{children:"git mv someFile someFileName2"})]}),"\n",(0,t.jsx)(i.h2,{id:"check-the-changes-in-your-files",children:"Check the changes in your files"}),"\n",(0,t.jsx)(i.p,{children:"It's a good idea to review the changes you have made to each file. This is to make sure you're committing what you intend and to make sure it looks good. Do this before adding changed files."}),"\n",(0,t.jsxs)(i.p,{children:["To diff them all at once, useful for small changes, use ",(0,t.jsx)(i.code,{children:"git diff"}),".\nTo diff each file one at a time run ",(0,t.jsx)(i.code,{children:"git diff filename"})," on each one."]}),"\n",(0,t.jsx)(i.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Check your branch"})}),"\n",(0,t.jsxs)(i.p,{children:["Get the status of the branch with ",(0,t.jsx)(i.code,{children:"git status"}),". Make sure all the files you changed are staged, and that there are no untracked files. The git status should say your branch is clean."]}),"\n",(0,t.jsxs)(i.p,{children:["Now that you've tested and reviewed your change, when you're happy with it, it's time to commit your changes with ",(0,t.jsx)(i.code,{children:"git commit"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"deleting-your-branch-after-a-pull-request-is-merged",children:"Deleting your branch after a pull request is merged"}),"\n",(0,t.jsx)(i.p,{children:"Once your pull request has been accepted you can delete your working branches.\nFirst, change to the package directory, switch to the main branch, then delete your local and the remote branches."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit branch -D my-branch\ngit push -d origin my-branch\n"})})]})}function d(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var t=n(67294);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5f194406.74e8cf88.js b/assets/js/5f194406.ad4c1306.js
similarity index 99%
rename from assets/js/5f194406.74e8cf88.js
rename to assets/js/5f194406.ad4c1306.js
index 96293b97b..66f825eaa 100644
--- a/assets/js/5f194406.74e8cf88.js
+++ b/assets/js/5f194406.ad4c1306.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7607],{77882:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const o={title:"Community Guidelines",summary:"Community Guidelines"},r="Community guidelines",a={id:"user/contributing/community-guidelines",title:"Community Guidelines",description:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment.",source:"@site/docs/user/contributing/community-guidelines.md",sourceDirName:"user/contributing",slug:"/user/contributing/community-guidelines",permalink:"/docs/user/contributing/community-guidelines",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/community-guidelines.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Community Guidelines",summary:"Community Guidelines"},sidebar:"userSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"}},l={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Harassment",id:"harassment",level:3},{value:"Language",id:"language",level:3},{value:"Media sharing",id:"media-sharing",level:3},{value:"Observe topic guidance",id:"observe-topic-guidance",level:3},{value:"Other",id:"other",level:3},{value:"Service-specific guidelines",id:"service-specific-guidelines",level:2},{value:"Repositories and issue trackers",id:"repositories-and-issue-trackers",level:3}];function u(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"community-guidelines",children:"Community guidelines"})}),"\n",(0,s.jsx)(i.p,{children:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment."}),"\n",(0,s.jsx)(i.p,{children:"Our guidelines apply to all services offered or used by the project, in addition to any terms of service of third-party services used by the project. Solus Staff reserves the right to either ban or terminate access, on a temporary or permanent basis, to members of the community which are found to be violating our guidelines."}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The guidelines laid out in this section apply to all services offered or used by the project, such as (but not limited to):"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Our package issue tracker"}),"\n",(0,s.jsx)(i.li,{children:"Any and all forums or organized communities, e.g. our Flarum forums or subreddit"}),"\n",(0,s.jsx)(i.li,{children:"Matrix, IRC, or any other officially supported means of communicating with the project and community members in real-time"}),"\n",(0,s.jsx)(i.li,{children:"Postings to social media pages / properties owned or used by the project."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"harassment",children:"Harassment"}),"\n",(0,s.jsx)(i.p,{children:"The project condemns any and all forms of harassment. Harassment by individuals in our community, whether in public (on services provided by or used by the project) or private (e.g. direct messages), to other members in our community, will result in the temporary or permanent banning of such individuals across any and all services provided by or used by the project."}),"\n",(0,s.jsx)(i.p,{children:"This extends to any and all events / venues sponsored or otherwise supported by the project. Harassment in such events or venues will result in the permanent banning of such individuals from future events and if necessary, the immediate removal of such individuals from any current events / venues."}),"\n",(0,s.jsx)(i.p,{children:"You are encouraged to reach out to a member of the Solus Staff should you be harassed by any member of our community so such matters may be addressed immediately."}),"\n",(0,s.jsx)(i.h3,{id:"language",children:"Language"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to engage in a manner which is respectful and avoids the use of language which is hateful, derogatory, or otherwise intentionally degrading. This includes (but is not limited to) language which could be classified as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Hateful towards individuals or groups based on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Disabilities"}),"\n",(0,s.jsx)(i.li,{children:"Gender or gender identity"}),"\n",(0,s.jsx)(i.li,{children:"Religious beliefs"}),"\n",(0,s.jsx)(i.li,{children:"Sexual orientation"}),"\n",(0,s.jsx)(i.li,{children:"Race or nationality"}),"\n",(0,s.jsx)(i.li,{children:"Political affiliation"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.li,{children:"Sexual or otherwise lewd in nature"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Profane language which is not derogatory, hateful, or sexual in nature may be allowed in specific off-topic rooms or other locations permitted by the project. However, the Solus Staff moderation team reserves the right to request the immediate ceasing of the use of such language by any individual if it is deemed to be derogatory, hateful, sexual, or in a manner which is otherwise distasteful."}),"\n",(0,s.jsx)(i.h3,{id:"media-sharing",children:"Media sharing"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community shall not link / share media which is illegal, pornographic / sexual, or otherwise offensive in nature. This extends to sharing media which shows any illegal or otherwise harmful acts, such as acts of violence."}),"\n",(0,s.jsx)(i.h3,{id:"observe-topic-guidance",children:"Observe topic guidance"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should attempt to observe topic guidance when participating in various services offered or used by the project, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Ensuring support-related rooms / mediums remain free of development and off-topic discussions to maximize the community and Solus Staff\u2019s ability to respond and address issues or support requests."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring development rooms / mediums remain free of off-topic discussions which are not relevant to the development or progression of various development items relating to Solus."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring off-topic rooms / mediums remain free of heated discussions of polarizing issues or current events in order to keep these spaces inviting and enjoyable."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"other",children:"Other"}),"\n",(0,s.jsx)(i.p,{children:"The below guidelines do not fall into any specific category but should be observed by members of the community:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Continual repetition and/or advertisement of any products, services, or projects is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"Using bots or other automated ways of interaction, unless explicitly permitted by the project, is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"No spamming or flooding. This may result in temporary removals (for example: kicks in Matrix) or warnings, to prevent the continued spamming or flooding."}),"\n",(0,s.jsx)(i.li,{children:"Promotion of unofficial Solus communities or communication channels without prior permission is not allowed."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"service-specific-guidelines",children:"Service-specific guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The below mentioned guidelines apply to individual services provided or used by the project."}),"\n",(0,s.jsx)(i.h3,{id:"repositories-and-issue-trackers",children:"Repositories and issue trackers"}),"\n",(0,s.jsx)(i.p,{children:"Solus utilizes a number of repositories and issue trackers to facilitate the development of various items in our project and to address issues raised by our community through tasks / issue reports. These include, but are not limited to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Our ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/",children:"Documentation, Package, Software Center, and various tooling repositories"})]}),"\n",(0,s.jsxs)(i.li,{children:["Our package ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/issues",children:"issue tracker"})]}),"\n",(0,s.jsx)(i.li,{children:"All other issue trackers utilized by the project across repositories hosted in our GitHub organizations"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Maintain on-topic discussions as relevant to each individual task"}),"\n",(0,s.jsx)(i.li,{children:"Not engage in disruptive behavior such as the modification of tasks or task information which are not owned or assigned to the user. Please leave the general maintenance of tasks or requesting of specific information to individuals which are assigned to the task, or Solus Staff"}),"\n",(0,s.jsx)(i.li,{children:"Refrain from using the Development Tracker for general support queries, such as (but not limited to): installation assistance, package installation assistance, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should remain mindful that all contributors to the project do so on a voluntary basis, in their free time, and should refrain from making demands or engaging in behavior which is not respectful."}),"\n",(0,s.jsx)(i.p,{children:"Solus Staff reserves the rights to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Close or lock tasks on a temporary or permanent basis"}),"\n",(0,s.jsx)(i.li,{children:"Disable the account of individuals which violate either general guidelines or \u201cDevelopment / Issue Trackers\u201d-specific guidelines."}),"\n",(0,s.jsx)(i.li,{children:"Make any finalized decisions in the interest of the project, continuation of our vision / objectives for the project or various software which we develop or support."}),"\n"]})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7607],{77882:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const o={title:"Community Guidelines",summary:"Community Guidelines"},r="Community guidelines",a={id:"user/contributing/community-guidelines",title:"Community Guidelines",description:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment.",source:"@site/docs/user/contributing/community-guidelines.md",sourceDirName:"user/contributing",slug:"/user/contributing/community-guidelines",permalink:"/docs/user/contributing/community-guidelines",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/community-guidelines.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Community Guidelines",summary:"Community Guidelines"},sidebar:"userSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"}},l={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Harassment",id:"harassment",level:3},{value:"Language",id:"language",level:3},{value:"Media sharing",id:"media-sharing",level:3},{value:"Observe topic guidance",id:"observe-topic-guidance",level:3},{value:"Other",id:"other",level:3},{value:"Service-specific guidelines",id:"service-specific-guidelines",level:2},{value:"Repositories and issue trackers",id:"repositories-and-issue-trackers",level:3}];function u(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"community-guidelines",children:"Community guidelines"})}),"\n",(0,s.jsx)(i.p,{children:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment."}),"\n",(0,s.jsx)(i.p,{children:"Our guidelines apply to all services offered or used by the project, in addition to any terms of service of third-party services used by the project. Solus Staff reserves the right to either ban or terminate access, on a temporary or permanent basis, to members of the community which are found to be violating our guidelines."}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The guidelines laid out in this section apply to all services offered or used by the project, such as (but not limited to):"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Our package issue tracker"}),"\n",(0,s.jsx)(i.li,{children:"Any and all forums or organized communities, e.g. our Flarum forums or subreddit"}),"\n",(0,s.jsx)(i.li,{children:"Matrix, IRC, or any other officially supported means of communicating with the project and community members in real-time"}),"\n",(0,s.jsx)(i.li,{children:"Postings to social media pages / properties owned or used by the project."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"harassment",children:"Harassment"}),"\n",(0,s.jsx)(i.p,{children:"The project condemns any and all forms of harassment. Harassment by individuals in our community, whether in public (on services provided by or used by the project) or private (e.g. direct messages), to other members in our community, will result in the temporary or permanent banning of such individuals across any and all services provided by or used by the project."}),"\n",(0,s.jsx)(i.p,{children:"This extends to any and all events / venues sponsored or otherwise supported by the project. Harassment in such events or venues will result in the permanent banning of such individuals from future events and if necessary, the immediate removal of such individuals from any current events / venues."}),"\n",(0,s.jsx)(i.p,{children:"You are encouraged to reach out to a member of the Solus Staff should you be harassed by any member of our community so such matters may be addressed immediately."}),"\n",(0,s.jsx)(i.h3,{id:"language",children:"Language"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to engage in a manner which is respectful and avoids the use of language which is hateful, derogatory, or otherwise intentionally degrading. This includes (but is not limited to) language which could be classified as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Hateful towards individuals or groups based on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Disabilities"}),"\n",(0,s.jsx)(i.li,{children:"Gender or gender identity"}),"\n",(0,s.jsx)(i.li,{children:"Religious beliefs"}),"\n",(0,s.jsx)(i.li,{children:"Sexual orientation"}),"\n",(0,s.jsx)(i.li,{children:"Race or nationality"}),"\n",(0,s.jsx)(i.li,{children:"Political affiliation"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.li,{children:"Sexual or otherwise lewd in nature"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Profane language which is not derogatory, hateful, or sexual in nature may be allowed in specific off-topic rooms or other locations permitted by the project. However, the Solus Staff moderation team reserves the right to request the immediate ceasing of the use of such language by any individual if it is deemed to be derogatory, hateful, sexual, or in a manner which is otherwise distasteful."}),"\n",(0,s.jsx)(i.h3,{id:"media-sharing",children:"Media sharing"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community shall not link / share media which is illegal, pornographic / sexual, or otherwise offensive in nature. This extends to sharing media which shows any illegal or otherwise harmful acts, such as acts of violence."}),"\n",(0,s.jsx)(i.h3,{id:"observe-topic-guidance",children:"Observe topic guidance"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should attempt to observe topic guidance when participating in various services offered or used by the project, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Ensuring support-related rooms / mediums remain free of development and off-topic discussions to maximize the community and Solus Staff\u2019s ability to respond and address issues or support requests."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring development rooms / mediums remain free of off-topic discussions which are not relevant to the development or progression of various development items relating to Solus."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring off-topic rooms / mediums remain free of heated discussions of polarizing issues or current events in order to keep these spaces inviting and enjoyable."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"other",children:"Other"}),"\n",(0,s.jsx)(i.p,{children:"The below guidelines do not fall into any specific category but should be observed by members of the community:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Continual repetition and/or advertisement of any products, services, or projects is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"Using bots or other automated ways of interaction, unless explicitly permitted by the project, is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"No spamming or flooding. This may result in temporary removals (for example: kicks in Matrix) or warnings, to prevent the continued spamming or flooding."}),"\n",(0,s.jsx)(i.li,{children:"Promotion of unofficial Solus communities or communication channels without prior permission is not allowed."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"service-specific-guidelines",children:"Service-specific guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The below mentioned guidelines apply to individual services provided or used by the project."}),"\n",(0,s.jsx)(i.h3,{id:"repositories-and-issue-trackers",children:"Repositories and issue trackers"}),"\n",(0,s.jsx)(i.p,{children:"Solus utilizes a number of repositories and issue trackers to facilitate the development of various items in our project and to address issues raised by our community through tasks / issue reports. These include, but are not limited to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Our ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/",children:"Documentation, Package, Software Center, and various tooling repositories"})]}),"\n",(0,s.jsxs)(i.li,{children:["Our package ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/issues",children:"issue tracker"})]}),"\n",(0,s.jsx)(i.li,{children:"All other issue trackers utilized by the project across repositories hosted in our GitHub organizations"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Maintain on-topic discussions as relevant to each individual task"}),"\n",(0,s.jsx)(i.li,{children:"Not engage in disruptive behavior such as the modification of tasks or task information which are not owned or assigned to the user. Please leave the general maintenance of tasks or requesting of specific information to individuals which are assigned to the task, or Solus Staff"}),"\n",(0,s.jsx)(i.li,{children:"Refrain from using the Development Tracker for general support queries, such as (but not limited to): installation assistance, package installation assistance, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should remain mindful that all contributors to the project do so on a voluntary basis, in their free time, and should refrain from making demands or engaging in behavior which is not respectful."}),"\n",(0,s.jsx)(i.p,{children:"Solus Staff reserves the rights to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Close or lock tasks on a temporary or permanent basis"}),"\n",(0,s.jsx)(i.li,{children:"Disable the account of individuals which violate either general guidelines or \u201cDevelopment / Issue Trackers\u201d-specific guidelines."}),"\n",(0,s.jsx)(i.li,{children:"Make any finalized decisions in the interest of the project, continuation of our vision / objectives for the project or various software which we develop or support."}),"\n"]})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/61c953b4.e1437d06.js b/assets/js/61c953b4.ca4b1080.js
similarity index 99%
rename from assets/js/61c953b4.e1437d06.js
rename to assets/js/61c953b4.ca4b1080.js
index afd2d79d1..cfab902f0 100644
--- a/assets/js/61c953b4.e1437d06.js
+++ b/assets/js/61c953b4.ca4b1080.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8032],{18421:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=i(85893),t=i(11151);const s={title:"Maintainership",summary:"Package maintainership"},r="Maintainership",o={id:"packaging/procedures/maintainership",title:"Maintainership",description:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards.",source:"@site/docs/packaging/procedures/maintainership.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/maintainership",permalink:"/docs/packaging/procedures/maintainership",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/maintainership.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Maintainership",summary:"Package maintainership"},sidebar:"packagingSidebar",previous:{title:"Procedures",permalink:"/docs/category/procedures"},next:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"}},c={},d=[{value:"Commitment",id:"commitment",level:2},{value:"Stepping in",id:"stepping-in",level:2},{value:"Updating a maintained package",id:"updating-a-maintained-package",level:2},{value:"Maintainers",id:"maintainers",level:3},{value:"Non-maintainers",id:"non-maintainers",level:3},{value:"Template for the MAINTAINERS.md
file",id:"template-for-the-maintainersmd-file",level:2}];function l(e){const a={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"maintainership",children:"Maintainership"})}),"\n",(0,n.jsx)(a.p,{children:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards."}),"\n",(0,n.jsx)(a.h2,{id:"commitment",children:"Commitment"}),"\n",(0,n.jsx)(a.p,{children:"Each new package which is going to land in the Solus repository must have one or more maintainers. These individuals commit to:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Update the package reasonably regularly, unless there are valid reasons to hold it back"}),"\n",(0,n.jsxs)(a.li,{children:["Ensure the ",(0,n.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"packaging file"})," adheres to the Solus ",(0,n.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"standards"})]}),"\n",(0,n.jsx)(a.li,{children:"Ensure the application or library is consistent with the Operating System aesthetics, file system conventions and the Solus philosophy in general"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["On the Solus side however, the community must not forget that maintainers are volunteers, which may or may not have a technical background. More experienced users are to engage new maintainers in a welcoming manner, e.g. by listing their errors and inviting them to fix them. (More on this in the ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/community-guidelines#repositories-and-issue-trackers",children:"community guidelines"}),")"]}),"\n",(0,n.jsx)(a.p,{children:"The Solus Staff have the right to enforce certain practices, even when in contrast with maintainers' vision. It also has the right to ultimately accept or reject a patch."}),"\n",(0,n.jsx)(a.h2,{id:"stepping-in",children:"Stepping in"}),"\n",(0,n.jsxs)(a.p,{children:["To officially step in as the maintainer of a package, a ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be provided for accepted packages that are not yet included in the repository, or if the package predates the policy of requiring one. Instead, if a previously maintained package is marked by Solus Staff as needing a new maintainer, the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be updated."]}),"\n",(0,n.jsx)(a.h2,{id:"updating-a-maintained-package",children:"Updating a maintained package"}),"\n",(0,n.jsx)(a.p,{children:"The procedure varies depending on whether or not the individual is the maintainer."}),"\n",(0,n.jsx)(a.h3,{id:"maintainers",children:"Maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["Maintainers are free to ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"update a package"})," at their will, unless otherwise indicated by Solus Staff."]}),"\n",(0,n.jsx)(a.h3,{id:"non-maintainers",children:"Non-maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["If a package is actively maintained, modifications should not occur and the individual should exercise patience when it comes to updates. In some cases, a maintainer may intentionally be holding back a package, or has simply not updated yet. If pertinent, the individual should file a ",(0,n.jsx)(a.a,{href:"/docs/packaging/procedures/request-a-package-update",children:"package update request"}),". Alternatively, the individual can reach the maintainers or Solus Staff via the Solus Packaging room on ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," and ask permission to update the package. It is also possible to submit an update and attach a message to it clarifying the intention of updating the package, although this is a special case reserved to e.g. security updates."]}),"\n",(0,n.jsxs)(a.h2,{id:"template-for-the-maintainersmd-file",children:["Template for the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,n.jsxs)(a.p,{children:["Presented here is the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file. This file must be provided verbatim alongside the other patch contents, and filled in with the maintainers' personal information. A ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended, while an email address is mandatory. Similar to the ",(0,n.jsx)(a.code,{children:".solus/packager"})," file used for packaging, the maintainers listed in ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," must use their real first and last name(s) for accountability purposes."]}),"\n",(0,n.jsxs)(a.p,{children:["The contact information section is a YAML list. If needed, more elements may be added, each per maintainer. Do not edit the file in any other way, including spacing, except ",(0,n.jsx)(a.em,{children:"Name"}),", ",(0,n.jsx)(a.em,{children:"Surname"})," and ",(0,n.jsx)(a.em,{children:"REPLACEME"})," placeholders."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"This file is used to indicate primary maintainership for this package. A package may list more than one maintainer to avoid bus factor issues. People on this list may be considered \u201csubject-matter experts\u201d. Please note that Solus Staff may need to perform necessary rebuilds, upgrades, or security fixes as part of the normal maintenance of the Solus package repository. If you believe this package requires an update, follow documentation from https://help.getsol.us/docs/packaging/procedures/request-a-package-update. In the event that this package becomes insufficiently maintained, the Solus Staff reserves the right to request a new maintainer, or deprecate and remove this package from the repository entirely.\n\n- Name Surname\n - Matrix: REPLACEME\n - Email: REPLACEME\n"})})]})}function h(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,a,i)=>{i.d(a,{Z:()=>o,a:()=>r});var n=i(67294);const t={},s=n.createContext(t);function r(e){const a=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8032],{18421:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=i(85893),t=i(11151);const s={title:"Maintainership",summary:"Package maintainership"},r="Maintainership",o={id:"packaging/procedures/maintainership",title:"Maintainership",description:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards.",source:"@site/docs/packaging/procedures/maintainership.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/maintainership",permalink:"/docs/packaging/procedures/maintainership",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/maintainership.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Maintainership",summary:"Package maintainership"},sidebar:"packagingSidebar",previous:{title:"Procedures",permalink:"/docs/category/procedures"},next:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"}},c={},d=[{value:"Commitment",id:"commitment",level:2},{value:"Stepping in",id:"stepping-in",level:2},{value:"Updating a maintained package",id:"updating-a-maintained-package",level:2},{value:"Maintainers",id:"maintainers",level:3},{value:"Non-maintainers",id:"non-maintainers",level:3},{value:"Template for the MAINTAINERS.md
file",id:"template-for-the-maintainersmd-file",level:2}];function l(e){const a={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"maintainership",children:"Maintainership"})}),"\n",(0,n.jsx)(a.p,{children:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards."}),"\n",(0,n.jsx)(a.h2,{id:"commitment",children:"Commitment"}),"\n",(0,n.jsx)(a.p,{children:"Each new package which is going to land in the Solus repository must have one or more maintainers. These individuals commit to:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Update the package reasonably regularly, unless there are valid reasons to hold it back"}),"\n",(0,n.jsxs)(a.li,{children:["Ensure the ",(0,n.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"packaging file"})," adheres to the Solus ",(0,n.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"standards"})]}),"\n",(0,n.jsx)(a.li,{children:"Ensure the application or library is consistent with the Operating System aesthetics, file system conventions and the Solus philosophy in general"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["On the Solus side however, the community must not forget that maintainers are volunteers, which may or may not have a technical background. More experienced users are to engage new maintainers in a welcoming manner, e.g. by listing their errors and inviting them to fix them. (More on this in the ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/community-guidelines#repositories-and-issue-trackers",children:"community guidelines"}),")"]}),"\n",(0,n.jsx)(a.p,{children:"The Solus Staff have the right to enforce certain practices, even when in contrast with maintainers' vision. It also has the right to ultimately accept or reject a patch."}),"\n",(0,n.jsx)(a.h2,{id:"stepping-in",children:"Stepping in"}),"\n",(0,n.jsxs)(a.p,{children:["To officially step in as the maintainer of a package, a ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be provided for accepted packages that are not yet included in the repository, or if the package predates the policy of requiring one. Instead, if a previously maintained package is marked by Solus Staff as needing a new maintainer, the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be updated."]}),"\n",(0,n.jsx)(a.h2,{id:"updating-a-maintained-package",children:"Updating a maintained package"}),"\n",(0,n.jsx)(a.p,{children:"The procedure varies depending on whether or not the individual is the maintainer."}),"\n",(0,n.jsx)(a.h3,{id:"maintainers",children:"Maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["Maintainers are free to ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"update a package"})," at their will, unless otherwise indicated by Solus Staff."]}),"\n",(0,n.jsx)(a.h3,{id:"non-maintainers",children:"Non-maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["If a package is actively maintained, modifications should not occur and the individual should exercise patience when it comes to updates. In some cases, a maintainer may intentionally be holding back a package, or has simply not updated yet. If pertinent, the individual should file a ",(0,n.jsx)(a.a,{href:"/docs/packaging/procedures/request-a-package-update",children:"package update request"}),". Alternatively, the individual can reach the maintainers or Solus Staff via the Solus Packaging room on ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," and ask permission to update the package. It is also possible to submit an update and attach a message to it clarifying the intention of updating the package, although this is a special case reserved to e.g. security updates."]}),"\n",(0,n.jsxs)(a.h2,{id:"template-for-the-maintainersmd-file",children:["Template for the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,n.jsxs)(a.p,{children:["Presented here is the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file. This file must be provided verbatim alongside the other patch contents, and filled in with the maintainers' personal information. A ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended, while an email address is mandatory. Similar to the ",(0,n.jsx)(a.code,{children:".solus/packager"})," file used for packaging, the maintainers listed in ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," must use their real first and last name(s) for accountability purposes."]}),"\n",(0,n.jsxs)(a.p,{children:["The contact information section is a YAML list. If needed, more elements may be added, each per maintainer. Do not edit the file in any other way, including spacing, except ",(0,n.jsx)(a.em,{children:"Name"}),", ",(0,n.jsx)(a.em,{children:"Surname"})," and ",(0,n.jsx)(a.em,{children:"REPLACEME"})," placeholders."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"This file is used to indicate primary maintainership for this package. A package may list more than one maintainer to avoid bus factor issues. People on this list may be considered \u201csubject-matter experts\u201d. Please note that Solus Staff may need to perform necessary rebuilds, upgrades, or security fixes as part of the normal maintenance of the Solus package repository. If you believe this package requires an update, follow documentation from https://help.getsol.us/docs/packaging/procedures/request-a-package-update. In the event that this package becomes insufficiently maintained, the Solus Staff reserves the right to request a new maintainer, or deprecate and remove this package from the repository entirely.\n\n- Name Surname\n - Matrix: REPLACEME\n - Email: REPLACEME\n"})})]})}function h(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,a,i)=>{i.d(a,{Z:()=>o,a:()=>r});var n=i(67294);const t={},s=n.createContext(t);function r(e){const a=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/64699048.9858ebd9.js b/assets/js/64699048.ea4f9bba.js
similarity index 98%
rename from assets/js/64699048.9858ebd9.js
rename to assets/js/64699048.ea4f9bba.js
index 10762a1dc..7232dfb6b 100644
--- a/assets/js/64699048.9858ebd9.js
+++ b/assets/js/64699048.ea4f9bba.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2151],{87063:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=t(85893),o=t(11151);const r={title:"Development",summary:"Installation of development software on Solus"},l="Development",i={id:"user/software/development/index",title:"Development",description:"Solus provides a stable foundation for creating, testing, and deploying applications.",source:"@site/docs/user/software/development/index.md",sourceDirName:"user/software/development",slug:"/user/software/development/",permalink:"/docs/user/software/development/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Development",summary:"Installation of development software on Solus"},sidebar:"userSidebar",previous:{title:"Desktops",permalink:"/docs/user/software/desktops/"},next:{title:"Containers",permalink:"/docs/user/software/development/containers"}},a={},d=[{value:"Getting started",id:"getting-started",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"Solus provides a stable foundation for creating, testing, and deploying applications."}),"\n",(0,s.jsx)(n.p,{children:"You can install tools such as text editors, programming languages, compilers, and version control systems. Solus also supports containerization and virtualization technologies."}),"\n",(0,s.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,s.jsxs)(n.p,{children:["If you want to compile and develop software using Solus, we recommend installing the ",(0,s.jsx)(n.code,{children:"system.devel"})," component."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install -c system.devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"system.devel"})," component installs libraries and packages for software development, such as ",(0,s.jsx)(n.code,{children:"clang"}),", ",(0,s.jsx)(n.code,{children:"gcc"}),", and ",(0,s.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"containers",children:(0,s.jsx)(n.strong,{children:"Containers"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure containerization software on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"java",children:(0,s.jsx)(n.strong,{children:"Java"})})}),"\n",(0,s.jsx)(n.p,{children:"Learn how to install, run, and manage Java on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"postgresql",children:(0,s.jsx)(n.strong,{children:"PostgreSQL"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to using PostgreSQL on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"r-and-rstudio",children:(0,s.jsx)(n.strong,{children:"R and RStudio"})})}),"\n",(0,s.jsx)(n.p,{children:"Quick start guide for R and RStudio on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"rust",children:(0,s.jsx)(n.strong,{children:"Rust"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to getting set up for Rust development on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"web",children:(0,s.jsx)(n.strong,{children:"Web Development"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure different web development tools on Solus."})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>l});var s=t(67294);const o={},r=s.createContext(o);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2151],{87063:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=t(85893),o=t(11151);const r={title:"Development",summary:"Installation of development software on Solus"},l="Development",i={id:"user/software/development/index",title:"Development",description:"Solus provides a stable foundation for creating, testing, and deploying applications.",source:"@site/docs/user/software/development/index.md",sourceDirName:"user/software/development",slug:"/user/software/development/",permalink:"/docs/user/software/development/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Development",summary:"Installation of development software on Solus"},sidebar:"userSidebar",previous:{title:"Desktops",permalink:"/docs/user/software/desktops/"},next:{title:"Containers",permalink:"/docs/user/software/development/containers"}},a={},d=[{value:"Getting started",id:"getting-started",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"Solus provides a stable foundation for creating, testing, and deploying applications."}),"\n",(0,s.jsx)(n.p,{children:"You can install tools such as text editors, programming languages, compilers, and version control systems. Solus also supports containerization and virtualization technologies."}),"\n",(0,s.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,s.jsxs)(n.p,{children:["If you want to compile and develop software using Solus, we recommend installing the ",(0,s.jsx)(n.code,{children:"system.devel"})," component."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install -c system.devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"system.devel"})," component installs libraries and packages for software development, such as ",(0,s.jsx)(n.code,{children:"clang"}),", ",(0,s.jsx)(n.code,{children:"gcc"}),", and ",(0,s.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"containers",children:(0,s.jsx)(n.strong,{children:"Containers"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure containerization software on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"java",children:(0,s.jsx)(n.strong,{children:"Java"})})}),"\n",(0,s.jsx)(n.p,{children:"Learn how to install, run, and manage Java on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"postgresql",children:(0,s.jsx)(n.strong,{children:"PostgreSQL"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to using PostgreSQL on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"r-and-rstudio",children:(0,s.jsx)(n.strong,{children:"R and RStudio"})})}),"\n",(0,s.jsx)(n.p,{children:"Quick start guide for R and RStudio on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"rust",children:(0,s.jsx)(n.strong,{children:"Rust"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to getting set up for Rust development on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"web",children:(0,s.jsx)(n.strong,{children:"Web Development"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure different web development tools on Solus."})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>l});var s=t(67294);const o={},r=s.createContext(o);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6787574e.1482e835.js b/assets/js/6787574e.5388a897.js
similarity index 99%
rename from assets/js/6787574e.1482e835.js
rename to assets/js/6787574e.5388a897.js
index 7e5753c45..175af05d2 100644
--- a/assets/js/6787574e.1482e835.js
+++ b/assets/js/6787574e.5388a897.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4500],{26240:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=s(85893),n=s(11151);const o={title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},i="Welcome",d={id:"user/intro",title:"Welcome",description:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with.",source:"@site/docs/user/intro.md",sourceDirName:"user",slug:"/user/intro",permalink:"/docs/user/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/intro.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:0,frontMatter:{title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},sidebar:"userSidebar",next:{title:"Quick Start",permalink:"/docs/category/quick-start"}},a={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"Support channels",id:"support-channels",level:2}];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"welcome",children:"Welcome"})}),"\n",(0,r.jsx)(t.p,{children:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with."}),"\n",(0,r.jsx)(t.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsx)(t.p,{children:"We organized the help center into sections to help you navigate the contents easily:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Section"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/quick-start",children:"Quick Start"})}),(0,r.jsx)(t.td,{children:"If you're new to Solus, this section will set you on the right track. Find documentation on system requirements, installing Solus, software management, the boot process, and troubleshooting."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/contributing",children:"Contributing"})}),(0,r.jsx)(t.td,{children:"Find how you can contribute to Solus, whether you're a beginner or an experienced Linux and Solus user."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/editions/",children:"Editions"})}),(0,r.jsx)(t.td,{children:"Understand the different editions of Solus: differences between editions, configuration tasks, and helpful tips and tricks."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/hardware/",children:"Hardware"})}),(0,r.jsx)(t.td,{children:"Solus supports most hardware out-of-the-box, but there are exceptions. This section focuses on those exceptions and how to get the most out of your hardware."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package management"})}),(0,r.jsx)(t.td,{children:"Learn how to install software and manage the repositories of your Solus system."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/privacy",children:"Privacy policy"})}),(0,r.jsx)(t.td,{children:"Understand our privacy policy: Learn how we handle your data, and how to contact us for privacy concerns."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/software/",children:"Software"})}),(0,r.jsx)(t.td,{children:"Getting started and configuration guides for the software packages included in Solus."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/troubleshooting/",children:"Troubleshooting"})}),(0,r.jsx)(t.td,{children:"Learn how to diagnose and fix problems you might have with Solus."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"support-channels",children:"Support channels"}),"\n",(0,r.jsx)(t.p,{children:"If you need help with something not covered in the help center, there are various channels where you can seek support from the Solus team or other Solus users."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Channel"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Forums"})}),(0,r.jsx)(t.td,{children:"Our Flarum-powered forums are easy to use from any device and are a great resource for getting support."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Matrix"})}),(0,r.jsxs)(t.td,{children:["Matrix is a great way to discuss issues and development in real-time. Learn how to access Solus' Matrix space ",(0,r.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"here"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject",children:"Reddit"})}),(0,r.jsx)(t.td,{children:"If you are a Redditor, our subreddit has a similar purpose to the forums."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://issues.getsol.us",children:"Issue tracker"})}),(0,r.jsx)(t.td,{children:"If you have issues with your Solus system, or any of our software packages doesn't work as expected, consider filing a bug report on our issue tracker."})]})]})]}),"\n",(0,r.jsx)(t.admonition,{title:"Important",type:"caution",children:(0,r.jsx)(t.p,{children:"Volunteers around the world build and maintain Solus. Due to time zone differences there might not always be people to answer your questions immediately."})})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>i});var r=s(67294);const n={},o=r.createContext(n);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4500],{26240:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=s(85893),n=s(11151);const o={title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},i="Welcome",d={id:"user/intro",title:"Welcome",description:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with.",source:"@site/docs/user/intro.md",sourceDirName:"user",slug:"/user/intro",permalink:"/docs/user/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/intro.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:0,frontMatter:{title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},sidebar:"userSidebar",next:{title:"Quick Start",permalink:"/docs/category/quick-start"}},a={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"Support channels",id:"support-channels",level:2}];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"welcome",children:"Welcome"})}),"\n",(0,r.jsx)(t.p,{children:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with."}),"\n",(0,r.jsx)(t.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsx)(t.p,{children:"We organized the help center into sections to help you navigate the contents easily:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Section"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/quick-start",children:"Quick Start"})}),(0,r.jsx)(t.td,{children:"If you're new to Solus, this section will set you on the right track. Find documentation on system requirements, installing Solus, software management, the boot process, and troubleshooting."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/contributing",children:"Contributing"})}),(0,r.jsx)(t.td,{children:"Find how you can contribute to Solus, whether you're a beginner or an experienced Linux and Solus user."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/editions/",children:"Editions"})}),(0,r.jsx)(t.td,{children:"Understand the different editions of Solus: differences between editions, configuration tasks, and helpful tips and tricks."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/hardware/",children:"Hardware"})}),(0,r.jsx)(t.td,{children:"Solus supports most hardware out-of-the-box, but there are exceptions. This section focuses on those exceptions and how to get the most out of your hardware."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package management"})}),(0,r.jsx)(t.td,{children:"Learn how to install software and manage the repositories of your Solus system."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/privacy",children:"Privacy policy"})}),(0,r.jsx)(t.td,{children:"Understand our privacy policy: Learn how we handle your data, and how to contact us for privacy concerns."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/software/",children:"Software"})}),(0,r.jsx)(t.td,{children:"Getting started and configuration guides for the software packages included in Solus."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/troubleshooting/",children:"Troubleshooting"})}),(0,r.jsx)(t.td,{children:"Learn how to diagnose and fix problems you might have with Solus."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"support-channels",children:"Support channels"}),"\n",(0,r.jsx)(t.p,{children:"If you need help with something not covered in the help center, there are various channels where you can seek support from the Solus team or other Solus users."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Channel"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Forums"})}),(0,r.jsx)(t.td,{children:"Our Flarum-powered forums are easy to use from any device and are a great resource for getting support."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Matrix"})}),(0,r.jsxs)(t.td,{children:["Matrix is a great way to discuss issues and development in real-time. Learn how to access Solus' Matrix space ",(0,r.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"here"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject",children:"Reddit"})}),(0,r.jsx)(t.td,{children:"If you are a Redditor, our subreddit has a similar purpose to the forums."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://issues.getsol.us",children:"Issue tracker"})}),(0,r.jsx)(t.td,{children:"If you have issues with your Solus system, or any of our software packages doesn't work as expected, consider filing a bug report on our issue tracker."})]})]})]}),"\n",(0,r.jsx)(t.admonition,{title:"Important",type:"caution",children:(0,r.jsx)(t.p,{children:"Volunteers around the world build and maintain Solus. Due to time zone differences there might not always be people to answer your questions immediately."})})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>i});var r=s(67294);const n={},o=r.createContext(n);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6873f895.73ae0d1f.js b/assets/js/6873f895.240d8b66.js
similarity index 99%
rename from assets/js/6873f895.73ae0d1f.js
rename to assets/js/6873f895.240d8b66.js
index 311be1797..ad3bb7fef 100644
--- a/assets/js/6873f895.73ae0d1f.js
+++ b/assets/js/6873f895.240d8b66.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8849],{83781:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var s=t(85893),i=t(11151);const r={title:"Solus Style Guide",summary:"Guidance for writing Solus content"},o="Solus style guide",l={id:"user/contributing/style",title:"Solus Style Guide",description:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content.",source:"@site/docs/user/contributing/style.md",sourceDirName:"user/contributing",slug:"/user/contributing/style",permalink:"/docs/user/contributing/style",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/style.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Solus Style Guide",summary:"Guidance for writing Solus content"},sidebar:"userSidebar",previous:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"},next:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"}},d={},a=[{value:"General writing style",id:"general-writing-style",level:2},{value:"Linux-specific terms",id:"linux-specific-terms",level:2},{value:"Specific guidance",id:"specific-guidance",level:2},{value:"Admonitions",id:"admonitions",level:3},{value:"Code blocks",id:"code-blocks",level:2},{value:"Commands",id:"commands",level:3},{value:"Common Solus terms",id:"common-solus-terms",level:3},{value:"Markdown formatting",id:"markdown-formatting",level:3},{value:"Package names",id:"package-names",level:2},{value:"Spelling",id:"spelling",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"solus-style-guide",children:"Solus style guide"})}),"\n",(0,s.jsx)(n.p,{children:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Existing help center topics might not follow our style guide yet."})}),"\n",(0,s.jsx)(n.h2,{id:"general-writing-style",children:"General writing style"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.a,{href:"https://developers.google.com/style",children:"Google developer documentation style guide"})," for general writing style, grammar, and formatting."]}),"\n",(0,s.jsx)(n.p,{children:"Some useful pages:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/text-formatting",children:"Text formatting summary"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/procedures",children:"Procedures"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/timeless-documentation",children:"Timeless documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/word-list",children:"Word list"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"linux-specific-terms",children:"Linux-specific terms"}),"\n",(0,s.jsxs)(n.p,{children:["If you are unsure of how to use a common Linux term, refer to the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#glossary-terms-conventions",children:"Glossary of terms and conventions"})," from the ",(0,s.jsx)(n.em,{children:"Red Hat supplementary style guide for documentation"})]}),"\n",(0,s.jsx)(n.h2,{id:"specific-guidance",children:"Specific guidance"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"In alphabetical order, not order of importance."})}),"\n",(0,s.jsx)(n.h3,{id:"admonitions",children:"Admonitions"}),"\n",(0,s.jsxs)(n.p,{children:["This section is based on the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#admonitions",children:"Red Hat supplementary style guide"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Admonitions should draw the reader\u2019s attention to certain information. Keep admonitions to a minimum, and avoid placing multiple admonitions close to one another. If multiple admonitions are necessary, restructure the information by moving the less-important statements into the flow of the main content. See the ",(0,s.jsx)(n.a,{href:"https://docusaurus.io/docs/markdown-features/admonitions",children:"Docusaurus documentation"})," to learn the correct syntax."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Note"}),(0,s.jsx)(n.td,{children:"Additional guidance or advice that improves product configuration, performance, or supportability"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Tip"}),(0,s.jsx)(n.td,{children:"Recommendations, suggestions, and alternative methods that might not be obvious. Tips are not essential to using the product."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Info"}),(0,s.jsx)(n.td,{children:"General information about the topic at hand that may be useful or relevant to user."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Important"}),(0,s.jsx)(n.td,{children:"Advisory information essential to the completion of a task or default configuration settings. Users must not disregard this information."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Warning"}),(0,s.jsx)(n.td,{children:"Information that warns the user to proceed with caution. Warning emphasizes a course of action\u2019s potential downsides."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Danger"}),(0,s.jsx)(n.td,{children:"Information about imminent system damage, data loss, or a support-related issue if the user disregards this admonition. If available, offer information to avoid the problem in the future or state where to find more information."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"code-blocks",children:"Code blocks"}),"\n",(0,s.jsx)(n.p,{children:"Code blocks must indicate the programming language of the code snippet."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:'```js\nconsole.log("Hello, world!");\n```\n'})}),"\n",(0,s.jsx)(n.h3,{id:"commands",children:"Commands"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Commands as part of procedures must be inside code blocks with ",(0,s.jsx)(n.code,{children:"bash"}),' as the language type. This ensures users get a "copy to clipboard" button.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When needed, indicate the directory where users need to move before executing the command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"```bash\ncd ~/path/to/directory\nsudo somecommand\n```\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"common-solus-terms",children:"Common Solus terms"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Solus","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Prefer ",(0,s.jsx)(n.em,{children:"Solus"})," rather than ",(0,s.jsx)(n.em,{children:"Solus Project"}),". Don't use ",(0,s.jsx)(n.em,{children:"Solus OS"})," or ",(0,s.jsx)(n.em,{children:"Solus Linux"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The names of the different editions of Solus are:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Solus Budgie"}),"\n",(0,s.jsx)(n.li,{children:"Solus GNOME"}),"\n",(0,s.jsx)(n.li,{children:"Solus Plasma"}),"\n",(0,s.jsx)(n.li,{children:"Solus XFCE"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Repositories","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using terms such as ",(0,s.jsx)(n.em,{children:"repo"}),", or ",(0,s.jsx)(n.em,{children:"monorepo"}),", use the specific repository name instead."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages repository", instead of "The monorepo".'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Dev Tracker","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using the term ",(0,s.jsx)(n.em,{children:"Dev Tracker"}),"."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages issue tracker", instead of "The dev tracker"'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["eopkg","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're referring to the application or package, use \"",(0,s.jsx)(n.code,{children:"eopkg"}),'" with inline code formatting (see below)']}),"\n",(0,s.jsxs)(n.li,{children:["If you're referring to package files, use \"",(0,s.jsx)(n.code,{children:".eopkg"}),'" with inline code formatting, including the period but no wildcard']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"markdown-formatting",children:"Markdown formatting"}),"\n",(0,s.jsxs)(n.p,{children:["Write content using ",(0,s.jsx)(n.a,{href:"https://www.markdownguide.org/cheat-sheet/",children:"Markdown formatting"}),", use ",(0,s.jsx)(n.a,{href:"https://prettier.io/",children:"Prettier"})," to enforce consistent formatting."]}),"\n",(0,s.jsx)(n.h2,{id:"package-names",children:"Package names"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The name of packages in the Solus repository must use inline code formatting."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"To install `caddy`, use the Software Center or execute the following command:\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"When referring to the name of a product or project, use the name the authors use."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Examples: ",(0,s.jsx)(n.em,{children:"RetroArch"}),", and ",(0,s.jsx)(n.em,{children:"Code::Blocks"})]}),"\n",(0,s.jsx)(n.h3,{id:"spelling",children:"Spelling"}),"\n",(0,s.jsxs)(n.p,{children:["We prefer American spelling over British spelling. When in doubt about the spelling of a word, see the ",(0,s.jsx)(n.a,{href:"https://www.merriam-webster.com/",children:"Merriam-Webster dictionary"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8849],{83781:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var s=t(85893),i=t(11151);const r={title:"Solus Style Guide",summary:"Guidance for writing Solus content"},o="Solus style guide",l={id:"user/contributing/style",title:"Solus Style Guide",description:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content.",source:"@site/docs/user/contributing/style.md",sourceDirName:"user/contributing",slug:"/user/contributing/style",permalink:"/docs/user/contributing/style",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/style.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Solus Style Guide",summary:"Guidance for writing Solus content"},sidebar:"userSidebar",previous:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"},next:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"}},d={},a=[{value:"General writing style",id:"general-writing-style",level:2},{value:"Linux-specific terms",id:"linux-specific-terms",level:2},{value:"Specific guidance",id:"specific-guidance",level:2},{value:"Admonitions",id:"admonitions",level:3},{value:"Code blocks",id:"code-blocks",level:2},{value:"Commands",id:"commands",level:3},{value:"Common Solus terms",id:"common-solus-terms",level:3},{value:"Markdown formatting",id:"markdown-formatting",level:3},{value:"Package names",id:"package-names",level:2},{value:"Spelling",id:"spelling",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"solus-style-guide",children:"Solus style guide"})}),"\n",(0,s.jsx)(n.p,{children:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Existing help center topics might not follow our style guide yet."})}),"\n",(0,s.jsx)(n.h2,{id:"general-writing-style",children:"General writing style"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.a,{href:"https://developers.google.com/style",children:"Google developer documentation style guide"})," for general writing style, grammar, and formatting."]}),"\n",(0,s.jsx)(n.p,{children:"Some useful pages:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/text-formatting",children:"Text formatting summary"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/procedures",children:"Procedures"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/timeless-documentation",children:"Timeless documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/word-list",children:"Word list"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"linux-specific-terms",children:"Linux-specific terms"}),"\n",(0,s.jsxs)(n.p,{children:["If you are unsure of how to use a common Linux term, refer to the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#glossary-terms-conventions",children:"Glossary of terms and conventions"})," from the ",(0,s.jsx)(n.em,{children:"Red Hat supplementary style guide for documentation"})]}),"\n",(0,s.jsx)(n.h2,{id:"specific-guidance",children:"Specific guidance"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"In alphabetical order, not order of importance."})}),"\n",(0,s.jsx)(n.h3,{id:"admonitions",children:"Admonitions"}),"\n",(0,s.jsxs)(n.p,{children:["This section is based on the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#admonitions",children:"Red Hat supplementary style guide"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Admonitions should draw the reader\u2019s attention to certain information. Keep admonitions to a minimum, and avoid placing multiple admonitions close to one another. If multiple admonitions are necessary, restructure the information by moving the less-important statements into the flow of the main content. See the ",(0,s.jsx)(n.a,{href:"https://docusaurus.io/docs/markdown-features/admonitions",children:"Docusaurus documentation"})," to learn the correct syntax."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Note"}),(0,s.jsx)(n.td,{children:"Additional guidance or advice that improves product configuration, performance, or supportability"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Tip"}),(0,s.jsx)(n.td,{children:"Recommendations, suggestions, and alternative methods that might not be obvious. Tips are not essential to using the product."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Info"}),(0,s.jsx)(n.td,{children:"General information about the topic at hand that may be useful or relevant to user."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Important"}),(0,s.jsx)(n.td,{children:"Advisory information essential to the completion of a task or default configuration settings. Users must not disregard this information."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Warning"}),(0,s.jsx)(n.td,{children:"Information that warns the user to proceed with caution. Warning emphasizes a course of action\u2019s potential downsides."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Danger"}),(0,s.jsx)(n.td,{children:"Information about imminent system damage, data loss, or a support-related issue if the user disregards this admonition. If available, offer information to avoid the problem in the future or state where to find more information."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"code-blocks",children:"Code blocks"}),"\n",(0,s.jsx)(n.p,{children:"Code blocks must indicate the programming language of the code snippet."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:'```js\nconsole.log("Hello, world!");\n```\n'})}),"\n",(0,s.jsx)(n.h3,{id:"commands",children:"Commands"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Commands as part of procedures must be inside code blocks with ",(0,s.jsx)(n.code,{children:"bash"}),' as the language type. This ensures users get a "copy to clipboard" button.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When needed, indicate the directory where users need to move before executing the command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"```bash\ncd ~/path/to/directory\nsudo somecommand\n```\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"common-solus-terms",children:"Common Solus terms"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Solus","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Prefer ",(0,s.jsx)(n.em,{children:"Solus"})," rather than ",(0,s.jsx)(n.em,{children:"Solus Project"}),". Don't use ",(0,s.jsx)(n.em,{children:"Solus OS"})," or ",(0,s.jsx)(n.em,{children:"Solus Linux"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The names of the different editions of Solus are:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Solus Budgie"}),"\n",(0,s.jsx)(n.li,{children:"Solus GNOME"}),"\n",(0,s.jsx)(n.li,{children:"Solus Plasma"}),"\n",(0,s.jsx)(n.li,{children:"Solus XFCE"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Repositories","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using terms such as ",(0,s.jsx)(n.em,{children:"repo"}),", or ",(0,s.jsx)(n.em,{children:"monorepo"}),", use the specific repository name instead."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages repository", instead of "The monorepo".'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Dev Tracker","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using the term ",(0,s.jsx)(n.em,{children:"Dev Tracker"}),"."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages issue tracker", instead of "The dev tracker"'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["eopkg","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're referring to the application or package, use \"",(0,s.jsx)(n.code,{children:"eopkg"}),'" with inline code formatting (see below)']}),"\n",(0,s.jsxs)(n.li,{children:["If you're referring to package files, use \"",(0,s.jsx)(n.code,{children:".eopkg"}),'" with inline code formatting, including the period but no wildcard']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"markdown-formatting",children:"Markdown formatting"}),"\n",(0,s.jsxs)(n.p,{children:["Write content using ",(0,s.jsx)(n.a,{href:"https://www.markdownguide.org/cheat-sheet/",children:"Markdown formatting"}),", use ",(0,s.jsx)(n.a,{href:"https://prettier.io/",children:"Prettier"})," to enforce consistent formatting."]}),"\n",(0,s.jsx)(n.h2,{id:"package-names",children:"Package names"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The name of packages in the Solus repository must use inline code formatting."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"To install `caddy`, use the Software Center or execute the following command:\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"When referring to the name of a product or project, use the name the authors use."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Examples: ",(0,s.jsx)(n.em,{children:"RetroArch"}),", and ",(0,s.jsx)(n.em,{children:"Code::Blocks"})]}),"\n",(0,s.jsx)(n.h3,{id:"spelling",children:"Spelling"}),"\n",(0,s.jsxs)(n.p,{children:["We prefer American spelling over British spelling. When in doubt about the spelling of a word, see the ",(0,s.jsx)(n.a,{href:"https://www.merriam-webster.com/",children:"Merriam-Webster dictionary"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/6cfe09a0.de7c9bdf.js b/assets/js/6cfe09a0.ac033cb3.js
similarity index 98%
rename from assets/js/6cfe09a0.de7c9bdf.js
rename to assets/js/6cfe09a0.ac033cb3.js
index 84a33102c..9b3c9c9df 100644
--- a/assets/js/6cfe09a0.de7c9bdf.js
+++ b/assets/js/6cfe09a0.ac033cb3.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1174],{67189:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=s(85893),r=s(11151);const i={title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},o="TigerVNC",a={id:"user/software/networking/tigervnc",title:"TigerVNC",description:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet.",source:"@site/docs/user/software/networking/tigervnc.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/tigervnc",permalink:"/docs/user/software/networking/tigervnc",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/tigervnc.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},sidebar:"userSidebar",previous:{title:"Samba File Sharing",permalink:"/docs/user/software/networking/samba"},next:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Initial setup of vncserver",id:"initial-setup-of-vncserver",level:3},{value:"Configuration for your desktops",id:"configuration-for-your-desktops",level:3},{value:"Budgie",id:"budgie",level:3},{value:"GNOME",id:"gnome",level:3},{value:"MATE",id:"mate",level:3},{value:"Plasma",id:"plasma",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tigervnc",children:"TigerVNC"})}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet."}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC can be installed either from the Software Center or via terminal. The terminal command to run it is:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install tigervnc\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.h3,{id:"initial-setup-of-vncserver",children:"Initial setup of vncserver"}),"\n",(0,t.jsx)(n.p,{children:"For the initial setup of vncserver for TigerVNC you have to open a terminal and run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver\n"})}),"\n",(0,t.jsxs)(n.p,{children:["While this setup you will be asked for setting up a ",(0,t.jsx)(n.strong,{children:"password"})," and if you'd like to setup a ",(0,t.jsx)(n.strong,{children:"view-only mode"}),", please do it accordingly your desire."]}),"\n",(0,t.jsx)(n.p,{children:"After the initial setup you have to stop the vncserver process, for this please type inside the terminal"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver -kill :1\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configuration-for-your-desktops",children:"Configuration for your desktops"}),"\n",(0,t.jsxs)(n.p,{children:["Every Desktop needs a different Setup, you find the vncserver config under",(0,t.jsx)(n.code,{children:"$HOME/.vnc/xstartup"})," open the file with your desired editor and change bash script inside the file with the following information for your Desktop."]}),"\n",(0,t.jsx)(n.h3,{id:"budgie",children:"Budgie"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\ngnome-session --session=budgie-desktop &\nbudgie-wm &\nbudgie-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"gnome",children:"GNOME"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexport XKL_XMODMAP_DISABLE=1\n\ngnome-session &\ngnome-panel &\ngnome-settings-daemon &\nmetacity &\nnautilus &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"mate",children:"MATE"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\nmate-session &\nmate-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"plasma",children:"Plasma"}),"\n",(0,t.jsxs)(n.p,{children:["Plasma desktop is not supported at the moment. Please use the software ",(0,t.jsx)(n.code,{children:"x11vnc"})," for vncserver support on Plasma."]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>o});var t=s(67294);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1174],{67189:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=s(85893),r=s(11151);const i={title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},o="TigerVNC",a={id:"user/software/networking/tigervnc",title:"TigerVNC",description:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet.",source:"@site/docs/user/software/networking/tigervnc.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/tigervnc",permalink:"/docs/user/software/networking/tigervnc",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/tigervnc.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},sidebar:"userSidebar",previous:{title:"Samba File Sharing",permalink:"/docs/user/software/networking/samba"},next:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Initial setup of vncserver",id:"initial-setup-of-vncserver",level:3},{value:"Configuration for your desktops",id:"configuration-for-your-desktops",level:3},{value:"Budgie",id:"budgie",level:3},{value:"GNOME",id:"gnome",level:3},{value:"MATE",id:"mate",level:3},{value:"Plasma",id:"plasma",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tigervnc",children:"TigerVNC"})}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet."}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC can be installed either from the Software Center or via terminal. The terminal command to run it is:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install tigervnc\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.h3,{id:"initial-setup-of-vncserver",children:"Initial setup of vncserver"}),"\n",(0,t.jsx)(n.p,{children:"For the initial setup of vncserver for TigerVNC you have to open a terminal and run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver\n"})}),"\n",(0,t.jsxs)(n.p,{children:["While this setup you will be asked for setting up a ",(0,t.jsx)(n.strong,{children:"password"})," and if you'd like to setup a ",(0,t.jsx)(n.strong,{children:"view-only mode"}),", please do it accordingly your desire."]}),"\n",(0,t.jsx)(n.p,{children:"After the initial setup you have to stop the vncserver process, for this please type inside the terminal"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver -kill :1\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configuration-for-your-desktops",children:"Configuration for your desktops"}),"\n",(0,t.jsxs)(n.p,{children:["Every Desktop needs a different Setup, you find the vncserver config under",(0,t.jsx)(n.code,{children:"$HOME/.vnc/xstartup"})," open the file with your desired editor and change bash script inside the file with the following information for your Desktop."]}),"\n",(0,t.jsx)(n.h3,{id:"budgie",children:"Budgie"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\ngnome-session --session=budgie-desktop &\nbudgie-wm &\nbudgie-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"gnome",children:"GNOME"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexport XKL_XMODMAP_DISABLE=1\n\ngnome-session &\ngnome-panel &\ngnome-settings-daemon &\nmetacity &\nnautilus &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"mate",children:"MATE"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\nmate-session &\nmate-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"plasma",children:"Plasma"}),"\n",(0,t.jsxs)(n.p,{children:["Plasma desktop is not supported at the moment. Please use the software ",(0,t.jsx)(n.code,{children:"x11vnc"})," for vncserver support on Plasma."]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>o});var t=s(67294);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7071adf5.95872f78.js b/assets/js/7071adf5.8479f3f3.js
similarity index 99%
rename from assets/js/7071adf5.95872f78.js
rename to assets/js/7071adf5.8479f3f3.js
index 5dd740a9e..ee55fba0b 100644
--- a/assets/js/7071adf5.95872f78.js
+++ b/assets/js/7071adf5.8479f3f3.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4796],{31386:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const t={title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},a="Troubleshooting for Packagers",c={id:"packaging/troubleshooting-packaging",title:"Troubleshooting for Packagers",description:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms.",source:"@site/docs/packaging/troubleshooting-packaging.md",sourceDirName:"packaging",slug:"/packaging/troubleshooting-packaging",permalink:"/docs/packaging/troubleshooting-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/troubleshooting-packaging.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},sidebar:"packagingSidebar",previous:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"},next:{title:"Your First Package Update",permalink:"/docs/packaging/your-first-package-update"}},r={},l=[{value:"Asking for help",id:"asking-for-help",level:2},{value:"Common Issues",id:"common-issues",level:2},{value:""Error downloading https://github.com/project/blah/1.2.3.tar.gz: checksum mismatch"",id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",level:3},{value:""Failed to build packages err="Failed to fetch source https://github.com/project/blah.git#{commit ref here}, reason: exit status 1\\n"",id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",level:3},{value:""mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"",id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",level:3},{value:"Solbuild is eating up all my disk space",id:"solbuild-is-eating-up-all-my-disk-space",level:3},{value:"An old package using %configure
doesn't build",id:"an-old-package-using-configure-doesnt-build",level:3},{value:"Something is wrong with my solbuild profile",id:"something-is-wrong-with-my-solbuild-profile",level:3},{value:"Git commands fail and complain about package checks",id:"git-commands-fail-and-complain-about-package-checks",level:3}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"troubleshooting-for-packagers",children:"Troubleshooting for Packagers"})}),"\n",(0,i.jsx)(o.p,{children:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms."}),"\n",(0,i.jsx)(o.h2,{id:"asking-for-help",children:"Asking for help"}),"\n",(0,i.jsxs)(o.p,{children:["When you run into a problem that you don't know how to fix you should ask for help in the ",(0,i.jsx)(o.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Solus Packaging Matrix room"}),". But first you should send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file and ",(0,i.jsx)(o.code,{children:"solbuild"})," output to somewhere others can see it; we recommend you use ",(0,i.jsx)(o.a,{href:"https://gist.github.com/",children:"GitHub Gists"}),". These commands assume you have set up ",(0,i.jsx)(o.code,{children:"github-cli"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["If you would rather not use Gists, use a pastebin site like ",(0,i.jsx)(o.a,{href:"https://bpa.st/",children:"bpaste"})]}),"\n",(0,i.jsxs)(o.p,{children:["Send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file in the current directory to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"cat package.yml | gh gist create --public\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& gh gist create --public\n"})}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsxs)(o.em,{children:["Note: the usual ",(0,i.jsx)(o.code,{children:"solbuild"})," output will not be shown when this command is running, and it will take at least a few seconds"]})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a new ",(0,i.jsx)(o.code,{children:"output.txt"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& tee output.txt\n"})}),"\n",(0,i.jsx)(o.h2,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsxs)(o.h3,{id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",children:['"Error downloading ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah/1.2.3.tar.gz",children:"https://github.com/project/blah/1.2.3.tar.gz"}),': checksum mismatch"']}),"\n",(0,i.jsxs)(o.p,{children:["Your ",(0,i.jsx)(o.code,{children:"source"})," tarball does not match the checksum next to it in ",(0,i.jsx)(o.code,{children:"package.yml"}),". You should use ",(0,i.jsx)(o.code,{children:"go-task new"})," or ",(0,i.jsx)(o.code,{children:"go-task update"})," to write the correct checksum automatically."]}),"\n",(0,i.jsxs)(o.h3,{id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",children:['"Failed to build packages err="Failed to fetch source ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah.git#%7Bcommit",children:"https://github.com/project/blah.git#{commit"}),' ref here}, reason: exit status 1\\n"']}),"\n",(0,i.jsxs)(o.p,{children:["If your build fails immediately this message, and you are using a ",(0,i.jsx)(o.strong,{children:"git source"}),", you should clear the ",(0,i.jsx)(o.code,{children:"solbuild"})," git sources cache:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo rm -rf /var/lib/solbuild/sources/git\n"})}),"\n",(0,i.jsx)(o.h3,{id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",children:'"mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"'}),"\n",(0,i.jsxs)(o.p,{children:["If you interrupt a build sometimes ",(0,i.jsx)(o.code,{children:"solbuild"})," does not unmount cleanly, and you will need to unmount manually:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo umount -f /var/lib/solbuild/roots/unstable-x86_64\n"})}),"\n",(0,i.jsx)(o.h3,{id:"solbuild-is-eating-up-all-my-disk-space",children:"Solbuild is eating up all my disk space"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"solbuild"})," cache at ",(0,i.jsx)(o.code,{children:"/var/cache/solbuild"}),' can grow to tens of gigabytes easily. Recover that disk space by running the "delete cache (',(0,i.jsx)(o.code,{children:"dc"}),')" command:']}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo solbuild dc\n"})}),"\n",(0,i.jsxs)(o.h3,{id:"an-old-package-using-configure-doesnt-build",children:["An old package using ",(0,i.jsx)(o.code,{children:"%configure"})," doesn't build"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Replace ",(0,i.jsx)(o.code,{children:"%configure"})," with ",(0,i.jsx)(o.code,{children:"%reconfigure"})," and try again."]}),"\n",(0,i.jsxs)(o.li,{children:["If ",(0,i.jsx)(o.code,{children:"%reconfigure"})," produces the error ",(0,i.jsx)(o.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),", then use the new ",(0,i.jsx)(o.code,{children:"%configure_no_runstatedir"})," macro"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"something-is-wrong-with-my-solbuild-profile",children:"Something is wrong with my solbuild profile"}),"\n",(0,i.jsxs)(o.p,{children:["Try running ",(0,i.jsx)(o.code,{children:"go-task solbuild-reset"}),". This will delete the solbuild cache and profile, then download and initialize a fresh copy of the default unstable profile."]}),"\n",(0,i.jsx)(o.h3,{id:"git-commands-fail-and-complain-about-package-checks",children:"Git commands fail and complain about package checks"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"git commit --amend\nWRN packages/q/qqwing/package.yml:1: Package release is not incremented by 1\nERR packages/q/qqwing/pspec_x86_64.xml:1: Package release is not incremented by 1\nPackage checks failed: /home/user/solus-packages/common/CI/package_checks.py packages/q/qqwing/package.yml packages/q/qqwing/pspec_x86_64.xml\n"})}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Solus uses pre-commit hooks to check for simple errors. Right now, certain ",(0,i.jsx)(o.code,{children:"git"})," commands can fail, particularly ",(0,i.jsx)(o.code,{children:"git commit --amend"})," and ",(0,i.jsx)(o.code,{children:"git commit --fixup"})]}),"\n",(0,i.jsxs)(o.li,{children:["You can bypass the pre-commit hooks by adding the ",(0,i.jsx)(o.code,{children:"no-verify"})," option, for example: ",(0,i.jsx)(o.code,{children:"git commit --amend --no-verify"}),". Checks will still be run by GitHub after a Pull Request is created."]}),"\n"]})]})}function u(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,s)=>{s.d(o,{Z:()=>c,a:()=>a});var i=s(67294);const n={},t=i.createContext(n);function a(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4796],{31386:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const t={title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},a="Troubleshooting for Packagers",c={id:"packaging/troubleshooting-packaging",title:"Troubleshooting for Packagers",description:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms.",source:"@site/docs/packaging/troubleshooting-packaging.md",sourceDirName:"packaging",slug:"/packaging/troubleshooting-packaging",permalink:"/docs/packaging/troubleshooting-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/troubleshooting-packaging.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},sidebar:"packagingSidebar",previous:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"},next:{title:"Your First Package Update",permalink:"/docs/packaging/your-first-package-update"}},r={},l=[{value:"Asking for help",id:"asking-for-help",level:2},{value:"Common Issues",id:"common-issues",level:2},{value:""Error downloading https://github.com/project/blah/1.2.3.tar.gz: checksum mismatch"",id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",level:3},{value:""Failed to build packages err="Failed to fetch source https://github.com/project/blah.git#{commit ref here}, reason: exit status 1\\n"",id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",level:3},{value:""mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"",id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",level:3},{value:"Solbuild is eating up all my disk space",id:"solbuild-is-eating-up-all-my-disk-space",level:3},{value:"An old package using %configure
doesn't build",id:"an-old-package-using-configure-doesnt-build",level:3},{value:"Something is wrong with my solbuild profile",id:"something-is-wrong-with-my-solbuild-profile",level:3},{value:"Git commands fail and complain about package checks",id:"git-commands-fail-and-complain-about-package-checks",level:3}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"troubleshooting-for-packagers",children:"Troubleshooting for Packagers"})}),"\n",(0,i.jsx)(o.p,{children:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms."}),"\n",(0,i.jsx)(o.h2,{id:"asking-for-help",children:"Asking for help"}),"\n",(0,i.jsxs)(o.p,{children:["When you run into a problem that you don't know how to fix you should ask for help in the ",(0,i.jsx)(o.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Solus Packaging Matrix room"}),". But first you should send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file and ",(0,i.jsx)(o.code,{children:"solbuild"})," output to somewhere others can see it; we recommend you use ",(0,i.jsx)(o.a,{href:"https://gist.github.com/",children:"GitHub Gists"}),". These commands assume you have set up ",(0,i.jsx)(o.code,{children:"github-cli"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["If you would rather not use Gists, use a pastebin site like ",(0,i.jsx)(o.a,{href:"https://bpa.st/",children:"bpaste"})]}),"\n",(0,i.jsxs)(o.p,{children:["Send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file in the current directory to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"cat package.yml | gh gist create --public\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& gh gist create --public\n"})}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsxs)(o.em,{children:["Note: the usual ",(0,i.jsx)(o.code,{children:"solbuild"})," output will not be shown when this command is running, and it will take at least a few seconds"]})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a new ",(0,i.jsx)(o.code,{children:"output.txt"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& tee output.txt\n"})}),"\n",(0,i.jsx)(o.h2,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsxs)(o.h3,{id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",children:['"Error downloading ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah/1.2.3.tar.gz",children:"https://github.com/project/blah/1.2.3.tar.gz"}),': checksum mismatch"']}),"\n",(0,i.jsxs)(o.p,{children:["Your ",(0,i.jsx)(o.code,{children:"source"})," tarball does not match the checksum next to it in ",(0,i.jsx)(o.code,{children:"package.yml"}),". You should use ",(0,i.jsx)(o.code,{children:"go-task new"})," or ",(0,i.jsx)(o.code,{children:"go-task update"})," to write the correct checksum automatically."]}),"\n",(0,i.jsxs)(o.h3,{id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",children:['"Failed to build packages err="Failed to fetch source ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah.git#%7Bcommit",children:"https://github.com/project/blah.git#{commit"}),' ref here}, reason: exit status 1\\n"']}),"\n",(0,i.jsxs)(o.p,{children:["If your build fails immediately this message, and you are using a ",(0,i.jsx)(o.strong,{children:"git source"}),", you should clear the ",(0,i.jsx)(o.code,{children:"solbuild"})," git sources cache:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo rm -rf /var/lib/solbuild/sources/git\n"})}),"\n",(0,i.jsx)(o.h3,{id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",children:'"mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"'}),"\n",(0,i.jsxs)(o.p,{children:["If you interrupt a build sometimes ",(0,i.jsx)(o.code,{children:"solbuild"})," does not unmount cleanly, and you will need to unmount manually:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo umount -f /var/lib/solbuild/roots/unstable-x86_64\n"})}),"\n",(0,i.jsx)(o.h3,{id:"solbuild-is-eating-up-all-my-disk-space",children:"Solbuild is eating up all my disk space"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"solbuild"})," cache at ",(0,i.jsx)(o.code,{children:"/var/cache/solbuild"}),' can grow to tens of gigabytes easily. Recover that disk space by running the "delete cache (',(0,i.jsx)(o.code,{children:"dc"}),')" command:']}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo solbuild dc\n"})}),"\n",(0,i.jsxs)(o.h3,{id:"an-old-package-using-configure-doesnt-build",children:["An old package using ",(0,i.jsx)(o.code,{children:"%configure"})," doesn't build"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Replace ",(0,i.jsx)(o.code,{children:"%configure"})," with ",(0,i.jsx)(o.code,{children:"%reconfigure"})," and try again."]}),"\n",(0,i.jsxs)(o.li,{children:["If ",(0,i.jsx)(o.code,{children:"%reconfigure"})," produces the error ",(0,i.jsx)(o.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),", then use the new ",(0,i.jsx)(o.code,{children:"%configure_no_runstatedir"})," macro"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"something-is-wrong-with-my-solbuild-profile",children:"Something is wrong with my solbuild profile"}),"\n",(0,i.jsxs)(o.p,{children:["Try running ",(0,i.jsx)(o.code,{children:"go-task solbuild-reset"}),". This will delete the solbuild cache and profile, then download and initialize a fresh copy of the default unstable profile."]}),"\n",(0,i.jsx)(o.h3,{id:"git-commands-fail-and-complain-about-package-checks",children:"Git commands fail and complain about package checks"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"git commit --amend\nWRN packages/q/qqwing/package.yml:1: Package release is not incremented by 1\nERR packages/q/qqwing/pspec_x86_64.xml:1: Package release is not incremented by 1\nPackage checks failed: /home/user/solus-packages/common/CI/package_checks.py packages/q/qqwing/package.yml packages/q/qqwing/pspec_x86_64.xml\n"})}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Solus uses pre-commit hooks to check for simple errors. Right now, certain ",(0,i.jsx)(o.code,{children:"git"})," commands can fail, particularly ",(0,i.jsx)(o.code,{children:"git commit --amend"})," and ",(0,i.jsx)(o.code,{children:"git commit --fixup"})]}),"\n",(0,i.jsxs)(o.li,{children:["You can bypass the pre-commit hooks by adding the ",(0,i.jsx)(o.code,{children:"no-verify"})," option, for example: ",(0,i.jsx)(o.code,{children:"git commit --amend --no-verify"}),". Checks will still be run by GitHub after a Pull Request is created."]}),"\n"]})]})}function u(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,s)=>{s.d(o,{Z:()=>c,a:()=>a});var i=s(67294);const n={},t=i.createContext(n);function a(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/72054e31.251cbe36.js b/assets/js/72054e31.251cbe36.js
deleted file mode 100644
index 095e101c4..000000000
--- a/assets/js/72054e31.251cbe36.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7135],{83888:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const l={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},r="Cual es la causa",a={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},o={authorsImageUrls:[void 0]},d=[{value:"Let's Start Obvious",id:"lets-start-obvious",level:2},{value:"PGO is great, except, when it isn't.",id:"pgo-is-great-except-when-it-isnt",level:2},{value:"256 Vector Units go brrrrrr...",id:"256-vector-units-go-brrrrrr",level:2},{value:"Something about perf
to the rescue",id:"something-about-perf-to-the-rescue",level:2},{value:"Choosing Wisely",id:"choosing-wisely",level:2},{value:"Adjusting the Benchmark",id:"adjusting-the-benchmark",level:2},{value:"Partial Profiling",id:"partial-profiling",level:3},{value:"I Zee a Purty lil' Package",id:"i-zee-a-purty-lil-package",level:2},{value:"Squeezing more from zlib-ng",id:"squeezing-more-from-zlib-ng",level:2}];function c(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]}),"\n",(0,s.jsx)(i.p,{children:"Linux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements."}),"\n",(0,s.jsxs)(i.p,{children:["Part of the problem is, a packager's time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for ",(0,s.jsx)(i.em,{children:"all"})," packages, such as enabling ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Interprocedural_optimization",children:"LTO"})," by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Profile-guided_optimization",children:"PGO"})," without too much faffing around on a ",(0,s.jsx)(i.em,{children:"targeted"})," package."]}),"\n",(0,s.jsx)(i.p,{children:"The benefits of such an approach are:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Can target the performance of a specific package to benefit ",(0,s.jsx)(i.em,{children:"all"})," users"]}),"\n",(0,s.jsx)(i.li,{children:"A compiler optimization may improve one package, but may not apply globally to all packages."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The downsides are such:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Requires additional packager time to benchmark and experiment with different optimization strategies."}),"\n",(0,s.jsxs)(i.li,{children:["Requires the packager to ",(0,s.jsx)(i.em,{children:"choose"})," and invest time into improving performance of a package."]}),"\n",(0,s.jsx)(i.li,{children:"Requires the packager to find an appropriate benchmark to test the package against."}),"\n",(0,s.jsx)(i.li,{children:"Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck."}),"\n"]}),"\n",(0,s.jsx)(i.h1,{id:"optimization-techniques-available",children:"Optimization Techniques Available"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["speed:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["As simple as it gets really, build a package with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags deemed worthy to be included as part of the ",(0,s.jsx)(i.code,{children:"speed"})," flags. The main drawback of this is that ",(0,s.jsx)(i.code,{children:"-O3"})," is not guaranteed to produce faster results than building with ",(0,s.jsx)(i.code,{children:"-O2"})," and typically will produce bigger binaries. The days of ",(0,s.jsx)(i.code,{children:"-O3"})," outright breaking your program in weird unexpected ways is largely behind us."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["LTO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Compared to some other distributions ",(0,s.jsx)(i.code,{children:"-flto"})," is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Clang:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Not strictly an optimization, but, building a package with ",(0,s.jsx)(i.code,{children:"clang"})," instead of ",(0,s.jsx)(i.code,{children:"gcc"})," and ",(0,s.jsx)(i.code,{children:"ld.ldd"})," to link instead of the infamous ",(0,s.jsx)(i.code,{children:"ld.bfd"})," may provide a faster package out of the box. You'll have to be careful of subtle ABI differences if building with ",(0,s.jsx)(i.code,{children:"clang"}),". If in doubt, and, ",(0,s.jsx)(i.code,{children:"clang"})," is the obvious choice, perform safety rebuilds on all reverse dependencies of the package."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["PGO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["BOLT:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['Binary optimization and layout tool. You can think of this as "post-link PGO" where you instrument a binary with ',(0,s.jsx)(i.code,{children:"bolt"})," to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Regardless, that's enough word spaghetti, let's look at the process to actually optimize a package."}),"\n",(0,s.jsx)(i.h1,{id:"optimizing-a-package",children:"Optimizing a Package"}),"\n",(0,s.jsxs)(i.p,{children:["Right, to begin with we'll have to start on choosing an actual package to benchmark and optimize. I've heard the ",(0,s.jsx)(i.code,{children:".webp"})," file format is becoming increasingly common on the web, slowly replacing ",(0,s.jsx)(i.code,{children:".png"})," and ",(0,s.jsx)(i.code,{children:".jpg"})," file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for ",(0,s.jsx)(i.code,{children:".webp"})," files would benefit any user using a web browser casually browsing the web."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's have a look at the ",(0,s.jsx)(i.code,{children:"package.yml"})," build recipe for ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : libwebp\nversion : 1.3.2\nrelease : 25\nsource :\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\nhomepage : https://developers.google.com/speed/webp/\nlicense : BSD-3-Clause\ncomponent : multimedia.codecs\nsummary : A new image format for the web\ndescription: |\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\nemul32 : yes\npatterns :\n - devel : /usr/share/man\nbuilddeps :\n - pkgconfig32(glu)\n - pkgconfig32(glut)\n - pkgconfig32(libpng)\n - pkgconfig32(libtiff-4)\n - pkgconfig32(libturbojpeg)\n - pkgconfig32(zlib)\n - giflib-devel\nsetup : |\n %reconfigure --disable-static --enable-everything\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, looks to be a quite simple affair. A simple configure, make, make install as well as ",(0,s.jsx)(i.code,{children:"emul32"})," being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We'll begin by looking at the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file which lists all the files produced from the ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe as well as some metadata."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-xml",children:' perf
to the rescue",id:"something-about-perf-to-the-rescue",level:2},{value:"Choosing Wisely",id:"choosing-wisely",level:2},{value:"Adjusting the Benchmark",id:"adjusting-the-benchmark",level:2},{value:"Partial Profiling",id:"partial-profiling",level:3},{value:"I Zee a Purty lil' Package",id:"i-zee-a-purty-lil-package",level:2},{value:"Squeezing more from zlib-ng",id:"squeezing-more-from-zlib-ng",level:2}];function c(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]}),"\n",(0,s.jsx)(i.p,{children:"Linux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements."}),"\n",(0,s.jsxs)(i.p,{children:["Part of the problem is, a packager's time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for ",(0,s.jsx)(i.em,{children:"all"})," packages, such as enabling ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Interprocedural_optimization",children:"LTO"})," by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Profile-guided_optimization",children:"PGO"})," without too much faffing around on a ",(0,s.jsx)(i.em,{children:"targeted"})," package."]}),"\n",(0,s.jsx)(i.p,{children:"The benefits of such an approach are:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Can target the performance of a specific package to benefit ",(0,s.jsx)(i.em,{children:"all"})," users"]}),"\n",(0,s.jsx)(i.li,{children:"A compiler optimization may improve one package, but may not apply globally to all packages."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The downsides are such:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Requires additional packager time to benchmark and experiment with different optimization strategies."}),"\n",(0,s.jsxs)(i.li,{children:["Requires the packager to ",(0,s.jsx)(i.em,{children:"choose"})," and invest time into improving performance of a package."]}),"\n",(0,s.jsx)(i.li,{children:"Requires the packager to find an appropriate benchmark to test the package against."}),"\n",(0,s.jsx)(i.li,{children:"Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck."}),"\n"]}),"\n",(0,s.jsx)(i.h1,{id:"optimization-techniques-available",children:"Optimization Techniques Available"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["speed:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["As simple as it gets really, build a package with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags deemed worthy to be included as part of the ",(0,s.jsx)(i.code,{children:"speed"})," flags. The main drawback of this is that ",(0,s.jsx)(i.code,{children:"-O3"})," is not guaranteed to produce faster results than building with ",(0,s.jsx)(i.code,{children:"-O2"})," and typically will produce bigger binaries. The days of ",(0,s.jsx)(i.code,{children:"-O3"})," outright breaking your program in weird unexpected ways is largely behind us."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["LTO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Compared to some other distributions ",(0,s.jsx)(i.code,{children:"-flto"})," is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Clang:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Not strictly an optimization, but, building a package with ",(0,s.jsx)(i.code,{children:"clang"})," instead of ",(0,s.jsx)(i.code,{children:"gcc"})," and ",(0,s.jsx)(i.code,{children:"ld.ldd"})," to link instead of the infamous ",(0,s.jsx)(i.code,{children:"ld.bfd"})," may provide a faster package out of the box. You'll have to be careful of subtle ABI differences if building with ",(0,s.jsx)(i.code,{children:"clang"}),". If in doubt, and, ",(0,s.jsx)(i.code,{children:"clang"})," is the obvious choice, perform safety rebuilds on all reverse dependencies of the package."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["PGO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["BOLT:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['Binary optimization and layout tool. You can think of this as "post-link PGO" where you instrument a binary with ',(0,s.jsx)(i.code,{children:"bolt"})," to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Regardless, that's enough word spaghetti, let's look at the process to actually optimize a package."}),"\n",(0,s.jsx)(i.h1,{id:"optimizing-a-package",children:"Optimizing a Package"}),"\n",(0,s.jsxs)(i.p,{children:["Right, to begin with we'll have to start on choosing an actual package to benchmark and optimize. I've heard the ",(0,s.jsx)(i.code,{children:".webp"})," file format is becoming increasingly common on the web, slowly replacing ",(0,s.jsx)(i.code,{children:".png"})," and ",(0,s.jsx)(i.code,{children:".jpg"})," file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for ",(0,s.jsx)(i.code,{children:".webp"})," files would benefit any user using a web browser casually browsing the web."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's have a look at the ",(0,s.jsx)(i.code,{children:"package.yml"})," build recipe for ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : libwebp\nversion : 1.3.2\nrelease : 25\nsource :\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\nhomepage : https://developers.google.com/speed/webp/\nlicense : BSD-3-Clause\ncomponent : multimedia.codecs\nsummary : A new image format for the web\ndescription: |\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\nemul32 : yes\npatterns :\n - devel : /usr/share/man\nbuilddeps :\n - pkgconfig32(glu)\n - pkgconfig32(glut)\n - pkgconfig32(libpng)\n - pkgconfig32(libtiff-4)\n - pkgconfig32(libturbojpeg)\n - pkgconfig32(zlib)\n - giflib-devel\nsetup : |\n %reconfigure --disable-static --enable-everything\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, looks to be a quite simple affair. A simple configure, make, make install as well as ",(0,s.jsx)(i.code,{children:"emul32"})," being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We'll begin by looking at the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file which lists all the files produced from the ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe as well as some metadata."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-xml",children:' .eopkg
files to the local repository",id:"copying-eopkg-files-to-the-local-repository",level:3},{value:"Listing locally built eopkg files",id:"listing-locally-built-eopkg-files",level:3},{value:"Using the local repository to build a package",id:"using-the-local-repository-to-build-a-package",level:3},{value:"A streamlined local repository workflow for stack updates",id:"a-streamlined-local-repository-workflow-for-stack-updates",level:3},{value:"Best practices when working with a solbuild local repository",id:"best-practices-when-working-with-a-solbuild-local-repository",level:3},{value:"Installing packages from the local repository index",id:"installing-packages-from-the-local-repository-index",level:2},{value:"Creating or updating the local repository index",id:"creating-or-updating-the-local-repository-index",level:3},{value:"Package resolution priority in eopkg",id:"package-resolution-priority-in-eopkg",level:3},{value:"Adding the local repository index to the eopkg repository database",id:"adding-the-local-repository-index-to-the-eopkg-repository-database",level:3},{value:"Disabling the local solbuild repository in eopkg",id:"disabling-the-local-solbuild-repository-in-eopkg",level:4},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"packaging-using-a-local-repository",children:"Packaging using a local repository"})}),"\n",(0,i.jsxs)(o.p,{children:["This guide walks you through the steps necessary to tell ",(0,i.jsx)(o.code,{children:"solbuild"})," how to use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," files that are not yet in the Solus repository."]}),"\n",(0,i.jsx)(o.admonition,{type:"note",children:(0,i.jsxs)(o.p,{children:["It is not necessary to use a local repository to test most package submissions. The easier and recommended way is to install the ",(0,i.jsx)(o.code,{children:".eopkg"})," files created when a package is built. This procedure is intended for use with stack upgrades, rebuilds, or new packages that need new dependencies that are not yet in the repository."]})}),"\n",(0,i.jsxs)(o.p,{children:["We assume you have worked through the ",(0,i.jsx)(o.a,{href:"/docs/packaging",children:"packaging"})," material for creating a package with ",(0,i.jsx)(o.code,{children:"solbuild"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"install-the-local-profile",children:"Install the local profile"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install solbuild-config-local-unstable\n"})}),"\n",(0,i.jsxs)(o.p,{children:["You will also need to ensure that your repository is fully up to date. See ",(0,i.jsx)(o.a,{href:"/docs/packaging/update-dev-environment",children:"Update Your Development Environment"})]}),"\n",(0,i.jsx)(o.h2,{id:"using-the-local-repository",children:"Using the local repository"}),"\n",(0,i.jsxs)(o.p,{children:["The local repository index and any local eopkg files are stored in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local/"})]}),"\n",(0,i.jsxs)(o.h3,{id:"copying-eopkg-files-to-the-local-repository",children:["Copying ",(0,i.jsx)(o.code,{children:".eopkg"})," files to the local repository"]}),"\n",(0,i.jsxs)(o.p,{children:["To use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," package files as dependencies for another package, you must copy the regular package files, and any accompanying ",(0,i.jsx)(o.code,{children:"-devel"})," package files to the ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"})," local repository directory."]}),"\n",(0,i.jsxs)(o.p,{children:["For example, building the package ",(0,i.jsx)(o.code,{children:"libcmis"})," produces the packages ",(0,i.jsx)(o.code,{children:"libcmis"})," and ",(0,i.jsx)(o.code,{children:"libcmis-devel"}),". Both should be copied to the local repository to build other packages against ",(0,i.jsx)(o.code,{children:"libcmis"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To copy all ",(0,i.jsx)(o.code,{children:".eopkg"})," files within a directory to the local repository, use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo cp -v *.eopkg /var/lib/solbuild/local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"listing-locally-built-eopkg-files",children:"Listing locally built eopkg files"}),"\n",(0,i.jsx)(o.p,{children:"Use this to list all index and eopkg files in the local repository:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task list-local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"using-the-local-repository-to-build-a-package",children:"Using the local repository to build a package"}),"\n",(0,i.jsxs)(o.p,{children:["With the ",(0,i.jsx)(o.code,{children:".eopkg"})," files now present in the local repository, you can use them to build a package by running ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", rather than just ",(0,i.jsx)(o.code,{children:"go-task"}),", and ",(0,i.jsx)(o.code,{children:"solbuild"})," will prefer your packages over packages found in the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["Every time you run ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", all ",(0,i.jsx)(o.code,{children:".eopkg"})," files in the local repository will be re-indexed."]}),"\n",(0,i.jsx)(o.h3,{id:"a-streamlined-local-repository-workflow-for-stack-updates",children:"A streamlined local repository workflow for stack updates"}),"\n",(0,i.jsx)(o.p,{children:"If you know ahead of time that you are going to need to put the package files from the current build into the local repository as dependencies for subsequent builds, you can use:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localcp\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," task will:"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Build the current package against any existing packages in your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Copy the newly built package files to your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Re-index your local repository."}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," workflow can be very convenient when you are doing stack updates."]}),"\n",(0,i.jsx)(o.h3,{id:"best-practices-when-working-with-a-solbuild-local-repository",children:"Best practices when working with a solbuild local repository"}),"\n",(0,i.jsx)(o.p,{children:"There are some important things to know when working with local repositories, as they may lead to issues later on."}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"solbuild"})," will use your version of a package from the local repository regardless of whether there's a higher release in the Solus repository. Therefore:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only use the ",(0,i.jsx)(o.code,{children:"build-local"})," or ",(0,i.jsx)(o.code,{children:"build-localcp"})," tasks when required."]}),"\n",(0,i.jsxs)(o.li,{children:["Old packages in the local repository can be removed with the ",(0,i.jsx)(o.code,{children:"clean-local"})," task:","\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task clean-local\n"})}),"\n","Note that the ",(0,i.jsx)(o.code,{children:"clean-local"})," task will automatically re-index the (now empty) local repository."]}),"\n",(0,i.jsxs)(o.li,{children:["If a package is already installed in the ",(0,i.jsx)(o.code,{children:"solbuild"})," image, the release number of the updated version must be higher for it to be installed and used as a dependency at build time."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"installing-packages-from-the-local-repository-index",children:"Installing packages from the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," supports resolving packages from more than one repository. This can be used to configure ",(0,i.jsx)(o.code,{children:"eopkg"})," to prefer installing local repository packages over packages from the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["This requires an existing local repository index. If you have used the command ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", then an index was created automatically. Otherwise, you must create one."]}),"\n",(0,i.jsx)(o.h3,{id:"creating-or-updating-the-local-repository-index",children:"Creating or updating the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:["To generate or refresh the ",(0,i.jsx)(o.code,{children:"eopkg"})," index in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"}),", use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Or, if you have our ",(0,i.jsx)(o.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," set up, you get the same result by running:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"localrepo_reindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Keep in mind that the index needs to be refreshed whenever you add or remove locally built packages to your local repository. Otherwise, ",(0,i.jsx)(o.code,{children:"eopkg"})," won't know that new packages are available or have been removed from the local repository."]}),"\n",(0,i.jsx)(o.h3,{id:"package-resolution-priority-in-eopkg",children:"Package resolution priority in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," will always prefer packages from the topmost repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["In other words, if a package exists both in the local repository and the Solus repository, ",(0,i.jsx)(o.code,{children:"eopkg"})," will only consider the package from the first repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"})," ",(0,i.jsx)(o.em,{children:"regardless of its release number"}),"."]}),"\n",(0,i.jsx)(o.h3,{id:"adding-the-local-repository-index-to-the-eopkg-repository-database",children:"Adding the local repository index to the eopkg repository database"}),"\n",(0,i.jsxs)(o.p,{children:["The easiest way to add the local repository index to the list of repositories known to ",(0,i.jsx)(o.code,{children:"eopkg"}),", in the correct order, is to add the local repository and then ",(0,i.jsx)(o.em,{children:"re-add"})," the official Solus repository:"]}),"\n",(0,i.jsxs)(o.ol,{children:["\n",(0,i.jsxs)(o.li,{children:["First, let's list the repositories currently known to ",(0,i.jsx)(o.code,{children:"eopkg"})," with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),". This should produce output similar to:"]}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"Solus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"2",children:["\n",(0,i.jsx)(o.li,{children:"Now the repositories need to be added to account for the desired dependency resolution order:"}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nsudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.p,{children:"This should yield output similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nRepo Local added to system.\nUpdating repository: Local\nPackage database updated.\n$ sudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\nRepo already present with name Solus and same URL. Removing first.\nRepo Solus added to system.\nUpdating repository: Solus\neopkg-index.xml.xz.sha1sum (40.0 B)100% 765.61 KB/s [00:00:00] [complete]\neopkg-index.xml.xz (2.1 MB)100% 914.38 KB/s [00:00:01] [complete]\nPackage database updated.\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"3",children:["\n",(0,i.jsxs)(o.li,{children:["Check that the dependency resolution order is correct so that packages from the local ",(0,i.jsx)(o.code,{children:"solbuild"})," repository are preferred over the upstream Solus repository."]}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg lr"})," should yield output similar to:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h4,{id:"disabling-the-local-solbuild-repository-in-eopkg",children:"Disabling the local solbuild repository in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:['To reset the system to use only packages from the official Solus repository, disable the "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository using the command ",(0,i.jsx)(o.code,{children:"sudo eopkg disable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"The output should look similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg disable-repo Local\n$ sudo eopkg lr\nLocal [inactive]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.p,{children:['The "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository can be re-enabled with ",(0,i.jsx)(o.code,{children:"sudo eopkg enable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg enable-repo Local\n$ sudo eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,i.jsx)(o.p,{children:"Congratulations on making it this far! Your system should now be ready for convenient deployment and testing of locally built packages."})]})}function p(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,l)=>{l.d(o,{Z:()=>a,a:()=>r});var i=l(67294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8575],{5734:(e,o,l)=>{l.r(o),l.d(o,{assets:()=>t,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=l(85893),s=l(11151);const n={title:"Local Repository",summary:"Packaging using a local repository"},r="Packaging using a local repository",a={id:"packaging/advanced-config/local-repository",title:"Local Repository",description:"This guide walks you through the steps necessary to tell solbuild how to use your locally built .eopkg files that are not yet in the Solus repository.",source:"@site/docs/packaging/advanced-config/local-repository.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/local-repository",permalink:"/docs/packaging/advanced-config/local-repository",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/local-repository.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Local Repository",summary:"Packaging using a local repository"},sidebar:"packagingSidebar",previous:{title:"Eopkg Configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration"},next:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"}},t={},c=[{value:"Install the local profile",id:"install-the-local-profile",level:2},{value:"Using the local repository",id:"using-the-local-repository",level:2},{value:"Copying .eopkg
files to the local repository",id:"copying-eopkg-files-to-the-local-repository",level:3},{value:"Listing locally built eopkg files",id:"listing-locally-built-eopkg-files",level:3},{value:"Using the local repository to build a package",id:"using-the-local-repository-to-build-a-package",level:3},{value:"A streamlined local repository workflow for stack updates",id:"a-streamlined-local-repository-workflow-for-stack-updates",level:3},{value:"Best practices when working with a solbuild local repository",id:"best-practices-when-working-with-a-solbuild-local-repository",level:3},{value:"Installing packages from the local repository index",id:"installing-packages-from-the-local-repository-index",level:2},{value:"Creating or updating the local repository index",id:"creating-or-updating-the-local-repository-index",level:3},{value:"Package resolution priority in eopkg",id:"package-resolution-priority-in-eopkg",level:3},{value:"Adding the local repository index to the eopkg repository database",id:"adding-the-local-repository-index-to-the-eopkg-repository-database",level:3},{value:"Disabling the local solbuild repository in eopkg",id:"disabling-the-local-solbuild-repository-in-eopkg",level:4},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"packaging-using-a-local-repository",children:"Packaging using a local repository"})}),"\n",(0,i.jsxs)(o.p,{children:["This guide walks you through the steps necessary to tell ",(0,i.jsx)(o.code,{children:"solbuild"})," how to use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," files that are not yet in the Solus repository."]}),"\n",(0,i.jsx)(o.admonition,{type:"note",children:(0,i.jsxs)(o.p,{children:["It is not necessary to use a local repository to test most package submissions. The easier and recommended way is to install the ",(0,i.jsx)(o.code,{children:".eopkg"})," files created when a package is built. This procedure is intended for use with stack upgrades, rebuilds, or new packages that need new dependencies that are not yet in the repository."]})}),"\n",(0,i.jsxs)(o.p,{children:["We assume you have worked through the ",(0,i.jsx)(o.a,{href:"/docs/packaging",children:"packaging"})," material for creating a package with ",(0,i.jsx)(o.code,{children:"solbuild"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"install-the-local-profile",children:"Install the local profile"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install solbuild-config-local-unstable\n"})}),"\n",(0,i.jsxs)(o.p,{children:["You will also need to ensure that your repository is fully up to date. See ",(0,i.jsx)(o.a,{href:"/docs/packaging/update-dev-environment",children:"Update Your Development Environment"})]}),"\n",(0,i.jsx)(o.h2,{id:"using-the-local-repository",children:"Using the local repository"}),"\n",(0,i.jsxs)(o.p,{children:["The local repository index and any local eopkg files are stored in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local/"})]}),"\n",(0,i.jsxs)(o.h3,{id:"copying-eopkg-files-to-the-local-repository",children:["Copying ",(0,i.jsx)(o.code,{children:".eopkg"})," files to the local repository"]}),"\n",(0,i.jsxs)(o.p,{children:["To use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," package files as dependencies for another package, you must copy the regular package files, and any accompanying ",(0,i.jsx)(o.code,{children:"-devel"})," package files to the ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"})," local repository directory."]}),"\n",(0,i.jsxs)(o.p,{children:["For example, building the package ",(0,i.jsx)(o.code,{children:"libcmis"})," produces the packages ",(0,i.jsx)(o.code,{children:"libcmis"})," and ",(0,i.jsx)(o.code,{children:"libcmis-devel"}),". Both should be copied to the local repository to build other packages against ",(0,i.jsx)(o.code,{children:"libcmis"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To copy all ",(0,i.jsx)(o.code,{children:".eopkg"})," files within a directory to the local repository, use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo cp -v *.eopkg /var/lib/solbuild/local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"listing-locally-built-eopkg-files",children:"Listing locally built eopkg files"}),"\n",(0,i.jsx)(o.p,{children:"Use this to list all index and eopkg files in the local repository:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task list-local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"using-the-local-repository-to-build-a-package",children:"Using the local repository to build a package"}),"\n",(0,i.jsxs)(o.p,{children:["With the ",(0,i.jsx)(o.code,{children:".eopkg"})," files now present in the local repository, you can use them to build a package by running ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", rather than just ",(0,i.jsx)(o.code,{children:"go-task"}),", and ",(0,i.jsx)(o.code,{children:"solbuild"})," will prefer your packages over packages found in the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["Every time you run ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", all ",(0,i.jsx)(o.code,{children:".eopkg"})," files in the local repository will be re-indexed."]}),"\n",(0,i.jsx)(o.h3,{id:"a-streamlined-local-repository-workflow-for-stack-updates",children:"A streamlined local repository workflow for stack updates"}),"\n",(0,i.jsx)(o.p,{children:"If you know ahead of time that you are going to need to put the package files from the current build into the local repository as dependencies for subsequent builds, you can use:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localcp\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," task will:"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Build the current package against any existing packages in your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Copy the newly built package files to your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Re-index your local repository."}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," workflow can be very convenient when you are doing stack updates."]}),"\n",(0,i.jsx)(o.h3,{id:"best-practices-when-working-with-a-solbuild-local-repository",children:"Best practices when working with a solbuild local repository"}),"\n",(0,i.jsx)(o.p,{children:"There are some important things to know when working with local repositories, as they may lead to issues later on."}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"solbuild"})," will use your version of a package from the local repository regardless of whether there's a higher release in the Solus repository. Therefore:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only use the ",(0,i.jsx)(o.code,{children:"build-local"})," or ",(0,i.jsx)(o.code,{children:"build-localcp"})," tasks when required."]}),"\n",(0,i.jsxs)(o.li,{children:["Old packages in the local repository can be removed with the ",(0,i.jsx)(o.code,{children:"clean-local"})," task:","\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task clean-local\n"})}),"\n","Note that the ",(0,i.jsx)(o.code,{children:"clean-local"})," task will automatically re-index the (now empty) local repository."]}),"\n",(0,i.jsxs)(o.li,{children:["If a package is already installed in the ",(0,i.jsx)(o.code,{children:"solbuild"})," image, the release number of the updated version must be higher for it to be installed and used as a dependency at build time."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"installing-packages-from-the-local-repository-index",children:"Installing packages from the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," supports resolving packages from more than one repository. This can be used to configure ",(0,i.jsx)(o.code,{children:"eopkg"})," to prefer installing local repository packages over packages from the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["This requires an existing local repository index. If you have used the command ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", then an index was created automatically. Otherwise, you must create one."]}),"\n",(0,i.jsx)(o.h3,{id:"creating-or-updating-the-local-repository-index",children:"Creating or updating the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:["To generate or refresh the ",(0,i.jsx)(o.code,{children:"eopkg"})," index in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"}),", use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Or, if you have our ",(0,i.jsx)(o.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," set up, you get the same result by running:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"localrepo_reindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Keep in mind that the index needs to be refreshed whenever you add or remove locally built packages to your local repository. Otherwise, ",(0,i.jsx)(o.code,{children:"eopkg"})," won't know that new packages are available or have been removed from the local repository."]}),"\n",(0,i.jsx)(o.h3,{id:"package-resolution-priority-in-eopkg",children:"Package resolution priority in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," will always prefer packages from the topmost repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["In other words, if a package exists both in the local repository and the Solus repository, ",(0,i.jsx)(o.code,{children:"eopkg"})," will only consider the package from the first repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"})," ",(0,i.jsx)(o.em,{children:"regardless of its release number"}),"."]}),"\n",(0,i.jsx)(o.h3,{id:"adding-the-local-repository-index-to-the-eopkg-repository-database",children:"Adding the local repository index to the eopkg repository database"}),"\n",(0,i.jsxs)(o.p,{children:["The easiest way to add the local repository index to the list of repositories known to ",(0,i.jsx)(o.code,{children:"eopkg"}),", in the correct order, is to add the local repository and then ",(0,i.jsx)(o.em,{children:"re-add"})," the official Solus repository:"]}),"\n",(0,i.jsxs)(o.ol,{children:["\n",(0,i.jsxs)(o.li,{children:["First, let's list the repositories currently known to ",(0,i.jsx)(o.code,{children:"eopkg"})," with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),". This should produce output similar to:"]}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"Solus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"2",children:["\n",(0,i.jsx)(o.li,{children:"Now the repositories need to be added to account for the desired dependency resolution order:"}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nsudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.p,{children:"This should yield output similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nRepo Local added to system.\nUpdating repository: Local\nPackage database updated.\n$ sudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\nRepo already present with name Solus and same URL. Removing first.\nRepo Solus added to system.\nUpdating repository: Solus\neopkg-index.xml.xz.sha1sum (40.0 B)100% 765.61 KB/s [00:00:00] [complete]\neopkg-index.xml.xz (2.1 MB)100% 914.38 KB/s [00:00:01] [complete]\nPackage database updated.\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"3",children:["\n",(0,i.jsxs)(o.li,{children:["Check that the dependency resolution order is correct so that packages from the local ",(0,i.jsx)(o.code,{children:"solbuild"})," repository are preferred over the upstream Solus repository."]}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg lr"})," should yield output similar to:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h4,{id:"disabling-the-local-solbuild-repository-in-eopkg",children:"Disabling the local solbuild repository in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:['To reset the system to use only packages from the official Solus repository, disable the "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository using the command ",(0,i.jsx)(o.code,{children:"sudo eopkg disable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"The output should look similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg disable-repo Local\n$ sudo eopkg lr\nLocal [inactive]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.p,{children:['The "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository can be re-enabled with ",(0,i.jsx)(o.code,{children:"sudo eopkg enable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg enable-repo Local\n$ sudo eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,i.jsx)(o.p,{children:"Congratulations on making it this far! Your system should now be ready for convenient deployment and testing of locally built packages."})]})}function p(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,l)=>{l.d(o,{Z:()=>a,a:()=>r});var i=l(67294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/88a83a8c.bafc94c1.js b/assets/js/88a83a8c.edbaa425.js
similarity index 99%
rename from assets/js/88a83a8c.bafc94c1.js
rename to assets/js/88a83a8c.edbaa425.js
index daed38c31..c5529b169 100644
--- a/assets/js/88a83a8c.bafc94c1.js
+++ b/assets/js/88a83a8c.edbaa425.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1242],{65574:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(85893),a=t(11151);const o={title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},i="KDE Wallet and SSH keys",l={id:"user/software/utilities/kwallet",title:"KDE Wallet",description:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them.",source:"@site/docs/user/software/utilities/kwallet.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/kwallet",permalink:"/docs/user/software/utilities/kwallet",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/kwallet.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},sidebar:"userSidebar",previous:{title:"KSysGuard",permalink:"/docs/user/software/utilities/ksysguard"},next:{title:"Virtualization",permalink:"/docs/category/virtualization"}},r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"The SSH_ASKPASS
environment variable",id:"the-ssh_askpass-environment-variable",level:2},{value:"Create ~/.config/autostart/ssh-add.desktop
",id:"create-configautostartssh-adddesktop",level:2},{value:"Example",id:"example",level:3},{value:"Set correct permissions",id:"set-correct-permissions",level:3},{value:"Re-log to test your changes",id:"re-log-to-test-your-changes",level:2},{value:"Unlock SSH key passphrases automatically on login",id:"unlock-ssh-key-passphrases-automatically-on-login",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"kde-wallet-and-ssh-keys",children:"KDE Wallet and SSH keys"})}),"\n",(0,n.jsx)(s.p,{children:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them."}),"\n",(0,n.jsx)(s.p,{children:"Out of the box, the Solus KDE Plasma Desktop is already configured to use the KDE Wallet PAM module, which unlocks the KDE Wallet on session login."}),"\n",(0,n.jsx)(s.p,{children:"However, additional configuration is needed to make the KDE Wallet manage SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(s.p,{children:"This document assumes that you are familiar with utilising SSH key passphrases."}),"\n",(0,n.jsxs)(s.p,{children:["For more information, see ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases",children:"working with SSH key passphrases"})]}),"\n",(0,n.jsxs)(s.h2,{id:"the-ssh_askpass-environment-variable",children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable"]}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable tells the SSH subsystem which application to use when prompting the user for SSH key passphrases."]}),"\n",(0,n.jsxs)(s.p,{children:["On the Solus KDE Plasma Desktop spin, ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," is installed out of the box and ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," is set to ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," in the file ",(0,n.jsx)(s.code,{children:"/usr/share/xdg/plasma-workspace/env/50-solus-defaults.sh"})," by default."]}),"\n",(0,n.jsxs)(s.h2,{id:"create-configautostartssh-adddesktop",children:["Create ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})]}),"\n",(0,n.jsxs)(s.p,{children:["The contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})," should reflect the SSH keys you want to manage using the KDE Wallet."]}),"\n",(0,n.jsx)(s.h3,{id:"example",children:"Example"}),"\n",(0,n.jsxs)(s.p,{children:["Below is an example of the contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Tip: The above ssh-add.desktop file will only add the default key ",(0,n.jsx)(s.code,{children:"~/.ssh/id_rsa"}),". Assuming you have different keys named key1, key2 etc you need to change the above desktop file to"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q ~/.ssh/key1 ~/.ssh/key2 ~/.ssh/key3\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsx)(s.h3,{id:"set-correct-permissions",children:"Set correct permissions"}),"\n",(0,n.jsx)(s.p,{children:"After you created your file inside the autostart folder you have to give it the correct permissions"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"chmod 700 ~/.config/autostart/ssh-add.desktop\n"})}),"\n",(0,n.jsx)(s.p,{children:"with this the file should appear inside the autostart settings"}),"\n",(0,n.jsx)(s.h2,{id:"re-log-to-test-your-changes",children:"Re-log to test your changes"}),"\n",(0,n.jsx)(s.p,{children:"After logging out and back in, you should now be prompted by the KDE Wallet to input your SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"unlock-ssh-key-passphrases-automatically-on-login",children:"Unlock SSH key passphrases automatically on login"}),"\n",(0,n.jsx)(s.p,{children:"KDE Wallet supports automatically unlocking your SSH key passphrases on login."}),"\n",(0,n.jsx)(s.p,{children:"For this to work, your KDE Wallet password needs to be identical to your login password."}),"\n",(0,n.jsx)(s.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(s.p,{children:"ssh key doesn't get triggered, you can force this manually by running this command."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"SSH_ASKPASS=/usr/bin/ksshaskpass ssh-add < /dev/null\n"})})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>i});var n=t(67294);const a={},o=n.createContext(a);function i(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1242],{65574:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(85893),a=t(11151);const o={title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},i="KDE Wallet and SSH keys",l={id:"user/software/utilities/kwallet",title:"KDE Wallet",description:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them.",source:"@site/docs/user/software/utilities/kwallet.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/kwallet",permalink:"/docs/user/software/utilities/kwallet",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/kwallet.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},sidebar:"userSidebar",previous:{title:"KSysGuard",permalink:"/docs/user/software/utilities/ksysguard"},next:{title:"Virtualization",permalink:"/docs/category/virtualization"}},r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"The SSH_ASKPASS
environment variable",id:"the-ssh_askpass-environment-variable",level:2},{value:"Create ~/.config/autostart/ssh-add.desktop
",id:"create-configautostartssh-adddesktop",level:2},{value:"Example",id:"example",level:3},{value:"Set correct permissions",id:"set-correct-permissions",level:3},{value:"Re-log to test your changes",id:"re-log-to-test-your-changes",level:2},{value:"Unlock SSH key passphrases automatically on login",id:"unlock-ssh-key-passphrases-automatically-on-login",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"kde-wallet-and-ssh-keys",children:"KDE Wallet and SSH keys"})}),"\n",(0,n.jsx)(s.p,{children:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them."}),"\n",(0,n.jsx)(s.p,{children:"Out of the box, the Solus KDE Plasma Desktop is already configured to use the KDE Wallet PAM module, which unlocks the KDE Wallet on session login."}),"\n",(0,n.jsx)(s.p,{children:"However, additional configuration is needed to make the KDE Wallet manage SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(s.p,{children:"This document assumes that you are familiar with utilising SSH key passphrases."}),"\n",(0,n.jsxs)(s.p,{children:["For more information, see ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases",children:"working with SSH key passphrases"})]}),"\n",(0,n.jsxs)(s.h2,{id:"the-ssh_askpass-environment-variable",children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable"]}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable tells the SSH subsystem which application to use when prompting the user for SSH key passphrases."]}),"\n",(0,n.jsxs)(s.p,{children:["On the Solus KDE Plasma Desktop spin, ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," is installed out of the box and ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," is set to ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," in the file ",(0,n.jsx)(s.code,{children:"/usr/share/xdg/plasma-workspace/env/50-solus-defaults.sh"})," by default."]}),"\n",(0,n.jsxs)(s.h2,{id:"create-configautostartssh-adddesktop",children:["Create ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})]}),"\n",(0,n.jsxs)(s.p,{children:["The contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})," should reflect the SSH keys you want to manage using the KDE Wallet."]}),"\n",(0,n.jsx)(s.h3,{id:"example",children:"Example"}),"\n",(0,n.jsxs)(s.p,{children:["Below is an example of the contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Tip: The above ssh-add.desktop file will only add the default key ",(0,n.jsx)(s.code,{children:"~/.ssh/id_rsa"}),". Assuming you have different keys named key1, key2 etc you need to change the above desktop file to"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q ~/.ssh/key1 ~/.ssh/key2 ~/.ssh/key3\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsx)(s.h3,{id:"set-correct-permissions",children:"Set correct permissions"}),"\n",(0,n.jsx)(s.p,{children:"After you created your file inside the autostart folder you have to give it the correct permissions"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"chmod 700 ~/.config/autostart/ssh-add.desktop\n"})}),"\n",(0,n.jsx)(s.p,{children:"with this the file should appear inside the autostart settings"}),"\n",(0,n.jsx)(s.h2,{id:"re-log-to-test-your-changes",children:"Re-log to test your changes"}),"\n",(0,n.jsx)(s.p,{children:"After logging out and back in, you should now be prompted by the KDE Wallet to input your SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"unlock-ssh-key-passphrases-automatically-on-login",children:"Unlock SSH key passphrases automatically on login"}),"\n",(0,n.jsx)(s.p,{children:"KDE Wallet supports automatically unlocking your SSH key passphrases on login."}),"\n",(0,n.jsx)(s.p,{children:"For this to work, your KDE Wallet password needs to be identical to your login password."}),"\n",(0,n.jsx)(s.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(s.p,{children:"ssh key doesn't get triggered, you can force this manually by running this command."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"SSH_ASKPASS=/usr/bin/ksshaskpass ssh-add < /dev/null\n"})})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>i});var n=t(67294);const a={},o=n.createContext(a);function i(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8d193990.043ec1a8.js b/assets/js/8d193990.043ec1a8.js
deleted file mode 100644
index 571354421..000000000
--- a/assets/js/8d193990.043ec1a8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1539],{5436:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=o(85893),n=o(11151);const i={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},l=void 0,a={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Close watchers of our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It's a long story."}),"\n",(0,s.jsxs)(t.p,{children:["Our package manager ",(0,s.jsx)(t.code,{children:"eopkg"})," is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Do we really want to just port ",(0,s.jsx)(t.code,{children:"eopkg"})," to python3? Surely we could build something newer and shinier."]}),"\n",(0,s.jsxs)(t.li,{children:["How exactly do we want to port ",(0,s.jsx)(t.code,{children:"eopkg"})," to Python3? (We'll call this ported version ",(0,s.jsx)(t.code,{children:"eopkg3"})," for short)"]}),"\n",(0,s.jsxs)(t.li,{children:["How do we make sure ",(0,s.jsx)(t.code,{children:"eopkg3"})," works even if something goes wrong with the Python3 libraries on someone's machine?"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Here's the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager ",(0,s.jsx)(t.a,{href:"https://github.com/serpent-os/moss",children:(0,s.jsx)(t.em,{children:"moss"})})," that we are excited about. And they're building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we're taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things."]}),"\n",(0,s.jsxs)(t.p,{children:["Sheepman, Livingsilver, and others completed a ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/eopkg/commits/python3",children:"direct Python3 port"}),", which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a ",(0,s.jsx)(t.em,{children:"binary"})," using ",(0,s.jsx)(t.a,{href:"https://nuitka.net/doc/download.html",children:"nuitka"}),". We're calling this compiled ",(0,s.jsx)(t.code,{children:"eopkg3"})," binary ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," for now. Critically, this binary will have ",(0,s.jsx)(t.em,{children:"no dependencies"})," other than ",(0,s.jsx)(t.code,{children:"libc"}),". If we can successfully swap ",(0,s.jsx)(t.code,{children:"eopkg"})," with ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," on user's machines, then we've solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?"]}),"\n",(0,s.jsxs)(t.p,{children:["But what about Python2? Well, now that Evan and Joey have seen off a ",(0,s.jsx)(t.a,{href:"https://getsol.us/2024/01/08/solus-4-5-released/",children:"successful ISO release"})," with a ",(0,s.jsx)(t.code,{children:"calamares"})," based installer, we can cross ",(0,s.jsx)(t.code,{children:"os-installer"})," ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"off the list"}),". And ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," will let us cross off a whole bunch more. The rest of that list is a story for another day."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8d193990.e1e40f22.js b/assets/js/8d193990.e1e40f22.js
new file mode 100644
index 000000000..5b91b8c8e
--- /dev/null
+++ b/assets/js/8d193990.e1e40f22.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1539],{5436:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=o(85893),n=o(11151);const i={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},l=void 0,a={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Close watchers of our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It's a long story."}),"\n",(0,s.jsxs)(t.p,{children:["Our package manager ",(0,s.jsx)(t.code,{children:"eopkg"})," is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Do we really want to just port ",(0,s.jsx)(t.code,{children:"eopkg"})," to python3? Surely we could build something newer and shinier."]}),"\n",(0,s.jsxs)(t.li,{children:["How exactly do we want to port ",(0,s.jsx)(t.code,{children:"eopkg"})," to Python3? (We'll call this ported version ",(0,s.jsx)(t.code,{children:"eopkg3"})," for short)"]}),"\n",(0,s.jsxs)(t.li,{children:["How do we make sure ",(0,s.jsx)(t.code,{children:"eopkg3"})," works even if something goes wrong with the Python3 libraries on someone's machine?"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Here's the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager ",(0,s.jsx)(t.a,{href:"https://github.com/serpent-os/moss",children:(0,s.jsx)(t.em,{children:"moss"})})," that we are excited about. And they're building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we're taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things."]}),"\n",(0,s.jsxs)(t.p,{children:["Sheepman, Livingsilver, and others completed a ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/eopkg/commits/python3",children:"direct Python3 port"}),", which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a ",(0,s.jsx)(t.em,{children:"binary"})," using ",(0,s.jsx)(t.a,{href:"https://nuitka.net/doc/download.html",children:"nuitka"}),". We're calling this compiled ",(0,s.jsx)(t.code,{children:"eopkg3"})," binary ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," for now. Critically, this binary will have ",(0,s.jsx)(t.em,{children:"no dependencies"})," other than ",(0,s.jsx)(t.code,{children:"libc"}),". If we can successfully swap ",(0,s.jsx)(t.code,{children:"eopkg"})," with ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," on user's machines, then we've solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?"]}),"\n",(0,s.jsxs)(t.p,{children:["But what about Python2? Well, now that Evan and Joey have seen off a ",(0,s.jsx)(t.a,{href:"https://getsol.us/2024/01/08/solus-4-5-released/",children:"successful ISO release"})," with a ",(0,s.jsx)(t.code,{children:"calamares"})," based installer, we can cross ",(0,s.jsx)(t.code,{children:"os-installer"})," ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"off the list"}),". And ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," will let us cross off a whole bunch more. The rest of that list is a story for another day."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8e3d5b32.6f81261a.js b/assets/js/8e3d5b32.c1cc1aff.js
similarity index 98%
rename from assets/js/8e3d5b32.6f81261a.js
rename to assets/js/8e3d5b32.c1cc1aff.js
index 7b095fb56..8300814bf 100644
--- a/assets/js/8e3d5b32.6f81261a.js
+++ b/assets/js/8e3d5b32.c1cc1aff.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8499],{15838:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var t=n(85893),s=n(11151);const a={title:"IBus",summary:"Configuration of additional languages via IBUS"},o="IBus",r={id:"user/software/localization/ibus",title:"IBus",description:"Configuration",source:"@site/docs/user/software/localization/ibus.md",sourceDirName:"user/software/localization",slug:"/user/software/localization/ibus",permalink:"/docs/user/software/localization/ibus",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/localization/ibus.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"IBus",summary:"Configuration of additional languages via IBUS"},sidebar:"userSidebar",previous:{title:"Localization",permalink:"/docs/category/localization"},next:{title:"Networking",permalink:"/docs/category/networking"}},l={},d=[{value:"Configuration",id:"configuration",level:2},{value:"IBus IME package list",id:"ibus-ime-package-list",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ibus",children:"IBus"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i.p,{children:["Find the IME (Input Method Editor) you require from the ",(0,t.jsx)(i.a,{href:"#ibus-ime-package-list",children:"IBus IME package list"}),' and then search for it in the Software Center. Click "Install" to add the IME.']}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Install",src:n(38161).Z+"",width:"812",height:"315"})}),"\n",(0,t.jsx)(i.p,{children:"You may have to agree to install some additional dependencies and will need to type in your user password as authentication is required."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Dependencies",src:n(11533).Z+"",width:"446",height:"445"})}),"\n",(0,t.jsxs)(i.p,{children:["Once it has finished installing, logout of your computer and then login again. Now you'll be able to select the newly installed IME by following the same steps as detailed above for changing keyboard layouts in Budgie. For instance, in this example we have installed the ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," package for the Korean language. By following the steps above and then searching for Korean keyboard layouts, we are now able to select Korean (Hangul) as an input source."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus Region and Language",src:n(99809).Z+"",width:"742",height:"394"})}),"\n",(0,t.jsxs)(i.p,{children:["Additionally, once you have added the IME and have it selected in the Region & Languages window, you can click on the cog icon under the input sources to load the settings window for your specific IME. The ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," settings window is shown below but this will vary between the different IME's."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Settings Example: Hangul",src:n(40584).Z+"",width:"347",height:"405"})}),"\n",(0,t.jsx)(i.h2,{id:"ibus-ime-package-list",children:"IBus IME package list"}),"\n",(0,t.jsx)(i.p,{children:"A list of IBus IME packages available in the Solus software repository."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Package"}),(0,t.jsx)(i.th,{children:"Input Method"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-anthy"}),(0,t.jsx)(i.td,{children:"Japanese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-chewing"}),(0,t.jsx)(i.td,{children:"Phonetic Chinese input method for Zhuyin (Bopomofo)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-hangul"}),(0,t.jsx)(i.td,{children:"Korean"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-m17n"}),(0,t.jsx)(i.td,{children:"Multiple Languages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-unikey"}),(0,t.jsx)(i.td,{children:"Vietnamese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libpinyin"}),(0,t.jsx)(i.td,{children:"Chinese Pinyin and Bopomofo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libzhuyin"}),(0,t.jsx)(i.td,{children:"Chinese Zhuyin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-cangjie"}),(0,t.jsx)(i.td,{children:"Simplified Cangjie"})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},11533:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-dependencies-0dc4668d437230c7528de2f86647531b.jpg"},38161:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-install-68ba41c372dec67147393ad161a0f6f9.jpg"},40584:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-settings-hangul-27a3a73e189a7c7e02287539008b825c.jpg"},99809:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-region-and-languages-beb500ff774fb2dc414857fe1d196515.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>o});var t=n(67294);const s={},a=t.createContext(s);function o(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8499],{15838:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var t=n(85893),s=n(11151);const a={title:"IBus",summary:"Configuration of additional languages via IBUS"},o="IBus",r={id:"user/software/localization/ibus",title:"IBus",description:"Configuration",source:"@site/docs/user/software/localization/ibus.md",sourceDirName:"user/software/localization",slug:"/user/software/localization/ibus",permalink:"/docs/user/software/localization/ibus",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/localization/ibus.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"IBus",summary:"Configuration of additional languages via IBUS"},sidebar:"userSidebar",previous:{title:"Localization",permalink:"/docs/category/localization"},next:{title:"Networking",permalink:"/docs/category/networking"}},l={},d=[{value:"Configuration",id:"configuration",level:2},{value:"IBus IME package list",id:"ibus-ime-package-list",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ibus",children:"IBus"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i.p,{children:["Find the IME (Input Method Editor) you require from the ",(0,t.jsx)(i.a,{href:"#ibus-ime-package-list",children:"IBus IME package list"}),' and then search for it in the Software Center. Click "Install" to add the IME.']}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Install",src:n(38161).Z+"",width:"812",height:"315"})}),"\n",(0,t.jsx)(i.p,{children:"You may have to agree to install some additional dependencies and will need to type in your user password as authentication is required."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Dependencies",src:n(11533).Z+"",width:"446",height:"445"})}),"\n",(0,t.jsxs)(i.p,{children:["Once it has finished installing, logout of your computer and then login again. Now you'll be able to select the newly installed IME by following the same steps as detailed above for changing keyboard layouts in Budgie. For instance, in this example we have installed the ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," package for the Korean language. By following the steps above and then searching for Korean keyboard layouts, we are now able to select Korean (Hangul) as an input source."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus Region and Language",src:n(99809).Z+"",width:"742",height:"394"})}),"\n",(0,t.jsxs)(i.p,{children:["Additionally, once you have added the IME and have it selected in the Region & Languages window, you can click on the cog icon under the input sources to load the settings window for your specific IME. The ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," settings window is shown below but this will vary between the different IME's."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Settings Example: Hangul",src:n(40584).Z+"",width:"347",height:"405"})}),"\n",(0,t.jsx)(i.h2,{id:"ibus-ime-package-list",children:"IBus IME package list"}),"\n",(0,t.jsx)(i.p,{children:"A list of IBus IME packages available in the Solus software repository."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Package"}),(0,t.jsx)(i.th,{children:"Input Method"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-anthy"}),(0,t.jsx)(i.td,{children:"Japanese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-chewing"}),(0,t.jsx)(i.td,{children:"Phonetic Chinese input method for Zhuyin (Bopomofo)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-hangul"}),(0,t.jsx)(i.td,{children:"Korean"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-m17n"}),(0,t.jsx)(i.td,{children:"Multiple Languages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-unikey"}),(0,t.jsx)(i.td,{children:"Vietnamese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libpinyin"}),(0,t.jsx)(i.td,{children:"Chinese Pinyin and Bopomofo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libzhuyin"}),(0,t.jsx)(i.td,{children:"Chinese Zhuyin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-cangjie"}),(0,t.jsx)(i.td,{children:"Simplified Cangjie"})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},11533:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-dependencies-0dc4668d437230c7528de2f86647531b.jpg"},38161:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-install-68ba41c372dec67147393ad161a0f6f9.jpg"},40584:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-settings-hangul-27a3a73e189a7c7e02287539008b825c.jpg"},99809:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-region-and-languages-beb500ff774fb2dc414857fe1d196515.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>o});var t=n(67294);const s={},a=t.createContext(s);function o(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8e861970.06f1c4da.js b/assets/js/8e861970.2715b317.js
similarity index 98%
rename from assets/js/8e861970.06f1c4da.js
rename to assets/js/8e861970.2715b317.js
index 8c25de852..c823ffdc7 100644
--- a/assets/js/8e861970.06f1c4da.js
+++ b/assets/js/8e861970.2715b317.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8026],{95751:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var t=a(85893),n=a(11151);const r={title:"Requesting a Package",summary:"Requesting a new package"},i="Requesting A Package",o={id:"packaging/procedures/request-a-package",title:"Requesting a Package",description:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker.",source:"@site/docs/packaging/procedures/request-a-package.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package",permalink:"/docs/packaging/procedures/request-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Requesting a Package",summary:"Requesting a new package"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"},next:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"}},c={},u=[{value:"Steps to request a new package",id:"steps-to-request-a-new-package",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"requesting-a-package",children:"Requesting A Package"})}),"\n",(0,t.jsx)(s.p,{children:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker."}),"\n",(0,t.jsx)(s.h2,{id:"steps-to-request-a-new-package",children:"Steps to request a new package"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Addition+Request%22",children:"Look to see if an issue has already been filed"})," for the package you want. If there is already request for your package, please do not open another issue. Instead, add your comments to the existing issue."]}),"\n",(0,t.jsxs)(s.li,{children:["Skim our ",(0,t.jsx)(s.a,{href:"/docs/packaging/procedures/package-inclusion",children:"Package inclusion policy"})," to make sure your request won't be rejected."]}),"\n",(0,t.jsxs)(s.li,{children:["Open a new ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Addition+Request%2CPriority%3A+Wishlist&projects=&template=request-new-package.yml&title=What%27s+the+package+name%3F",children:"issue"})," for your package using the ",(0,t.jsx)(s.em,{children:"Request a new package"})," template. The template will ask you for the following information. Please complete as much as you can.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Name"}),"\n",(0,t.jsx)(s.li,{children:"Homepage"}),"\n",(0,t.jsxs)(s.li,{children:["Why should this be included in the repository? If we already offer similar packages in our repository ",(0,t.jsx)(s.strong,{children:"or third party repository"}),", please tell us what your new package does that our existing packages do not (",(0,t.jsx)(s.em,{children:"How is it different or better"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Are we allowed to distribute it?","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For Solus to distribute the package it must use a license found on the ",(0,t.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),", or Solus must be given permission to redistribute it by the owner."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"What kind of user will use this package, and how many users do you think will use this package?"}),"\n",(0,t.jsxs)(s.li,{children:["Link to source tarball/zip file. This must point to a stable, versioned source, for example: ",(0,t.jsx)(s.code,{children:"1.2.3.tar.gz"})," or ",(0,t.jsx)(s.code,{children:"packagename-1.2.3"}),". Nightlies, snapshots and pre-releases are not allowed."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Wait for Solus Staff to approve or reject your request."}),"\n"]})]})}function d(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>o,a:()=>i});var t=a(67294);const n={},r=t.createContext(n);function i(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8026],{95751:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var t=a(85893),n=a(11151);const r={title:"Requesting a Package",summary:"Requesting a new package"},i="Requesting A Package",o={id:"packaging/procedures/request-a-package",title:"Requesting a Package",description:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker.",source:"@site/docs/packaging/procedures/request-a-package.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package",permalink:"/docs/packaging/procedures/request-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Requesting a Package",summary:"Requesting a new package"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"},next:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"}},c={},u=[{value:"Steps to request a new package",id:"steps-to-request-a-new-package",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"requesting-a-package",children:"Requesting A Package"})}),"\n",(0,t.jsx)(s.p,{children:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker."}),"\n",(0,t.jsx)(s.h2,{id:"steps-to-request-a-new-package",children:"Steps to request a new package"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Addition+Request%22",children:"Look to see if an issue has already been filed"})," for the package you want. If there is already request for your package, please do not open another issue. Instead, add your comments to the existing issue."]}),"\n",(0,t.jsxs)(s.li,{children:["Skim our ",(0,t.jsx)(s.a,{href:"/docs/packaging/procedures/package-inclusion",children:"Package inclusion policy"})," to make sure your request won't be rejected."]}),"\n",(0,t.jsxs)(s.li,{children:["Open a new ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Addition+Request%2CPriority%3A+Wishlist&projects=&template=request-new-package.yml&title=What%27s+the+package+name%3F",children:"issue"})," for your package using the ",(0,t.jsx)(s.em,{children:"Request a new package"})," template. The template will ask you for the following information. Please complete as much as you can.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Name"}),"\n",(0,t.jsx)(s.li,{children:"Homepage"}),"\n",(0,t.jsxs)(s.li,{children:["Why should this be included in the repository? If we already offer similar packages in our repository ",(0,t.jsx)(s.strong,{children:"or third party repository"}),", please tell us what your new package does that our existing packages do not (",(0,t.jsx)(s.em,{children:"How is it different or better"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Are we allowed to distribute it?","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For Solus to distribute the package it must use a license found on the ",(0,t.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),", or Solus must be given permission to redistribute it by the owner."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"What kind of user will use this package, and how many users do you think will use this package?"}),"\n",(0,t.jsxs)(s.li,{children:["Link to source tarball/zip file. This must point to a stable, versioned source, for example: ",(0,t.jsx)(s.code,{children:"1.2.3.tar.gz"})," or ",(0,t.jsx)(s.code,{children:"packagename-1.2.3"}),". Nightlies, snapshots and pre-releases are not allowed."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Wait for Solus Staff to approve or reject your request."}),"\n"]})]})}function d(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>o,a:()=>i});var t=a(67294);const n={},r=t.createContext(n);function i(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8e886580.28508e9f.js b/assets/js/8e886580.36d0b6a0.js
similarity index 98%
rename from assets/js/8e886580.28508e9f.js
rename to assets/js/8e886580.36d0b6a0.js
index d331bf27c..1818ed3c8 100644
--- a/assets/js/8e886580.28508e9f.js
+++ b/assets/js/8e886580.36d0b6a0.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4978],{71137:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=s(85893),o=s(11151);const r={title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},i="Rust",l={id:"user/software/development/rust",title:"Rust",description:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs.",source:"@site/docs/user/software/development/rust.md",sourceDirName:"user/software/development",slug:"/user/software/development/rust",permalink:"/docs/user/software/development/rust",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/rust.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},sidebar:"userSidebar",previous:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"},next:{title:"Web Development",permalink:"/docs/user/software/development/web"}},a={},d=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rust",children:"Rust"})}),"\n",(0,n.jsx)(t.p,{children:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs."}),"\n",(0,n.jsx)(t.p,{children:"Rust can be obtained by:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rustup"})," package, then installing any Rust target and/or tool using ",(0,n.jsx)(t.code,{children:"rustup"})," itself"]}),"\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rust"})," package"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Users should prefer the ",(0,n.jsx)(t.code,{children:"rustup"})," way, since it gives the freedom to install any tools and targets, including nightly versions and debugging utilities, although it may require editing the ",(0,n.jsx)(t.code,{children:"PATH"})," variable depending on your shell setup. According to the official Rust ",(0,n.jsx)(t.a,{href:"https://www.rust-lang.org/tools/install",children:"installation guide"}),":"]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["It is customary for Rust developers to include ",(0,n.jsx)(t.code,{children:"~/.cargo/bin"})," in their ",(0,n.jsx)(t.code,{children:"PATH "}),"environment variable. During installation rustup will attempt to configure the ",(0,n.jsx)(t.code,{children:"PATH"}),". Because of differences between platforms, command shells, and bugs in rustup, the modifications to ",(0,n.jsx)(t.code,{children:"PATH"})," may not take effect until the console is restarted, or the user is logged out, or it may not succeed at all."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"rust"})," package, in fact, is present in the Solus repository for building packages that depend on it and it is not intended to be used by the final user, although it is possible and supported. Users that want to use the ",(0,n.jsx)(t.code,{children:"rust"})," package for their projects will be limited to the targets and tools that Solus needs to support, namely x86_64 and i686 Linux targets and ",(0,n.jsx)(t.code,{children:"cargo"}),". On the other hand, the ",(0,n.jsx)(t.code,{children:"rust"})," package is ready to use after its installation with no extra configurations."]}),"\n",(0,n.jsxs)(t.p,{children:["Either way, it is also recommended to install our ",(0,n.jsx)(t.code,{children:"system.devel"})," component, which is typically required for compiling. See our documentation for it ",(0,n.jsx)(t.a,{href:"/docs/user/software/development",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["As a final note, it is possible to ",(0,n.jsx)(t.a,{href:"https://rust-lang.github.io/rustup/installation/already-installed-rust.html",children:"configure"})," ",(0,n.jsx)(t.code,{children:"rustup"})," to use the system toolchain. This setup is ",(0,n.jsx)(t.strong,{children:"discouraged"})," unless aimed at developing applications targeting Solus itself."]})]})}function c(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(67294);const o={},r=n.createContext(o);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4978],{71137:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=s(85893),o=s(11151);const r={title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},i="Rust",l={id:"user/software/development/rust",title:"Rust",description:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs.",source:"@site/docs/user/software/development/rust.md",sourceDirName:"user/software/development",slug:"/user/software/development/rust",permalink:"/docs/user/software/development/rust",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/rust.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},sidebar:"userSidebar",previous:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"},next:{title:"Web Development",permalink:"/docs/user/software/development/web"}},a={},d=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rust",children:"Rust"})}),"\n",(0,n.jsx)(t.p,{children:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs."}),"\n",(0,n.jsx)(t.p,{children:"Rust can be obtained by:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rustup"})," package, then installing any Rust target and/or tool using ",(0,n.jsx)(t.code,{children:"rustup"})," itself"]}),"\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rust"})," package"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Users should prefer the ",(0,n.jsx)(t.code,{children:"rustup"})," way, since it gives the freedom to install any tools and targets, including nightly versions and debugging utilities, although it may require editing the ",(0,n.jsx)(t.code,{children:"PATH"})," variable depending on your shell setup. According to the official Rust ",(0,n.jsx)(t.a,{href:"https://www.rust-lang.org/tools/install",children:"installation guide"}),":"]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["It is customary for Rust developers to include ",(0,n.jsx)(t.code,{children:"~/.cargo/bin"})," in their ",(0,n.jsx)(t.code,{children:"PATH "}),"environment variable. During installation rustup will attempt to configure the ",(0,n.jsx)(t.code,{children:"PATH"}),". Because of differences between platforms, command shells, and bugs in rustup, the modifications to ",(0,n.jsx)(t.code,{children:"PATH"})," may not take effect until the console is restarted, or the user is logged out, or it may not succeed at all."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"rust"})," package, in fact, is present in the Solus repository for building packages that depend on it and it is not intended to be used by the final user, although it is possible and supported. Users that want to use the ",(0,n.jsx)(t.code,{children:"rust"})," package for their projects will be limited to the targets and tools that Solus needs to support, namely x86_64 and i686 Linux targets and ",(0,n.jsx)(t.code,{children:"cargo"}),". On the other hand, the ",(0,n.jsx)(t.code,{children:"rust"})," package is ready to use after its installation with no extra configurations."]}),"\n",(0,n.jsxs)(t.p,{children:["Either way, it is also recommended to install our ",(0,n.jsx)(t.code,{children:"system.devel"})," component, which is typically required for compiling. See our documentation for it ",(0,n.jsx)(t.a,{href:"/docs/user/software/development",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["As a final note, it is possible to ",(0,n.jsx)(t.a,{href:"https://rust-lang.github.io/rustup/installation/already-installed-rust.html",children:"configure"})," ",(0,n.jsx)(t.code,{children:"rustup"})," to use the system toolchain. This setup is ",(0,n.jsx)(t.strong,{children:"discouraged"})," unless aimed at developing applications targeting Solus itself."]})]})}function c(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(67294);const o={},r=n.createContext(o);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9284d474.0391793d.js b/assets/js/9284d474.3452b32d.js
similarity index 99%
rename from assets/js/9284d474.0391793d.js
rename to assets/js/9284d474.3452b32d.js
index cce7281a8..559fd60b0 100644
--- a/assets/js/9284d474.0391793d.js
+++ b/assets/js/9284d474.3452b32d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7626],{8110:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var i=s(85893),r=s(11151);const t={title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},a="Gaming",l={id:"user/software/gaming/index",title:"Gaming",description:"Heroes of Newerth",source:"@site/docs/user/software/gaming/index.md",sourceDirName:"user/software/gaming",slug:"/user/software/gaming/",permalink:"/docs/user/software/gaming/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/gaming/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},sidebar:"userSidebar",previous:{title:"Web Development",permalink:"/docs/user/software/development/web"},next:{title:"Localization",permalink:"/docs/category/localization"}},o={},d=[{value:"Heroes of Newerth",id:"heroes-of-newerth",level:2},{value:"Lutris",id:"lutris",level:2},{value:"About",id:"about",level:3},{value:"Minecraft",id:"minecraft",level:2},{value:"Installation",id:"installation",level:3},{value:"Prism Launcher",id:"prism-launcher",level:3},{value:"RetroArch",id:"retroarch",level:2},{value:"Installing the assets",id:"installing-the-assets",level:3},{value:"Steam",id:"steam",level:2},{value:"NVIDIA",id:"nvidia",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gaming",children:"Gaming"})}),"\n",(0,i.jsx)(n.h2,{id:"heroes-of-newerth",children:"Heroes of Newerth"}),"\n",(0,i.jsx)(n.p,{children:'First, install the latest version of HoN by downloading it and running "HoNClient.sh".'}),"\n",(0,i.jsx)(n.p,{children:"Assuming that you install to ~/HoN (default), you only need to run two commands:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf libgcrypt11 libglu\n"})}),"\n",(0,i.jsx)(n.p,{children:"That installs all of the dependencies that HoN needs."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"rm ~/HoN/libs-x86_64/{libcurl.so.4,libfreetype.so.6,libgcc_s.so.1,libgcrypt.so.11,libspeexdsp.so.1,libspeex.so.1,libstdc++.so.6,libudev.so.0}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This removes all the libraries that conflict with the ones in Solus."}),"\n",(0,i.jsx)(n.h2,{id:"lutris",children:"Lutris"}),"\n",(0,i.jsxs)(n.p,{children:["Lutris is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"lutris"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"about",children:"About"}),"\n",(0,i.jsx)(n.p,{children:"Lutris is an open gaming platform for Linux. It helps you install and manage your games in a unified interface. Their goal is to support every game which runs on Linux, from native to Windows games (via Wine) to emulators and browser games. The desktop application and the website are libre software, contributions are welcome!"}),"\n",(0,i.jsxs)(n.p,{children:["For more information you can visit their website at ",(0,i.jsx)(n.a,{href:"https://lutris.net",children:"lutris.net"}),". You can also see their list of games ",(0,i.jsx)(n.a,{href:"https://lutris.net/games/",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"minecraft",children:"Minecraft"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://www.minecraft.net",children:"Minecraft"}),' is a sandbox independent video game originally created by Swedish programmer Markus "Notch" Persson and later developed and published by the Swedish company Mojang.']}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Minecraft Screenshot",src:s(15528).Z+"",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"Install dependencies and download Minecraft:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf binutils\nwget https://launcher.mojang.com/download/Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract files and remove old archive:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ar xf Minecraft.deb\nsudo tar xf data.tar.xz -C /\nsudo rm control.tar.xz data.tar.xz debian-binary Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Integrate the installed files into your system:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,i.jsx)(n.h3,{id:"prism-launcher",children:"Prism Launcher"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://prismlauncher.org/",children:"Prism Launcher"})," is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods. Focused on user freedom and free redistributability."]}),"\n",(0,i.jsxs)(n.p,{children:["Prism Launcher is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"prism-launcher"})," package."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The official Minecraft launcher is not required to use Prism Launcher"})}),"\n",(0,i.jsx)(n.h2,{id:"retroarch",children:"RetroArch"}),"\n",(0,i.jsx)(n.p,{children:"RetroArch is a frontend for emulators, game engines and media players. It has all you need to run classic games through its polished graphical interface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"RetroArch Screenshot",src:s(30963).Z+"",width:"960",height:"746"})}),"\n",(0,i.jsx)(n.h3,{id:"installing-the-assets",children:"Installing the assets"}),"\n",(0,i.jsx)(n.p,{children:'The assets are not packaged with RetroArch itself and have to be downloaded from inside the program. This can easily be done by going into the Online Updater from the Main Menu and selecting "Update Assets".'}),"\n",(0,i.jsx)(n.h2,{id:"steam",children:"Steam"}),"\n",(0,i.jsxs)(n.p,{children:["Steam is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"steam"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"nvidia",children:"NVIDIA"}),"\n",(0,i.jsx)(n.p,{children:"For systems running NVIDIA graphics hardware, you will need to install the corresponding 32bit video driver for your card, listed below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Current Gen: ",(0,i.jsx)(n.code,{children:"nvidia-glx-driver-32bit"})]}),"\n",(0,i.jsxs)(n.li,{children:["470 series: ",(0,i.jsx)(n.code,{children:"nvidia-470-glx-driver-32bit"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:'You can use our "Hardware Drivers" utility to find the right driver for your system.'})})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},15528:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/minecraft-7079f00591b397a6d96d8b3603f5d05f.jpg"},30963:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/retroarch-9d687fb4c01f4d4f393f10b277b10e9c.jpg"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>a});var i=s(67294);const r={},t=i.createContext(r);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7626],{8110:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var i=s(85893),r=s(11151);const t={title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},a="Gaming",l={id:"user/software/gaming/index",title:"Gaming",description:"Heroes of Newerth",source:"@site/docs/user/software/gaming/index.md",sourceDirName:"user/software/gaming",slug:"/user/software/gaming/",permalink:"/docs/user/software/gaming/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/gaming/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},sidebar:"userSidebar",previous:{title:"Web Development",permalink:"/docs/user/software/development/web"},next:{title:"Localization",permalink:"/docs/category/localization"}},o={},d=[{value:"Heroes of Newerth",id:"heroes-of-newerth",level:2},{value:"Lutris",id:"lutris",level:2},{value:"About",id:"about",level:3},{value:"Minecraft",id:"minecraft",level:2},{value:"Installation",id:"installation",level:3},{value:"Prism Launcher",id:"prism-launcher",level:3},{value:"RetroArch",id:"retroarch",level:2},{value:"Installing the assets",id:"installing-the-assets",level:3},{value:"Steam",id:"steam",level:2},{value:"NVIDIA",id:"nvidia",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gaming",children:"Gaming"})}),"\n",(0,i.jsx)(n.h2,{id:"heroes-of-newerth",children:"Heroes of Newerth"}),"\n",(0,i.jsx)(n.p,{children:'First, install the latest version of HoN by downloading it and running "HoNClient.sh".'}),"\n",(0,i.jsx)(n.p,{children:"Assuming that you install to ~/HoN (default), you only need to run two commands:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf libgcrypt11 libglu\n"})}),"\n",(0,i.jsx)(n.p,{children:"That installs all of the dependencies that HoN needs."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"rm ~/HoN/libs-x86_64/{libcurl.so.4,libfreetype.so.6,libgcc_s.so.1,libgcrypt.so.11,libspeexdsp.so.1,libspeex.so.1,libstdc++.so.6,libudev.so.0}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This removes all the libraries that conflict with the ones in Solus."}),"\n",(0,i.jsx)(n.h2,{id:"lutris",children:"Lutris"}),"\n",(0,i.jsxs)(n.p,{children:["Lutris is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"lutris"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"about",children:"About"}),"\n",(0,i.jsx)(n.p,{children:"Lutris is an open gaming platform for Linux. It helps you install and manage your games in a unified interface. Their goal is to support every game which runs on Linux, from native to Windows games (via Wine) to emulators and browser games. The desktop application and the website are libre software, contributions are welcome!"}),"\n",(0,i.jsxs)(n.p,{children:["For more information you can visit their website at ",(0,i.jsx)(n.a,{href:"https://lutris.net",children:"lutris.net"}),". You can also see their list of games ",(0,i.jsx)(n.a,{href:"https://lutris.net/games/",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"minecraft",children:"Minecraft"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://www.minecraft.net",children:"Minecraft"}),' is a sandbox independent video game originally created by Swedish programmer Markus "Notch" Persson and later developed and published by the Swedish company Mojang.']}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Minecraft Screenshot",src:s(15528).Z+"",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"Install dependencies and download Minecraft:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf binutils\nwget https://launcher.mojang.com/download/Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract files and remove old archive:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ar xf Minecraft.deb\nsudo tar xf data.tar.xz -C /\nsudo rm control.tar.xz data.tar.xz debian-binary Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Integrate the installed files into your system:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,i.jsx)(n.h3,{id:"prism-launcher",children:"Prism Launcher"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://prismlauncher.org/",children:"Prism Launcher"})," is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods. Focused on user freedom and free redistributability."]}),"\n",(0,i.jsxs)(n.p,{children:["Prism Launcher is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"prism-launcher"})," package."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The official Minecraft launcher is not required to use Prism Launcher"})}),"\n",(0,i.jsx)(n.h2,{id:"retroarch",children:"RetroArch"}),"\n",(0,i.jsx)(n.p,{children:"RetroArch is a frontend for emulators, game engines and media players. It has all you need to run classic games through its polished graphical interface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"RetroArch Screenshot",src:s(30963).Z+"",width:"960",height:"746"})}),"\n",(0,i.jsx)(n.h3,{id:"installing-the-assets",children:"Installing the assets"}),"\n",(0,i.jsx)(n.p,{children:'The assets are not packaged with RetroArch itself and have to be downloaded from inside the program. This can easily be done by going into the Online Updater from the Main Menu and selecting "Update Assets".'}),"\n",(0,i.jsx)(n.h2,{id:"steam",children:"Steam"}),"\n",(0,i.jsxs)(n.p,{children:["Steam is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"steam"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"nvidia",children:"NVIDIA"}),"\n",(0,i.jsx)(n.p,{children:"For systems running NVIDIA graphics hardware, you will need to install the corresponding 32bit video driver for your card, listed below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Current Gen: ",(0,i.jsx)(n.code,{children:"nvidia-glx-driver-32bit"})]}),"\n",(0,i.jsxs)(n.li,{children:["470 series: ",(0,i.jsx)(n.code,{children:"nvidia-470-glx-driver-32bit"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:'You can use our "Hardware Drivers" utility to find the right driver for your system.'})})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},15528:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/minecraft-7079f00591b397a6d96d8b3603f5d05f.jpg"},30963:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/retroarch-9d687fb4c01f4d4f393f10b277b10e9c.jpg"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>a});var i=s(67294);const r={},t=i.createContext(r);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/947d9ca4.55aa0c2e.js b/assets/js/947d9ca4.505bb376.js
similarity index 99%
rename from assets/js/947d9ca4.55aa0c2e.js
rename to assets/js/947d9ca4.505bb376.js
index 91fac09e9..ee3d88fce 100644
--- a/assets/js/947d9ca4.55aa0c2e.js
+++ b/assets/js/947d9ca4.505bb376.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1944],{10025:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var o=t(85893),i=t(11151);const s={title:"Web Development",summary:"Install and configure different web development tools on Solus."},l="Web Development",d={id:"user/software/development/web",title:"Web Development",description:"Solus provides multiple web servers for local testing of web applications.",source:"@site/docs/user/software/development/web.md",sourceDirName:"user/software/development",slug:"/user/software/development/web",permalink:"/docs/user/software/development/web",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/web.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Web Development",summary:"Install and configure different web development tools on Solus."},sidebar:"userSidebar",previous:{title:"Rust",permalink:"/docs/user/software/development/rust"},next:{title:"Gaming",permalink:"/docs/user/software/gaming/"}},a={},r=[{value:"Caddy",id:"caddy",level:2},{value:"Installation",id:"installation",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Management",id:"management",level:4},{value:"httpd (Apache)",id:"httpd-apache",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Usage",id:"usage",level:3},{value:"Configuration and DocumentRoot",id:"configuration-and-documentroot",level:4},{value:"Enabling PHP support",id:"enabling-php-support",level:4},{value:"Management",id:"management-1",level:4},{value:"nginx",id:"nginx",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Usage",id:"usage-1",level:3},{value:"Configuration",id:"configuration-1",level:4},{value:"Management",id:"management-2",level:4}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"web-development",children:"Web Development"})}),"\n",(0,o.jsx)(n.h1,{id:"servers",children:"Servers"}),"\n",(0,o.jsx)(n.p,{children:"Solus provides multiple web servers for local testing of web applications."}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Solus is not a server operating system"}),". Usage of server packages outside local testing is not recommended."]})}),"\n",(0,o.jsx)(n.h2,{id:"caddy",children:"Caddy"}),"\n",(0,o.jsx)(n.p,{children:"Caddy is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"caddy"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install caddy\n"})}),"\n",(0,o.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["You can configure Caddy using a ",(0,o.jsx)(n.em,{children:"Caddyfile"}),", a text file that contains configuration directives. The default Caddyfile is located at ",(0,o.jsx)(n.code,{children:"/usr/share/caddy/Caddyfile"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To reload Caddy with a new configuration file, use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"caddy reload --config /path/to/new/caddyfile\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see the Caddy documentation at ",(0,o.jsx)(n.a,{href:"https://caddyserver.com/docs/",children:"https://caddyserver.com/docs/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"management",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage Caddy:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable Caddy on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now caddy"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop Caddy: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop caddy"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"httpd-apache",children:"httpd (Apache)"}),"\n",(0,o.jsx)(n.p,{children:"httpd (Apache) is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"httpd"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install httpd\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-and-documentroot",children:"Configuration and DocumentRoot"}),"\n",(0,o.jsxs)(n.p,{children:["The default configuration files for Apache are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," directory. To override the default configuration, create a new file with the ",(0,o.jsx)(n.code,{children:".conf"})," extension in the ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d"})," directory."]}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:["If you modify the configuration files located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," folder, your changes might be overwritten during a system update."]})}),"\n",(0,o.jsxs)(n.p,{children:["The document root is the directory where Apache serves files from. By default, the document root is ",(0,o.jsx)(n.code,{children:"/var/www/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"enabling-php-support",children:"Enabling PHP support"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.code,{children:"php"})," from the Software Center or execute the following command: ",(0,o.jsx)(n.code,{children:"sudo eopkg install php"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Create a new ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d/php.conf"})," file with the following contents:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'LoadModule proxy_module lib64/httpd/mod_proxy.so\nLoadModule proxy_fcgi_module lib64/httpd/mod_proxy_fcgi.so\nsolbuild
and the system",id:"update-solbuild-and-the-system",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"update-your-development-environment",children:"Update Your Development Environment"})}),"\n",(0,t.jsx)(o.p,{children:"Always make sure your development environment and system are up to date before beginning work on a package"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["Update your fork of the ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," repository."]}),"\n",(0,t.jsx)(o.li,{children:"Update your local clone of your fork."}),"\n",(0,t.jsxs)(o.li,{children:["Update the solbuild base image ",(0,t.jsx)(o.code,{children:"sudo solbuild update"})]}),"\n",(0,t.jsx)(o.li,{children:"Update the system."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"update-your-fork-of-the-getsoluspackages-repository",children:"Update your fork of the getsolus/packages repository"}),"\n",(0,t.jsxs)(o.p,{children:["If you already have a fork of ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," in GitHub, log into GitHub. Make sure you're looking at the ",(0,t.jsx)(o.code,{children:"main"}),' branch. Check to see that your fork is up to date with the main repository it was forked from. If your fork indicates it is behind, use the "Sync fork" button to bring it up to date.']}),"\n",(0,t.jsx)(o.h2,{id:"update-your-local-clone-of-your-fork",children:"Update your local clone of your fork"}),"\n",(0,t.jsx)(o.p,{children:"If you already have a local clone, you need to bring it up to date. To do so run:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,t.jsxs)(o.h2,{id:"update-solbuild-and-the-system",children:["Update ",(0,t.jsx)(o.code,{children:"solbuild"})," and the system"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"sudo solbuild update\nsudo eopkg up\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Next, you can either ",(0,t.jsx)(o.a,{href:"/docs/packaging/creating-a-new-package",children:"Submit a New Package"})," or ",(0,t.jsx)(o.a,{href:"/docs/packaging/updating-an-existing-package",children:"Update an Existing Package"})]})]})}function p(e={}){const{wrapper:o}={...(0,a.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,o,n)=>{n.d(o,{Z:()=>i,a:()=>s});var t=n(67294);const a={},r=t.createContext(a);function s(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6012],{62262:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=n(85893),a=n(11151);const r={title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},s="Update Your Development Environment",i={id:"packaging/update-dev-environment",title:"Update Your Development Environment",description:"Always make sure your development environment and system are up to date before beginning work on a package",source:"@site/docs/packaging/update-dev-environment.md",sourceDirName:"packaging",slug:"/packaging/update-dev-environment",permalink:"/docs/packaging/update-dev-environment",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/update-dev-environment.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:2,frontMatter:{title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},sidebar:"packagingSidebar",previous:{title:"Prepare for Packaging",permalink:"/docs/packaging/prepare-for-packaging"},next:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"}},d={},c=[{value:"Update your fork of the getsolus/packages repository",id:"update-your-fork-of-the-getsoluspackages-repository",level:2},{value:"Update your local clone of your fork",id:"update-your-local-clone-of-your-fork",level:2},{value:"Update solbuild
and the system",id:"update-solbuild-and-the-system",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"update-your-development-environment",children:"Update Your Development Environment"})}),"\n",(0,t.jsx)(o.p,{children:"Always make sure your development environment and system are up to date before beginning work on a package"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["Update your fork of the ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," repository."]}),"\n",(0,t.jsx)(o.li,{children:"Update your local clone of your fork."}),"\n",(0,t.jsxs)(o.li,{children:["Update the solbuild base image ",(0,t.jsx)(o.code,{children:"sudo solbuild update"})]}),"\n",(0,t.jsx)(o.li,{children:"Update the system."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"update-your-fork-of-the-getsoluspackages-repository",children:"Update your fork of the getsolus/packages repository"}),"\n",(0,t.jsxs)(o.p,{children:["If you already have a fork of ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," in GitHub, log into GitHub. Make sure you're looking at the ",(0,t.jsx)(o.code,{children:"main"}),' branch. Check to see that your fork is up to date with the main repository it was forked from. If your fork indicates it is behind, use the "Sync fork" button to bring it up to date.']}),"\n",(0,t.jsx)(o.h2,{id:"update-your-local-clone-of-your-fork",children:"Update your local clone of your fork"}),"\n",(0,t.jsx)(o.p,{children:"If you already have a local clone, you need to bring it up to date. To do so run:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,t.jsxs)(o.h2,{id:"update-solbuild-and-the-system",children:["Update ",(0,t.jsx)(o.code,{children:"solbuild"})," and the system"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"sudo solbuild update\nsudo eopkg up\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Next, you can either ",(0,t.jsx)(o.a,{href:"/docs/packaging/creating-a-new-package",children:"Submit a New Package"})," or ",(0,t.jsx)(o.a,{href:"/docs/packaging/updating-an-existing-package",children:"Update an Existing Package"})]})]})}function p(e={}){const{wrapper:o}={...(0,a.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,o,n)=>{n.d(o,{Z:()=>i,a:()=>s});var t=n(67294);const a={},r=t.createContext(a);function s(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c15d9823.50145b1a.js b/assets/js/c15d9823.bd5c9de5.js
similarity index 76%
rename from assets/js/c15d9823.50145b1a.js
rename to assets/js/c15d9823.bd5c9de5.js
index 54ff70754..f42a170d9 100644
--- a/assets/js/c15d9823.50145b1a.js
+++ b/assets/js/c15d9823.bd5c9de5.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6642],{92506:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":4,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6642],{92506:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/c55c138b.d801b250.js b/assets/js/c55c138b.d4901da8.js
similarity index 99%
rename from assets/js/c55c138b.d801b250.js
rename to assets/js/c55c138b.d4901da8.js
index 66bed4e87..5b129e5b8 100644
--- a/assets/js/c55c138b.d801b250.js
+++ b/assets/js/c55c138b.d4901da8.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7465],{76323:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>t});var s=n(85893),a=n(11151);const o={title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},c="Packaging Changes",l={id:"packaging/packaging-changes",title:"Packaging Changes",description:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details.",source:"@site/docs/packaging/packaging-changes.md",sourceDirName:"packaging",slug:"/packaging/packaging-changes",permalink:"/docs/packaging/packaging-changes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-changes.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:7,frontMatter:{title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},sidebar:"packagingSidebar",previous:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"},next:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"}},r={},t=[{value:"2024",id:"2024",level:2},{value:"May",id:"may",level:3},{value:"Remove 'Test Plan' and 'Checklist' from commit messages",id:"remove-test-plan-and-checklist-from-commit-messages",level:4},{value:"Add Rust macros to package.yml",id:"add-rust-macros-to-packageyml",level:4},{value:"Add guidance for SourceForge sources in package.yml",id:"add-guidance-for-sourceforge-sources-in-packageyml",level:4},{value:"February",id:"february",level:3},{value:"Begin adding monitoring.yml
to packages",id:"begin-adding-monitoringyml-to-packages",level:4},{value:"2023",id:"2023",level:2},{value:"October",id:"october",level:3},{value:"Adding checkdeps
in package.yml
",id:"adding-checkdeps-in-packageyml",level:4},{value:"Git hooks",id:"git-hooks",level:4},{value:"Requiring homepage
in package.yml
",id:"requiring-homepage-in-packageyml",level:4},{value:"Recommending amending commits in Pull Requests",id:"recommending-amending-commits-in-pull-requests",level:4},{value:"September",id:"september",level:3},{value:"Switch to asterisk bolding for PR template",id:"switch-to-asterisk-bolding-for-pr-template",level:4},{value:"Switching From make
to go-task
",id:"switching-from-make-to-go-task",level:4},{value:"GitHub Monorepo Migration",id:"github-monorepo-migration",level:4},{value:"August",id:"august",level:3},{value:"Initial GitHub Migration from old Phabricator Dev Tracker",id:"initial-github-migration-from-old-phabricator-dev-tracker",level:4},{value:"April",id:"april",level:3},{value:"2022 and Earlier",id:"2022-and-earlier",level:2}];function d(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"packaging-changes",children:"Packaging Changes"})}),"\n",(0,s.jsx)(i.p,{children:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"This list is not exhaustive"}),"\n",(0,s.jsxs)(i.li,{children:["This list is in ",(0,s.jsx)(i.em,{children:"reverse chronological order"})," (newest first)"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2024",children:"2024"}),"\n",(0,s.jsx)(i.h3,{id:"may",children:"May"}),"\n",(0,s.jsx)(i.h4,{id:"remove-test-plan-and-checklist-from-commit-messages",children:"Remove 'Test Plan' and 'Checklist' from commit messages"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"These are no longer needed in commit messages."}),"\n",(0,s.jsx)(i.li,{children:"They must still be included in the pull request description."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-rust-macros-to-packageyml",children:"Add Rust macros to package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now have macros for building Rust packages. Example: ",(0,s.jsx)(i.code,{children:"%cargo_build"}),". Rust packages should be switched to use the new macros as they are updated."]}),"\n",(0,s.jsxs)(i.li,{children:['See the "Rust (cargo) actionable macros" section on the ',(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#rust-cargo-actionable-macros",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-guidance-for-sourceforge-sources-in-packageyml",children:"Add guidance for SourceForge sources in package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now require SourceForge sources used in ",(0,s.jsx)(i.code,{children:"package.yml"})," files to follow a specific format."]}),"\n",(0,s.jsxs)(i.li,{children:["See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#source-key",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"february",children:"February"}),"\n",(0,s.jsxs)(i.h4,{id:"begin-adding-monitoringyml-to-packages",children:["Begin adding ",(0,s.jsx)(i.code,{children:"monitoring.yml"})," to packages"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new per-package file was introduced: ",(0,s.jsx)(i.code,{children:"monitoring.yml"}),". Used to monitor packages for releases and security advisories; see ",(0,s.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml"}),"."]}),"\n",(0,s.jsx)(i.li,{children:"This is not enforced by automatic checks yet, but we may ask that it be added."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2023",children:"2023"}),"\n",(0,s.jsx)(i.h3,{id:"october",children:"October"}),"\n",(0,s.jsxs)(i.h4,{id:"adding-checkdeps-in-packageyml",children:["Adding ",(0,s.jsx)(i.code,{children:"checkdeps"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new type of packaging dependency was added: ",(0,s.jsx)(i.code,{children:"checkdeps"}),". They behave the same as ",(0,s.jsx)(i.code,{children:"builddeps"}),", except they are not considered when determining build order for automatic builds. See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"git-hooks",children:"Git hooks"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"go-task init"})," to initialize Git hooks for the packages repository. See ",(0,s.jsx)(i.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"Prepare for packaging"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Use ",(0,s.jsx)(i.code,{children:"git commit"})," for committing packaging changes and fill in the template shown.\nIt is no longer required to manually copy-paste the template or use ",(0,s.jsx)(i.code,{children:"git commit --cleanup=scissors"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"requiring-homepage-in-packageyml",children:["Requiring ",(0,s.jsx)(i.code,{children:"homepage"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"homepage"})," key in ",(0,s.jsx)(i.code,{children:"package.yml"})," has become mandatory. Use the address to the upstream source repository (eg: the GitHub page) if a package does not have a homepage."]}),"\n",(0,s.jsx)(i.li,{children:"This is enforced by checks on all pull requests."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"recommending-amending-commits-in-pull-requests",children:"Recommending amending commits in Pull Requests"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Amending commits and force pushing the changes works better with our build tooling.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"It was thought that abandoning this practice would be okay, but it turns out not to be the case."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"september",children:"September"}),"\n",(0,s.jsx)(i.h4,{id:"switch-to-asterisk-bolding-for-pr-template",children:"Switch to asterisk bolding for PR template"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The initial PR template for the ",(0,s.jsx)(i.code,{children:"packages"})," repository used markdown header styling (",(0,s.jsx)(i.code,{children:"## Heading text"}),"), but ",(0,s.jsx)(i.code,{children:"solus-sc"})," does not render that styling, so the template was changed to asterisk bolding (",(0,s.jsx)(i.code,{children:"**Heading text**"}),")"]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/pull/366",children:"https://github.com/getsolus/packages/pull/366"})}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"switching-from-make-to-go-task",children:["Switching From ",(0,s.jsx)(i.code,{children:"make"})," to ",(0,s.jsx)(i.code,{children:"go-task"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["All packaging actions are now handled by ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),".","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Building a package can be done using ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Commands are the same: ",(0,s.jsx)(i.code,{children:"make local"}),", for example, is replaced by ",(0,s.jsx)(i.code,{children:"go-task local"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["You can see all available commands by either browsing to ",(0,s.jsx)(i.code,{children:"Taskfile.yml"})," in the ",(0,s.jsxs)(i.a,{href:"https://github.com/getsolus/packages/blob/main/Taskfile.yml",children:[(0,s.jsx)(i.code,{children:"packages"})," repository"]})," OR running ",(0,s.jsx)(i.code,{children:"go-task -l"})," somewhere in your updated clone of the packages git monorepo."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should install ",(0,s.jsx)(i.code,{children:"go-task"})," on their machines if they have not already."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Makefile"})," included with every package is no longer required. Please delete it from a package when updating, and do not include it when making the initial commit of a new package."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"github-monorepo-migration",children:"GitHub Monorepo Migration"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Packages were moved from the initial multirepo setup to the ",(0,s.jsx)(i.code,{children:"packages"})," monorepo: ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"})," Now packagers only need to clone/fork one repository for all packages."]}),"\n",(0,s.jsx)(i.li,{children:"The recommended migration strategy is to fork this repository and start with a clean clone. Any local changes to packages should be moved over manually."}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should now title commits like ",(0,s.jsx)(i.code,{children:"packagename: Action"}),"; for example: ",(0,s.jsx)(i.code,{children:"nano: Update to 9.0"}),". Generic titles like ",(0,s.jsx)(i.code,{children:"Update to 9.0"})," should not be used, except for rebuilds."]}),"\n",(0,s.jsx)(i.li,{children:"Packagers should use the pull request template for package updates, filling out the Summary and Test Plan sections as usual."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"august",children:"August"}),"\n",(0,s.jsx)(i.h4,{id:"initial-github-migration-from-old-phabricator-dev-tracker",children:"Initial GitHub Migration from old Phabricator Dev Tracker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.em,{children:"This change was superseded by the later monorepo migration."})}),"\n",(0,s.jsxs)(i.li,{children:["The new multirepo setup for packages was under ",(0,s.jsx)(i.code,{children:"github.com/solus-packages"})," organization, packages were updated with PRs to individual repositories."]}),"\n",(0,s.jsxs)(i.li,{children:["Issues were migrated to ",(0,s.jsx)(i.code,{children:"github.com/getsolus/packages"})," from Phabricator. ",(0,s.jsx)(i.em,{children:"Closed issues were not migrated."})]}),"\n",(0,s.jsxs)(i.li,{children:["A read-only instance of the old Dev Tracker is available at ",(0,s.jsx)(i.a,{href:"https://phab.getsol.us",children:"phab.getsol.us"}),". ",(0,s.jsx)(i.em,{children:"This will eventually be shut down."})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"april",children:"April"}),"\n",(0,s.jsxs)(i.p,{children:["The repository index was moved to ",(0,s.jsx)(i.code,{children:"cdn.getsol.us"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"2022-and-earlier",children:"2022 and Earlier"}),"\n",(0,s.jsx)(i.p,{children:"Not included in this list."})]})}function h(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>l,a:()=>c});var s=n(67294);const a={},o=s.createContext(a);function c(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7465],{76323:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>t});var s=n(85893),a=n(11151);const o={title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},c="Packaging Changes",l={id:"packaging/packaging-changes",title:"Packaging Changes",description:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details.",source:"@site/docs/packaging/packaging-changes.md",sourceDirName:"packaging",slug:"/packaging/packaging-changes",permalink:"/docs/packaging/packaging-changes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-changes.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:7,frontMatter:{title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},sidebar:"packagingSidebar",previous:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"},next:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"}},r={},t=[{value:"2024",id:"2024",level:2},{value:"May",id:"may",level:3},{value:"Remove 'Test Plan' and 'Checklist' from commit messages",id:"remove-test-plan-and-checklist-from-commit-messages",level:4},{value:"Add Rust macros to package.yml",id:"add-rust-macros-to-packageyml",level:4},{value:"Add guidance for SourceForge sources in package.yml",id:"add-guidance-for-sourceforge-sources-in-packageyml",level:4},{value:"February",id:"february",level:3},{value:"Begin adding monitoring.yml
to packages",id:"begin-adding-monitoringyml-to-packages",level:4},{value:"2023",id:"2023",level:2},{value:"October",id:"october",level:3},{value:"Adding checkdeps
in package.yml
",id:"adding-checkdeps-in-packageyml",level:4},{value:"Git hooks",id:"git-hooks",level:4},{value:"Requiring homepage
in package.yml
",id:"requiring-homepage-in-packageyml",level:4},{value:"Recommending amending commits in Pull Requests",id:"recommending-amending-commits-in-pull-requests",level:4},{value:"September",id:"september",level:3},{value:"Switch to asterisk bolding for PR template",id:"switch-to-asterisk-bolding-for-pr-template",level:4},{value:"Switching From make
to go-task
",id:"switching-from-make-to-go-task",level:4},{value:"GitHub Monorepo Migration",id:"github-monorepo-migration",level:4},{value:"August",id:"august",level:3},{value:"Initial GitHub Migration from old Phabricator Dev Tracker",id:"initial-github-migration-from-old-phabricator-dev-tracker",level:4},{value:"April",id:"april",level:3},{value:"2022 and Earlier",id:"2022-and-earlier",level:2}];function d(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"packaging-changes",children:"Packaging Changes"})}),"\n",(0,s.jsx)(i.p,{children:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"This list is not exhaustive"}),"\n",(0,s.jsxs)(i.li,{children:["This list is in ",(0,s.jsx)(i.em,{children:"reverse chronological order"})," (newest first)"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2024",children:"2024"}),"\n",(0,s.jsx)(i.h3,{id:"may",children:"May"}),"\n",(0,s.jsx)(i.h4,{id:"remove-test-plan-and-checklist-from-commit-messages",children:"Remove 'Test Plan' and 'Checklist' from commit messages"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"These are no longer needed in commit messages."}),"\n",(0,s.jsx)(i.li,{children:"They must still be included in the pull request description."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-rust-macros-to-packageyml",children:"Add Rust macros to package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now have macros for building Rust packages. Example: ",(0,s.jsx)(i.code,{children:"%cargo_build"}),". Rust packages should be switched to use the new macros as they are updated."]}),"\n",(0,s.jsxs)(i.li,{children:['See the "Rust (cargo) actionable macros" section on the ',(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#rust-cargo-actionable-macros",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-guidance-for-sourceforge-sources-in-packageyml",children:"Add guidance for SourceForge sources in package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now require SourceForge sources used in ",(0,s.jsx)(i.code,{children:"package.yml"})," files to follow a specific format."]}),"\n",(0,s.jsxs)(i.li,{children:["See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#source-key",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"february",children:"February"}),"\n",(0,s.jsxs)(i.h4,{id:"begin-adding-monitoringyml-to-packages",children:["Begin adding ",(0,s.jsx)(i.code,{children:"monitoring.yml"})," to packages"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new per-package file was introduced: ",(0,s.jsx)(i.code,{children:"monitoring.yml"}),". Used to monitor packages for releases and security advisories; see ",(0,s.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml"}),"."]}),"\n",(0,s.jsx)(i.li,{children:"This is not enforced by automatic checks yet, but we may ask that it be added."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2023",children:"2023"}),"\n",(0,s.jsx)(i.h3,{id:"october",children:"October"}),"\n",(0,s.jsxs)(i.h4,{id:"adding-checkdeps-in-packageyml",children:["Adding ",(0,s.jsx)(i.code,{children:"checkdeps"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new type of packaging dependency was added: ",(0,s.jsx)(i.code,{children:"checkdeps"}),". They behave the same as ",(0,s.jsx)(i.code,{children:"builddeps"}),", except they are not considered when determining build order for automatic builds. See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"git-hooks",children:"Git hooks"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"go-task init"})," to initialize Git hooks for the packages repository. See ",(0,s.jsx)(i.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"Prepare for packaging"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Use ",(0,s.jsx)(i.code,{children:"git commit"})," for committing packaging changes and fill in the template shown.\nIt is no longer required to manually copy-paste the template or use ",(0,s.jsx)(i.code,{children:"git commit --cleanup=scissors"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"requiring-homepage-in-packageyml",children:["Requiring ",(0,s.jsx)(i.code,{children:"homepage"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"homepage"})," key in ",(0,s.jsx)(i.code,{children:"package.yml"})," has become mandatory. Use the address to the upstream source repository (eg: the GitHub page) if a package does not have a homepage."]}),"\n",(0,s.jsx)(i.li,{children:"This is enforced by checks on all pull requests."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"recommending-amending-commits-in-pull-requests",children:"Recommending amending commits in Pull Requests"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Amending commits and force pushing the changes works better with our build tooling.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"It was thought that abandoning this practice would be okay, but it turns out not to be the case."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"september",children:"September"}),"\n",(0,s.jsx)(i.h4,{id:"switch-to-asterisk-bolding-for-pr-template",children:"Switch to asterisk bolding for PR template"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The initial PR template for the ",(0,s.jsx)(i.code,{children:"packages"})," repository used markdown header styling (",(0,s.jsx)(i.code,{children:"## Heading text"}),"), but ",(0,s.jsx)(i.code,{children:"solus-sc"})," does not render that styling, so the template was changed to asterisk bolding (",(0,s.jsx)(i.code,{children:"**Heading text**"}),")"]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/pull/366",children:"https://github.com/getsolus/packages/pull/366"})}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"switching-from-make-to-go-task",children:["Switching From ",(0,s.jsx)(i.code,{children:"make"})," to ",(0,s.jsx)(i.code,{children:"go-task"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["All packaging actions are now handled by ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),".","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Building a package can be done using ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Commands are the same: ",(0,s.jsx)(i.code,{children:"make local"}),", for example, is replaced by ",(0,s.jsx)(i.code,{children:"go-task local"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["You can see all available commands by either browsing to ",(0,s.jsx)(i.code,{children:"Taskfile.yml"})," in the ",(0,s.jsxs)(i.a,{href:"https://github.com/getsolus/packages/blob/main/Taskfile.yml",children:[(0,s.jsx)(i.code,{children:"packages"})," repository"]})," OR running ",(0,s.jsx)(i.code,{children:"go-task -l"})," somewhere in your updated clone of the packages git monorepo."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should install ",(0,s.jsx)(i.code,{children:"go-task"})," on their machines if they have not already."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Makefile"})," included with every package is no longer required. Please delete it from a package when updating, and do not include it when making the initial commit of a new package."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"github-monorepo-migration",children:"GitHub Monorepo Migration"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Packages were moved from the initial multirepo setup to the ",(0,s.jsx)(i.code,{children:"packages"})," monorepo: ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"})," Now packagers only need to clone/fork one repository for all packages."]}),"\n",(0,s.jsx)(i.li,{children:"The recommended migration strategy is to fork this repository and start with a clean clone. Any local changes to packages should be moved over manually."}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should now title commits like ",(0,s.jsx)(i.code,{children:"packagename: Action"}),"; for example: ",(0,s.jsx)(i.code,{children:"nano: Update to 9.0"}),". Generic titles like ",(0,s.jsx)(i.code,{children:"Update to 9.0"})," should not be used, except for rebuilds."]}),"\n",(0,s.jsx)(i.li,{children:"Packagers should use the pull request template for package updates, filling out the Summary and Test Plan sections as usual."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"august",children:"August"}),"\n",(0,s.jsx)(i.h4,{id:"initial-github-migration-from-old-phabricator-dev-tracker",children:"Initial GitHub Migration from old Phabricator Dev Tracker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.em,{children:"This change was superseded by the later monorepo migration."})}),"\n",(0,s.jsxs)(i.li,{children:["The new multirepo setup for packages was under ",(0,s.jsx)(i.code,{children:"github.com/solus-packages"})," organization, packages were updated with PRs to individual repositories."]}),"\n",(0,s.jsxs)(i.li,{children:["Issues were migrated to ",(0,s.jsx)(i.code,{children:"github.com/getsolus/packages"})," from Phabricator. ",(0,s.jsx)(i.em,{children:"Closed issues were not migrated."})]}),"\n",(0,s.jsxs)(i.li,{children:["A read-only instance of the old Dev Tracker is available at ",(0,s.jsx)(i.a,{href:"https://phab.getsol.us",children:"phab.getsol.us"}),". ",(0,s.jsx)(i.em,{children:"This will eventually be shut down."})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"april",children:"April"}),"\n",(0,s.jsxs)(i.p,{children:["The repository index was moved to ",(0,s.jsx)(i.code,{children:"cdn.getsol.us"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"2022-and-earlier",children:"2022 and Earlier"}),"\n",(0,s.jsx)(i.p,{children:"Not included in this list."})]})}function h(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>l,a:()=>c});var s=n(67294);const a={},o=s.createContext(a);function c(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c5de29d4.476afa6b.js b/assets/js/c5de29d4.62c2e63d.js
similarity index 99%
rename from assets/js/c5de29d4.476afa6b.js
rename to assets/js/c5de29d4.62c2e63d.js
index fc8fc9aa5..d9be220c3 100644
--- a/assets/js/c5de29d4.476afa6b.js
+++ b/assets/js/c5de29d4.62c2e63d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3851],{44158:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var i=a(85893),s=a(11151);const t={title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},r="Creating a New Package",l={id:"packaging/creating-a-new-package",title:"Creating a New Package",description:"This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility tree, which is already packaged for Solus, but we will pretend like it's not.",source:"@site/docs/packaging/creating-a-new-package.md",sourceDirName:"packaging",slug:"/packaging/creating-a-new-package",permalink:"/docs/packaging/creating-a-new-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/creating-a-new-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:3,frontMatter:{title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},sidebar:"packagingSidebar",previous:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"},next:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"}},c={},o=[{value:"Update an existing clone",id:"update-an-existing-clone",level:3},{value:"Create a new branch",id:"create-a-new-branch",level:2},{value:"Create the MAINTAINERS.md
file",id:"create-the-maintainersmd-file",level:2},{value:"Create the package.yml
file",id:"create-the-packageyml-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format for new packages",id:"commit-message-format-for-new-packages",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"creating-a-new-package",children:"Creating a New Package"})}),"\n",(0,i.jsxs)(n.p,{children:["This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility ",(0,i.jsx)(n.a,{href:"https://gitlab.com/OldManProgrammer/unix-tree",children:"tree"}),", which is already packaged for Solus, but we will pretend like it's not."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," and ",(0,i.jsx)(n.em,{children:"accepted"})," for the software or library you intend to package"]}),". If there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-an-existing-clone",children:"Update an existing clone"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"create-a-new-branch",children:"Create a new branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c your-branch\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-maintainersmd-file",children:["Create the ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["You must add a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Solus uses this to track the primary maintainer(s) for each package."]}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-packageyml-file",children:["Create the ",(0,i.jsx)(n.code,{children:"package.yml"})," file"]}),"\n",(0,i.jsx)(n.p,{children:"You will need a link to the most recent source tarball for this from the software's website."}),"\n",(0,i.jsxs)(n.p,{children:["To create a skeleton ",(0,i.jsx)(n.code,{children:"package.yml"})," file, use the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]}),"\n",(0,i.jsx)(n.p,{children:"This command takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Package name"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task new -- tree https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command will automatically place the new ",(0,i.jsx)(n.code,{children:"package.yml"})," in the proper directory according the package name, ",(0,i.jsxs)(n.em,{children:["and will overwrite any existing ",(0,i.jsx)(n.code,{children:"package.yml"})," file at that location"]}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["You can, of course, create your ",(0,i.jsx)(n.code,{children:"package.yml"})," file entirely from scratch, but ",(0,i.jsx)(n.code,{children:"go-task new"})," will give you a better starting point. We recommend using the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]})}),"\n",(0,i.jsxs)(n.p,{children:["Now you should have a ",(0,i.jsx)(n.code,{children:"package.yml"})," file that looks something like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : unix-tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : PLEASE FILL ME IN\nlicense : GPL-2.0-or-later # CHECK ME\ncomponent : PLEASE FILL ME IN\nsummary : PLEASE FILL ME IN\ndescription: |\n PLEASE FILL ME IN\nbuilddeps :\nsetup : |\n %configure\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command has filled many fields for us, but not all of them will be right, and some of them need to be filled in. Refer to the ",(0,i.jsx)(n.a,{href:"/docs/packaging/package.yml",children:"package.yml page"})," to see how each field should be used."]}),"\n",(0,i.jsx)(n.p,{children:"For this example, we need to fix the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The name needs to be ",(0,i.jsx)(n.code,{children:"tree"}),", so update it."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"license"}),' is correct, so we remove the comment. License values need to match an "Identifier" in the ',(0,i.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Fill in ",(0,i.jsx)(n.code,{children:"homepage"}),", ",(0,i.jsx)(n.code,{children:"component"}),", ",(0,i.jsx)(n.code,{children:"summary"}),", and ",(0,i.jsx)(n.code,{children:"description"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Remove ",(0,i.jsx)(n.code,{children:"builddeps"}),". This package has no build dependencies beyond the ones already available for every package (the ",(0,i.jsx)(n.code,{children:"system.devel"})," packages)."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"setup"})," step is not required, remove it."]}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.code,{children:"install"})," key, we can't use the ",(0,i.jsx)(n.code,{children:"%make_install"})," macro for this package. The files are installed in their correct locations individually."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"After updating the file, it will now look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : https://gitlab.com/OldManProgrammer/unix-tree\nlicense : GPL-2.0-or-later\ncomponent : system.utils\nsummary : list contents of directories in a tree-like format.\ndescription: |\n Tree is a recursive directory listing command that produces a depth indented listing of files, which is colorized ala dircolors if the LS_COLORS environment variable is set and output is to tty\nbuild : |\n %make\ninstall : |\n install -Dm00664 $workdir/doc/tree.1 $installdir/usr/share/man/man1/tree.1\n install -Dm00755 $workdir/tree $installdir/usr/bin/tree\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To read more about finding and including dependencies and other parts of ",(0,i.jsx)(n.code,{children:"package.yml"})," please see ",(0,i.jsx)(n.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Understanding how to translate source code into a good ",(0,i.jsx)(n.code,{children:"package.yml"})," file is the heart of packaging. If you are stumped, or have questions, ",(0,i.jsxs)(n.strong,{children:["ask for help in our Solus Packaging room on ",(0,i.jsx)(n.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"}),"."]})]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once the build completes, your directory should now include the following files:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"\u251c\u2500\u2500 abi_used_libs\n\u251c\u2500\u2500 abi_used_symbols\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 tree-2.1.1-1-1-x86_64.eopkg\n"})}),"\n",(0,i.jsxs)(n.p,{children:["All these files ",(0,i.jsx)(n.em,{children:"except"})," the ",(0,i.jsx)(n.code,{children:".eopkg"})," file(s) should be included in your pull request. You will remove the ",(0,i.jsx)(n.code,{children:".eopkg"})," files after testing the package."]}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h3,{id:"commit-message-format-for-new-packages",children:"Commit message format for new packages"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsx)(n.p,{children:"There should be a summary line (with the package name), a blank line, and then the rest of the commit message."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"There should at the minimum be a Summary."}),"\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsxs)(n.li,{children:["Link the package request using a ",(0,i.jsx)(n.code,{children:"Resolves"})," line."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"tree: Add at v2.1.1\n\n**Summary**\n\nAdd the tree package, which recursively lists directories in a tree like manner.\n\nResolves getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"issuenumber"})," is the issue number of the package request."]}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need a change to depend on another change, mention it in the commit message too (use the full URL): ",(0,i.jsx)(n.code,{children:"Depends on https://github.com/getsolus/packages/issues/234"})]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>l,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3851],{44158:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var i=a(85893),s=a(11151);const t={title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},r="Creating a New Package",l={id:"packaging/creating-a-new-package",title:"Creating a New Package",description:"This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility tree, which is already packaged for Solus, but we will pretend like it's not.",source:"@site/docs/packaging/creating-a-new-package.md",sourceDirName:"packaging",slug:"/packaging/creating-a-new-package",permalink:"/docs/packaging/creating-a-new-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/creating-a-new-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:3,frontMatter:{title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},sidebar:"packagingSidebar",previous:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"},next:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"}},c={},o=[{value:"Update an existing clone",id:"update-an-existing-clone",level:3},{value:"Create a new branch",id:"create-a-new-branch",level:2},{value:"Create the MAINTAINERS.md
file",id:"create-the-maintainersmd-file",level:2},{value:"Create the package.yml
file",id:"create-the-packageyml-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format for new packages",id:"commit-message-format-for-new-packages",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"creating-a-new-package",children:"Creating a New Package"})}),"\n",(0,i.jsxs)(n.p,{children:["This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility ",(0,i.jsx)(n.a,{href:"https://gitlab.com/OldManProgrammer/unix-tree",children:"tree"}),", which is already packaged for Solus, but we will pretend like it's not."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," and ",(0,i.jsx)(n.em,{children:"accepted"})," for the software or library you intend to package"]}),". If there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-an-existing-clone",children:"Update an existing clone"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"create-a-new-branch",children:"Create a new branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c your-branch\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-maintainersmd-file",children:["Create the ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["You must add a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Solus uses this to track the primary maintainer(s) for each package."]}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-packageyml-file",children:["Create the ",(0,i.jsx)(n.code,{children:"package.yml"})," file"]}),"\n",(0,i.jsx)(n.p,{children:"You will need a link to the most recent source tarball for this from the software's website."}),"\n",(0,i.jsxs)(n.p,{children:["To create a skeleton ",(0,i.jsx)(n.code,{children:"package.yml"})," file, use the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]}),"\n",(0,i.jsx)(n.p,{children:"This command takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Package name"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task new -- tree https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command will automatically place the new ",(0,i.jsx)(n.code,{children:"package.yml"})," in the proper directory according the package name, ",(0,i.jsxs)(n.em,{children:["and will overwrite any existing ",(0,i.jsx)(n.code,{children:"package.yml"})," file at that location"]}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["You can, of course, create your ",(0,i.jsx)(n.code,{children:"package.yml"})," file entirely from scratch, but ",(0,i.jsx)(n.code,{children:"go-task new"})," will give you a better starting point. We recommend using the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]})}),"\n",(0,i.jsxs)(n.p,{children:["Now you should have a ",(0,i.jsx)(n.code,{children:"package.yml"})," file that looks something like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : unix-tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : PLEASE FILL ME IN\nlicense : GPL-2.0-or-later # CHECK ME\ncomponent : PLEASE FILL ME IN\nsummary : PLEASE FILL ME IN\ndescription: |\n PLEASE FILL ME IN\nbuilddeps :\nsetup : |\n %configure\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command has filled many fields for us, but not all of them will be right, and some of them need to be filled in. Refer to the ",(0,i.jsx)(n.a,{href:"/docs/packaging/package.yml",children:"package.yml page"})," to see how each field should be used."]}),"\n",(0,i.jsx)(n.p,{children:"For this example, we need to fix the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The name needs to be ",(0,i.jsx)(n.code,{children:"tree"}),", so update it."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"license"}),' is correct, so we remove the comment. License values need to match an "Identifier" in the ',(0,i.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Fill in ",(0,i.jsx)(n.code,{children:"homepage"}),", ",(0,i.jsx)(n.code,{children:"component"}),", ",(0,i.jsx)(n.code,{children:"summary"}),", and ",(0,i.jsx)(n.code,{children:"description"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Remove ",(0,i.jsx)(n.code,{children:"builddeps"}),". This package has no build dependencies beyond the ones already available for every package (the ",(0,i.jsx)(n.code,{children:"system.devel"})," packages)."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"setup"})," step is not required, remove it."]}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.code,{children:"install"})," key, we can't use the ",(0,i.jsx)(n.code,{children:"%make_install"})," macro for this package. The files are installed in their correct locations individually."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"After updating the file, it will now look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : https://gitlab.com/OldManProgrammer/unix-tree\nlicense : GPL-2.0-or-later\ncomponent : system.utils\nsummary : list contents of directories in a tree-like format.\ndescription: |\n Tree is a recursive directory listing command that produces a depth indented listing of files, which is colorized ala dircolors if the LS_COLORS environment variable is set and output is to tty\nbuild : |\n %make\ninstall : |\n install -Dm00664 $workdir/doc/tree.1 $installdir/usr/share/man/man1/tree.1\n install -Dm00755 $workdir/tree $installdir/usr/bin/tree\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To read more about finding and including dependencies and other parts of ",(0,i.jsx)(n.code,{children:"package.yml"})," please see ",(0,i.jsx)(n.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Understanding how to translate source code into a good ",(0,i.jsx)(n.code,{children:"package.yml"})," file is the heart of packaging. If you are stumped, or have questions, ",(0,i.jsxs)(n.strong,{children:["ask for help in our Solus Packaging room on ",(0,i.jsx)(n.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"}),"."]})]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once the build completes, your directory should now include the following files:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"\u251c\u2500\u2500 abi_used_libs\n\u251c\u2500\u2500 abi_used_symbols\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 tree-2.1.1-1-1-x86_64.eopkg\n"})}),"\n",(0,i.jsxs)(n.p,{children:["All these files ",(0,i.jsx)(n.em,{children:"except"})," the ",(0,i.jsx)(n.code,{children:".eopkg"})," file(s) should be included in your pull request. You will remove the ",(0,i.jsx)(n.code,{children:".eopkg"})," files after testing the package."]}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h3,{id:"commit-message-format-for-new-packages",children:"Commit message format for new packages"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsx)(n.p,{children:"There should be a summary line (with the package name), a blank line, and then the rest of the commit message."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"There should at the minimum be a Summary."}),"\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsxs)(n.li,{children:["Link the package request using a ",(0,i.jsx)(n.code,{children:"Resolves"})," line."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"tree: Add at v2.1.1\n\n**Summary**\n\nAdd the tree package, which recursively lists directories in a tree like manner.\n\nResolves getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"issuenumber"})," is the issue number of the package request."]}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need a change to depend on another change, mention it in the commit message too (use the full URL): ",(0,i.jsx)(n.code,{children:"Depends on https://github.com/getsolus/packages/issues/234"})]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>l,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c9c1a3f4.fbdbc69c.js b/assets/js/c9c1a3f4.86924b51.js
similarity index 99%
rename from assets/js/c9c1a3f4.fbdbc69c.js
rename to assets/js/c9c1a3f4.86924b51.js
index 4bd328d3c..a1c6115dd 100644
--- a/assets/js/c9c1a3f4.fbdbc69c.js
+++ b/assets/js/c9c1a3f4.86924b51.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6121],{24080:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var n=i(85893),s=i(11151);const o={title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},a="Configuration",d={id:"user/editions/budgie/configuration",title:"Configuration",description:"Date and Time",source:"@site/docs/user/editions/budgie/configuration.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/configuration",permalink:"/docs/user/editions/budgie/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},sidebar:"userSidebar",previous:{title:"Budgie",permalink:"/docs/user/editions/budgie/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"}},r={},h=[{value:"Date and Time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Displays",id:"displays",level:2},{value:"Keyboard Layout",id:"keyboard-layout",level:2},{value:"Keyboard Layout Indicator",id:"keyboard-layout-indicator",level:3},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and Touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Network",id:"network",level:2},{value:"Non-Hidden Network",id:"non-hidden-network",level:3},{value:"Hidden Network",id:"hidden-network",level:3},{value:"Sound and Sound Devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Desktop Background",id:"desktop-background",level:2},{value:"Desktop Icons",id:"desktop-icons",level:2},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces Configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(t.h1,{id:"system",children:"System"}),"\n",(0,n.jsx)(t.h2,{id:"date-and-time",children:"Date and Time"}),"\n",(0,n.jsx)(t.p,{children:'In Budgie, the easiest way to access the date and time settings is by left clicking on the time in the bottom panel and clicking on "System time and date settings".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time Right-Click",src:i(87872).Z+"",width:"289",height:"162"})}),"\n",(0,n.jsx)(t.p,{children:'Alternatively, you can open the Budgie Control Center, and scroll the left-hand sidebar down to the bottom to find "Date & Time".'}),"\n",(0,n.jsx)(t.p,{children:'You will be presented with the following window. From here, you can enable / disable automatic date & time, automatic time zone changing, and change between AM/PM and 24-hour time formats. Note that changing the system date & time and time zone information requires clicking the "Unlock" button at the top of the window, and entering your password.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time",src:i(73249).Z+"",width:"996",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'If you wish to change how the time is displayed in the bottom panel, open Budgie Desktop Settings from the Budgie Menu, choose the Bottom Panel from the left-hand sidebar, choose "Clock" from the list of applets in the middle, then adjust your desired settings on the right-hand side.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Clock Applet",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsxs)(t.p,{children:["If you want to set a custom date & time format, the ",(0,n.jsx)(t.a,{href:"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html",children:'"conversion specifications" referenced by the POSIX standards'})," list the options that can be entered."]}),"\n",(0,n.jsx)(t.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,n.jsx)(t.p,{children:'You can configure default applications in Budgie by opening the Budgie Control Center, and scrolling the left-hand sidebar down to "Default Applications".'}),"\n",(0,n.jsx)(t.p,{children:"The drop-down boxes here enable choosing the default application for each category of file. For most categories, you will need to have already installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from Celluloid to VLC, then you must first install VLC (available in the Software Center)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Default Applications",src:i(74063).Z+"",width:"991",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can specify default applications for individual file types by right-clicking on a file and clicking on "Open With" from the popup menu, then choosing "Other Application".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Context Menu",src:i(45728).Z+"",width:"879",height:"579"})}),"\n",(0,n.jsx)(t.p,{children:'Next, select the application you wish to use from the list, then click "Set as default" below the list. Finish by clicking "OK". In the future, all files with the same file type will open with the chosen application.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Application Selection",src:i(23242).Z+"",width:"914",height:"618"})}),"\n",(0,n.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,n.jsx)(t.p,{children:'You can configure your display(s) in Budgie by opening the Budgie Menu and then clicking on "Displays" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will then be shown the following window."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Displays Overview",src:i(77218).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Individual Display Settings",src:i(27773).Z+"",width:"741",height:"365"})}),"\n",(0,n.jsx)(t.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Arrange Displays",src:i(26715).Z+"",width:"742",height:"381"})}),"\n",(0,n.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Confirm Display Settings",src:i(42677).Z+"",width:"466",height:"114"})}),"\n",(0,n.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard Layout"}),"\n",(0,n.jsx)(t.p,{children:'Using Budgie, you can change your keyboard layout in the Budgie Control Center. Click on the Budgie Menu, click the System Settings icon at the bottom or "Budgie Control Center" in the application list, and then click on "Keyboard" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Settings",src:i(12486).Z+"",width:"988",height:"695"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "+" button to add an input source (keyboard layout). You will be shown the following dialog.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add Input Source",src:i(93747).Z+"",width:"988",height:"696"})}),"\n",(0,n.jsx)(t.p,{children:'Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the "\u22ee" button (three vertical dots). This will enable you to search for the keyboard layout you wish to use.'}),"\n",(0,n.jsx)(t.p,{children:'After choosing the keyboard layout, click the "Add" button at the top of the window. You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US) and English (UK) layouts.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie New Layout Added",src:i(63730).Z+"",width:"987",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can remove a keyboard layout by clicking on one of the items, for instance English (UK), then clicking the "\u22ee" button, then choosing "Remove".'}),"\n",(0,n.jsxs)(t.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"}),", or by adding the Keyboard Layout Indicator applet to your Budgie panel."]}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-layout-indicator",children:"Keyboard Layout Indicator"}),"\n",(0,n.jsx)(t.p,{children:'To add the Keyboard Layout Indicator to your panel, open the Budgie Desktop Settings app from the Budgie Menu, then click "Bottom Panel" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Bottom Panel Settings",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsx)(t.p,{children:'On the right side of the window, click the "+" button next to "Add applet".'}),"\n",(0,n.jsx)(t.p,{children:'Find the Keyboard Layout Indicator entry and select it, then click "Add" at the top of the window. This will add the Keyboard Layout Indicator (to the center section by default), as shown below.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet",src:i(85522).Z+"",width:"1850",height:"159"})}),"\n",(0,n.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,n.jsxs)(t.p,{children:["Budgie comes with IBus ready to go straight out of the box. If you need an additional IBus IME see: ",(0,n.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,n.jsxs)(t.p,{children:["You will now be able to switch between your keyboard layouts by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"})," or by using the Keyboard Layout Indicator applet."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet: IBus",src:i(38896).Z+"",width:"169",height:"140"})}),"\n",(0,n.jsx)(t.h2,{id:"language",children:"Language"}),"\n",(0,n.jsx)(t.p,{children:'You can change your language in Budgie by opening the Budgie Menu and then clicking on "Region and Language" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Region and Languages",src:i(21178).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Selecting Language",src:i(34067).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsx)(t.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Language Search",src:i(74738).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsxs)(t.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,n.jsx)(t.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,n.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and Touchpad"}),"\n",(0,n.jsx)(t.p,{children:'You can configure the settings of your mouse and / or touchpad by opening the Budgie Menu and then clicking on "Mouse and Touchpad" in the System Settings category. You will see either settings for your mouse or trackpad, depending on the device.'}),"\n",(0,n.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Mouse Settings",src:i(56272).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Mouse speed."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Touchpad Settings",src:i(7722).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,n.jsx)(t.li,{children:"Touchpad speed."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,n.jsx)(t.h2,{id:"network",children:"Network"}),"\n",(0,n.jsx)(t.p,{children:'To configure your network settings in Budgie, start by opening the Budgie Menu and then click on "Network" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Overview",src:i(18399).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"To configure wireless, go to the Wi-Fi section. If your wireless is currently turned off, click the toggle button, leave the Network section, and go back in."}),"\n",(0,n.jsx)(t.h3,{id:"non-hidden-network",children:"Non-Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"In the WiFi section of the Network settings window, click the access point you wish to connect to."}),"\n",(0,n.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Authentication",src:i(29656).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,n.jsx)(t.h3,{id:"hidden-network",children:"Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"If you wish to connect to a hidden network, click \u201cConnect to Hidden Network...\u201d in the WiFi section of the Network settings window. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Hidden Network",src:i(35320).Z+"",width:"741",height:"490"})}),"\n",(0,n.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,n.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and Sound Devices"}),"\n",(0,n.jsx)(t.p,{children:"To change the volume in Budgie, simply left click on the speaker icon in the system tray and drag the slider or use the plus and minus icons to reach your desired level."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Volume Control",src:i(48355).Z+"",width:"117",height:"249"})}),"\n",(0,n.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,n.jsxs)(t.p,{children:["You can access sound settings via the Sound applet in Raven, the Notification and Widget Center. Open Raven, either by clicking on its icon in the far right of the system tray or using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + A"}),". The Sound applet allows you to enable, disable and alter input and output methods as well as providing a simple volume slider."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Raven Sound Applet",src:i(11145).Z+"",width:"299",height:"235"})}),"\n",(0,n.jsx)(t.p,{children:'You can access further sound settings, including individual application volume controls, and a simple speaker test by opening the Budgie Menu and then clicking on "Sound" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Sound Settings",src:i(20315).Z+"",width:"742",height:"495"})}),"\n",(0,n.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,n.jsx)(t.p,{children:'To add and remove users with Budgie, start by opening the Budgie Menu and then click on "Users" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User Settings",src:i(79964).Z+"",width:"742",height:"453"})}),"\n",(0,n.jsx)(t.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,n.jsx)(t.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,n.jsx)(t.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,n.jsx)(t.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Button",src:i(11494).Z+"",width:"225",height:"65"})}),"\n",(0,n.jsx)(t.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Dialog",src:i(38645).Z+"",width:"466",height:"546"})}),"\n",(0,n.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,n.jsx)(t.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,n.jsx)(t.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User List",src:i(86781).Z+"",width:"742",height:"592"})}),"\n",(0,n.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keep Files Prompt",src:i(86420).Z+"",width:"508",height:"162"})}),"\n",(0,n.jsx)(t.h1,{id:"user-interface",children:"User Interface"}),"\n",(0,n.jsx)(t.h2,{id:"desktop-background",children:"Desktop Background"}),"\n",(0,n.jsx)(t.p,{children:'To change the desktop background in Budgie, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Right-Click Menu",src:i(99786).Z+"",width:"390",height:"253"})}),"\n",(0,n.jsx)(t.p,{children:'Once the Budgie Control Center is open, click "Background" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:'Click one of the images displayed on the right to choose a pre-installed background image, or click "Add Picture..." in the headerbar to add one of your own image files to the available options.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Background Section",src:i(17750).Z+"",width:"1017",height:"715"})}),"\n",(0,n.jsx)(t.h2,{id:"desktop-icons",children:"Desktop Icons"}),"\n",(0,n.jsx)(t.p,{children:'Desktop Icons are enabled by default. To disable them, open the Budgie Desktop Settings app by selecting "Budgie Desktop Settings" from the Budgie Menu, or from the pop-up menu when right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:'In the Budgie Desktop Settings app, click "Desktop" in the left-hand sidebar - Desktop Icons is the first toggle switch on that screen.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Icons",src:i(33784).Z+"",width:"781",height:"627"})}),"\n",(0,n.jsx)(t.p,{children:"To place files on your desktop, you can either drag them directly onto the Desktop, or move the files you want to the Desktop folder within the Nemo file manager app (as shown in the image below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Folder",src:i(50045).Z+"",width:"820",height:"602"})}),"\n",(0,n.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,n.jsx)(t.p,{children:"Budgie enables the switching of workspaces with the Workspace Switcher. You can enable workspaces in Budgie by adding the Workspace Switcher applet to your panel."}),"\n",(0,n.jsx)(t.p,{children:'To add this applet, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop. Once in the Budgie Control Center, in the left-hand sidebar, select the panel to which you want to add the Workspace Switcher (choose the default Bottom Panel if you don\'t want to add more panels at this time).'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Settings Panel Section",src:i(61881).Z+"",width:"763",height:"611"})}),"\n",(0,n.jsx)(t.p,{children:'Click the + button next to "Add applet" on the right side of the window. This will open the list of available applets - scroll down until you find "Workspace Switcher", select it, and then click the \'Add\' button in the top-right of the window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Adding Budgie Workspaces Applet",src:i(73099).Z+"",width:"761",height:"610"})}),"\n",(0,n.jsx)(t.p,{children:"You should now see your workspaces available in the main Budgie panel. Applications can be moved between workspaces by dragging and dropping their icons within the Workspace Switcher."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Workspaces",src:i(67713).Z+"",width:"1850",height:"141"})}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"Budgie provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,n.jsx)(t.p,{children:'To view these shortcuts, open the Budgie Control Center app, choose the "Keyboard" section in the left-hand sidebar, then scroll down in the right part of the window to choose "Keyboard Shortcuts".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts",src:i(72264).Z+"",width:"995",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'Workspace shortcuts are contained in the "Navigation" section of the Keyboard Shortcuts window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts Sections",src:i(7521).Z+"",width:"996",height:"699"})}),"\n",(0,n.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces Configuration"}),"\n",(0,n.jsx)(t.p,{children:'There are 4 workspaces available in Budgie by default. To add a new workspace, click on the "+" button.'}),"\n",(0,n.jsx)(t.p,{children:"If you wish to remove or rename your workspace, right click on the desired workspace and select rename or remove."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Remove or Rename Workspaces",src:i(65893).Z+"",width:"1850",height:"187"})})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11494:(e,t,i)=>{i.d(t,{Z:()=>n});const n="data:image/jpeg;base64,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"},38645:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},26715:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},93747:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-add-input-method-09685f6a24a0012c3d954350511f449e.jpg"},17750:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-background-08d0ef91e1aafde95ab900656618ae4b.jpg"},73249:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-date-time-2e2a41c3504dc830843f938bbd142981.jpg"},74063:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-default-applications-ba0f2bc0472afc29f3a3bfd62fff4019.jpg"},72264:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-location-51ebaf6cc1a0f2d2581a35cf1b9a7116.jpg"},7521:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-popup-e16d754e17feaf2519cfb56d76b95e6c.jpg"},12486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-c35874adf88277c7f6368628e9faab58.jpg"},73099:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-panel-add-workspace-switcher-4756fd9ee280619d8b3250bc42817117.jpg"},99786:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-blank-space-right-click-c41f4ca4d33cfcdbea6b0db8bf37e069.jpg"},65486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-clock-62957b69b2028aed4498146d258826cf.jpg"},61881:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-4e14285d1a0df0b2b7f8ac1090064038.jpg"},33784:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-desktop-section-dbeac4ca05a68e1d4aa726cc015b067c.jpg"},42677:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-display-confirm-a76d736f32f356662af758fb94f6aafc.jpg"},77218:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},27773:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},63730:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-input-sources-multiple-dd4489d88d1d5a55afa2528664e5f908.jpg"},86420:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},38896:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-applet-ibus-306635b913e0265ce1f47e1098002e0c.jpg"},85522:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-switcher-f8ab66e42e1f0f982ecb691869490507.jpg"},56272:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},86781:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},50045:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-nemo-desktop-folder-898d96b13673ff56b0d1e9bed198808e.jpg"},29656:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-authentication-976c81d75e055000d1146dfd8d26f45f.jpg"},35320:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},18399:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},23242:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-other-deae0e7e2f5b6a1afc5f79813a668609.jpg"},45728:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-196e12963d47d150975ab06f51c54b28.jpg"},67713:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-panel-with-workspace-switcher-f5efe929dd564a1560a58ce5c108e7b1.jpg"},21178:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},74738:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},34067:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},79964:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},20315:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-sound-settings-83f0c82715b44956569594953085dad1.jpg"},87872:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-system-time-and-date-popup-cdcd8a6af79f4efe8cc7d4620468d2a4.jpg"},7722:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},48355:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-volume-control-cf7733bc82bb3684cc809cf0ec743cef.jpg"},65893:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-workspace-context-menu-d7ddb2b7d5c1ae6ae9e4b0c0ca4ed11f.jpg"},11145:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/raven-sound-applet-84fdb76d11a39ca554f2bc756205d35e.jpg"},11151:(e,t,i)=>{i.d(t,{Z:()=>d,a:()=>a});var n=i(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6121],{24080:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var n=i(85893),s=i(11151);const o={title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},a="Configuration",d={id:"user/editions/budgie/configuration",title:"Configuration",description:"Date and Time",source:"@site/docs/user/editions/budgie/configuration.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/configuration",permalink:"/docs/user/editions/budgie/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},sidebar:"userSidebar",previous:{title:"Budgie",permalink:"/docs/user/editions/budgie/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"}},r={},h=[{value:"Date and Time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Displays",id:"displays",level:2},{value:"Keyboard Layout",id:"keyboard-layout",level:2},{value:"Keyboard Layout Indicator",id:"keyboard-layout-indicator",level:3},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and Touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Network",id:"network",level:2},{value:"Non-Hidden Network",id:"non-hidden-network",level:3},{value:"Hidden Network",id:"hidden-network",level:3},{value:"Sound and Sound Devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Desktop Background",id:"desktop-background",level:2},{value:"Desktop Icons",id:"desktop-icons",level:2},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces Configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(t.h1,{id:"system",children:"System"}),"\n",(0,n.jsx)(t.h2,{id:"date-and-time",children:"Date and Time"}),"\n",(0,n.jsx)(t.p,{children:'In Budgie, the easiest way to access the date and time settings is by left clicking on the time in the bottom panel and clicking on "System time and date settings".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time Right-Click",src:i(87872).Z+"",width:"289",height:"162"})}),"\n",(0,n.jsx)(t.p,{children:'Alternatively, you can open the Budgie Control Center, and scroll the left-hand sidebar down to the bottom to find "Date & Time".'}),"\n",(0,n.jsx)(t.p,{children:'You will be presented with the following window. From here, you can enable / disable automatic date & time, automatic time zone changing, and change between AM/PM and 24-hour time formats. Note that changing the system date & time and time zone information requires clicking the "Unlock" button at the top of the window, and entering your password.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time",src:i(73249).Z+"",width:"996",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'If you wish to change how the time is displayed in the bottom panel, open Budgie Desktop Settings from the Budgie Menu, choose the Bottom Panel from the left-hand sidebar, choose "Clock" from the list of applets in the middle, then adjust your desired settings on the right-hand side.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Clock Applet",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsxs)(t.p,{children:["If you want to set a custom date & time format, the ",(0,n.jsx)(t.a,{href:"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html",children:'"conversion specifications" referenced by the POSIX standards'})," list the options that can be entered."]}),"\n",(0,n.jsx)(t.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,n.jsx)(t.p,{children:'You can configure default applications in Budgie by opening the Budgie Control Center, and scrolling the left-hand sidebar down to "Default Applications".'}),"\n",(0,n.jsx)(t.p,{children:"The drop-down boxes here enable choosing the default application for each category of file. For most categories, you will need to have already installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from Celluloid to VLC, then you must first install VLC (available in the Software Center)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Default Applications",src:i(74063).Z+"",width:"991",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can specify default applications for individual file types by right-clicking on a file and clicking on "Open With" from the popup menu, then choosing "Other Application".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Context Menu",src:i(45728).Z+"",width:"879",height:"579"})}),"\n",(0,n.jsx)(t.p,{children:'Next, select the application you wish to use from the list, then click "Set as default" below the list. Finish by clicking "OK". In the future, all files with the same file type will open with the chosen application.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Application Selection",src:i(23242).Z+"",width:"914",height:"618"})}),"\n",(0,n.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,n.jsx)(t.p,{children:'You can configure your display(s) in Budgie by opening the Budgie Menu and then clicking on "Displays" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will then be shown the following window."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Displays Overview",src:i(77218).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Individual Display Settings",src:i(27773).Z+"",width:"741",height:"365"})}),"\n",(0,n.jsx)(t.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Arrange Displays",src:i(26715).Z+"",width:"742",height:"381"})}),"\n",(0,n.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Confirm Display Settings",src:i(42677).Z+"",width:"466",height:"114"})}),"\n",(0,n.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard Layout"}),"\n",(0,n.jsx)(t.p,{children:'Using Budgie, you can change your keyboard layout in the Budgie Control Center. Click on the Budgie Menu, click the System Settings icon at the bottom or "Budgie Control Center" in the application list, and then click on "Keyboard" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Settings",src:i(12486).Z+"",width:"988",height:"695"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "+" button to add an input source (keyboard layout). You will be shown the following dialog.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add Input Source",src:i(93747).Z+"",width:"988",height:"696"})}),"\n",(0,n.jsx)(t.p,{children:'Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the "\u22ee" button (three vertical dots). This will enable you to search for the keyboard layout you wish to use.'}),"\n",(0,n.jsx)(t.p,{children:'After choosing the keyboard layout, click the "Add" button at the top of the window. You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US) and English (UK) layouts.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie New Layout Added",src:i(63730).Z+"",width:"987",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can remove a keyboard layout by clicking on one of the items, for instance English (UK), then clicking the "\u22ee" button, then choosing "Remove".'}),"\n",(0,n.jsxs)(t.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"}),", or by adding the Keyboard Layout Indicator applet to your Budgie panel."]}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-layout-indicator",children:"Keyboard Layout Indicator"}),"\n",(0,n.jsx)(t.p,{children:'To add the Keyboard Layout Indicator to your panel, open the Budgie Desktop Settings app from the Budgie Menu, then click "Bottom Panel" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Bottom Panel Settings",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsx)(t.p,{children:'On the right side of the window, click the "+" button next to "Add applet".'}),"\n",(0,n.jsx)(t.p,{children:'Find the Keyboard Layout Indicator entry and select it, then click "Add" at the top of the window. This will add the Keyboard Layout Indicator (to the center section by default), as shown below.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet",src:i(85522).Z+"",width:"1850",height:"159"})}),"\n",(0,n.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,n.jsxs)(t.p,{children:["Budgie comes with IBus ready to go straight out of the box. If you need an additional IBus IME see: ",(0,n.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,n.jsxs)(t.p,{children:["You will now be able to switch between your keyboard layouts by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"})," or by using the Keyboard Layout Indicator applet."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet: IBus",src:i(38896).Z+"",width:"169",height:"140"})}),"\n",(0,n.jsx)(t.h2,{id:"language",children:"Language"}),"\n",(0,n.jsx)(t.p,{children:'You can change your language in Budgie by opening the Budgie Menu and then clicking on "Region and Language" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Region and Languages",src:i(21178).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Selecting Language",src:i(34067).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsx)(t.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Language Search",src:i(74738).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsxs)(t.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,n.jsx)(t.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,n.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and Touchpad"}),"\n",(0,n.jsx)(t.p,{children:'You can configure the settings of your mouse and / or touchpad by opening the Budgie Menu and then clicking on "Mouse and Touchpad" in the System Settings category. You will see either settings for your mouse or trackpad, depending on the device.'}),"\n",(0,n.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Mouse Settings",src:i(56272).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Mouse speed."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Touchpad Settings",src:i(7722).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,n.jsx)(t.li,{children:"Touchpad speed."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,n.jsx)(t.h2,{id:"network",children:"Network"}),"\n",(0,n.jsx)(t.p,{children:'To configure your network settings in Budgie, start by opening the Budgie Menu and then click on "Network" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Overview",src:i(18399).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"To configure wireless, go to the Wi-Fi section. If your wireless is currently turned off, click the toggle button, leave the Network section, and go back in."}),"\n",(0,n.jsx)(t.h3,{id:"non-hidden-network",children:"Non-Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"In the WiFi section of the Network settings window, click the access point you wish to connect to."}),"\n",(0,n.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Authentication",src:i(29656).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,n.jsx)(t.h3,{id:"hidden-network",children:"Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"If you wish to connect to a hidden network, click \u201cConnect to Hidden Network...\u201d in the WiFi section of the Network settings window. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Hidden Network",src:i(35320).Z+"",width:"741",height:"490"})}),"\n",(0,n.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,n.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and Sound Devices"}),"\n",(0,n.jsx)(t.p,{children:"To change the volume in Budgie, simply left click on the speaker icon in the system tray and drag the slider or use the plus and minus icons to reach your desired level."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Volume Control",src:i(48355).Z+"",width:"117",height:"249"})}),"\n",(0,n.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,n.jsxs)(t.p,{children:["You can access sound settings via the Sound applet in Raven, the Notification and Widget Center. Open Raven, either by clicking on its icon in the far right of the system tray or using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + A"}),". The Sound applet allows you to enable, disable and alter input and output methods as well as providing a simple volume slider."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Raven Sound Applet",src:i(11145).Z+"",width:"299",height:"235"})}),"\n",(0,n.jsx)(t.p,{children:'You can access further sound settings, including individual application volume controls, and a simple speaker test by opening the Budgie Menu and then clicking on "Sound" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Sound Settings",src:i(20315).Z+"",width:"742",height:"495"})}),"\n",(0,n.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,n.jsx)(t.p,{children:'To add and remove users with Budgie, start by opening the Budgie Menu and then click on "Users" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User Settings",src:i(79964).Z+"",width:"742",height:"453"})}),"\n",(0,n.jsx)(t.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,n.jsx)(t.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,n.jsx)(t.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,n.jsx)(t.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Button",src:i(11494).Z+"",width:"225",height:"65"})}),"\n",(0,n.jsx)(t.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Dialog",src:i(38645).Z+"",width:"466",height:"546"})}),"\n",(0,n.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,n.jsx)(t.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,n.jsx)(t.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User List",src:i(86781).Z+"",width:"742",height:"592"})}),"\n",(0,n.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keep Files Prompt",src:i(86420).Z+"",width:"508",height:"162"})}),"\n",(0,n.jsx)(t.h1,{id:"user-interface",children:"User Interface"}),"\n",(0,n.jsx)(t.h2,{id:"desktop-background",children:"Desktop Background"}),"\n",(0,n.jsx)(t.p,{children:'To change the desktop background in Budgie, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Right-Click Menu",src:i(99786).Z+"",width:"390",height:"253"})}),"\n",(0,n.jsx)(t.p,{children:'Once the Budgie Control Center is open, click "Background" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:'Click one of the images displayed on the right to choose a pre-installed background image, or click "Add Picture..." in the headerbar to add one of your own image files to the available options.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Background Section",src:i(17750).Z+"",width:"1017",height:"715"})}),"\n",(0,n.jsx)(t.h2,{id:"desktop-icons",children:"Desktop Icons"}),"\n",(0,n.jsx)(t.p,{children:'Desktop Icons are enabled by default. To disable them, open the Budgie Desktop Settings app by selecting "Budgie Desktop Settings" from the Budgie Menu, or from the pop-up menu when right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:'In the Budgie Desktop Settings app, click "Desktop" in the left-hand sidebar - Desktop Icons is the first toggle switch on that screen.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Icons",src:i(33784).Z+"",width:"781",height:"627"})}),"\n",(0,n.jsx)(t.p,{children:"To place files on your desktop, you can either drag them directly onto the Desktop, or move the files you want to the Desktop folder within the Nemo file manager app (as shown in the image below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Folder",src:i(50045).Z+"",width:"820",height:"602"})}),"\n",(0,n.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,n.jsx)(t.p,{children:"Budgie enables the switching of workspaces with the Workspace Switcher. You can enable workspaces in Budgie by adding the Workspace Switcher applet to your panel."}),"\n",(0,n.jsx)(t.p,{children:'To add this applet, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop. Once in the Budgie Control Center, in the left-hand sidebar, select the panel to which you want to add the Workspace Switcher (choose the default Bottom Panel if you don\'t want to add more panels at this time).'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Settings Panel Section",src:i(61881).Z+"",width:"763",height:"611"})}),"\n",(0,n.jsx)(t.p,{children:'Click the + button next to "Add applet" on the right side of the window. This will open the list of available applets - scroll down until you find "Workspace Switcher", select it, and then click the \'Add\' button in the top-right of the window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Adding Budgie Workspaces Applet",src:i(73099).Z+"",width:"761",height:"610"})}),"\n",(0,n.jsx)(t.p,{children:"You should now see your workspaces available in the main Budgie panel. Applications can be moved between workspaces by dragging and dropping their icons within the Workspace Switcher."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Workspaces",src:i(67713).Z+"",width:"1850",height:"141"})}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"Budgie provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,n.jsx)(t.p,{children:'To view these shortcuts, open the Budgie Control Center app, choose the "Keyboard" section in the left-hand sidebar, then scroll down in the right part of the window to choose "Keyboard Shortcuts".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts",src:i(72264).Z+"",width:"995",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'Workspace shortcuts are contained in the "Navigation" section of the Keyboard Shortcuts window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts Sections",src:i(7521).Z+"",width:"996",height:"699"})}),"\n",(0,n.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces Configuration"}),"\n",(0,n.jsx)(t.p,{children:'There are 4 workspaces available in Budgie by default. To add a new workspace, click on the "+" button.'}),"\n",(0,n.jsx)(t.p,{children:"If you wish to remove or rename your workspace, right click on the desired workspace and select rename or remove."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Remove or Rename Workspaces",src:i(65893).Z+"",width:"1850",height:"187"})})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11494:(e,t,i)=>{i.d(t,{Z:()=>n});const n="data:image/jpeg;base64,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"},38645:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},26715:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},93747:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-add-input-method-09685f6a24a0012c3d954350511f449e.jpg"},17750:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-background-08d0ef91e1aafde95ab900656618ae4b.jpg"},73249:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-date-time-2e2a41c3504dc830843f938bbd142981.jpg"},74063:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-default-applications-ba0f2bc0472afc29f3a3bfd62fff4019.jpg"},72264:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-location-51ebaf6cc1a0f2d2581a35cf1b9a7116.jpg"},7521:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-popup-e16d754e17feaf2519cfb56d76b95e6c.jpg"},12486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-c35874adf88277c7f6368628e9faab58.jpg"},73099:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-panel-add-workspace-switcher-4756fd9ee280619d8b3250bc42817117.jpg"},99786:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-blank-space-right-click-c41f4ca4d33cfcdbea6b0db8bf37e069.jpg"},65486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-clock-62957b69b2028aed4498146d258826cf.jpg"},61881:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-4e14285d1a0df0b2b7f8ac1090064038.jpg"},33784:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-desktop-section-dbeac4ca05a68e1d4aa726cc015b067c.jpg"},42677:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-display-confirm-a76d736f32f356662af758fb94f6aafc.jpg"},77218:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},27773:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},63730:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-input-sources-multiple-dd4489d88d1d5a55afa2528664e5f908.jpg"},86420:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},38896:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-applet-ibus-306635b913e0265ce1f47e1098002e0c.jpg"},85522:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-switcher-f8ab66e42e1f0f982ecb691869490507.jpg"},56272:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},86781:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},50045:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-nemo-desktop-folder-898d96b13673ff56b0d1e9bed198808e.jpg"},29656:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-authentication-976c81d75e055000d1146dfd8d26f45f.jpg"},35320:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},18399:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},23242:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-other-deae0e7e2f5b6a1afc5f79813a668609.jpg"},45728:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-196e12963d47d150975ab06f51c54b28.jpg"},67713:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-panel-with-workspace-switcher-f5efe929dd564a1560a58ce5c108e7b1.jpg"},21178:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},74738:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},34067:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},79964:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},20315:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-sound-settings-83f0c82715b44956569594953085dad1.jpg"},87872:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-system-time-and-date-popup-cdcd8a6af79f4efe8cc7d4620468d2a4.jpg"},7722:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},48355:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-volume-control-cf7733bc82bb3684cc809cf0ec743cef.jpg"},65893:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-workspace-context-menu-d7ddb2b7d5c1ae6ae9e4b0c0ca4ed11f.jpg"},11145:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/raven-sound-applet-84fdb76d11a39ca554f2bc756205d35e.jpg"},11151:(e,t,i)=>{i.d(t,{Z:()=>d,a:()=>a});var n=i(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/cca891e2.0b18e5be.js b/assets/js/cca891e2.62ee8e8c.js
similarity index 99%
rename from assets/js/cca891e2.0b18e5be.js
rename to assets/js/cca891e2.62ee8e8c.js
index 4b63e1678..b2cb1f66e 100644
--- a/assets/js/cca891e2.0b18e5be.js
+++ b/assets/js/cca891e2.62ee8e8c.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9773],{7857:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var s=i(85893),r=i(11151);const n={title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},o="Package Inclusion Policy",a={id:"packaging/procedures/package-inclusion",title:"Package Inclusion Policy",description:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected.",source:"@site/docs/packaging/procedures/package-inclusion.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/package-inclusion",permalink:"/docs/packaging/procedures/package-inclusion",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/package-inclusion.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},sidebar:"packagingSidebar",previous:{title:"Maintainership",permalink:"/docs/packaging/procedures/maintainership"},next:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"}},l={},c=[{value:"Criteria",id:"criteria",level:2},{value:"Explicitly redistributable",id:"explicitly-redistributable",level:3},{value:"Server software",id:"server-software",level:3},{value:"Software age",id:"software-age",level:3},{value:"Stack complexity",id:"stack-complexity",level:3},{value:"Value-add",id:"value-add",level:3},{value:"Rejection",id:"rejection",level:2}];function d(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"package-inclusion-policy",children:"Package Inclusion Policy"})}),"\n",(0,s.jsx)(t.p,{children:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected."}),"\n",(0,s.jsx)(t.h2,{id:"criteria",children:"Criteria"}),"\n",(0,s.jsx)(t.h3,{id:"explicitly-redistributable",children:"Explicitly redistributable"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Software under a free software or open source software license, or license text which explicitly states that it is ",(0,s.jsx)(t.strong,{children:"permissible"})," to redistribute the software. We use the ",(0,s.jsx)(t.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"For anything that cannot be redistributed by Solus, there is the possibility for them to be provided as a Flatpak, for Third Party repository inclusion, however the Solus project is not responsible for flatpak or snap implementation of these items. These items should then fetch only at installation time, and not contain non distributable components."}),"\n",(0,s.jsx)(t.li,{children:"Solus supports both VCS (currently only git, this will expand) and traditional software sources (such as tarballs) for packages, equally."}),"\n",(0,s.jsxs)(t.li,{children:["Unless ",(0,s.jsx)(t.strong,{children:"absolutely unavoidable"}),", the sources for a package should be source, and not ",(0,s.jsx)(t.strong,{children:"binary, prebuilt"})," sources. Exceptions may be made in rare cases, such as stage1 bootstrap for a compiler, or requires custom components otherwise impossible to provide in Solus (patched libraries, etc.)"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"server-software",children:"Server software"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Mail servers such as Postfix, Dovecot, etc, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Solus does not provide a server operating system."]}),"\n",(0,s.jsxs)(t.li,{children:["Web servers and database daemons ",(0,s.jsx)(t.strong,{children:"are"})," eligible for inclusion, as they facilitate web developers to work locally."]}),"\n",(0,s.jsx)(t.li,{children:"Anything outside of these may be catered to by the usage of Docker, or other container technology. Thus, container technology must be supported by Solus to support access to ancillary cases."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"software-age",children:"Software age"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"DOA (dead-on-arrival) packages are generally rejected from Solus. However, they may be included at the discretion of the project, if they provide unique functionality."}),"\n",(0,s.jsx)(t.li,{children:"Projects with no tags/tarballs which lack traction, may be frozen until a suitable release is made. Tagging releases is an indicator for good release engineering practices."}),"\n",(0,s.jsxs)(t.li,{children:["Typically, we prefer ",(0,s.jsx)(t.strong,{children:"stable"})," tagged releases. However, this may be waived if:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The software has significant traction (i.e. prerelease)"}),"\n",(0,s.jsx)(t.li,{children:"A bug fix only exists beyond the latest stable release for a git source"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"stack-complexity",children:"Stack complexity"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Certain requests may tick all the boxes, but introduce a level of complexity or require a level of engagement not possible to balance for Solus Staff. Under certain situations, a request will be frozen until it has a dedicated maintainer."}),"\n",(0,s.jsx)(t.li,{children:"This extends to requests for full desktop environments. However, this does not extend to minor components like drop-in window managers or panels separate of a dependent stack (i.e. Awesome WM, tint2, etc.)"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"value-add",children:"Value-add"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A web wrapper which ",(0,s.jsx)(t.strong,{children:"adds value"}),", such as Discord, with the global push-to-talk shortcut, is eligible for inclusion."]}),"\n",(0,s.jsxs)(t.li,{children:["A web page wrapper, that adds ",(0,s.jsx)(t.strong,{children:"no further value"})," other than \u201cconvenient desktop shortcut\u201d or \u201ctray icon\u201d, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Web browsers already support desktop notifications."]}),"\n",(0,s.jsx)(t.li,{children:"If the newly requested package offers no functionality above that of an alternative already in the repositories, it will very likely be rejected. \u201cIt\u2019s pretty\u201d is never a sufficient reason."}),"\n",(0,s.jsx)(t.li,{children:"If the requested package is curated towards, or developed with the intent to work on, a specific operating system, it will very likely be rejected. This includes packages which require libraries that are built with the intent to work on a specific operating system."}),"\n",(0,s.jsxs)(t.li,{children:["Likewise, when a new package offers a better alternative to an ",(0,s.jsx)(t.strong,{children:"existing"})," package, we should look to replace the old one with the new one, to ensure the repository is always deduplicating."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"rejection",children:"Rejection"}),"\n",(0,s.jsxs)(t.p,{children:["Solus Staff members reserve the right to permanently reject a package request without the need for further discussion once the rejection is issued. The limited time of contributors should be considered and respected, instead of dragging out and 'necromancing' old issues in a vain attempt to force inclusion of previously rejected software. In the event of any policy change, existing/expired package requests will NOT be reevaluated under new criteria as this would lead to an exponential growth in work upon every policy change, and is physically impossible to handle for a project of ",(0,s.jsx)(t.em,{children:"any"})," size."]})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>o});var s=i(67294);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9773],{7857:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var s=i(85893),r=i(11151);const n={title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},o="Package Inclusion Policy",a={id:"packaging/procedures/package-inclusion",title:"Package Inclusion Policy",description:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected.",source:"@site/docs/packaging/procedures/package-inclusion.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/package-inclusion",permalink:"/docs/packaging/procedures/package-inclusion",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/package-inclusion.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},sidebar:"packagingSidebar",previous:{title:"Maintainership",permalink:"/docs/packaging/procedures/maintainership"},next:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"}},l={},c=[{value:"Criteria",id:"criteria",level:2},{value:"Explicitly redistributable",id:"explicitly-redistributable",level:3},{value:"Server software",id:"server-software",level:3},{value:"Software age",id:"software-age",level:3},{value:"Stack complexity",id:"stack-complexity",level:3},{value:"Value-add",id:"value-add",level:3},{value:"Rejection",id:"rejection",level:2}];function d(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"package-inclusion-policy",children:"Package Inclusion Policy"})}),"\n",(0,s.jsx)(t.p,{children:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected."}),"\n",(0,s.jsx)(t.h2,{id:"criteria",children:"Criteria"}),"\n",(0,s.jsx)(t.h3,{id:"explicitly-redistributable",children:"Explicitly redistributable"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Software under a free software or open source software license, or license text which explicitly states that it is ",(0,s.jsx)(t.strong,{children:"permissible"})," to redistribute the software. We use the ",(0,s.jsx)(t.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"For anything that cannot be redistributed by Solus, there is the possibility for them to be provided as a Flatpak, for Third Party repository inclusion, however the Solus project is not responsible for flatpak or snap implementation of these items. These items should then fetch only at installation time, and not contain non distributable components."}),"\n",(0,s.jsx)(t.li,{children:"Solus supports both VCS (currently only git, this will expand) and traditional software sources (such as tarballs) for packages, equally."}),"\n",(0,s.jsxs)(t.li,{children:["Unless ",(0,s.jsx)(t.strong,{children:"absolutely unavoidable"}),", the sources for a package should be source, and not ",(0,s.jsx)(t.strong,{children:"binary, prebuilt"})," sources. Exceptions may be made in rare cases, such as stage1 bootstrap for a compiler, or requires custom components otherwise impossible to provide in Solus (patched libraries, etc.)"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"server-software",children:"Server software"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Mail servers such as Postfix, Dovecot, etc, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Solus does not provide a server operating system."]}),"\n",(0,s.jsxs)(t.li,{children:["Web servers and database daemons ",(0,s.jsx)(t.strong,{children:"are"})," eligible for inclusion, as they facilitate web developers to work locally."]}),"\n",(0,s.jsx)(t.li,{children:"Anything outside of these may be catered to by the usage of Docker, or other container technology. Thus, container technology must be supported by Solus to support access to ancillary cases."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"software-age",children:"Software age"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"DOA (dead-on-arrival) packages are generally rejected from Solus. However, they may be included at the discretion of the project, if they provide unique functionality."}),"\n",(0,s.jsx)(t.li,{children:"Projects with no tags/tarballs which lack traction, may be frozen until a suitable release is made. Tagging releases is an indicator for good release engineering practices."}),"\n",(0,s.jsxs)(t.li,{children:["Typically, we prefer ",(0,s.jsx)(t.strong,{children:"stable"})," tagged releases. However, this may be waived if:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The software has significant traction (i.e. prerelease)"}),"\n",(0,s.jsx)(t.li,{children:"A bug fix only exists beyond the latest stable release for a git source"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"stack-complexity",children:"Stack complexity"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Certain requests may tick all the boxes, but introduce a level of complexity or require a level of engagement not possible to balance for Solus Staff. Under certain situations, a request will be frozen until it has a dedicated maintainer."}),"\n",(0,s.jsx)(t.li,{children:"This extends to requests for full desktop environments. However, this does not extend to minor components like drop-in window managers or panels separate of a dependent stack (i.e. Awesome WM, tint2, etc.)"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"value-add",children:"Value-add"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A web wrapper which ",(0,s.jsx)(t.strong,{children:"adds value"}),", such as Discord, with the global push-to-talk shortcut, is eligible for inclusion."]}),"\n",(0,s.jsxs)(t.li,{children:["A web page wrapper, that adds ",(0,s.jsx)(t.strong,{children:"no further value"})," other than \u201cconvenient desktop shortcut\u201d or \u201ctray icon\u201d, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Web browsers already support desktop notifications."]}),"\n",(0,s.jsx)(t.li,{children:"If the newly requested package offers no functionality above that of an alternative already in the repositories, it will very likely be rejected. \u201cIt\u2019s pretty\u201d is never a sufficient reason."}),"\n",(0,s.jsx)(t.li,{children:"If the requested package is curated towards, or developed with the intent to work on, a specific operating system, it will very likely be rejected. This includes packages which require libraries that are built with the intent to work on a specific operating system."}),"\n",(0,s.jsxs)(t.li,{children:["Likewise, when a new package offers a better alternative to an ",(0,s.jsx)(t.strong,{children:"existing"})," package, we should look to replace the old one with the new one, to ensure the repository is always deduplicating."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"rejection",children:"Rejection"}),"\n",(0,s.jsxs)(t.p,{children:["Solus Staff members reserve the right to permanently reject a package request without the need for further discussion once the rejection is issued. The limited time of contributors should be considered and respected, instead of dragging out and 'necromancing' old issues in a vain attempt to force inclusion of previously rejected software. In the event of any policy change, existing/expired package requests will NOT be reevaluated under new criteria as this would lead to an exponential growth in work upon every policy change, and is physically impossible to handle for a project of ",(0,s.jsx)(t.em,{children:"any"})," size."]})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>o});var s=i(67294);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ce4855c1.731f708b.js b/assets/js/ce4855c1.2ba31148.js
similarity index 98%
rename from assets/js/ce4855c1.731f708b.js
rename to assets/js/ce4855c1.2ba31148.js
index ca31e7c23..cf99ec20b 100644
--- a/assets/js/ce4855c1.731f708b.js
+++ b/assets/js/ce4855c1.2ba31148.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3440],{66855:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={title:"Translation instructions",summary:"Instructions for translators"},o="Translation instructions",a={id:"packaging/translation-instructions",title:"Translation instructions",description:'Users will arrive here from the "Translation instructions" link on Transifex.',source:"@site/docs/packaging/translation-instructions.md",sourceDirName:"packaging",slug:"/packaging/translation-instructions",permalink:"/docs/packaging/translation-instructions",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/translation-instructions.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Translation instructions",summary:"Instructions for translators"},sidebar:"packagingSidebar",previous:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"},next:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Project specific instructions",id:"project-specific-instructions",level:2},{value:"Solus Mate Transition Tool",id:"solus-mate-transition-tool",level:3}];function u(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"translation-instructions",children:"Translation instructions"})}),"\n",(0,s.jsx)(e.p,{children:'Users will arrive here from the "Translation instructions" link on Transifex.'}),"\n",(0,s.jsxs)(e.p,{children:["Please join our ",(0,s.jsx)(e.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix rooms"})," if you have questions about our translation projects."]}),"\n",(0,s.jsx)(e.h2,{id:"project-specific-instructions",children:"Project specific instructions"}),"\n",(0,s.jsx)(e.h3,{id:"solus-mate-transition-tool",children:"Solus Mate Transition Tool"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.a,{href:"https://app.transifex.com/solus/solus-mate-transition-tool/",children:"Transifex project link"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:["Strings which include curly braces ",(0,s.jsx)(e.code,{children:"{ }"})," should be translated leaving the curly braces, ",(0,s.jsx)(e.em,{children:"and anything inside the braces"}),", untouched."]}),"\n",(0,s.jsxs)(e.li,{children:["Examples:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"{DE} Successfully installed, please reboot to continue."})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"{DE} Instalado exitosamente, reinicie para continuar."})}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Successfully Installed {}"})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Instalado exitosamente {}"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["Do not translate the following strings; leave them untouched:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Packagekit"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"XDG_SESSION_DESKTOP"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(e.li,{children:"If a string includes a new-line character, be sure to include it in the same place in the translation."}),"\n"]})]})}function d(n={}){const{wrapper:e}={...(0,i.a)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(u,{...n})}):u(n)}},11151:(n,e,t)=>{t.d(e,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(n){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(r.Provider,{value:e},n.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3440],{66855:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={title:"Translation instructions",summary:"Instructions for translators"},o="Translation instructions",a={id:"packaging/translation-instructions",title:"Translation instructions",description:'Users will arrive here from the "Translation instructions" link on Transifex.',source:"@site/docs/packaging/translation-instructions.md",sourceDirName:"packaging",slug:"/packaging/translation-instructions",permalink:"/docs/packaging/translation-instructions",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/translation-instructions.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Translation instructions",summary:"Instructions for translators"},sidebar:"packagingSidebar",previous:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"},next:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Project specific instructions",id:"project-specific-instructions",level:2},{value:"Solus Mate Transition Tool",id:"solus-mate-transition-tool",level:3}];function u(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"translation-instructions",children:"Translation instructions"})}),"\n",(0,s.jsx)(e.p,{children:'Users will arrive here from the "Translation instructions" link on Transifex.'}),"\n",(0,s.jsxs)(e.p,{children:["Please join our ",(0,s.jsx)(e.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix rooms"})," if you have questions about our translation projects."]}),"\n",(0,s.jsx)(e.h2,{id:"project-specific-instructions",children:"Project specific instructions"}),"\n",(0,s.jsx)(e.h3,{id:"solus-mate-transition-tool",children:"Solus Mate Transition Tool"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.a,{href:"https://app.transifex.com/solus/solus-mate-transition-tool/",children:"Transifex project link"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:["Strings which include curly braces ",(0,s.jsx)(e.code,{children:"{ }"})," should be translated leaving the curly braces, ",(0,s.jsx)(e.em,{children:"and anything inside the braces"}),", untouched."]}),"\n",(0,s.jsxs)(e.li,{children:["Examples:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"{DE} Successfully installed, please reboot to continue."})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"{DE} Instalado exitosamente, reinicie para continuar."})}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Successfully Installed {}"})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Instalado exitosamente {}"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["Do not translate the following strings; leave them untouched:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Packagekit"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"XDG_SESSION_DESKTOP"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(e.li,{children:"If a string includes a new-line character, be sure to include it in the same place in the translation."}),"\n"]})]})}function d(n={}){const{wrapper:e}={...(0,i.a)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(u,{...n})}):u(n)}},11151:(n,e,t)=>{t.d(e,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(n){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(r.Provider,{value:e},n.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/cec10a63.fc9527ff.js b/assets/js/cec10a63.af6f885d.js
similarity index 99%
rename from assets/js/cec10a63.fc9527ff.js
rename to assets/js/cec10a63.af6f885d.js
index 8c57fa33b..87ea0a615 100644
--- a/assets/js/cec10a63.fc9527ff.js
+++ b/assets/js/cec10a63.af6f885d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8422],{96928:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(85893),i=n(11151);const r={title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},o="Configuration",l={id:"user/editions/plasma/configuration",title:"Configuration",description:"Opening System Settings",source:"@site/docs/user/editions/plasma/configuration.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/configuration",permalink:"/docs/user/editions/plasma/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},sidebar:"userSidebar",previous:{title:"Plasma",permalink:"/docs/user/editions/plasma/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"}},d={},c=[{value:"Opening System Settings",id:"opening-system-settings",level:2},{value:"Date and time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Configuring default applications from System Settings",id:"configuring-default-applications-from-system-settings",level:3},{value:"Configuring default applications from the file manager",id:"configuring-default-applications-from-the-file-manager",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"Configuring keyboard layouts",id:"configuring-keyboard-layouts",level:3},{value:"Using IBus",id:"using-ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Network settings",id:"network-settings",level:2},{value:"Connecting to a hidden Wi-Fi network",id:"connecting-to-a-hidden-wi-fi-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Users",id:"users",level:2},{value:"Adding user accounts",id:"adding-user-accounts",level:3},{value:"Removing user accounts",id:"removing-user-accounts",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Customizing the desktop",id:"customizing-the-desktop",level:3},{value:"Virtual desktops",id:"virtual-desktops",level:2},{value:"Creating virtual desktops",id:"creating-virtual-desktops",level:3},{value:"Switching between virtual desktops",id:"switching-between-virtual-desktops",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(s.h2,{id:"opening-system-settings",children:"Opening System Settings"}),"\n",(0,t.jsx)(s.p,{children:"You can open the system settings in Solus Plasma using any of the following methods:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Application menu"}),(0,t.jsxs)(s.td,{children:["Open the application menu and go to ",(0,t.jsx)(s.strong,{children:"Settings"})," > ",(0,t.jsx)(s.strong,{children:"System Settings"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KRunner"}),(0,t.jsxs)(s.td,{children:["Press ",(0,t.jsx)(s.code,{children:"Alt + F2"})," or ",(0,t.jsx)(s.code,{children:"Alt + Space"}),", type ",(0,t.jsx)(s.code,{children:"systemsettings"}),", and press Enter"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Terminal"}),(0,t.jsxs)(s.td,{children:["Open a terminal window and execute ",(0,t.jsx)(s.code,{children:"systemsettings"})]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Regional Settings"})," > ",(0,t.jsx)(s.strong,{children:"Date and Time"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Configure the date and time of your system.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["If you want Solus to set the date and time automatically, select ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["If you want to set the date and time manually, clear the ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"})," checkbox, then use the available controls.\n",(0,t.jsx)(s.img,{alt:"Plasma date and time settings",src:n(46488).Z+"",width:"1022",height:"730"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Configure the time zone of your system.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Time Zone"})," tab."]}),"\n",(0,t.jsx)(s.li,{children:"Select a time zone from the list."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Customize how the time and date display in the bottom panel.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Right-click the digital clock widget on the bottom panel."}),"\n",(0,t.jsxs)(s.li,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure Digital Clock..."})]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-system-settings",children:"Configuring default applications from System Settings"}),"\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Applications"})," > ",(0,t.jsx)(s.strong,{children:"Default Applications"}),", then use the menus to select your preferred default applications."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Default applications",src:n(74995).Z+"",width:"1022",height:"731"})}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-the-file-manager",children:"Configuring default applications from the file manager"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open Dolphin."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Navigate to the folder that contains the file you want to open."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Right-click the file."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Context menu",src:n(9501).Z+"",width:"714",height:"456"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Go to ",(0,t.jsx)(s.strong,{children:"Open With"})," > ",(0,t.jsx)(s.strong,{children:"Other Application"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Choose Application"})," dialog appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Choose the application you want to use from the list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Remember application association for all files of type [file type]"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Choose application dialog",src:n(65400).Z+"",width:"373",height:"571"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Press ",(0,t.jsx)(s.code,{children:"Super + P"})," to access the screen layout settings."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Hardware"})," > ",(0,t.jsx)(s.strong,{children:"Display and Monitor"})," > ",(0,t.jsx)(s.strong,{children:"Display Configuration"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Select the display you want to configure."}),"\n",(0,t.jsxs)(s.li,{children:["Configure the available settings as needed.\n",(0,t.jsx)(s.img,{alt:"Screen settings available in Solus Plasma",src:n(56304).Z+"",width:"1021",height:"763"})]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-keyboard-layouts",children:"Configuring keyboard layouts"}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["If you need to input languages that do not use Latin characters (for example, Chinese or Japanese), ",(0,t.jsx)(s.a,{href:"#using-ibus",children:"use IBus instead"}),"."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Keyboard"})," > ",(0,t.jsx)(s.strong,{children:"Layouts"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The layouts screen appears.\n",(0,t.jsx)(s.img,{alt:"Keyboard layouts",src:n(52570).Z+"",width:"743",height:"728"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure layouts"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure keyboard layouts as you need."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To add a keyboard layout click ",(0,t.jsx)(s.strong,{children:"Add"}),", select a layout from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To remove a keyboard layout select a layout from the list and click ",(0,t.jsx)(s.strong,{children:"Remove"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To order the list of keyboard layouts, select a layout from the list, then use the ",(0,t.jsx)(s.strong,{children:"Move Up"})," and ",(0,t.jsx)(s.strong,{children:"Move Down"})," buttons to reorder the list."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Configure a keyboard shortcut to switch between layouts by using the options under ",(0,t.jsx)(s.strong,{children:"Shortcuts for Switching Layout"}),"."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To use the default shortcuts Solus Plasma provides, use the ",(0,t.jsx)(s.strong,{children:"Main shortcuts"})," and ",(0,t.jsx)(s.strong,{children:"3rd level shortcuts"})," options."]}),"\n",(0,t.jsxs)(s.li,{children:["To use a custom shortcut, use the ",(0,t.jsx)(s.strong,{children:"Alternative shortcut"})," option."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"using-ibus",children:"Using IBus"}),"\n",(0,t.jsx)(s.p,{children:"Solus Plasma includes IBus installed by default. However, you need to enable and integrate IBus with Plasma before usage."}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Using IBus overrides the configuration in the ",(0,t.jsx)(s.strong,{children:"Layouts"})," section of ",(0,t.jsx)(s.strong,{children:"System Settings"})]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open the ",(0,t.jsx)(s.code,{children:"/home/[username]/.bashrc"})," file with a text editor."]}),"\n",(0,t.jsx)(s.li,{children:"Add the following lines at the end of the file."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"export GTK_IM_MODULE=ibus\nexport QT_IM_MODULE=ibus\nexport XMODIFIERS=@im=ibus\n"})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Save the file."}),"\n",(0,t.jsxs)(s.li,{children:["Configure IBus to autostart.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Startup and Shutdown"})," > ",(0,t.jsx)(s.strong,{children:"Autostart"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),", then ",(0,t.jsx)(s.strong,{children:"Add Application"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["In the search box, enter ",(0,t.jsx)(s.code,{children:"ibus-daemon -rxR"})," and press ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Log out from your session, then log in again."}),"\n",(0,t.jsxs)(s.li,{children:["Configure keyboard layouts as you need.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open ",(0,t.jsx)(s.strong,{children:"IBus Preferences"})," from the application launcher."]}),"\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.strong,{children:"Input Method"})," tab, add the keyboard layout you need."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Some keyboard layouts require ",(0,t.jsx)(s.a,{href:"/docs/user/software/localization/ibus",children:"installing additional packages"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to the appropriate configuration screen:","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To configure the mouse, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Mouse"}),".\n",(0,t.jsx)(s.img,{alt:"Mouse settings",src:n(70080).Z+"",width:"749",height:"343"})]}),"\n",(0,t.jsxs)(s.li,{children:["To configure the touchpad, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Touchpad"}),".\n",(0,t.jsx)(s.img,{alt:"Touchpad settings",src:n(95387).Z+"",width:"748",height:"591"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"network-settings",children:"Network settings"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Networks"})," widget on the bottom panel allows you to perform frequent networking tasks, such as connecting to a Wi-Fi network or enabling airplane mode."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Networks widget",src:n(80253).Z+"",width:"460",height:"489"})}),"\n",(0,t.jsx)(s.h3,{id:"connecting-to-a-hidden-wi-fi-network",children:"Connecting to a hidden Wi-Fi network"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"System Settings"})," screen, go to ",(0,t.jsx)(s.strong,{children:"Network"})," > ",(0,t.jsx)(s.strong,{children:"Connections"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Add new connection"})," icon (+)."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Wi-Fi"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"New Connection"})," window appears.\n",(0,t.jsx)(s.img,{alt:"New connection settings",src:n(98991).Z+"",width:"651",height:"656"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi"})," tab, specify the name (SSID) and basic network settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi Security"})," tab, configure the password or other authentication settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Use the ",(0,t.jsx)(s.strong,{children:"IPv4"}),", ",(0,t.jsx)(s.strong,{children:"IPv6"})," and ",(0,t.jsx)(s.strong,{children:"General configuration"})," tabs to configure additional settings, such as DNS servers."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Save"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Audio Volume widget",src:n(14781).Z+"",width:"497",height:"489"})}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Audio Volume"})," widget on the bottom panel allows you to perform the following tasks:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Task"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active output device"}),(0,t.jsx)(s.td,{children:"Select any of the available output devices to change the active output device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active input device"}),(0,t.jsx)(s.td,{children:"Select any of the available input devices to change the active input device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Control the volume of a device"}),(0,t.jsx)(s.td,{children:"Use the sliders to adjust the master volume of an input/output device."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Adjust the volume for a specific app"}),(0,t.jsxs)(s.td,{children:["The ",(0,t.jsx)(s.strong,{children:"Volume"})," tab allows you to control the volume for a specific application."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Open the audio settings"}),(0,t.jsxs)(s.td,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Configure Audio Devices"})," button to open the audio configuration screen in System Settings."]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(s.h3,{id:"adding-user-accounts",children:"Adding user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add New User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure the necessary settings."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Add user account",src:n(69367).Z+"",width:"752",height:"731"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Authentication Required"})," window appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Specify your user password and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"removing-user-accounts",children:"Removing user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Select an account from the user list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Delete User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["To delete the the user account files, select ",(0,t.jsx)(s.strong,{children:"Delete files"}),"; to keep the files for posterior use, select ",(0,t.jsx)(s.strong,{children:"Keep files"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keep or delete user files",src:n(49300).Z+"",width:"671",height:"525"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(s.h3,{id:"customizing-the-desktop",children:"Customizing the desktop"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen allows you to customize various aspects of your desktop, such as the wallpaper and the desktop icons. To open ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen, right-click anywhere on the desktop and select ",(0,t.jsx)(s.strong,{children:"Configure Desktop and Wallpaper..."}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Desktop context menu",src:n(53004).Z+"",width:"537",height:"355"})}),"\n",(0,t.jsxs)(s.p,{children:["The following table describes how to customize the desktop using the ",(0,t.jsx)(s.strong,{children:"Desktop Folder Settings"})," screen."]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Section"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the wallpaper"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, choose an image from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Hide the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, change ",(0,t.jsx)(s.strong,{children:"Layout"})," to ",(0,t.jsx)(s.strong,{children:"Desktop"}),", and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Configure mouse gestures"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Mouse Actions"})," section to setup mouse gestures."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the folder displayed on the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Location"})," section, select a location in your system, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the appearance of the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Icons"})," section, configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Display only specific files in the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Filter"})," section,configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]})]})]}),"\n",(0,t.jsx)(s.admonition,{type:"info",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Icons"})," and ",(0,t.jsx)(s.strong,{children:"Location"})," are only available when the desktop layout is set to ",(0,t.jsx)(s.strong,{children:"Folder View"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"virtual-desktops",children:"Virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"Plasma allows you to have multiple desktops on your computer."}),"\n",(0,t.jsx)(s.p,{children:"Virtual desktops are helpful to keep tasks organized and avoid clutter. For example, you could have one virtual desktop for work, one for school, and one for personal use."}),"\n",(0,t.jsx)(s.p,{children:"Plasma arranges virtual desktops in a grid. You can configure the rows of the grid to suit your needs."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Solus Plasma has one virtual desktop and one row by default."})}),"\n",(0,t.jsx)(s.h3,{id:"creating-virtual-desktops",children:"Creating virtual desktops"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Workspace Behavior"})," > ",(0,t.jsx)(s.strong,{children:"Virtual Desktops"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Define the number of rows in the grid."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Create a new virtual desktop."}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Click the ",(0,t.jsx)(s.strong,{children:"Rename"})," button to change the name of the virtual desktop."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Repeat the previous step to add multiple virtual desktops."}),"\n",(0,t.jsx)(s.admonition,{type:"caution",children:(0,t.jsx)(s.p,{children:"Plasma arranges the desktops by the rows automatically."})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"(Optional) Configure the behavior of the virtual desktops."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Navigation wraps around"}),": Lets you cycle through your virtual desktops in a loop using keyboard shortcuts or mouse gestures."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show animation when switching"}),": Displays animations when switching between virtual desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show on-screen display when switching"}),": Displays the name of the current desktop when switching between desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show desktop layout indicators"}),": Displays the virtual desktop grid when you switch between desktops."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Plasma displays the virtual desktop grid next to the application launcher button.\n",(0,t.jsx)(s.img,{alt:"Virtual desktop grid",src:n(86582).Z+"",width:"375",height:"325"})]})}),"\n",(0,t.jsx)(s.h3,{id:"switching-between-virtual-desktops",children:"Switching between virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"The following table outlines the methods to change between desktops in Solus Plasma."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using the applet in the bottom panel"}),(0,t.jsx)(s.td,{children:"Use the the virtual desktop grid next to the application launcher button to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using mouse gestures"}),(0,t.jsx)(s.td,{children:"Move the mouse pointer anywhere in the desktop, then move the mouse wheel to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using keyboard shortcuts"}),(0,t.jsxs)(s.td,{children:["Open System Settings, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Shortcuts"})," > ",(0,t.jsx)(s.strong,{children:"KWin"}),", then search for ",(0,t.jsx)(s.code,{children:"desktop"})," to see the available keyboard shortcuts to switch between virtual desktops"]})]})]})]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keyboard shortcuts to switch between desktops",src:n(79834).Z+"",width:"1150",height:"859"})}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Some of the keyboard shortcuts are disabled by default."})})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},69367:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/add-user-account-1e83f41522d5b43ae2f29250e52bb758.png"},14781:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/audio-widget-48a0e65d8e699ad8ca493a1e2dfcfb10.png"},65400:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/choose-application-f3747627db0cff378d7192b6c7b253f0.png"},46488:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/date-time-9e18cbfa859270a81d6973cab14ae1b6.png"},74995:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/default-apps-screen-3da638bbc4ab452b8242fb718543a132.png"},53004:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/desktop-context-menu-2a7196d846dab6acdff78dacb64b3fd6.png"},9501:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/file-context-menu-default-app-0816ad4ab5c64beeef9817dad6cbaeb7.png"},49300:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keep-delete-files-9a5622ed38b6dd5a1002312f0a7a01cd.png"},52570:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keyboard-layouts-468ec6547841069b372a81ef4120a67b.png"},70080:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/mouse-settings-0ec1470b23397d7d0aba492f1f4806fe.png"},80253:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/networks-widget-5446dcc803349c7a20e445393930a00a.png"},98991:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/new-wifi-network-b1c4e7f299993318ae998c66b217fa69.png"},56304:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/screen-configuration-2fd6ef5f5d7a1d590ae67d553f6f58c9.png"},79834:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/switch-desktop-shortcut-list-8b9812e81259bd41b56730a22d11728b.png"},95387:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/touchpad-settings-71fa3d9caf82f2103b978f12bf73a5be.png"},86582:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/vd-grid-bb98a6b6492fe334b36271eac65b4acb.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>o});var t=n(67294);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8422],{96928:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(85893),i=n(11151);const r={title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},o="Configuration",l={id:"user/editions/plasma/configuration",title:"Configuration",description:"Opening System Settings",source:"@site/docs/user/editions/plasma/configuration.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/configuration",permalink:"/docs/user/editions/plasma/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},sidebar:"userSidebar",previous:{title:"Plasma",permalink:"/docs/user/editions/plasma/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"}},d={},c=[{value:"Opening System Settings",id:"opening-system-settings",level:2},{value:"Date and time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Configuring default applications from System Settings",id:"configuring-default-applications-from-system-settings",level:3},{value:"Configuring default applications from the file manager",id:"configuring-default-applications-from-the-file-manager",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"Configuring keyboard layouts",id:"configuring-keyboard-layouts",level:3},{value:"Using IBus",id:"using-ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Network settings",id:"network-settings",level:2},{value:"Connecting to a hidden Wi-Fi network",id:"connecting-to-a-hidden-wi-fi-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Users",id:"users",level:2},{value:"Adding user accounts",id:"adding-user-accounts",level:3},{value:"Removing user accounts",id:"removing-user-accounts",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Customizing the desktop",id:"customizing-the-desktop",level:3},{value:"Virtual desktops",id:"virtual-desktops",level:2},{value:"Creating virtual desktops",id:"creating-virtual-desktops",level:3},{value:"Switching between virtual desktops",id:"switching-between-virtual-desktops",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(s.h2,{id:"opening-system-settings",children:"Opening System Settings"}),"\n",(0,t.jsx)(s.p,{children:"You can open the system settings in Solus Plasma using any of the following methods:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Application menu"}),(0,t.jsxs)(s.td,{children:["Open the application menu and go to ",(0,t.jsx)(s.strong,{children:"Settings"})," > ",(0,t.jsx)(s.strong,{children:"System Settings"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KRunner"}),(0,t.jsxs)(s.td,{children:["Press ",(0,t.jsx)(s.code,{children:"Alt + F2"})," or ",(0,t.jsx)(s.code,{children:"Alt + Space"}),", type ",(0,t.jsx)(s.code,{children:"systemsettings"}),", and press Enter"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Terminal"}),(0,t.jsxs)(s.td,{children:["Open a terminal window and execute ",(0,t.jsx)(s.code,{children:"systemsettings"})]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Regional Settings"})," > ",(0,t.jsx)(s.strong,{children:"Date and Time"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Configure the date and time of your system.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["If you want Solus to set the date and time automatically, select ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["If you want to set the date and time manually, clear the ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"})," checkbox, then use the available controls.\n",(0,t.jsx)(s.img,{alt:"Plasma date and time settings",src:n(46488).Z+"",width:"1022",height:"730"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Configure the time zone of your system.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Time Zone"})," tab."]}),"\n",(0,t.jsx)(s.li,{children:"Select a time zone from the list."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Customize how the time and date display in the bottom panel.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Right-click the digital clock widget on the bottom panel."}),"\n",(0,t.jsxs)(s.li,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure Digital Clock..."})]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-system-settings",children:"Configuring default applications from System Settings"}),"\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Applications"})," > ",(0,t.jsx)(s.strong,{children:"Default Applications"}),", then use the menus to select your preferred default applications."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Default applications",src:n(74995).Z+"",width:"1022",height:"731"})}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-the-file-manager",children:"Configuring default applications from the file manager"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open Dolphin."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Navigate to the folder that contains the file you want to open."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Right-click the file."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Context menu",src:n(9501).Z+"",width:"714",height:"456"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Go to ",(0,t.jsx)(s.strong,{children:"Open With"})," > ",(0,t.jsx)(s.strong,{children:"Other Application"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Choose Application"})," dialog appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Choose the application you want to use from the list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Remember application association for all files of type [file type]"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Choose application dialog",src:n(65400).Z+"",width:"373",height:"571"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Press ",(0,t.jsx)(s.code,{children:"Super + P"})," to access the screen layout settings."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Hardware"})," > ",(0,t.jsx)(s.strong,{children:"Display and Monitor"})," > ",(0,t.jsx)(s.strong,{children:"Display Configuration"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Select the display you want to configure."}),"\n",(0,t.jsxs)(s.li,{children:["Configure the available settings as needed.\n",(0,t.jsx)(s.img,{alt:"Screen settings available in Solus Plasma",src:n(56304).Z+"",width:"1021",height:"763"})]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-keyboard-layouts",children:"Configuring keyboard layouts"}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["If you need to input languages that do not use Latin characters (for example, Chinese or Japanese), ",(0,t.jsx)(s.a,{href:"#using-ibus",children:"use IBus instead"}),"."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Keyboard"})," > ",(0,t.jsx)(s.strong,{children:"Layouts"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The layouts screen appears.\n",(0,t.jsx)(s.img,{alt:"Keyboard layouts",src:n(52570).Z+"",width:"743",height:"728"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure layouts"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure keyboard layouts as you need."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To add a keyboard layout click ",(0,t.jsx)(s.strong,{children:"Add"}),", select a layout from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To remove a keyboard layout select a layout from the list and click ",(0,t.jsx)(s.strong,{children:"Remove"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To order the list of keyboard layouts, select a layout from the list, then use the ",(0,t.jsx)(s.strong,{children:"Move Up"})," and ",(0,t.jsx)(s.strong,{children:"Move Down"})," buttons to reorder the list."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Configure a keyboard shortcut to switch between layouts by using the options under ",(0,t.jsx)(s.strong,{children:"Shortcuts for Switching Layout"}),"."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To use the default shortcuts Solus Plasma provides, use the ",(0,t.jsx)(s.strong,{children:"Main shortcuts"})," and ",(0,t.jsx)(s.strong,{children:"3rd level shortcuts"})," options."]}),"\n",(0,t.jsxs)(s.li,{children:["To use a custom shortcut, use the ",(0,t.jsx)(s.strong,{children:"Alternative shortcut"})," option."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"using-ibus",children:"Using IBus"}),"\n",(0,t.jsx)(s.p,{children:"Solus Plasma includes IBus installed by default. However, you need to enable and integrate IBus with Plasma before usage."}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Using IBus overrides the configuration in the ",(0,t.jsx)(s.strong,{children:"Layouts"})," section of ",(0,t.jsx)(s.strong,{children:"System Settings"})]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open the ",(0,t.jsx)(s.code,{children:"/home/[username]/.bashrc"})," file with a text editor."]}),"\n",(0,t.jsx)(s.li,{children:"Add the following lines at the end of the file."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"export GTK_IM_MODULE=ibus\nexport QT_IM_MODULE=ibus\nexport XMODIFIERS=@im=ibus\n"})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Save the file."}),"\n",(0,t.jsxs)(s.li,{children:["Configure IBus to autostart.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Startup and Shutdown"})," > ",(0,t.jsx)(s.strong,{children:"Autostart"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),", then ",(0,t.jsx)(s.strong,{children:"Add Application"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["In the search box, enter ",(0,t.jsx)(s.code,{children:"ibus-daemon -rxR"})," and press ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Log out from your session, then log in again."}),"\n",(0,t.jsxs)(s.li,{children:["Configure keyboard layouts as you need.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open ",(0,t.jsx)(s.strong,{children:"IBus Preferences"})," from the application launcher."]}),"\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.strong,{children:"Input Method"})," tab, add the keyboard layout you need."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Some keyboard layouts require ",(0,t.jsx)(s.a,{href:"/docs/user/software/localization/ibus",children:"installing additional packages"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to the appropriate configuration screen:","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To configure the mouse, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Mouse"}),".\n",(0,t.jsx)(s.img,{alt:"Mouse settings",src:n(70080).Z+"",width:"749",height:"343"})]}),"\n",(0,t.jsxs)(s.li,{children:["To configure the touchpad, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Touchpad"}),".\n",(0,t.jsx)(s.img,{alt:"Touchpad settings",src:n(95387).Z+"",width:"748",height:"591"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"network-settings",children:"Network settings"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Networks"})," widget on the bottom panel allows you to perform frequent networking tasks, such as connecting to a Wi-Fi network or enabling airplane mode."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Networks widget",src:n(80253).Z+"",width:"460",height:"489"})}),"\n",(0,t.jsx)(s.h3,{id:"connecting-to-a-hidden-wi-fi-network",children:"Connecting to a hidden Wi-Fi network"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"System Settings"})," screen, go to ",(0,t.jsx)(s.strong,{children:"Network"})," > ",(0,t.jsx)(s.strong,{children:"Connections"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Add new connection"})," icon (+)."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Wi-Fi"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"New Connection"})," window appears.\n",(0,t.jsx)(s.img,{alt:"New connection settings",src:n(98991).Z+"",width:"651",height:"656"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi"})," tab, specify the name (SSID) and basic network settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi Security"})," tab, configure the password or other authentication settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Use the ",(0,t.jsx)(s.strong,{children:"IPv4"}),", ",(0,t.jsx)(s.strong,{children:"IPv6"})," and ",(0,t.jsx)(s.strong,{children:"General configuration"})," tabs to configure additional settings, such as DNS servers."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Save"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Audio Volume widget",src:n(14781).Z+"",width:"497",height:"489"})}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Audio Volume"})," widget on the bottom panel allows you to perform the following tasks:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Task"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active output device"}),(0,t.jsx)(s.td,{children:"Select any of the available output devices to change the active output device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active input device"}),(0,t.jsx)(s.td,{children:"Select any of the available input devices to change the active input device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Control the volume of a device"}),(0,t.jsx)(s.td,{children:"Use the sliders to adjust the master volume of an input/output device."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Adjust the volume for a specific app"}),(0,t.jsxs)(s.td,{children:["The ",(0,t.jsx)(s.strong,{children:"Volume"})," tab allows you to control the volume for a specific application."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Open the audio settings"}),(0,t.jsxs)(s.td,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Configure Audio Devices"})," button to open the audio configuration screen in System Settings."]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(s.h3,{id:"adding-user-accounts",children:"Adding user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add New User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure the necessary settings."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Add user account",src:n(69367).Z+"",width:"752",height:"731"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Authentication Required"})," window appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Specify your user password and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"removing-user-accounts",children:"Removing user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Select an account from the user list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Delete User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["To delete the the user account files, select ",(0,t.jsx)(s.strong,{children:"Delete files"}),"; to keep the files for posterior use, select ",(0,t.jsx)(s.strong,{children:"Keep files"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keep or delete user files",src:n(49300).Z+"",width:"671",height:"525"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(s.h3,{id:"customizing-the-desktop",children:"Customizing the desktop"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen allows you to customize various aspects of your desktop, such as the wallpaper and the desktop icons. To open ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen, right-click anywhere on the desktop and select ",(0,t.jsx)(s.strong,{children:"Configure Desktop and Wallpaper..."}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Desktop context menu",src:n(53004).Z+"",width:"537",height:"355"})}),"\n",(0,t.jsxs)(s.p,{children:["The following table describes how to customize the desktop using the ",(0,t.jsx)(s.strong,{children:"Desktop Folder Settings"})," screen."]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Section"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the wallpaper"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, choose an image from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Hide the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, change ",(0,t.jsx)(s.strong,{children:"Layout"})," to ",(0,t.jsx)(s.strong,{children:"Desktop"}),", and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Configure mouse gestures"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Mouse Actions"})," section to setup mouse gestures."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the folder displayed on the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Location"})," section, select a location in your system, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the appearance of the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Icons"})," section, configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Display only specific files in the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Filter"})," section,configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]})]})]}),"\n",(0,t.jsx)(s.admonition,{type:"info",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Icons"})," and ",(0,t.jsx)(s.strong,{children:"Location"})," are only available when the desktop layout is set to ",(0,t.jsx)(s.strong,{children:"Folder View"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"virtual-desktops",children:"Virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"Plasma allows you to have multiple desktops on your computer."}),"\n",(0,t.jsx)(s.p,{children:"Virtual desktops are helpful to keep tasks organized and avoid clutter. For example, you could have one virtual desktop for work, one for school, and one for personal use."}),"\n",(0,t.jsx)(s.p,{children:"Plasma arranges virtual desktops in a grid. You can configure the rows of the grid to suit your needs."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Solus Plasma has one virtual desktop and one row by default."})}),"\n",(0,t.jsx)(s.h3,{id:"creating-virtual-desktops",children:"Creating virtual desktops"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Workspace Behavior"})," > ",(0,t.jsx)(s.strong,{children:"Virtual Desktops"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Define the number of rows in the grid."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Create a new virtual desktop."}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Click the ",(0,t.jsx)(s.strong,{children:"Rename"})," button to change the name of the virtual desktop."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Repeat the previous step to add multiple virtual desktops."}),"\n",(0,t.jsx)(s.admonition,{type:"caution",children:(0,t.jsx)(s.p,{children:"Plasma arranges the desktops by the rows automatically."})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"(Optional) Configure the behavior of the virtual desktops."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Navigation wraps around"}),": Lets you cycle through your virtual desktops in a loop using keyboard shortcuts or mouse gestures."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show animation when switching"}),": Displays animations when switching between virtual desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show on-screen display when switching"}),": Displays the name of the current desktop when switching between desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show desktop layout indicators"}),": Displays the virtual desktop grid when you switch between desktops."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Plasma displays the virtual desktop grid next to the application launcher button.\n",(0,t.jsx)(s.img,{alt:"Virtual desktop grid",src:n(86582).Z+"",width:"375",height:"325"})]})}),"\n",(0,t.jsx)(s.h3,{id:"switching-between-virtual-desktops",children:"Switching between virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"The following table outlines the methods to change between desktops in Solus Plasma."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using the applet in the bottom panel"}),(0,t.jsx)(s.td,{children:"Use the the virtual desktop grid next to the application launcher button to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using mouse gestures"}),(0,t.jsx)(s.td,{children:"Move the mouse pointer anywhere in the desktop, then move the mouse wheel to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using keyboard shortcuts"}),(0,t.jsxs)(s.td,{children:["Open System Settings, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Shortcuts"})," > ",(0,t.jsx)(s.strong,{children:"KWin"}),", then search for ",(0,t.jsx)(s.code,{children:"desktop"})," to see the available keyboard shortcuts to switch between virtual desktops"]})]})]})]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keyboard shortcuts to switch between desktops",src:n(79834).Z+"",width:"1150",height:"859"})}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Some of the keyboard shortcuts are disabled by default."})})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},69367:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/add-user-account-1e83f41522d5b43ae2f29250e52bb758.png"},14781:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/audio-widget-48a0e65d8e699ad8ca493a1e2dfcfb10.png"},65400:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/choose-application-f3747627db0cff378d7192b6c7b253f0.png"},46488:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/date-time-9e18cbfa859270a81d6973cab14ae1b6.png"},74995:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/default-apps-screen-3da638bbc4ab452b8242fb718543a132.png"},53004:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/desktop-context-menu-2a7196d846dab6acdff78dacb64b3fd6.png"},9501:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/file-context-menu-default-app-0816ad4ab5c64beeef9817dad6cbaeb7.png"},49300:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keep-delete-files-9a5622ed38b6dd5a1002312f0a7a01cd.png"},52570:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keyboard-layouts-468ec6547841069b372a81ef4120a67b.png"},70080:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/mouse-settings-0ec1470b23397d7d0aba492f1f4806fe.png"},80253:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/networks-widget-5446dcc803349c7a20e445393930a00a.png"},98991:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/new-wifi-network-b1c4e7f299993318ae998c66b217fa69.png"},56304:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/screen-configuration-2fd6ef5f5d7a1d590ae67d553f6f58c9.png"},79834:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/switch-desktop-shortcut-list-8b9812e81259bd41b56730a22d11728b.png"},95387:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/touchpad-settings-71fa3d9caf82f2103b978f12bf73a5be.png"},86582:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/vd-grid-bb98a6b6492fe334b36271eac65b4acb.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>o});var t=n(67294);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d00f7e62.ec65eead.js b/assets/js/d00f7e62.5566e19e.js
similarity index 99%
rename from assets/js/d00f7e62.ec65eead.js
rename to assets/js/d00f7e62.5566e19e.js
index cf2bc642a..24a75eb29 100644
--- a/assets/js/d00f7e62.ec65eead.js
+++ b/assets/js/d00f7e62.5566e19e.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[255],{67868:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=a(85893),t=a(11151);const s={title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},i="Your First Package Update",r={id:"packaging/your-first-package-update",title:"Your First Package Update",description:"This page will guide you through the steps required to build your first package. This is really a test to make sure that your build environment is set up correctly. You will clone an existing package, build it, then install it, and finally remove it.",source:"@site/docs/packaging/your-first-package-update.md",sourceDirName:"packaging",slug:"/packaging/your-first-package-update",permalink:"/docs/packaging/your-first-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/your-first-package-update.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},sidebar:"packagingSidebar",previous:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Cloning and building nano
",id:"cloning-and-building-nano",level:2},{value:"Installing your new nano
package",id:"installing-your-new-nano-package",level:2},{value:"Returning to the repository version (optional)",id:"returning-to-the-repository-version-optional",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"your-first-package-update",children:"Your First Package Update"})}),"\n",(0,o.jsxs)(n.p,{children:["This page will guide you through the steps required to build your first package. This is really a test to make sure that your ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging",children:"build environment is set up correctly"}),". You will clone an existing package, build it, then install it, and finally remove it."]}),"\n",(0,o.jsxs)(n.h2,{id:"cloning-and-building-nano",children:["Cloning and building ",(0,o.jsx)(n.code,{children:"nano"})]}),"\n",(0,o.jsxs)(n.p,{children:["For this example we will use the text editor ",(0,o.jsx)(n.code,{children:"nano"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Change to your packaging directory. Your directory may have a different name or location:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Switch to the directory containing the ",(0,o.jsx)(n.code,{children:"nano"})," recipe:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd packages/n/nano\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, if you've set up the ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"Monorepo Helper Functions"})," you can replace the above to steps by these simple commands",":n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"gotosoluspkgs\ngotopkg nano\n"})}),"\n",(0,o.jsx)(n.p,{children:'Increase the release number by one ("bump" the package) and then check the results:'}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task bump\ngit diff\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see output from git similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-diff",children:"diff --git a/package.yml b/package.yml\nindex 2ff1756..4bc344c 100644\n--- a/package.yml\n+++ b/package.yml\n@@ -1,6 +1,6 @@\n name : nano\n version : '7.2'\n-release : 161\n+release : 162\n source :\n - https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526\n homepage : https://www.nano-editor.org\n"})}),"\n",(0,o.jsx)(n.p,{children:"Next, build the package:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You will be prompted to enter your password by sudo, and the ",(0,o.jsx)(n.code,{children:"solbuild"})," tool will build the package.\nIf the build is successful, you will have a ",(0,o.jsx)(n.code,{children:"nano"})," package file with a name like ",(0,o.jsx)(n.code,{children:"nano-7.2-161-1-x86_64.eopkg"}),". Run the ",(0,o.jsx)(n.code,{children:"ls"})," tool to check the exact name:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ ls\nabi_used_libs files package.yml\nabi_used_symbols nano-7.2-162-1-x86_64.eopkg pspec_x86_64.xml\n"})}),"\n",(0,o.jsx)(n.p,{children:"Congratulations! You have successfully built your first package on Solus."}),"\n",(0,o.jsxs)(n.h2,{id:"installing-your-new-nano-package",children:["Installing your new ",(0,o.jsx)(n.code,{children:"nano"})," package"]}),"\n",(0,o.jsxs)(n.p,{children:["To install your new ",(0,o.jsx)(n.code,{children:"nano"})," package, run the following command. Your filename will probably be slightly different."]}),"\n",(0,o.jsx)(n.p,{children:"This is done so you can test that the package works as expected. Each package submission will require you to describe what testing you did."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it nano-7.2-162-1-x86_64.eopkg\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Testing ",(0,o.jsx)(n.code,{children:"nano"})," is pretty easy. Testing other packages may be more complicated, depending on what they do."]}),"\n",(0,o.jsxs)(n.p,{children:["To test your newly built ",(0,o.jsx)(n.code,{children:"nano"})," package, simply run it on command line, then make sure you can edit and save a file."]}),"\n",(0,o.jsx)(n.h2,{id:"returning-to-the-repository-version-optional",children:"Returning to the repository version (optional)"}),"\n",(0,o.jsx)(n.p,{children:"It is a good idea to remove the package you built, and return to the repository version, once you are done testing."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it --reinstall nano\n"})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>i});var o=a(67294);const t={},s=o.createContext(t);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[255],{67868:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=a(85893),t=a(11151);const s={title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},i="Your First Package Update",r={id:"packaging/your-first-package-update",title:"Your First Package Update",description:"This page will guide you through the steps required to build your first package. This is really a test to make sure that your build environment is set up correctly. You will clone an existing package, build it, then install it, and finally remove it.",source:"@site/docs/packaging/your-first-package-update.md",sourceDirName:"packaging",slug:"/packaging/your-first-package-update",permalink:"/docs/packaging/your-first-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/your-first-package-update.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},sidebar:"packagingSidebar",previous:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Cloning and building nano
",id:"cloning-and-building-nano",level:2},{value:"Installing your new nano
package",id:"installing-your-new-nano-package",level:2},{value:"Returning to the repository version (optional)",id:"returning-to-the-repository-version-optional",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"your-first-package-update",children:"Your First Package Update"})}),"\n",(0,o.jsxs)(n.p,{children:["This page will guide you through the steps required to build your first package. This is really a test to make sure that your ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging",children:"build environment is set up correctly"}),". You will clone an existing package, build it, then install it, and finally remove it."]}),"\n",(0,o.jsxs)(n.h2,{id:"cloning-and-building-nano",children:["Cloning and building ",(0,o.jsx)(n.code,{children:"nano"})]}),"\n",(0,o.jsxs)(n.p,{children:["For this example we will use the text editor ",(0,o.jsx)(n.code,{children:"nano"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Change to your packaging directory. Your directory may have a different name or location:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Switch to the directory containing the ",(0,o.jsx)(n.code,{children:"nano"})," recipe:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd packages/n/nano\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, if you've set up the ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"Monorepo Helper Functions"})," you can replace the above to steps by these simple commands",":n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"gotosoluspkgs\ngotopkg nano\n"})}),"\n",(0,o.jsx)(n.p,{children:'Increase the release number by one ("bump" the package) and then check the results:'}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task bump\ngit diff\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see output from git similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-diff",children:"diff --git a/package.yml b/package.yml\nindex 2ff1756..4bc344c 100644\n--- a/package.yml\n+++ b/package.yml\n@@ -1,6 +1,6 @@\n name : nano\n version : '7.2'\n-release : 161\n+release : 162\n source :\n - https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526\n homepage : https://www.nano-editor.org\n"})}),"\n",(0,o.jsx)(n.p,{children:"Next, build the package:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You will be prompted to enter your password by sudo, and the ",(0,o.jsx)(n.code,{children:"solbuild"})," tool will build the package.\nIf the build is successful, you will have a ",(0,o.jsx)(n.code,{children:"nano"})," package file with a name like ",(0,o.jsx)(n.code,{children:"nano-7.2-161-1-x86_64.eopkg"}),". Run the ",(0,o.jsx)(n.code,{children:"ls"})," tool to check the exact name:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ ls\nabi_used_libs files package.yml\nabi_used_symbols nano-7.2-162-1-x86_64.eopkg pspec_x86_64.xml\n"})}),"\n",(0,o.jsx)(n.p,{children:"Congratulations! You have successfully built your first package on Solus."}),"\n",(0,o.jsxs)(n.h2,{id:"installing-your-new-nano-package",children:["Installing your new ",(0,o.jsx)(n.code,{children:"nano"})," package"]}),"\n",(0,o.jsxs)(n.p,{children:["To install your new ",(0,o.jsx)(n.code,{children:"nano"})," package, run the following command. Your filename will probably be slightly different."]}),"\n",(0,o.jsx)(n.p,{children:"This is done so you can test that the package works as expected. Each package submission will require you to describe what testing you did."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it nano-7.2-162-1-x86_64.eopkg\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Testing ",(0,o.jsx)(n.code,{children:"nano"})," is pretty easy. Testing other packages may be more complicated, depending on what they do."]}),"\n",(0,o.jsxs)(n.p,{children:["To test your newly built ",(0,o.jsx)(n.code,{children:"nano"})," package, simply run it on command line, then make sure you can edit and save a file."]}),"\n",(0,o.jsx)(n.h2,{id:"returning-to-the-repository-version-optional",children:"Returning to the repository version (optional)"}),"\n",(0,o.jsx)(n.p,{children:"It is a good idea to remove the package you built, and return to the repository version, once you are done testing."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it --reinstall nano\n"})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>i});var o=a(67294);const t={},s=o.createContext(t);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/d0d2faf6.63069d38.js b/assets/js/d0d2faf6.fce96d12.js
similarity index 98%
rename from assets/js/d0d2faf6.63069d38.js
rename to assets/js/d0d2faf6.fce96d12.js
index fafd67c80..b270b9a32 100644
--- a/assets/js/d0d2faf6.63069d38.js
+++ b/assets/js/d0d2faf6.fce96d12.js
@@ -1 +1 @@
-"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4507],{79267:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var t=a(85893),n=a(11151);const r={title:"Release Processes",summary:"Release Processes"},o="Release Processes",i={id:"packaging/procedures/release-processes",title:"Release Processes",description:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model.",source:"@site/docs/packaging/procedures/release-processes.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/release-processes",permalink:"/docs/packaging/procedures/release-processes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/release-processes.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Release Processes",summary:"Release Processes"},sidebar:"packagingSidebar",previous:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"},next:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"}},c={},l=[{value:"Repository staging",id:"repository-staging",level:2},{value:"Weekly Sync - Every Friday",id:"weekly-sync---every-friday",level:2},{value:"Package deprecation",id:"package-deprecation",level:2},{value:"Deprecating a package",id:"deprecating-a-package",level:3},{value:"Un-deprecating a package",id:"un-deprecating-a-package",level:3},{value:"Major stack changes",id:"major-stack-changes",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"release-processes",children:"Release Processes"})}),"\n",(0,t.jsx)(s.p,{children:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model."}),"\n",(0,t.jsx)(s.h2,{id:"repository-staging",children:"Repository staging"}),"\n",(0,t.jsxs)(s.p,{children:["All package builds for Solus, updates or otherwise, will always enter the ",(0,t.jsx)(s.code,{children:"unstable"})," repository first. Consequently, all Solus developers and contributors should ensure ",(0,t.jsx)(s.code,{children:"solbuild"})," is configured to use the unstable target. As and when the weekly stabilization efforts have completed, the ",(0,t.jsx)(s.code,{children:"unstable"})," repository will be pulled into ",(0,t.jsx)(s.code,{children:"shannon"}),", the stable target."]}),"\n",(0,t.jsxs)(s.p,{children:["This effectively means that ",(0,t.jsx)(s.code,{children:"shannon"})," is a rolling snapshot of ",(0,t.jsx)(s.code,{children:"unstable"}),". Note that the weekly sync will not make each repository match identically - the ",(0,t.jsx)(s.strong,{children:"tip"})," of every package in ",(0,t.jsx)(s.code,{children:"unstable"})," will be merged into ",(0,t.jsx)(s.code,{children:"shannon"}),". This ensures that the ",(0,t.jsx)(s.code,{children:"shannon"})," update path is cost-efficient in terms of package availability, and that the delta packages provided on ",(0,t.jsx)(s.code,{children:"shannon"})," match the true update path for those users. Lastly, this also ensures that there are no unintended packages arriving in shannon from older builds."]}),"\n",(0,t.jsxs)(s.p,{children:["Solus installations always default to the ",(0,t.jsx)(s.code,{children:"shannon"})," repository, making shannon the published distribution, and ",(0,t.jsx)(s.code,{children:"unstable"})," the development distribution."]}),"\n",(0,t.jsx)(s.h2,{id:"weekly-sync---every-friday",children:"Weekly Sync - Every Friday"}),"\n",(0,t.jsx)(s.p,{children:"At minimum there shall be one sync per week - this will always be on a Friday. As a result, users are never more than a few days away from unstable. This allows packagers to make deeper changes to Solus and still have time to stabilize the repository before releasing changes on the Friday."}),"\n",(0,t.jsxs)(s.p,{children:["Given the high volume of changes within Solus in any sync window, the Friday sync should be viewed more as a release than a simple sync. All developers and contributors should try their best to ensure that their changes do not introduce regressions, and that existing update paths are ",(0,t.jsx)(s.strong,{children:"always respected"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Minor syncs during the week, and correctional syncs shortly after the Friday-sync, are permitted assuming they do not introduce breaking changes to shannon. These may include minor packaging changes, security updates, etc."}),"\n",(0,t.jsx)(s.h2,{id:"package-deprecation",children:"Package deprecation"}),"\n",(0,t.jsx)(s.p,{children:"There are times when a package may need to be deprecated or even renamed. Packagers owning these changes must first communicate the need to ensure a coordinated deprecation."}),"\n",(0,t.jsxs)(s.p,{children:["Deprecated packages will remove themselves from the users systems as the first operation in an update or package install using the package manager, once marked as ",(0,t.jsx)(s.code,{children:"Obsolete"})," in the index."]}),"\n",(0,t.jsx)(s.h3,{id:"deprecating-a-package",children:"Deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"Follow these steps to submit a package for deprecation:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "deprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})]}),"\n",(0,t.jsxs)(s.li,{children:["Add the package you wish to deprecate at the end of the ",(0,t.jsx)(s.code,{children:"install.packages()
on Solus",id:"how-to-use-installpackages-on-solus",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"r-and-rstudio",children:"R and RStudio"})}),"\n",(0,s.jsx)(n.p,{children:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries."}),"\n",(0,s.jsx)(n.h2,{id:"downloading-r",children:"Downloading R"}),"\n",(0,s.jsxs)(n.p,{children:["It is recommended to download R before downloading RStudio. This can be accomplished easily in any of three ways.\n",(0,s.jsx)(n.strong,{children:"NOTE:"})," Both R and RStudio are available natively on Solus thanks to their amazing maintainers, it is not necessary to go to either software's respective website."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "R" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Programming"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"r"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it r"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"downloading-rstudio",children:"Downloading RStudio"}),"\n",(0,s.jsx)(n.p,{children:"The first step in setting up RStudio is to download and install it. This can be accomplished in the same ways as R in the prior step."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "RStudio" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Integrated Development Environments"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"RStudio"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it rstudio"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"how-to-use-installpackages-on-solus",children:["How to use ",(0,s.jsx)(n.code,{children:"install.packages()"})," on Solus"]}),"\n",(0,s.jsxs)(n.p,{children:["Unless you are only going to use base R functions, you will need to make use of ",(0,s.jsx)(n.code,{children:"install.packages()"})," within R to install additional libraries. To use this function you need to install certain development packages which vary depending on the library you are trying to enable within R."]}),"\n",(0,s.jsx)(n.p,{children:"On other Linux distros (like Debian, Ubuntu, and Fedora) this is accomplished through the installation of r-devel. However since Solus does not have an r-devel package these dependencies have to be installed through other means."}),"\n",(0,s.jsxs)(n.p,{children:["There are three main Solus packages that will include many of the dependencies required that allow you to install most CRAN packages. These are ",(0,s.jsx)(n.code,{children:"system.devel"}),", ",(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"system.devel"})," is a component containing several packages and can ",(0,s.jsx)(n.strong,{children:"ONLY"})," be installed from within a terminal by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it -c system.devel"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"})," can be found by searching in the ",(0,s.jsx)(n.strong,{children:"Software Center"})," or by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it curl-devel fontconfig-devel"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Once these two Solus packages are installed ",(0,s.jsx)(n.code,{children:"install.packages()"})," will work as usual within R for most packages like ",(0,s.jsx)(n.code,{children:"tidyverse"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you try to install a CRAN library with ",(0,s.jsx)(n.code,{children:"install.packages()"})," from within R and you are presented with an error that says ",(0,s.jsx)(n.code,{children:"...exited with non zero exit status"})," this is most likely because one of the required dependencies, ",(0,s.jsx)(n.em,{children:"which will be listed within the R console detailing the error"}),", is contained within a Solus devel package you have not yet installed."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(67294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6042],{28537:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var s=t(85893),o=t(11151);const i={title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},r="R and RStudio",l={id:"user/software/development/r-and-rstudio",title:"R and RStudio",description:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries.",source:"@site/docs/user/software/development/r-and-rstudio.md",sourceDirName:"user/software/development",slug:"/user/software/development/r-and-rstudio",permalink:"/docs/user/software/development/r-and-rstudio",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/r-and-rstudio.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},sidebar:"userSidebar",previous:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"},next:{title:"Rust",permalink:"/docs/user/software/development/rust"}},d={},a=[{value:"Downloading R",id:"downloading-r",level:2},{value:"Downloading RStudio",id:"downloading-rstudio",level:2},{value:"How to use install.packages()
on Solus",id:"how-to-use-installpackages-on-solus",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"r-and-rstudio",children:"R and RStudio"})}),"\n",(0,s.jsx)(n.p,{children:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries."}),"\n",(0,s.jsx)(n.h2,{id:"downloading-r",children:"Downloading R"}),"\n",(0,s.jsxs)(n.p,{children:["It is recommended to download R before downloading RStudio. This can be accomplished easily in any of three ways.\n",(0,s.jsx)(n.strong,{children:"NOTE:"})," Both R and RStudio are available natively on Solus thanks to their amazing maintainers, it is not necessary to go to either software's respective website."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "R" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Programming"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"r"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it r"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"downloading-rstudio",children:"Downloading RStudio"}),"\n",(0,s.jsx)(n.p,{children:"The first step in setting up RStudio is to download and install it. This can be accomplished in the same ways as R in the prior step."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "RStudio" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Integrated Development Environments"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"RStudio"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it rstudio"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"how-to-use-installpackages-on-solus",children:["How to use ",(0,s.jsx)(n.code,{children:"install.packages()"})," on Solus"]}),"\n",(0,s.jsxs)(n.p,{children:["Unless you are only going to use base R functions, you will need to make use of ",(0,s.jsx)(n.code,{children:"install.packages()"})," within R to install additional libraries. To use this function you need to install certain development packages which vary depending on the library you are trying to enable within R."]}),"\n",(0,s.jsx)(n.p,{children:"On other Linux distros (like Debian, Ubuntu, and Fedora) this is accomplished through the installation of r-devel. However since Solus does not have an r-devel package these dependencies have to be installed through other means."}),"\n",(0,s.jsxs)(n.p,{children:["There are three main Solus packages that will include many of the dependencies required that allow you to install most CRAN packages. These are ",(0,s.jsx)(n.code,{children:"system.devel"}),", ",(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"system.devel"})," is a component containing several packages and can ",(0,s.jsx)(n.strong,{children:"ONLY"})," be installed from within a terminal by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it -c system.devel"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"})," can be found by searching in the ",(0,s.jsx)(n.strong,{children:"Software Center"})," or by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it curl-devel fontconfig-devel"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Once these two Solus packages are installed ",(0,s.jsx)(n.code,{children:"install.packages()"})," will work as usual within R for most packages like ",(0,s.jsx)(n.code,{children:"tidyverse"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you try to install a CRAN library with ",(0,s.jsx)(n.code,{children:"install.packages()"})," from within R and you are presented with an error that says ",(0,s.jsx)(n.code,{children:"...exited with non zero exit status"})," this is most likely because one of the required dependencies, ",(0,s.jsx)(n.em,{children:"which will be listed within the R console detailing the error"}),", is contained within a Solus devel package you have not yet installed."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(67294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/fe13418f.ea789d98.js b/assets/js/fe13418f.ea789d98.js
new file mode 100644
index 000000000..950951398
--- /dev/null
+++ b/assets/js/fe13418f.ea789d98.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1182],{43900:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>r});var a=n(85893),l=n(11151);const o={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/blog/clean-clean-clean",source:"@site/devlog/2024-11-21-clean-cleanl-clean.md",title:"Clean, clean, clean!",description:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.",date:"2024-11-21T00:00:00.000Z",tags:[{inline:!0,label:"housekeeping",permalink:"/blog/tags/housekeeping"},{inline:!0,label:"cleanup",permalink:"/blog/tags/cleanup"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:5.585,hasTruncateMarker:!0,authors:[{name:"Muhammad Alfi Syahrin",title:"Solus Staff",page:{permalink:"/blog/authors/alfi"},socials:{github:"https://github.com/malfisya"},imageURL:"https://avatars.githubusercontent.com/u/101771435",key:"alfi"}],frontMatter:{title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"}},c={authorsImageUrls:[void 0]},r=[];function u(e){const t={p:"p",...(0,l.a)(),...e.components};return(0,a.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."})}function p(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>s});var a=n(67294);const l={},o=a.createContext(l);function s(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/main.30095a43.js b/assets/js/main.30095a43.js
deleted file mode 100644
index b763a7692..000000000
--- a/assets/js/main.30095a43.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.30095a43.js.LICENSE.txt */
-(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[179],{78179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(67294);var r=n(68356),o=n.n(r),a=n(16887);const i={"0058b4c6":[()=>n.e(4088).then(n.t.bind(n,66462,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",66462],"01a85c17":[()=>Promise.all([n.e(3312),n.e(4013)]).then(n.bind(n,53282)),"@theme/BlogTagsListPage",53282],"04b18502":[()=>n.e(1942).then(n.bind(n,37123)),"@site/docs/packaging/index.md",37123],"05767842":[()=>n.e(1606).then(n.t.bind(n,77755,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-joey-023.json",77755],"06758c2b":[()=>n.e(1073).then(n.t.bind(n,81885,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-optimization-150.json",81885],"080a8349":[()=>n.e(224).then(n.bind(n,92857)),"@site/docs/packaging/monitoring.yml.md",92857],"08bef15d":[()=>n.e(7228).then(n.bind(n,40846)),"@site/docs/user/privacy.md",40846],"09dbd43b":[()=>n.e(9397).then(n.bind(n,78118)),"@site/docs/user/troubleshooting/boot-rescue.md",78118],"0b254e3a":[()=>n.e(6726).then(n.bind(n,99528)),"@site/docs/packaging/updating-an-existing-package.md",99528],"0b85ec06":[()=>n.e(3398).then(n.t.bind(n,22844,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-pgo-777.json",22844],"0cfc9369":[()=>n.e(6025).then(n.t.bind(n,82504,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-lto-304.json",82504],"0e3c5e6b":[()=>n.e(4859).then(n.bind(n,5166)),"@site/docs/user/editions/plasma/index.md",5166],"0e862883":[()=>n.e(172).then(n.bind(n,24673)),"@site/docs/user/contributing/testing-an-iso.md",24673],"14488e92":[()=>n.e(4815).then(n.bind(n,93980)),"@site/docs/user/quick-start/default-applications.md",93980],"14eb3368":[()=>Promise.all([n.e(3312),n.e(9817)]).then(n.bind(n,31745)),"@theme/DocCategoryGeneratedIndexPage",31745],"156eae2c":[()=>n.e(8692).then(n.t.bind(n,92354,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-networking-814.json",92354],17896441:[()=>Promise.all([n.e(3312),n.e(6937),n.e(7918)]).then(n.bind(n,11095)),"@theme/DocItem",11095],"1a698c37":[()=>Promise.all([n.e(3323),n.e(8917),n.e(6126)]).then(n.bind(n,99870)),"@site/docs/user/editions/index.mdx",99870],"1ae709a2":[()=>n.e(355).then(n.bind(n,49332)),"@site/docs/user/package-management/history-and-rollback.md",49332],"1b835d51":[()=>n.e(532).then(n.t.bind(n,769,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-3-b1c.json",769],"1df93b7f":[()=>Promise.all([n.e(3323),n.e(3237)]).then(n.bind(n,20780)),"@site/src/pages/index.tsx",20780],21944812:[()=>n.e(9873).then(n.bind(n,43042)),"@site/docs/user/software/desktops/index.md",43042],"257b9082":[()=>n.e(3192).then(n.bind(n,31874)),"@site/docs/user/software/development/containers.md",31874],"2598a3a5":[()=>n.e(5951).then(n.bind(n,70197)),"@site/docs/user/editions/mate/configuration.md",70197],"2609550e":[()=>n.e(3206).then(n.bind(n,23394)),"@site/docs/user/software/networking/samba.md",23394],"26308ea3":[()=>Promise.all([n.e(3312),n.e(6937),n.e(6485)]).then(n.bind(n,85612)),"@site/docs/packaging/submitting-a-pull-request.mdx",85612],"27d71881":[()=>n.e(7577).then(n.t.bind(n,19511,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-package-management-681.json",19511],"2a0f90eb":[()=>n.e(2817).then(n.t.bind(n,98247,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-solus-558.json",98247],"2a34ce22":[()=>n.e(6074).then(n.bind(n,21974)),"@site/docs/user/quick-start/installation/system-requirements.md",21974],"2a37c7d8":[()=>n.e(9995).then(n.bind(n,81754)),"@site/docs/user/editions/plasma/tips-and-tricks.md",81754],"2a9c4f4d":[()=>n.e(9474).then(n.t.bind(n,75994,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-clang-1c6.json",75994],"2b4abe09":[()=>n.e(2413).then(n.bind(n,45427)),"@site/docs/user/troubleshooting/index.md",45427],"2b61a93c":[()=>n.e(9897).then(n.bind(n,23065)),"@site/docs/user/editions/mate/index.md",23065],"2c3e84bd":[()=>n.e(8157).then(n.bind(n,12359)),"@site/docs/user/quick-start/installation/disks.md",12359],"334da572":[()=>n.e(5900).then(n.t.bind(n,70542,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-mobile-306.json",70542],"33f669c7":[()=>n.e(5854).then(n.t.bind(n,50536,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-software-1ab.json",50536],"33fc5bb8":[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(8355)]).then(n.bind(n,37678)),"@theme/Blog/Pages/BlogAuthorsPostsPage",37678],"36994c47":[()=>n.e(9208).then(n.t.bind(n,94468,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",94468],"38920c38":[()=>n.e(5481).then(n.bind(n,50)),"@site/docs/user/hardware/peripherals/printers-and-scanners.md",50],"3a2db09e":[()=>n.e(9361).then(n.t.bind(n,57588,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",57588],"3a93f7ba":[()=>n.e(7422).then(n.t.bind(n,76972,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hwcaps-8b3.json",76972],"3bd0a7e9":[()=>n.e(247).then(n.t.bind(n,60032,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-advanced-configuration-b1b.json",60032],"3fdfc7ff":[()=>n.e(4608).then(n.bind(n,57884)),"@site/docs/user/package-management/basics.md",57884],"3ff05326":[()=>n.e(2775).then(n.bind(n,17430)),"@site/docs/packaging/package.yml.md",17430],"418a6276":[()=>n.e(6160).then(n.bind(n,71697)),"@site/devlog/2024-01-19-eopkg-is-dead.md?truncated=true",71697],"41a4de91":[()=>n.e(7682).then(n.bind(n,31593)),"@site/docs/user/software/third-party/index.md",31593],"424f562c":[()=>n.e(3122).then(n.bind(n,15054)),"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md?truncated=true",15054],"439d6d8d":[()=>n.e(4374).then(n.t.bind(n,4915,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-mate-495.json",4915],"43d43a8f":[()=>n.e(9156).then(n.t.bind(n,5410,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-localization-3b5.json",5410],"45e9d313":[()=>n.e(6114).then(n.bind(n,47124)),"@site/docs/packaging/testing-a-package.md",47124],"46a65d96":[()=>n.e(8092).then(n.bind(n,82758)),"@site/docs/user/package-management/repo-management.md",82758],"47b97f63":[()=>n.e(834).then(n.t.bind(n,54517,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-compatibility-048.json",54517],"4802fa93":[()=>n.e(1774).then(n.bind(n,48815)),"@site/devlog/2024-01-29-dont-call-me-mate.md",48815],"49b71c16":[()=>n.e(3783).then(n.bind(n,99937)),"@site/docs/packaging/packaging-practices.md",99937],"4e87380c":[()=>n.e(2585).then(n.t.bind(n,68801,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gnu-f4d.json",68801],"513b6405":[()=>n.e(4278).then(n.bind(n,38033)),"@site/docs/packaging/prepare-for-packaging.md",38033],"528b6a6b":[()=>n.e(7822).then(n.bind(n,61661)),"@site/docs/user/software/utilities/ksysguard.md",61661],"533eefa9":[()=>n.e(4002).then(n.bind(n,99023)),"@site/docs/user/quick-start/installation/index.md",99023],"5685b4d8":[()=>n.e(1540).then(n.bind(n,17599)),"@site/docs/user/editions/xfce/configuration.md",17599],"5b7f3753":[()=>n.e(6413).then(n.bind(n,47512)),"@site/docs/packaging/git-basics.md",47512],"5e95c892":[()=>n.e(9661).then(n.bind(n,14399)),"@theme/DocsRoot",14399],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"5efe994e":[()=>n.e(1598).then(n.t.bind(n,83532,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-llvm-8d1.json",83532],"5f194406":[()=>n.e(7607).then(n.bind(n,77882)),"@site/docs/user/contributing/community-guidelines.md",77882],"6146d358":[()=>n.e(7798).then(n.t.bind(n,90800,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-contributing-e4f.json",90800],"61c953b4":[()=>n.e(8032).then(n.bind(n,18421)),"@site/docs/packaging/procedures/maintainership.md",18421],"621db11d":[()=>Promise.all([n.e(3312),n.e(5966),n.e(3940)]).then(n.bind(n,44995)),"@theme/Blog/Pages/BlogAuthorsListPage",44995],"62d70de2":[()=>n.e(818).then(n.t.bind(n,5230,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-virtualization-413.json",5230],"633d53d7":[()=>n.e(425).then(n.t.bind(n,30080,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-procedures-1dc.json",30080],64699048:[()=>n.e(2151).then(n.bind(n,87063)),"@site/docs/user/software/development/index.md",87063],"6787574e":[()=>n.e(4500).then(n.bind(n,26240)),"@site/docs/user/intro.md",26240],"6873f895":[()=>n.e(8849).then(n.bind(n,83781)),"@site/docs/user/contributing/style.md",83781],"6875c492":[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(8610)]).then(n.bind(n,23966)),"@theme/BlogTagsPostsPage",23966],"6cfe09a0":[()=>n.e(1174).then(n.bind(n,67189)),"@site/docs/user/software/networking/tigervnc.md",67189],"7071adf5":[()=>n.e(4796).then(n.bind(n,31386)),"@site/docs/packaging/troubleshooting-packaging.md",31386],"72054e31":[()=>n.e(7135).then(n.bind(n,83888)),"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",83888],"72f2f84e":[()=>n.e(794).then(n.t.bind(n,23343,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-utilities-bb8.json",23343],"74470af4":[()=>n.e(1896).then(n.bind(n,5893)),"@site/docs/user/software/virtualization/virtualbox.md",5893],"75c41d11":[()=>n.e(3337).then(n.bind(n,75584)),"@site/docs/user/editions/xfce/tips-and-tricks.md",75584],"793c86b2":[()=>n.e(168).then(n.bind(n,41426)),"@site/docs/user/software/command-line/index.md",41426],"7a24477a":[()=>n.e(9135).then(n.bind(n,44308)),"@site/docs/user/contributing/getting-involved.md",44308],"7b0bdf40":[()=>n.e(29).then(n.t.bind(n,56548,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-eopkg-20b.json",56548],"7c1fb106":[()=>n.e(4605).then(n.bind(n,66334)),"@site/docs/packaging/appstream-metainfo.md",66334],"7c2abd66":[()=>n.e(586).then(n.t.bind(n,19739,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-moss-7c4.json",19739],"7e4100d6":[()=>n.e(6990).then(n.bind(n,18193)),"@site/docs/user/software/networking/wireshark.md",18193],"814f3328":[()=>n.e(2535).then(n.t.bind(n,45641,19)),"~blog/default/blog-post-list-prop-default.json",45641],"8490a22d":[()=>n.e(8575).then(n.bind(n,5734)),"@site/docs/packaging/advanced-config/local-repository.md",5734],"88a83a8c":[()=>n.e(1242).then(n.bind(n,65574)),"@site/docs/user/software/utilities/kwallet.md",65574],"8d193990":[()=>n.e(1539).then(n.bind(n,5436)),"@site/devlog/2024-01-19-eopkg-is-dead.md",5436],"8e3d5b32":[()=>n.e(8499).then(n.bind(n,15838)),"@site/docs/user/software/localization/ibus.md",15838],"8e861970":[()=>n.e(8026).then(n.bind(n,95751)),"@site/docs/packaging/procedures/request-a-package.md",95751],"8e886580":[()=>n.e(4978).then(n.bind(n,71137)),"@site/docs/user/software/development/rust.md",71137],"920ec10a":[()=>n.e(4725).then(n.t.bind(n,63438,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-glibc-23b.json",63438],"9284d474":[()=>n.e(7626).then(n.bind(n,8110)),"@site/docs/user/software/gaming/index.md",8110],"947d9ca4":[()=>n.e(1944).then(n.bind(n,10025)),"@site/docs/user/software/development/web.md",10025],"9485dea6":[()=>n.e(2358).then(n.bind(n,29421)),"@site/docs/user/hardware/compatibility/wifi.md",29421],"96af6484":[()=>n.e(6225).then(n.bind(n,53058)),"@site/docs/user/hardware/peripherals/mice-and-touchpads.md",53058],"97c623e4":[()=>n.e(6427).then(n.bind(n,42268)),"@site/docs/packaging/procedures/request-a-package-update.md",42268],"99bedda9":[()=>n.e(8639).then(n.bind(n,48345)),"@site/docs/user/hardware/index.md",48345],"9b400668":[()=>n.e(7670).then(n.t.bind(n,20767,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-x-86-64-v-3-dc8.json",20767],"9e4087bc":[()=>n.e(3608).then(n.bind(n,8635)),"@theme/BlogArchivePage",8635],a05bfad9:[()=>n.e(885).then(n.bind(n,12620)),"@site/docs/user/editions/budgie/tips-and-tricks.md",12620],a398ef57:[()=>n.e(2586).then(n.bind(n,45523)),"@site/docs/user/hardware/mobile/apple.md",45523],a52026b8:[()=>n.e(7862).then(n.bind(n,19253)),"@site/devlog/2024-01-13-welcome-devlog.md?truncated=true",19253],a6aa9e1f:[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(3089)]).then(n.bind(n,33587)),"@theme/BlogListPage",33587],a7456010:[()=>n.e(5980).then(n.t.bind(n,79365,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",79365],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,89615)),"@theme/DocVersionRoot",89615],a94703ab:[()=>Promise.all([n.e(3312),n.e(4368)]).then(n.bind(n,59779)),"@theme/DocRoot",59779],a9e19215:[()=>n.e(333).then(n.bind(n,71371)),"@site/docs/user/software/networking/xrdp.md",71371],ab89b7a6:[()=>n.e(5575).then(n.bind(n,83016)),"@site/docs/user/editions/xfce/index.md",83016],aba21aa0:[()=>n.e(3629).then(n.t.bind(n,41765,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",41765],acecf23e:[()=>n.e(7393).then(n.t.bind(n,81838,19)),"~blog/default/blogMetadata-default.json",81838],ad205e99:[()=>n.e(1617).then(n.bind(n,38491)),"@site/docs/packaging/stack-rebuilds.md",38491],b4302412:[()=>n.e(2081).then(n.bind(n,55892)),"@site/docs/user/editions/gnome/tips-and-tricks.md",55892],b6ca4f35:[()=>n.e(9214).then(n.t.bind(n,27983,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-packaging-55a.json",27983],baa66232:[()=>n.e(984).then(n.bind(n,17789)),"@site/docs/user/software/camera/droidcam.md",17789],baf1b6e8:[()=>n.e(9677).then(n.bind(n,14864)),"@site/docs/user/software/development/java.md",14864],be4ac66b:[()=>n.e(4869).then(n.bind(n,87190)),"@site/docs/user/hardware/compatibility/laptops.md",87190],be79d003:[()=>n.e(6012).then(n.bind(n,62262)),"@site/docs/packaging/update-dev-environment.md",62262],c15d9823:[()=>n.e(6642).then(n.t.bind(n,92506,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",92506],c55c138b:[()=>n.e(7465).then(n.bind(n,76323)),"@site/docs/packaging/packaging-changes.md",76323],c5de29d4:[()=>n.e(3851).then(n.bind(n,44158)),"@site/docs/packaging/creating-a-new-package.md",44158],c99ea947:[()=>n.e(7018).then(n.t.bind(n,7768,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-camera-f25.json",7768],c9c1a3f4:[()=>n.e(6121).then(n.bind(n,24080)),"@site/docs/user/editions/budgie/configuration.md",24080],cca891e2:[()=>n.e(9773).then(n.bind(n,7857)),"@site/docs/packaging/procedures/package-inclusion.md",7857],ccc49370:[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(6103)]).then(n.bind(n,88987)),"@theme/BlogPostPage",88987],ce4855c1:[()=>n.e(3440).then(n.bind(n,66855)),"@site/docs/packaging/translation-instructions.md",66855],cec10a63:[()=>n.e(8422).then(n.bind(n,96928)),"@site/docs/user/editions/plasma/configuration.md",96928],d00f7e62:[()=>n.e(255).then(n.bind(n,67868)),"@site/docs/packaging/your-first-package-update.md",67868],d0d2faf6:[()=>n.e(4507).then(n.bind(n,79267)),"@site/docs/packaging/procedures/release-processes.md",79267],d4762887:[()=>n.e(3624).then(n.bind(n,1108)),"@site/docs/user/troubleshooting/installation.md",1108],d5670106:[()=>n.e(1950).then(n.bind(n,60908)),"@site/docs/user/troubleshooting/plasma.md",60908],d9c798e8:[()=>n.e(807).then(n.t.bind(n,37275,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-peripherals-173.json",37275],da62f019:[()=>n.e(1821).then(n.t.bind(n,98171,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-quick-start-1ee.json",98171],dabd6b33:[()=>n.e(1059).then(n.bind(n,37101)),"@site/docs/packaging/advanced-config/eopkg-configuration.md",37101],ddc41e4a:[()=>n.e(9451).then(n.bind(n,3619)),"@site/docs/user/software/sound/index.md",3619],e083e94b:[()=>n.e(3056).then(n.bind(n,83514)),"@site/docs/user/software/third-party/snap.md",83514],e4134e95:[()=>n.e(8621).then(n.t.bind(n,80700,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-devlog-dac.json",80700],e5595530:[()=>n.e(1648).then(n.bind(n,4183)),"@site/docs/user/quick-start/boot-management.md",4183],ea6d9109:[()=>n.e(812).then(n.t.bind(n,88930,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-web-23c.json",88930],eb074ba1:[()=>n.e(3705).then(n.bind(n,45247)),"@site/docs/user/software/configuration_files.md",45247],ec4e4367:[()=>n.e(4529).then(n.bind(n,76130)),"@site/docs/user/hardware/mobile/android.md",76130],ecdeb26c:[()=>n.e(1971).then(n.bind(n,35247)),"@site/devlog/2024-01-29-dont-call-me-mate.md?truncated=true",35247],ed2a5927:[()=>n.e(4560).then(n.bind(n,18653)),"@site/docs/user/quick-start/software-center/index.md",18653],ef8b811a:[()=>n.e(2644).then(n.t.bind(n,89441,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",89441],f0629c21:[()=>n.e(3375).then(n.bind(n,53126)),"@site/docs/user/software/web/obs.md",53126],f1d13e1b:[()=>n.e(5462).then(n.bind(n,16467)),"@site/docs/user/editions/mate/tips-and-tricks.md",16467],f32bcb79:[()=>n.e(6515).then(n.t.bind(n,15631,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-firstpost-ddd.json",15631],f35b91b6:[()=>n.e(9749).then(n.bind(n,78677)),"@site/devlog/2024-01-13-welcome-devlog.md",78677],f3d58343:[()=>n.e(8812).then(n.t.bind(n,11741,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-david-9d9.json",11741],f4aa4739:[()=>n.e(9170).then(n.bind(n,75340)),"@site/docs/user/editions/budgie/index.md",75340],f4c9601b:[()=>n.e(2595).then(n.bind(n,39910)),"@site/docs/user/quick-start/installation/secure-boot.md",39910],f6faa2b4:[()=>n.e(8143).then(n.bind(n,40396)),"@site/docs/user/hardware/peripherals/midi-keyboard.md",40396],f81c1134:[()=>n.e(4031).then(n.t.bind(n,4108,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",4108],f82cd581:[()=>n.e(8626).then(n.t.bind(n,56664,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hello-f96.json",56664],f8dd8223:[()=>n.e(7212).then(n.bind(n,4606)),"@site/docs/user/software/development/postgresql.md",4606],fb6dc457:[()=>n.e(5482).then(n.bind(n,77123)),"@site/docs/user/editions/gnome/configuration.md",77123],fb8d634e:[()=>n.e(999).then(n.bind(n,86591)),"@site/docs/user/editions/gnome/index.md",86591],fc733b73:[()=>n.e(6042).then(n.bind(n,28537)),"@site/docs/user/software/development/r-and-rstudio.md",28537]};var s=n(85893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(44151),u=n(13736);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(7734).then(n.bind(n,57734)),modules:["@theme/NotFound"],webpack:()=>[57734],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,c.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","cba"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/authors/david",component:d("/blog/authors/david","386"),exact:!0},{path:"/blog/authors/joey",component:d("/blog/authors/joey","979"),exact:!0},{path:"/blog/don't-call-me-mate-pal",component:d("/blog/don't-call-me-mate-pal","4cd"),exact:!0},{path:"/blog/eopkg-is-dead-long-live-eopkg",component:d("/blog/eopkg-is-dead-long-live-eopkg","a0e"),exact:!0},{path:"/blog/solus-optimizing-packages",component:d("/blog/solus-optimizing-packages","3c8"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/3",component:d("/blog/tags/3","2ba"),exact:!0},{path:"/blog/tags/clang",component:d("/blog/tags/clang","7cb"),exact:!0},{path:"/blog/tags/devlog",component:d("/blog/tags/devlog","e8c"),exact:!0},{path:"/blog/tags/eopkg",component:d("/blog/tags/eopkg","a41"),exact:!0},{path:"/blog/tags/firstpost",component:d("/blog/tags/firstpost","c48"),exact:!0},{path:"/blog/tags/glibc",component:d("/blog/tags/glibc","1b5"),exact:!0},{path:"/blog/tags/gnu",component:d("/blog/tags/gnu","94b"),exact:!0},{path:"/blog/tags/hello",component:d("/blog/tags/hello","d49"),exact:!0},{path:"/blog/tags/hwcaps",component:d("/blog/tags/hwcaps","6d6"),exact:!0},{path:"/blog/tags/llvm",component:d("/blog/tags/llvm","aff"),exact:!0},{path:"/blog/tags/lto",component:d("/blog/tags/lto","24f"),exact:!0},{path:"/blog/tags/mate",component:d("/blog/tags/mate","e08"),exact:!0},{path:"/blog/tags/moss",component:d("/blog/tags/moss","e04"),exact:!0},{path:"/blog/tags/optimization",component:d("/blog/tags/optimization","535"),exact:!0},{path:"/blog/tags/packaging",component:d("/blog/tags/packaging","07c"),exact:!0},{path:"/blog/tags/pgo",component:d("/blog/tags/pgo","a42"),exact:!0},{path:"/blog/tags/solus",component:d("/blog/tags/solus","873"),exact:!0},{path:"/blog/tags/x-86-64-v-3",component:d("/blog/tags/x-86-64-v-3","716"),exact:!0},{path:"/blog/welcome-solus-devlog-v1",component:d("/blog/welcome-solus-devlog-v1","418"),exact:!0},{path:"/docs",component:d("/docs","49b"),routes:[{path:"/docs",component:d("/docs","ef0"),routes:[{path:"/docs",component:d("/docs","861"),routes:[{path:"/docs/category/advanced-configuration",component:d("/docs/category/advanced-configuration","21a"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/category/camera",component:d("/docs/category/camera","eec"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/compatibility",component:d("/docs/category/compatibility","41d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/contributing",component:d("/docs/category/contributing","524"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/localization",component:d("/docs/category/localization","976"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/mobile",component:d("/docs/category/mobile","8b8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/networking",component:d("/docs/category/networking","2c7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/package-management",component:d("/docs/category/package-management","540"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/peripherals",component:d("/docs/category/peripherals","b31"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/procedures",component:d("/docs/category/procedures","59d"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/category/quick-start",component:d("/docs/category/quick-start","16b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/software",component:d("/docs/category/software","5c6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/utilities",component:d("/docs/category/utilities","7bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/virtualization",component:d("/docs/category/virtualization","cd2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/web",component:d("/docs/category/web","f03"),exact:!0,sidebar:"userSidebar"},{path:"/docs/packaging/",component:d("/docs/packaging/","9dd"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/advanced-config/eopkg-configuration",component:d("/docs/packaging/advanced-config/eopkg-configuration","4fb"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/advanced-config/local-repository",component:d("/docs/packaging/advanced-config/local-repository","092"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/appstream-metainfo",component:d("/docs/packaging/appstream-metainfo","901"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/creating-a-new-package",component:d("/docs/packaging/creating-a-new-package","551"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/git-basics",component:d("/docs/packaging/git-basics","d3f"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/monitoring.yml",component:d("/docs/packaging/monitoring.yml","cee"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/package.yml",component:d("/docs/packaging/package.yml","612"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/packaging-changes",component:d("/docs/packaging/packaging-changes","872"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/packaging-practices",component:d("/docs/packaging/packaging-practices","b60"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/prepare-for-packaging",component:d("/docs/packaging/prepare-for-packaging","88f"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/maintainership",component:d("/docs/packaging/procedures/maintainership","111"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/package-inclusion",component:d("/docs/packaging/procedures/package-inclusion","008"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/release-processes",component:d("/docs/packaging/procedures/release-processes","755"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/request-a-package",component:d("/docs/packaging/procedures/request-a-package","488"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/request-a-package-update",component:d("/docs/packaging/procedures/request-a-package-update","293"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/stack-rebuilds",component:d("/docs/packaging/stack-rebuilds","c7e"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/submitting-a-pull-request",component:d("/docs/packaging/submitting-a-pull-request","b81"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/testing-a-package",component:d("/docs/packaging/testing-a-package","e13"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/translation-instructions",component:d("/docs/packaging/translation-instructions","d32"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/troubleshooting-packaging",component:d("/docs/packaging/troubleshooting-packaging","713"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/update-dev-environment",component:d("/docs/packaging/update-dev-environment","661"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/updating-an-existing-package",component:d("/docs/packaging/updating-an-existing-package","531"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/your-first-package-update",component:d("/docs/packaging/your-first-package-update","26e"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/user/contributing/community-guidelines",component:d("/docs/user/contributing/community-guidelines","520"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/getting-involved",component:d("/docs/user/contributing/getting-involved","abf"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/style",component:d("/docs/user/contributing/style","202"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/testing-an-iso",component:d("/docs/user/contributing/testing-an-iso","d78"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/",component:d("/docs/user/editions/","275"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/",component:d("/docs/user/editions/budgie/","4e4"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/configuration",component:d("/docs/user/editions/budgie/configuration","4f7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/tips-and-tricks",component:d("/docs/user/editions/budgie/tips-and-tricks","358"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/",component:d("/docs/user/editions/gnome/","ac6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/configuration",component:d("/docs/user/editions/gnome/configuration","bc6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/tips-and-tricks",component:d("/docs/user/editions/gnome/tips-and-tricks","d2d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/",component:d("/docs/user/editions/mate/","468"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/configuration",component:d("/docs/user/editions/mate/configuration","1b0"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/tips-and-tricks",component:d("/docs/user/editions/mate/tips-and-tricks","cd1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/",component:d("/docs/user/editions/plasma/","a67"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/configuration",component:d("/docs/user/editions/plasma/configuration","8a4"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/tips-and-tricks",component:d("/docs/user/editions/plasma/tips-and-tricks","82b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/",component:d("/docs/user/editions/xfce/","802"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/configuration",component:d("/docs/user/editions/xfce/configuration","3f1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/tips-and-tricks",component:d("/docs/user/editions/xfce/tips-and-tricks","cb8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/",component:d("/docs/user/hardware/","61a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/compatibility/laptops",component:d("/docs/user/hardware/compatibility/laptops","f9e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/compatibility/wifi",component:d("/docs/user/hardware/compatibility/wifi","b71"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/mobile/android",component:d("/docs/user/hardware/mobile/android","542"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/mobile/apple",component:d("/docs/user/hardware/mobile/apple","640"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/mice-and-touchpads",component:d("/docs/user/hardware/peripherals/mice-and-touchpads","787"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/midi-keyboard",component:d("/docs/user/hardware/peripherals/midi-keyboard","763"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/printers-and-scanners",component:d("/docs/user/hardware/peripherals/printers-and-scanners","925"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/intro",component:d("/docs/user/intro","7fc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/basics",component:d("/docs/user/package-management/basics","8dd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/history-and-rollback",component:d("/docs/user/package-management/history-and-rollback","b37"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/repo-management",component:d("/docs/user/package-management/repo-management","f74"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/privacy",component:d("/docs/user/privacy","451"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/boot-management",component:d("/docs/user/quick-start/boot-management","fc5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/default-applications",component:d("/docs/user/quick-start/default-applications","c6a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/",component:d("/docs/user/quick-start/installation/","cd1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/disks",component:d("/docs/user/quick-start/installation/disks","266"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/secure-boot",component:d("/docs/user/quick-start/installation/secure-boot","d90"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/system-requirements",component:d("/docs/user/quick-start/installation/system-requirements","35d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/software-center/",component:d("/docs/user/quick-start/software-center/","085"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/camera/droidcam",component:d("/docs/user/software/camera/droidcam","b1e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/command-line/",component:d("/docs/user/software/command-line/","958"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/configuration_files",component:d("/docs/user/software/configuration_files","fcf"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/desktops/",component:d("/docs/user/software/desktops/","d43"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/",component:d("/docs/user/software/development/","d23"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/containers",component:d("/docs/user/software/development/containers","e29"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/java",component:d("/docs/user/software/development/java","342"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/postgresql",component:d("/docs/user/software/development/postgresql","408"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/r-and-rstudio",component:d("/docs/user/software/development/r-and-rstudio","747"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/rust",component:d("/docs/user/software/development/rust","0b7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/web",component:d("/docs/user/software/development/web","66a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/gaming/",component:d("/docs/user/software/gaming/","1b3"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/localization/ibus",component:d("/docs/user/software/localization/ibus","d11"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/samba",component:d("/docs/user/software/networking/samba","b11"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/tigervnc",component:d("/docs/user/software/networking/tigervnc","f76"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/wireshark",component:d("/docs/user/software/networking/wireshark","2e9"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/xrdp",component:d("/docs/user/software/networking/xrdp","573"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/sound/",component:d("/docs/user/software/sound/","f00"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/third-party/",component:d("/docs/user/software/third-party/","05b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/third-party/snap",component:d("/docs/user/software/third-party/snap","cf3"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/utilities/ksysguard",component:d("/docs/user/software/utilities/ksysguard","315"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/utilities/kwallet",component:d("/docs/user/software/utilities/kwallet","b7f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/virtualization/virtualbox",component:d("/docs/user/software/virtualization/virtualbox","e07"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/web/obs",component:d("/docs/user/software/web/obs","266"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/",component:d("/docs/user/troubleshooting/","91a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/boot-rescue",component:d("/docs/user/troubleshooting/boot-rescue","5b1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/installation",component:d("/docs/user/troubleshooting/installation","439"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/plasma",component:d("/docs/user/troubleshooting/plasma","a6c"),exact:!0,sidebar:"userSidebar"}]}]}]},{path:"/",component:d("/","e5f"),exact:!0},{path:"*",component:d("*")}]},72278:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,g,m,h,b,y,v,w,k,S,_,x,E,O,P,j,C,T,I,A,N,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;rYour Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\ne||125 {const s=t.toLowerCase(),l=((e,t)=>{const[n,o]=(0,r.useState)(Z(t,e)),a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)((()=>{t===a.current&&e===i.current||(a.current=t,i.current=e,o(Z(t,e)))}),[e,t]),n})(s,o),c=(e=>(0,r.useCallback)((t=>{var n=t,{className:r,style:o,line:i}=n,s=x(n,["className","style","line"]);const l=_(S({},s),{className:a("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=S(S({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,r.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,r.useCallback)((e=>{var n=e,{token:r,className:o,style:i}=n,s=x(n,["token","className","style"]);const l=_(S({},s),{className:a("token",...r.types,o),children:r.content,style:t(r)});return null!=i&&(l.style=S(S({},l.style||{}),i)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:o})=>{const a=(0,r.useRef)(e);return(0,r.useMemo)((()=>{if(null==n)return K([t]);const e={code:t,grammar:n,language:o,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),K(e.tokens)}),[t,n,o])})({prism:i,language:s,code:n,grammar:i.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},J=e=>(0,r.createElement)(X,_(S({},e),{prism:e.prism||O,theme:e.theme||U,code:e.code,language:e.language}))},38776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},97582:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>L,__assign:()=>a,__asyncDelegator:()=>E,__asyncGenerator:()=>x,__asyncValues:()=>O,__await:()=>_,__awaiter:()=>g,__classPrivateFieldGet:()=>I,__classPrivateFieldIn:()=>N,__classPrivateFieldSet:()=>A,__createBinding:()=>h,__decorate:()=>s,__disposeResources:()=>D,__esDecorate:()=>c,__exportStar:()=>b,__extends:()=>o,__generator:()=>m,__importDefault:()=>T,__importStar:()=>C,__makeTemplateObject:()=>P,__metadata:()=>f,__param:()=>l,__propKey:()=>d,__read:()=>v,__rest:()=>i,__runInitializers:()=>u,__setFunctionName:()=>p,__spread:()=>w,__spreadArray:()=>S,__spreadArrays:()=>k,__values:()=>y,default:()=>F});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n Your Docusaurus site did not load properly. A very common reason is a wrong site baseUrl configuration. Current configured baseUrl = ${e} ${"/"===e?" (default value)":""} We suggest trying baseUrl = /g,(function(){return n})).replace(/*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/