---
title: "Format Bridge — convert any asset to the format your tool needs"
tier: hero
format: 3d-asset
theme: interop pro-tool-spine convert mesh image cad format
persona: game artist, product designer, 3D generalist, anyone moving assets between tools
duration: "any hosted asset → the format your tool needs, in seconds"
budget_usd: "$0.01 per conversion (deterministic format-convert cap)"
caps: ["format-convert"]
verbs: ["convert"]
skills: ["pro-pipeline-3d", "cad-pipeline"]
showcases: ["/chapters/format-bridge-example.html"]
status: "live (2026-06-20) — format-convert cap on tool-staging-1; all three conversions below rendered E2E on production."
requires: "PRO_PIPELINE_ENABLED on the MCP server (the convert verb)."
reliability: 4.8 # deterministic cap (assimp/Pillow); −0.2 lossy-edge formats need the warning surfaced; +0.5 proven E2E (png/glb/stl)
---

# Format Bridge — convert anything (US-X1)

The connective tissue of the pro-tool spine: take **any hosted asset** and get
it in the format the next tool needs — mesh, image, or CAD — with an honest
warning on any lossy step. One verb, deterministic, ~$0.01.

## What you'll get

- **The converted asset URL** — in seconds, ready to feed an engine, a slicer, a DCC, or the web
- **An honest lossy note** — a clear warning when something was lost in translation (e.g. "FBX lost glTF PBR material extensions"), never a silent downgrade
- **Your lossless master kept** — the original is untouched; in project mode the conversion is appended as a lineage-linked scene
- **A deterministic, cacheable result** — same input, same output, ~$0.01, no model in the loop

## Fill in your BRIEF

```yaml
source_url:            # the asset to convert — a public https URL
                       # (e.g. https://…/chest-gameready.glb). Local file? host it first.
to_format:             # the format the DESTINATION tool wants — glb | fbx | obj | usdz |
                       # png | exr | jpg | webp | tiff | stl | 3mf
                       # (engine → glb · slicer → stl · older pipeline → fbx · web → webp)
from_format:           # OPTIONAL — only if the source extension is missing or ambiguous
destination_tool:      # OPTIONAL but useful — where it's going, e.g. "Unity 6", "Bambu
                       # Studio", "Blender 4.2", "a <model-viewer> on our site". Lets the
                       # agent pick the format for you if you're unsure of to_format.
project_id:            # OPTIONAL — convert a project scene instead of a raw URL
                       # (the original scene stays; the conversion is appended)
scene_index:           # OPTIONAL — which scene to convert, when project_id is set
keep_lossless_master:  # yes/no — default yes; keep the original alongside a lossy output
```

## The verb (two modes)

```
# Mode 1 — a raw hosted URL (one-shot, no project needed):
convert  source_url=<url>  to=<format>  [from=<ext if ambiguous>]

# Mode 2 — a project scene (appends a lineage-linked scene; original stays):
convert  project_id=<proj>  scene_index=<i>  to=<format>
```

CLI: `livepeer convert --source-url <url> --to fbx`  ·  `livepeer convert <proj> <i> --to glb`

## The format matrix

| Family | Conversions | Lossy note |
|---|---|---|
| mesh | glb ↔ fbx ↔ obj ↔ usdz | FBX/OBJ may drop glTF PBR extensions |
| image | png ↔ exr ↔ jpg ↔ webp ↔ tiff | jpg/webp = lossy codec; EXR→PNG clips HDR |
| cad | stl ↔ glb ↔ 3mf | STEP (parametric) is the FreeCAD fast-follow |

## How the agent should run this (interaction contract)

1. **CONFIRM target (≤1 line):** "convert `source_url` → `to_format`?" If `to_format`
   is blank, pick it from `destination_tool` (engine → GLB; slicer → STL; older
   pipeline → FBX; web → WEBP) and say which you chose and why.
2. **RUN:** call `convert` (`source_url` + `to_format`, or `project_id` +
   `scene_index`); it routes to the deterministic format-convert cap.
3. **SURFACE the lossy warning** if present — never let a lossy conversion pass
   silently. Honor `keep_lossless_master` and hand back both URLs when it's `yes`.

## Proven conversions (rendered live, see the example)

- **image** `sample.png` → `sample.jpg` (lossy-codec warning)
- **mesh** `chest-gameready.glb` → `chest-gameready.fbx` (PBR-extension warning)
- **cad** `bracket.stl` → `bracket.glb` (web/AR preview of a printable part)

## Notes / honesty

- The cap is a pure transcoder (assimp for mesh, Pillow for image). Deterministic
  + cacheable + cheap.
- Parametric STEP needs a BREP kernel (FreeCAD/OCC fast-follow); today CAD→STEP
  is a tessellated shell, flagged as such.
- This is the **US-X1** ("convert anything") capability of the pro-tool spine —
  the same `convert` step the game (`concept-to-game-asset`) and CAD
  (`idea-to-printable-part`) loops use.
