Hi all. Today I was messing around with making custom icons in Debian 12 and I was having a heck of a time. I finally figured it out and wanted to share my solution. Below is a .sh script that will automate creating and replacing existing icons.
How it works
The script takes a path to an .svg file as an input argument. It then searches the /usr/share/icons/hicolor folder's subdirectories for .pngs of a matching name, notes their resolutions, and utilizes InkScape to convert the .svg to .pngs and replace the icons.
To utilize, save the script below as an .sh file and provide it an input .svg as follows:
sudo ./icons.sh /home/USERNAME/icon.svg
(note: your input .svg file must match the name of the existing icon you are trying to replace. Check the folder path below to determine the correct name)
Script
#!/bin/bash
# Define the base directory where icons are located
BASE_DIR="/usr/share/icons/hicolor"
# Ensure the script is run as root to modify files in /usr/share/icons/hicolor
if [ "$(id -u)" -ne 0 ]; then
echo "This script must be run with root privileges to access the icons folder."
exit 1
fi
# Check if Inkscape is installed
if ! command -v inkscape &> /dev/null; then
echo "Inkscape is not installed. Please install it and try again. (sudo apt install inkscape)"
exit 1
fi
# Input SVG file filepath
INPUT_SVG="$1"
if [ -z "$INPUT_SVG" ]; then
echo "Usage: $0 /path/to/input.svg"
exit 1
fi
# Validate that the input SVG file exists
if [ ! -f "$INPUT_SVG" ]; then
echo "Input SVG file does not exist."
exit 1
fi
# Loop through all resolution folders (resolutions like 16x16, 32x32, etc.) in the /usr/share/icons/hicolor folder
for resolution_dir in "$BASE_DIR"/*x*; do
# Check if the resolution folder contains an 'apps' subfolder
if [ -d "$resolution_dir/apps" ]; then
echo "Found apps folder in $resolution_dir"
# Extract the resolution size (e.g., 16x16)
resolution=$(basename "$resolution_dir")
# Get the name of the input SVG file (without the .svg extension)
base_name=$(basename "$INPUT_SVG" .svg)
# Define the target PNG file path in the current resolution folder
target_png="$resolution_dir/apps/$base_name.png"
# Check if the resolution folder already contains a PNG file to replace
if [ -f "$target_png" ]; then
echo "Found existing $target_png. Replacing it."
# Use Inkscape to convert the SVG to PNG at the correct resolution
inkscape "$INPUT_SVG" --export-type=png --export-filename="$target_png" --export-width="${resolution%x*}" --export-height="${resolution#*x}"
# Confirm creation
if [ -f "$target_png" ]; then
echo "Successfully created $target_png"
else
echo "Failed to create $target_png"
fi
else
echo "No existing $target_png found. Skipping this resolution."
fi
else
echo "No 'apps' folder found in $resolution_dir. Skipping."
fi
done
echo "Icon update process complete!"
The Dataview plugin is the most critical one. You can create queries with the metadata in your notes (YAML frontmatter and # hashtags). If that sounded like a bunch of non-sense I highly encourage you to dig into it, because I had no idea what those words meant either but it took my note taking to a new level. I think of my Obsidian vault as my second brain.
Below are some cool examples of vaults that you can click through. Also note that because the obsidian pages are in markdown format you can use the Jekyll engine to directly turn them into web pages without any coding (this is how GitHub Pages works)
https://forum.obsidian.md/t/14-example-vaults-from-around-the-web-kepano-nick-milo-the-sweet-setup-and-more/81788
If you know how to do a bit of coding (or use ChatGPT) you can incorporate APIs from other apps in your obsidian vault. Maybe you want to make a fancy home page that displays all your tasks from ToDoist, alongside the RSS feeds to your favorite podcasts and YouTube channels. Maybe you are tracking your habits and using DataView to compile all relevant instances of #habit tags into one calendar for a birds eye view.