SpinningSeal QA Fixture
QA upload fixture: ~500 MiB, ~1000 files, zero dependencies, 6 MiB animated icon. A seal spins. That is the whole mod.Spinning Seal (QA upload fixture)
A seal. It spins. Nothing else happens, but it happens at 6.3 MiB of icon.
This package exists to exercise the Thunderstore upload pipeline (usermedia
multipart upload, package validation, file-tree/blob storage, icon storage,
README/CHANGELOG rendering) with a realistic, dependency-free package that sits
just under every limit at once. All content is procedurally generated
(see docs/LICENSE.txt); nothing here is copied from any real mod.
What it pushes against
| Limit (server default) | This package |
|---|---|
| Package size, 500 MiB | 523000000 bytes target, ~1.2 MiB under the cap |
| Zip entries, 10000 | roughly 1042 files plus directory entries |
icon.png, 6 MiB, PNG, 256x256 |
animated PNG (APNG), 32 frames, ~6.1 MiB |
| README/CHANGELOG, 100k chars | this file plus a CHANGELOG |
| Dependencies | none |
Layout
| Folder | Files | Size on disk |
|---|---|---|
assets/ |
897 | 398.2 MiB |
config/ |
82 | 0.0 MiB |
docs/ |
25 | 0.0 MiB |
plugins/ |
25 | 30.1 MiB |
src/ |
8 | 0.2 MiB |
Plus the root files: manifest.json, icon.png, README.md, CHANGELOG.md, LICENSE.
File types: .json (164), .wav (154), .png (139), .pak (100), .jpg (50), .tga (46), .cfg (41), .lua (40), .csv (20), .mat (20), .prefab (20), .meta (20), .shader (20), .xml (18), .txt (16), .unity3d (15), .md (13), .ogg (11), .yaml (10), .hlsl (10), .anim (8), .dll (8), .pdb (8), .cs (8), .obj (6), .dds (6), .bmp (6), (none) (5), .ini (5), .toml (5), .cginc (5), .frag (5), .webp (5), .assetbundle (3), .html (3), .bundle (2), .mp4 (2), .pdf (2), .flac (1), .m4a (1), .mp3 (1), .opus (1), .ttf (1), .otf (1), .bin (1), .gltf (1), .mtl (1), .ply (1), .stl (1), .glb (1), .controller (1), .tif (1), .webm (1), .mkv (1), .gif (1), .mov (1), .rtf (1)
Deliberate edge cases (all valid)
- Eight real .NET assemblies under
plugins/SpinningSeal/with embedded binary resources, PDBs and XML docs. Eight is the most before the upload page warns. - Several files above 8 MiB (video, audio, bundles, a 12 MiB+ streaming bundle) and hundreds under 100 KiB, so both the batched and multipart blob paths run.
- Identical file contents under different names (textures, licence, empty
.gitkeepfiles) to exercise blob deduplication, including the empty blob. - Non-ASCII file names (Finnish, Japanese), names with spaces and an en dash, upper-case extensions, a file without an extension, and a deep path.
- A mix of stored and deflated zip entries, plus explicit directory entries.
- A nested
README.mdinsideplugins/, which must not confuse root detection.
Re-uploading
Thunderstore refuses a second upload of the same namespace, name and version.
Use bump_version.py from the build folder to re-issue the same archive under
a new version (or a new name, to test the new-package path) without rebuilding.
Credits
Inspired by the internet's favourite rotating pinniped.


