Your personal game-asset library, in two small apps:
- AssetsDownloaders - downloads the game assets you own (itch.io, craftpix.net) or that are free (kenney.nl) into one organized library folder.
- AssetsViewer - browses that library: searchable, filterable grid with previews, favorites, notes and your own tags.
You only need two things installed - everything else is fetched automatically on first run:
- Python 3 (for AssetsDownloaders)
- Node.js (for AssetsViewer)
On Windows the scripts print the exact winget install command if either is
missing.
1. Get the code - clone it (or copy the folder onto your disk):
git clone https://github.com/innocentmiau/AssetsManager.git2. Run each app once - the launchers are self-bootstrapping (they create their own environment and install dependencies on the first run, which takes a minute):
# Linux
./downloader/run.sh # AssetsDownloaders
./viewer/run.sh # AssetsViewer# Windows - double-click run.bat, or from PowerShell:
.\downloader\run.ps1 # AssetsDownloaders
.\viewer\run.ps1 # AssetsViewer3. (Optional) Add them to your app menu / Start menu so you can open them from the OS search bar like any other app:
./linuxApplications.sh # Linux: adds both to the Activities searchwindowsApplications.bat :: Windows: adds both to the Start menu (double-click)Safe to re-run any time: each run verifies the installed launchers and repairs
anything stale (icon, paths); up-to-date ones are left alone. --force /
-Force rewrites unconditionally, --remove / -Remove uninstalls.
- Plug in the disk (or pick any folder) where the library should live, then start the app and pick that destination (use Refresh after plugging in).
- Pick a source and start:
- itch.io - paste your API key (itch.io -> Settings -> API keys). Downloads everything you own.
- craftpix.net - click Log in... once (a browser window opens; sign in with email + password), then Start. First use installs its own browser automation; large libraries resume across days (craftpix has a daily cap).
- kenney.nl - no account needed; downloads the free CC0 packs.
- Leave Skip already-downloaded on: re-running skips the big downloads and just refreshes titles/tags/previews on what you already have - so a re-run is always cheap and always safe.
Every asset lands in its own folder with the files, preview images and an
asset.json describing it.
- Start it and pick the library folder you downloaded into.
- Browse: search box + tag/source filters, Ctrl+scroll over the grid to resize the cards. Assets stream in while big libraries scan.
- Click an asset for details, then:
- Copy files to Downloads - copies its zips to
~/Downloads/<name>/and opens the folder (the "get this asset onto my computer" button). - Show asset files - opens the asset's folder on the library disk.
- Save tags & notes - favorite, rating, hidden, notes and your own tags. Your edits are never touched by the downloader.
- Copy files to Downloads - copies its zips to
- Made something yourself? + Add asset (top bar) saves your own work into
the library like any downloaded asset: pick the zip(s), optional preview
image(s), a name and tags - it gets its own folder under
custom/and shows up in the grid immediately.
Details for the curious - you don't need any of this to use the apps.
| App | Folder | Stack | Role |
|---|---|---|---|
| AssetsDownloaders | ./downloader |
Python 3.12 + Tkinter | Logs into the sources, downloads owned assets, writes asset.json + preview images per folder. |
| AssetsViewer | ./viewer |
Electron (Node 24) | Scans the library, shows the grid, edits only the user block of asset.json (favorites / notes / tags). |
They never import each other's code; the only contract is a per-folder
asset.json (see SCHEMA.md). Top-level fields are machine-owned
(the downloader may rewrite them on refresh); the user block is yours and the
downloader never touches it. Why split: the downloader talks to websites and is
fragile per-site; the viewer is a stable, read-mostly UI that can never corrupt
what was downloaded.
There is no central database - each asset folder carries its own metadata, so the library survives being copied, unplugged, or moved between machines:
<library_path>/
itch.io/<asset-slug>/{asset.json, previews/*, files/*}
craftpix.net/<asset-slug>/{asset.json, previews/*, files/*}
kenney.nl/<asset-slug>/{asset.json, previews/*, files/*}
custom/<asset-name>/{asset.json, previews/*, files/*} <- your own work, added in the viewer
Because the disk's mount point can change (or be absent), both apps scan the currently-mounted disks on launch and ask you to pick the folder - the last-used path is pre-selected if it's still there.
The launchers are self-bootstrapping and re-sync on every start, so you edit
source in ./downloader and ./viewer and just run:
- Viewer: Electron
^32.0.0is installed into a local runtime cache (on Linux under~/.cache/assetsmanager, because the code may live on an exFAT disk that can't hostnode_modules). - Downloader: a Python venv in the same cache; Pillow for previews; craftpix's browser automation (Playwright) is installed on demand, in-app.
- Both apps share their config at
~/.config/assetsmanager/config.json(%APPDATA%on Windows). linuxApplications.sh/windowsApplications.ps1install the app-menu / Start-menu entries, using the shared./icon.ico; they verify-and-repair on every re-run.
MIT - see LICENSE. The license covers this code only; assets you download keep their own terms from their source sites.