For anyone building robots with AI

Catch broken robot files before they break your simulation.

Every robot in a simulator starts as a file that lists its parts, joints, sizes and weights. When AI writes that file, small mistakes slip in: a part that weighs nothing, an arm 1,000 times too big. NIUA checks the file, tells the AI exactly what to fix, and signs a certificate once it is right.

Works today with robot arm files (URDF). Also checks 3D game models (GLB).

An AI building a robot arm, with NIUA checkingExample
AIHere is the robot arm you asked for. arm.urdf
NIUATesting it against the robot arm checklist.
NIUAFailed. The arm is 1,000 times too big. It is measured in millimeters, and simulators use meters.
AIFixed. Every part is now in meters.
NIUAPassed. Certificate signed.
Example certificate
arm.urdf
Passed and signed
Try it now

Drop a robot file. See what breaks.

Drop a robot file (a .urdf, or a .zip with its meshes). NIUA checks it right here and keeps nothing. No account needed.

Let your AI check its own files as it works. Connect it

Why this exists

Most tools only check that the file opens.

That misses the mistakes that matter: a moving part that weighs nothing, joint limits set backwards, a whole arm 1,000 times too big. The file opens fine. You only find out when the simulation goes wrong.

We broke our own robot arm file 8 different ways.
How many broken copies did each tool catch?
NIUA8 of 8
MuJoCo simulator2 of 8
yourdfpy file reader1 of 8

The simulator and the file reader answer a different question: does it open? The good copies passed all three. Simulation only. See how we measured it

Run it yourself

One script downloads the 13 robot files and runs all three tools on them. It needs Python 3 with MuJoCo and yourdfpy installed. On Windows, use curl.exe and py. Read the script first

curl -fsSLO https://ohao.tech/evidence/urdf-oracle/reproduce.py && python3 reproduce.py
Test

NIUA tests the file against a checklist.

Every kind of file has its own checklist. For a robot arm it asks questions like: is every part attached? Does every moving part have a weight? Is it measured in meters? Each answer is pass or fail. Nothing is guessed.

1,000x too big
Every part is attached to one robotPASS
Every moving part has a weightPASS
Joint limits are the right way roundPASS
Measured in metersFAIL
Checks from the robot arm checklist. Example result.
Fix

When something fails, the AI fixes it.

Each failure says what is wrong, where, and how to fix it, in words an AI can follow. The AI makes the change and sends the file back. Nobody has to step in.

See a real run: Claude Code read the failures, edited the file and checked again until it passed.

Problem: the arm is measured in millimeters.
How to fix: scale every part by 0.001 to get meters.
- scale="1 1 1"
+ scale="0.001 0.001 0.001"
Certificate
PASSED
filearm.urdf
checklistrobot arm
tries2
Example certificate.
Certificate

Every pass comes with a certificate.

It lists which file passed which checks. It is digitally signed, so anyone can confirm it is real on their own computer, with no account and no internet. Change one character and it stops being valid.

Example
The certificate as NIUA signed it
VALID
Example
The same certificate, edited by someone
INVALID

Example. A real one is linked below.

Use it from your AI tool

NIUA works with Claude, Cursor and other AI tools that support MCP, the standard way AI tools connect to outside services. Add this address in your tool's settings and the AI can check its own work.

claude mcp add --transport http niua https://mcp.ohao.tech/mcp
https://mcp.ohao.tech/mcp

Real runs, real files

The evidence

Each result below opens to a demo you can run, the file we used and a signed certificate. Simulation only, no hardware tested

  1. A robot is checked before a simulator sees it

    simulation only, no hardware tested

    NIUA reads a robot file (URDF) against its robot checklist, urdf.sim-ready@1: every part attached in one chain, a real weight on every moving part, a collision shape on every visible part, joint limits the right way round, 3D files that exist, sizes in meters, not millimeters. Each failure names the part, what was expected, what was found and the fix.

  2. It catches what other tools let through

    simulation only, no hardware tested

    We broke our arm 8 ways, one break per copy, and ran every copy through NIUA and two open-source tools. Those tools answer a different question (does the file load?), so they let most breaks through.

    • NIUA gate8/8
    • yourdfpy1/8
    • MuJoCo2/8compiled the other 6

    Broken copies flagged. Measured 2026-10-15. 13 URDF fixtures from our own desk arm (5 good, 8 broken). Gate: urdf.sim-ready@1. yourdfpy 0.0.60: URDF.load with meshes, then validate(). MuJoCo 3.16.0: MjModel.from_xml_path. Flagged means rejected or failed to load. result.json

  3. An agent repairs it until a simulator loads it

    simulation only, no hardware tested

    Claude Code read the failures NIUA named, edited the robot file (every guessed value marked as a guess) and checked again until it passed. The MuJoCo simulator refused the original file and loads the fixed one.

    Measured 2026-10-15. tools/auto-sim/run_auto_sim.mjs against production. MuJoCo 3.16.0 compiles each file, then runs 2 s under gravity from a bent pose with no actuation and checks the state stays finite. run.json

  4. A humanoid clip passes a physics replay

    simulation only, no hardware tested

    A real NVIDIA Unitree G1 humanoid clip passes motion.g1-safe@1 in a MuJoCo physics replay, run on CPU: every joint inside its range and speed limit, feet on the floor without sliding, upright the whole time. Four mistakes we planted were fixed first, each from a failure NIUA named.

    Measured 2026-10-15. tools/g1-motion/record_production.mjs: the production gate checked the published clips; MuJoCo 3.16.0, Menagerie unitree_g1, timestep 0.002 s, joint PD kp 500 kv 10.32, root unactuated, sampled at 50 Hz. Source: the first 3.5 s of NVIDIA GR00T-WholeBodyControl macarena_001__A545. production.json

What NIUA does not do

Simulation only, no hardware tested

NIUA has no robot hardware. Every check and run on this site happens in software, never on a physical robot.

Not sim-to-real

A pass means the file is well formed for a simulator. It does not promise a physical robot would behave the same.

No physics fidelity score

We check that weights and joint limits are present and possible, not that they match a real robot.

World models: not built yet

This is planned. Nothing for it exists today.

Our own test files

The robot results on this site come from our own arm files, each one linked. They are not customer results.

Also checks today: humanoid motion clips, replayed in the MuJoCo physics simulator. Next: checked training data for robot AI.

Also built

Before the checker, NIUA made the files too.

NIUA started as a service that creates game assets with AI. Send a picture, a video or a sentence, and it returns a textured 3D model, a rigged character, an animation, music or speech. NIUA runs these open models itself, on rented GPUs. It still runs as a paid add-on.

  • Picture to textured 3D modelPixal3D
  • Repaint a model's texturesTRELLIS.2
  • Split a model into partsX-Part
  • 3D model to rigged characterSkinTokens
  • Video to animationGEM-X
  • Text to animationKimodo
  • Text to musicACE-Step
  • Text to sound effectsStable Audio
  • Text to speech and dialogueIndexTTS-2
  • Describe a voice, get that voiceQwen3-TTS

Behind it: an API server written in Rust, GPU workers on Modal, pay-per-use billing, and a server so AI tools can call every model directly.

Every output here came out of NIUA's models. Inputs are labelled as inputs.

A picture
Input picture of a samurai
What you send
Pixal3D, one step
The 3D shape
The samurai 3D model shown without its textures
Still from an earlier job: Pixal3D, made 2026-05-28
The model with textures switched off
Textures on, same model, same step
A finished 3D model
Textured 3D model of the samurai
Still from an earlier job: Pixal3D, made 2026-05-28
3D model: Pixal3D, made 2026-11-02job 0ab8844e
Ready to drop into a game
A video becomes a 3D animation
A still from the input video of a woman cycling
What you send
Loads when you press the button.
The 3D animation
GEM-X, made 2026-11-02job 1ba2429a
A sentence becomes an animation
What you senda person walks forward, stops and waves with the right hand
Loads when you press the button.
Kimodo, made 2026-11-02job f80f9ccc
A sentence becomes sound
Music
What you sendtense orchestral game ambience, low strings, slow taiko drums
Tap to play
ACE-Step, made 2026-11-02job 81e40937
Sound effects
What you sendheavy metal sword clash with a sharp ring and a short echo
Tap to play
Stable Audio, made 2026-11-02job 52e98069
Speech
What you sendWelcome to the shrine. The path ahead is long, but worth every step.
Tap to play
IndexTTS-2, made 2026-11-02job dd767059