Download any icon set from Wallpapers Clan and pack it into a fully compliant Linux icon theme tarball.
From aesthetic icons to a system-ready theme in minutes!
This script grabs icon packs from Wallpapers Clan (or any page with downloadable icons), automatically organizes them into a proper Linux icon theme hierarchy, generates symlinks for every standard size, maps app names to your pack's icons, and installs the result β all with a single command.
- π― Auto-download from any Wallpapers Clan page (zip packs or image scraping)
- 𧬠Smart sizing β detects icon pixel dimensions and places them in correct size directories, with automatic context detection (apps / actions / mimetypes)
- π Full-size coverage β symlinks original icons into all standard sizes (16Γ16 through 256Γ256); alias symlinks (mapped names) live only in the primary size directory
- π§ Curated name mapping β knows what Linux calls each app (Discord β
discord, Chrome βgoogle-chrome, etc.) - π Hash-based fallback β distributes remaining system icons across your pack's artwork
- π¨ Shape masking β apply rounded corners or circular masks to all icons with
--shape rounded|circle - ποΈ Interactive icon picker β hand-pick which icon maps to each app via yad/zenity GUI
- π Auto-reset on install β old custom icon overrides are cleared when generating a new theme; standalone
--pickermode preserves existing mappings - π¦ Standards-compliant β generates a proper
index.themewithDirectories,Context, andTypesections - β‘ Auto-install β places the theme in
~/.icons/, runsgtk-update-icon-cache, and refreshes GTK - πΌοΈ Scalable SVG support β detects and places SVGs in the
scalabledirectory
# Arch / Manjaro
sudo pacman -S curl python python-pillow
# Optional for icon picker:
sudo pacman -S yad # or zenity
# Debian / Ubuntu
sudo apt install curl python3 python3-pil
# Optional for icon picker:
sudo apt install yad # or zenity
# Fedora
sudo dnf install curl python3 python3-pillow
# Optional for icon picker:
sudo dnf install yad # or zenity# Clone the repo
git clone https://github.com/xi-Rick/icon-maker.git
cd icon-maker
# Make it executable
chmod +x icon-maker.sh
# Basic usage
./icon-maker.sh <URL> <theme_name>
# With shape masking
./icon-maker.sh --shape rounded <URL> <theme_name>
./icon-maker.sh --shape circle <URL> <theme_name>
# Run icon picker on an already-installed theme (no download)
./icon-maker.sh --picker <theme_name>
./icon-maker.sh -p <theme_name>| Flag | Description |
|---|---|
--shape rounded |
Apply rounded corners to all icons (radius = 20% of icon size) |
--shape circle |
Crop all icons into a perfect circle |
--picker <theme> / -p <theme> |
Skip download/processing; open the icon picker on an already-installed theme |
# Download One Piece app icons with rounded corners
./icon-maker.sh --shape rounded https://wallpapers-clan.com/app-icons/one-piece/ One-Piece
# Re-open the icon picker later
./icon-maker.sh -p One-Pieceββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Fetch page HTML (curl / Firefox headless) β
β β β
β 2. Extract download URL (zip > images) β
β β β
β 3. Download & extract zip OR scrape images β
β β β
β 4. Detect icon sizes & organize into dirs β
β ββ 16Γ16/apps/ (symlinks β primary size) β
β ββ 22Γ22/apps/ β
β ββ 24Γ24/apps/ β
β ββ β¦ (16,22,24,32,48,64,128,256) β
β ββ <size>Γ<size>/apps/ (Type=Scalable, aliases) β
β β β
β 5. [Optional] Apply shape mask (--shape) β
β ββ --shape rounded β rounded corners β
β ββ --shape circle β circular mask β
β β β
β 6. Normalize filenames (lowercase, spacesβhyphens) β
β β β
β 7. Map Linux app names β pack icons β
β ββ Phase 1: Curated name map β
β ββ Phase 2: Hash-distribution fallback β
β β β
β 8. Generate index.theme β
β β β
β 9. [Optional] Interactive icon picker (yad/zenity) β
β ββ Clears overrides on fresh install β
β ββ Preserves overrides in --picker mode β
β ββ Lets you hand-pick per-app icon mappings β
β β β
β 10. Package as .tar.gz & install to ~/.icons/ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
When you run the script, your theme directory looks like this:
~/.icons/<theme_name>/
βββ index.theme
βββ 16Γ16/
β βββ apps/
β βββ discord.png # symlink β 180Γ180/apps/discord.png
β βββ β¦ # 80 original symlinks (no alias symlinks)
βββ 22Γ22/
β βββ apps/ # same 80 entries as 16Γ16
βββ 24Γ24/
β βββ apps/
βββ 32Γ32/
β βββ apps/
βββ 48Γ48/
β βββ apps/
βββ 64Γ64/
β βββ apps/
βββ 128Γ128/
β βββ apps/
βββ 256Γ256/
β βββ apps/
βββ 180Γ180/ # primary size (Type=Scalable)
β βββ apps/
β βββ discord.png # actual file
β βββ vesktop.png β discord.png # alias symlink
β βββ google-chrome.png β discord.png # hash-distributed alias
β βββ β¦ # 255+ alias symlinks
βββ scalable/ # only if SVGs are present
βββ apps/
The script knows what Linux calls your apps. A curated map covers 40+ popular applications:
| Pack Icon | Mapped To |
|---|---|
discord |
vesktop, discord, com.discordapp.Discord |
firefox |
firefox, mozilla-firefox, org.mozilla.firefox |
spotify |
spotify, spotify-client, spotify-launcher, com.spotify.Client |
code |
code, vscode, visual-studio-code, com.visualstudio.code, codium |
terminal |
org.gnome.Terminal, gnome-terminal, Alacritty, konsole, kgx, io.mitchellh.ghostty |
files |
org.gnome.Nautilus, nautilus, caja, dolphin, thunar, nemo |
game |
steam, lutris, heroic, net.lutris.Lutris, games |
For anything not in the curated list, the script uses deterministic hash-based distribution β so every .desktop file on your system gets some icon from the pack.
Spaces and uppercase are normalized; underscores are preserved for Flatpak-style IDs:
"discord icon.png" β discord-icon.png # lowercased, spaces β hyphens
"my_cool_app.png" β my_cool_app.png # underscore preservedThe generated index.theme includes:
[Icon Theme]header withName,Comment,Inherits=hicolor- Per-directory sections with correct
Size,Context, andType - Standard size dirs (16,22,24,32,48,64,128,256) get
Type=Fixed - Non-standard size dirs (e.g. 180Γ180) get
Type=Scalable MinSize=1 MaxSize=512so alias symlinks are found at any requested size - Context:
Applications(icons default toapps/context)
| OS | Compositor | Shell | Status |
|---|---|---|---|
| CachyOS (Arch-based) | Niri (Wayland) | Noctalia Shell | Full β download, shape masking, icon picker, install, --picker re-entry |
If the page is behind Cloudflare, the script tries Firefox headless:
# Needs Firefox installed
firefox --headless --dump-dom "$URL" > page.html- Direct zip download β looks for
href="*ICONS*.zip", then falls back to any.ziplink,data-downloadurl, single-quotedhref,data-href/data-url/data-fileattributes, and known path patterns (/wp-content/uploads/app-icons/) - Image scraping β extracts all
<img src="...">URLs as a last resort
| Tool | Required For |
|---|---|
curl |
Page & file downloads |
grep / sed |
URL extraction |
python3 |
Image processing, name mapping, normalization, index.theme generation |
Pillow (PIL) |
Reading image dimensions, shape masking |
yad / zenity |
(Optional) Interactive icon picker GUI |
All icon artwork is sourced from Wallpapers Clan β a digital space created by the W-Clan crew.
"W-Clan is a crew of people who love stylish things. So we created a digital space with fresh wallpapers and aesthetic app icons for everyone to adorn their phones."
Show them some love:
| Platform | Link |
|---|---|
| π Website | wallpapers-clan.com |
| π₯ Community | W-Clan Gang |
| πΈ Instagram | @wallpapers.clan |
| π¦ Twitter / X | @wallpapersclan |
| π Pinterest | wallpapersclan |
| π Facebook | wallpapersclan |
All content on Wallpapers Clan is original or transformative fan art, intended for personal, non-commercial use. All trademarks and characters belong to their respective owners. Wallpapers Clan is not affiliated with or endorsed by any brands.
Ideas, issues, and pull requests welcome!
git clone https://github.com/xi-Rick/icon-maker.git
cd icon-maker
# Hack away- Add more curated name mappings
- Support for
--dry-runmode (preview without downloading) - Handle animated PNG/APNG
π¨ Give your Linux desktop the style it deserves!
Made with π©· β icons by the W-Clan for the Linux community!


