Organize Game Assets: Mesh, Texture, Rig, Clip and Bind Handoff
A plain-text manifest convention for keeping mesh, texture, rig, clip and bind files versioned and traceable across your project.
don't rely on filenames or memory to keep a mesh, its textures, its rig, its animation clips and its equipment bindings together. Give each asset set one manifest file that records a stable library ID, a checksum and a version number for every component, store the actual binary files in your own repo, and treat any signed download URL as disposable — it's a fetch mechanism, not a reference you keep.
This matters because these five pieces are produced at different times, sometimes by different people or different agent runs, and a bind (a socket offset, an attachment transform) is only valid for the specific mesh and rig it was calibrated against. If you regenerate the mesh six weeks later and the bind file doesn't know which mesh version it belongs to, you'll ship a weapon floating a few centimeters off a hand and have no fast way to tell why.
The core problem: three different kinds of identity
When you pull an asset from a shared library, you're dealing with three separate things that are easy to conflate:
- Library ID — the identifier of an asset record. Unlike a signed download URL, it is not a time-limited transfer link. Retrieval still depends on the record existing and your access to it; do not assume the ID alone proves the file contents have never changed.
- Signed download URL — a temporary link used to actually transfer the file. It expires. Hardcoding it into a scene file, a config, or a script is a bug waiting to happen.
- Local repo copy — the file that actually lives in your project and gets committed, built and shipped. Use a controlled local or build-system copy when reproducible builds are required, rather than depending on an old signed transfer URL.
The hosted GripForge MCP endpoint returns asset URLs but cannot write into your project folder directly — it just hands you a link. The local MCP client (@gripforgeai/mcp, run alongside your coding agent) is the piece that can pull an asset by its library ID and write it into your local project. Keep this distinction in your head: URL for transfer, ID for lookup, and recorded file hashes or versions for the exact content your build consumes. See the MCP docs for how the hosted endpoint and local client differ.
A proposed manifest convention (example, not a GripForge schema)
This is a proposed project convention, not a format GripForge requires or reads. A GLB can contain geometry, rig and clips together; keep those components in one file when appropriate and reference that same file in the manifest. The separate files below illustrate one possible handoff, not required exports.
/assets/characters/hero_knight/
asset.manifest.txt
mesh/hero_knight_v3.glb
textures/hero_knight_albedo_v2.png
textures/hero_knight_normal_v2.png
rig/hero_knight_rig_v1.glb
clips/hero_knight_idle_v1.anim
clips/hero_knight_run_v1.anim
bindings/hero_knight_sword_socket_v1.json
Example asset.manifest.txt contents:
asset_set: hero_knight
version: 4
updated_at: 2026-09-10T12:00:00Z
mesh:
file: mesh/hero_knight_v3.glb
library_id: lib_mesh_88ad2
checksum: sha256:9f2c...
texture_albedo:
file: textures/hero_knight_albedo_v2.png
library_id: lib_tex_5c110
checksum: sha256:71a0...
rig:
file: rig/hero_knight_rig_v1.glb
library_id: lib_rig_302f1
checksum: sha256:be44...
bind:
file: bindings/hero_knight_sword_socket_v1.json
library_id: lib_bind_77a90
depends_on: [mesh:lib_mesh_88ad2, rig:lib_rig_302f1]
notes: "Socket offset recalibrated for tall-rig variant, see fit-weapon article"
The depends_on line records related asset IDs. Also record the exact file checksums or source versions you validated; an ID by itself is not proof of an immutable file version. If the mesh gets regenerated to lib_mesh_9a01f, the bind's depends_on no longer matches — that's your signal to re-check the socket, not assume it still lines up.
Steps
- One manifest per logical asset set, not per file type. A character, a weapon, a prop each get one manifest covering everything attached to them.
- Record the library ID the moment you pull or generate a component — before the signed URL expires. The library ID is what you'll use to re-fetch later; the URL can expire; it is not necessarily single-use.
- Download into your own repo path and compute a checksum. This local copy, not the URL, is what your engine project references.
- Bump the version field whenever any single component changes, and keep the previous file (e.g., under an
/archive/v3/subfolder) until you've confirmed the new version works in-engine. - Reference dependent library IDs in the bind entry. Your handoff process should flag the bind for review when related IDs, versions or file hashes change. This proposed manifest does not add an automatic dependency checker to GripForge.
- Check the manifest into version control alongside the binaries (or their Git LFS pointers). Never leave the only record of an asset's identity sitting in chat history or a generation log.
Acceptance criteria
- Every delivered component has a traceable source and checksum; record a Library ID when it is actually stored in the Library.
- No scene file, script or config references a signed URL directly.
- After re-pulling an asset, compare its checksum with the accepted version and review any difference.
- Every bind entry lists the library IDs of the mesh and rig it was calibrated against.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Local file missing, only a URL in old notes | Signed URL expired before download | Re-pull using the stored library ID, don't regenerate from prompt |
| Checksum mismatch on a tracked file | File was hand-edited or re-exported outside the pipeline | Bump version, update checksum, note reason in manifest |
| Weapon offset looks wrong after a mesh update | Bind's depends_on mesh ID is stale | Re-validate the socket against the Unreal socket transfer checklist before trusting old offsets |
| Two teammates have different files for "the same" asset | No shared manifest convention, or manifest not committed | Adopt one manifest per asset set and commit it with the binaries |
FAQ
Should I commit large mesh and texture files directly to Git?
Use Git LFS or a dedicated asset repo if file sizes are large; the manifest and its checksums still apply the same way regardless of which storage backend holds the binary.
What if I need several versions of the same animation clip around at once?
Keep each required clip version distinguishable, and have the manifest list the exact files and hashes used by the current asset set. Retain the versions needed to reproduce shipped builds.
Does listing an asset in the Library mean it's already validated for my project?
No — the Library lets you list and retrieve existing assets before generating new ones, but reuse doesn't confirm the asset meets your project's visual, licensing or performance requirements. Inspect it after pulling, the same way you'd inspect a fresh generation. See the documentation for library retrieval behavior.
For equipment specifically, pair this manifest convention with per-rig offset checks — identical socket offsets across differently proportioned characters are not a valid success criterion. The weapon-fit checklist covers that separately from asset organization.