← Back to Art, Pixels & Logic

Custom tools & automation

The last few months, with the help of Copilot, I have been experimenting with various tools and scripts to make workflows more efficient by automating the most tedious and repetitive tasks. This is mainly about simplifying asset export for game productions, from Photoshop to Spine, reducing repetitive or error-prone steps and making the process more accurate, optimized and streamlined.

Modified PhotoshopToSpine script.

This is a preview of a customized version of the PhotoshopToSpine script, with extra functionality, adjusted for use in a production pipeline.

Key improvements

  • Add Base Folders template button.
  • Center Ruler Origin by clicking a button.
  • Help & Tag Info updated.
  • Absolute and Relative path toggle option.
  • Path Browsing quick buttons to set export paths.
  • Flexible Paths toggle single or both image + JSON
  • Custom JSON field to set your own JSON filename.
  • History Tracking button for the patch log.
  • Debug logging, crash reports and hooks to support batch exporting.
  • + more usability enhancements
Modified PhotoshopToSpine script

These tweaks speeds up asset management and export workflows significantly between Photoshop and Spine, increasing efficiency and reusability throughout production.

This version is made for in-house use only and is not publicly available.

PhotoshopToSpine - Batch runner

PhotoshopToSpine batch runner

This is a JSX batch runner. It’s a companion to the PhotoshopToSpine script and can be executed if present in the same folder. It goes through all the PSD files added and exports them to predetermined relative path folders.

If a path is not set, it falls back to a default location side by side with the PSD. You can also override these paths and export the assets to a new location.

In essence, with the proper setup, it lets you re-populate the game with a bunch of assets with the press of a button and nothing breaks in Spine.

This is ideal for quicker productions such as reskins of existing games.

Atlas Weaver

Atlas Weaver

Atlas Weaver is a small Python tool for unpacking Spine atlases and “rewinding” them back into individual assets, then repacking them into larger atlases based on your custom folder sorting.

During the unpack stage it detects and overwrites assets with the same name, so they only appear once in the final packing stage instead of being repeated across multiple atlases. The skeleton path data for these assets remains unchanged in the JSON files.

For packing it can use the Spine CLI if it’s available or fall back to an internal Python packer (slower but works without the CLI). When the multipacking is complete it can also merge the JSON files into a combined one to reduce runtime requests.

Between runs it remembers custom folder categories in a sorting map that can be exported/imported when experimenting or switching projects. It also supports workflows where assets are organized into 1 and 0.5 ratio folders, letting you multipack either set or both depending on your target (for example, mobile-friendly output). This is still a prototype and focuses on PNG atlases for quick iteration, but it also includes optional texture conversion to WEBP or AVIF after packing to reduce file sizes.

Number Atlas Packer

Number Atlas Packer

NumberAtlasPacker is a Python desktop tool for packing number and symbol image assets (digits, separators, currency, x, and so on) into a single compressed image atlas. One sheet is cheaper for a game to load and draw than a separate file per character. Alongside the atlas it writes a font file so a game can look up each character: XML, JSON, or FNT (the format Godot imports).

The atlas itself is WebP (default, lossless) or PNG. You can set the compression before you export. You can set export size %, on-sheet spacing, tracking, trim, premultiply alpha, and how the atlas dimensions are rounded (multiple-of-4, power-of-two, or tight). Advance can be monospaced (no jitter while a counter ticks), tabular (fixed digits, natural separators), or proportional.

Each image is matched to a character from its filename (0.png is 0, comma is a comma, dollar is $, x_small / x_large for the two x’s, and so on). If a name doesn’t match what you want, you can change it in the mapping table. Each atlas keeps its own settings as JSON and reloads them on launch. A sidebar holds several atlases at once, one input folder and one output folder each, so you can switch between them and export one or several in a single run. There is also a CLI for headless, repeatable exports from those same settings.

Number Atlas Packer GUI

The GUI has a live count-up preview so you can type a string and check spacing before you export. A Layout tab shows the number at real export size against a game resolution and background, with a temporary offset if you need to nudge it. Under the hood it’s a small desktop app. Your settings are saved next to the program, so they come back the next time you open it, whether you’re running the packaged app or from the project folder.

This is currently an experimental prototype and not publicly available.

Atlas Lens

Atlas Lens

AtlasLens is a tool for inspecting Spine atlas files. Open a project folder and you get a squarified treemap of every region: largest top-left, colour-grouped by folder prefix, so you can see all assets’ relative sizes, and what’s eating space, without manually checking the assets. You can toggle the treemap between coloured boxes and image previews, so each cell is either a solid block or a crop from the page texture.

Hover a cell for name, packed size, original size, and estimated KB; click to copy the region name. You can filter by name, pick individual pages or combine them, and multi-select atlases into one view. The status bar shows estimated VRAM per folder (1/, 0.5/ or custom) plus image size on disk, with a separate line for the current selection.

Unused Assets compares atlas regions against the skeleton JSON and lists what nothing references. It skips folders like backup and ref, and it scans 1/, 0.5/, or the project root on purpose rather than guessing across folders.

There is an experimental drawcall feature that estimates spine-webgl cost per skeleton by counting batch breaks from atlas page or blend changes, using the worst skin, and names the slot pairs that break a batch so you can regroup them in Spine. Reports can be saved as .txt.

This is currently an experimental prototype and not publicly available.

Atlas Lens unused assets

Compression Toolkit

Compression Toolkit

Compression Toolkit is a Python-based multitool for compressing image and video assets. It supports output for: WebP, PNG, JPG, AVIF, MP4 and GIF. You can set compression level, alpha Q, transparency, lossy or lossless and output size.

There are some default presets for different quality levels. You can also create your own settings and store these by exporting and later importing. This is useful for project-specific compression settings.

It supports custom output organization. Default output for instance is set to "same as original" but you can override this with a custom path and add prefix or suffix info to exported filenames.

The tool supports batch compression of multiple assets via dragging and dropping or loading of folder contents (with optional subfolders). You can also manually add the specific assets you want to compress to a queue. When a run completes, the terminal reports how much space was saved.

For the compression technology itself, it uses FFmpeg, OxiPNG, libavif (avifenc), libwebp (cwebp) and Independent JPEG Group tools (cjpeg). These can be located standalone in a relative /tools path if not added to your system PATH. Both methods will work.

This tool is currently a prototype and not publicly available.

Slack: Trello, drive and git automation

For Slack I have been experimenting with setting up watchers and occasional auto-posts to keep track of project updates and which tasks are currently in the works. Once a week, the current status for DOING and REVIEW tasks on Trello is posted in Slack, with a link to the card and who is working on it.

For Git, every push done on main is tracked in a "dev-log-commits" channel for reference.

Drive watcher / Butler

On top of that, I wired an asset Butler to post scheduled status updates to Slack. Every 48 hours it scans and makes a post if changes are found. It's a folder watcher using Google Apps Script plus a Slack bot token, so uploads and changes in a specific Drive folder (optionally including subfolders) automatically show up in a Slack channel, with names, date changed and a link.

↑ Back to top

← Back to Art, Pixels & Logic