Adding a Project
You can add any compatible project as a ZIP file.
Click the button next to the project selector, then choose a .zip file from your local machine.
The project will appear in the dropdown and load immediately — no server upload needed.
The entry is temporary and will be removed on page refresh.
The ZIP file must contain index.json and credits.json at its root, along with all sprite PNG files following the structure below.
Project Folder Structure
All sprite assets must follow the directory hierarchy below. Each segment of the path carries semantic meaning parsed by the viewer.
{ProjectRoot}/
├── index.json ← required: file list + palette data
├── credits.json ← required: author / license info
└── {Category}/
└── p[{SubType}]/ ← one or more p[…] levels (sub-types / body types)
└── a[{Anim}]/ ← animation name
└── z{N}/ ← render depth (z-order, integer)
└── {filename}.png
Path segment rules:
{Category} — top-level grouping, e.g. Animal, arms, body
p[{SubType}] — sub-type / variant in square brackets, e.g. p[male], p[Cat], p[plate]. Multiple levels are allowed.
a[{Anim}] — animation identifier in square brackets, e.g. a[walk], a[idle], a[slash]. Use a[all] to apply across all animations.
z{N} — integer z-depth controlling layer compositing order (lower = further back).
Filename Format
The filename (without .png) encodes color / palette identity and sprite sheet layout:
1. Simple color — no palette swap support
{color}_{frameSize}_{frameCount}_{dirs}.png
Example: default_16_2_1.png
yellow_16_2_1.png
2. Palette color — supports in-viewer palette swapping
{material}.{version}.{color}_{frameSize}_{frameCount}_{dirs}.png
Example: metal.ulpc.brass_64_9_1203.png
cloth.ulpc.brown_64_8_0213.png
3. Multi-palette — multiple palette groups linked with -
{mat1}.{ver1}.{color1}-{mat2}.{ver2}.{color2}-…_{frameSize}_{frameCount}_{dirs}.png
Example: metal.ulpc.steel-metal.lpcr.steel-all.lpcr.source_64_6_1203.png
4. Legacy format (no dirs field — 4 directions assumed)
{color}_{frameSize}_{frameCount}.png
Field reference:
frameSize — width and height of one frame in pixels (e.g. 16, 64)
frameCount — number of animation frames per direction row
dirs — direction row order using ULPC direction codes: 0=North, 1=South, 2=West, 3=East. E.g. 1203 means rows are S, W, N, E. Use 1 for a single directionless sprite.
index.json
Must be placed at the project root (or ZIP root). Contains the full file list and optional palette data.
{
"files": [
"Animal/p[Cat]/a[walk]/z0/default_16_2_1.png",
"body/p[male]/a[walk]/z5/metal.ulpc.brass_64_9_1203.png",
...
],
"palettes": {
"{material}": {
"{version}": {
"{colorName}": ["#rrggbb", "#rrggbb", ...],
"source": ["#rrggbb", ...]
}
}
}
}
files — array of all PNG paths relative to the project root, sorted.
palettes — nested map of material → version → colorName → hex array. Each hex array must have the same length across all colors of the same material.version group (pixel-to-pixel mapping). Omit if no palette swapping is needed ("palettes": {}).
- The
source color represents the original pixel values used as the swap source.
credits.json
Must be placed at the project root (or ZIP root). Displayed in the Credits panel and downloadable.
{
"Authors": [
{ "name": "Author Name", "url": "https://example.com/author" },
{ "name": "Another Author" }
],
"Licenses": [
"CC-BY-SA 3.0",
"OGA-BY 3.0"
],
"URLs": [
{ "label": "Source Repository", "url": "https://github.com/example/repo" },
{ "label": "Asset Page", "url": "https://opengameart.org/..." }
]
}
Authors — list of contributors. url is optional.
Licenses — list of license strings (plain text).
URLs — list of relevant links with a display label and URL.