Character Factory
A free, open-source, locally-run text-to-3D character pipeline. Prompt in, rigged character out.
Website · Hugging Face · PyPI · Unity package
- Quickstart
- Agent quickstart
- What you get
- The character file
- Interfaces
- Hardware and install
- The interpreter
- Known limitations
- Going deeper
Quickstart
pip install "character-factory[generation]"
$ character-factory make "A retired astronomy professor, tweed waistcoat, round spectacles, white beard" -o professor
create 77.6 s
bake 134.3 s
assemble 5.2 s
professor/character.char.json
professor/scene.glb
Timings: one RTX 3090, weights on disk, default local interpreter.
The first run downloads 36.4 GB of model weights (17.1 GB with an endpoint interpreter). After that, generation is local and offline.
Agent quickstart
Paste into Claude Code, Codex, or any coding agent.
Set up Character Factory (NVIDIA GPU, 24 GB):
1. pip install "character-factory[generation,server]"
2. character-factory make "<description>" -o <dir>
Writes <dir>/character.char.json and <dir>/scene.glb; stdout is exactly those two paths.
Interpreter: Qwen3.5-9B, local by default (Apache-2.0, ungated — no token, no account).
First run downloads 36.4 GB of model weights.
Optional:
- MCP: pip install "character-factory[mcp]"; add `character-factory mcp` to the agent's MCP config.
- Unity 6000.0+: character-factory serve; add
"com.character-factory.unity": "https://github.com/character-factory/character-factory-unity.git"
to Packages/manifest.json; then unity cmd cf-create --prompt "<description>" --walking true --json
and unity cmd cf-verify --target "<name>" --json.
- Endpoint interpreter (faster): set CHARACTER_FACTORY_INTERPRETER_ENDPOINT, _MODEL, _API_KEY.
Or:
Build a character-driven game using https://characterfactory.ai
No additional API key or account required.
What you get
Two files per character:
character.char.json— body parameters, texture recipes, a hair description, and provenance. A few KB.scene.glb— a rigged, skinned glTF: a skin-only body, garment and shoe shells with their own materials, hair with albedo and normal maps, and a modeled mouth (teeth, gums, tongue, inner cavity).
| Property | Every character |
|---|---|
| Triangles | ~15–50k, hair-dependent |
| Textures | 1024² per surface — skin, eyes, garment, shoes; hair albedo + normal |
| Rig | 127 joints, linear-blend skinning; 54-bone Unity Humanoid map in the manifest |
| Facial animation | 72 morph targets (facs_00–facs_71) + jaw joint |
| Idle | a baked breathing clip, Generic or Humanoid |
| Materials / draw calls | 10–11 primitives |
| Alpha passes | 0 — fully opaque |
| GLB size | ~9 MB; ~4 MB with --compress |
Compression: --compress web writes scene.web.glb with WebP textures; --compress unity writes scene.unity.glb with JPEG textures for glTFast and other loaders without WebP.
The character file
character.char.json is the character; the GLB is built from it. Trimmed from the SPEC.md §3 example:
{
"format": "character-factory/character",
"schema_version": "0.1",
"body": {
"rig": "mhr-lod1@1.0",
"identity": ["…"],
"proportions": { "leg_length": 0.24, "hip_width": -0.06 },
"resting_expression": ["…"]
},
"textures": {
"garment": {
"component": "make-garment",
"component_version": "0.1.0",
"prompt": "teal running vest and black shorts, white piping",
"seed": 41004
},
"…": "…"
},
"hair": { "family": "crop", "color": { "family": "dark_brown" }, "…": "…" },
"provenance": {
"components": { "make-figure": { "version": "0.1.1" }, "make-garment": { "version": "0.1.0" }, "…": "…" },
"…": "…"
}
}
Edit the file and resubmit it — POST /v0/characters with {"character": …}, or bake then assemble in Python. Assembly is deterministic. The format is specified in SPEC.md.
Interfaces
CLI. make (--seed, --backend, --turbo, --compress web|unity), validate, assemble (character file → GLB, no GPU), compress, interpret, preflight.
Server + browser UI. pip install "character-factory[server]", then character-factory serve: the /v0 HTTP API and a gallery UI on 127.0.0.1:8400 (--host 0.0.0.0 for other machines). /v0/docs documents the API.
MCP. pip install "character-factory[mcp]", then add character-factory mcp to your agent's MCP config. Tools on stdio: create_character, get_job, get_character, list_components.
Unity (6000.0+). Run character-factory serve, add
"com.character-factory.unity": "https://github.com/character-factory/character-factory-unity.git"
to Packages/manifest.json, then:
unity cmd cf-create --prompt "<description>" --walking true --json
unity cmd cf-verify --target "<scene-object-name>" --json
See the package README.
Python.
from character_factory import Character
c = Character.load("examples/characters/freediver.char.json")
print(c.content_id, c.rig, sorted(c.textures))
Hardware and install
Measured on one RTX 3090; details in ARCHITECTURE.md §6.
| Size / time | |
|---|---|
| Install | 5.6 GB (torch with CUDA) |
| Weights, first use | 36.4 GB: 19.3 GB interpreter + 16.0 GB base image model + 1.1 GB components. 17.1 GB with an endpoint interpreter |
| Generation, 24 GB card | bf16: bake 17.4 GiB, 137 s. Whole character 3 min 38 s with the local interpreter |
| Generation, 12 GB card | nf4 (textures.quantization in the cache config): bake 8.9 GiB, 267 s, with an endpoint interpreter |
| Generation, 8 GB card | not supported |
| Assembly and consumption | no GPU — character file → GLB runs on CPU, including macOS |
character-factory preflight checks the install, CUDA build, and driver. make runs it first.
The interpreter
The interpreter is the language model that turns your description into each component's prompt.
Local (default). The registry's interpreter component names Qwen3.5-9B (Apache-2.0, ungated — no token, no account). 19.3 GB to download, 16.9 GiB of VRAM, 78 s per description on the 3090.
Endpoint (faster, better prompts). Point it at any OpenAI-compatible endpoint. A hosted frontier model (an OpenAI GPT-5.6-class model in our bench) takes 14 s and writes better prompts. Configure with one of:
- environment:
CHARACTER_FACTORY_INTERPRETER_ENDPOINT,_MODEL,_API_KEY interpreter.backendsin the cacheconfig.jsonPUT /v0/interpreters/{alias}on a running server
Known limitations (v0.1)
- Generated textures are albedo only, no normal or material maps.
- The initial hair provider is a finite set of procedural components.
- Garment textures may have warped details and edge artifacts.
- Garment and shoe geometry are a single layer shell separated from the body.
- Spec and architecture are an initial draft and will change rapidly.
Trust boundary
The server binds to 127.0.0.1 and does not authenticate. Do not expose it to the public internet.
Going deeper
- SPEC.md — the character format.
- ARCHITECTURE.md — the system.
/v0/docson a running server — the HTTP API.
Built on
MHR (Meta, Apache-2.0), FLUX.2 Klein 4B (Black Forest Labs, Apache-2.0), Qwen3.5-9B (Apache-2.0), UnityEyes2 (MIT), GNM (Google, Apache-2.0). See NOTICE.
Status and license
v0.1. File issues at github.com/character-factory/character-factory/issues.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file character_factory-0.1.1.tar.gz.
File metadata
- Download URL: character_factory-0.1.1.tar.gz
- Upload date:
- Size: 5.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fce5242977be8ac7b4503039cf82c53ac563ff3b2c0b11f418df3317ead227a
|
|
| MD5 |
dd0a778099259a351528c4a9a6208761
|
|
| BLAKE2b-256 |
36fbf28a0b1a4b8d36adba379e4b7a1636582bab7e5cc395a1aad07e358796e8
|
Provenance
The following attestation bundles were made for character_factory-0.1.1.tar.gz:
Publisher:
release.yml on character-factory/character-factory
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
character_factory-0.1.1.tar.gz -
Subject digest:
4fce5242977be8ac7b4503039cf82c53ac563ff3b2c0b11f418df3317ead227a - Sigstore transparency entry: 2692348708
- Sigstore integration time:
-
Permalink:
character-factory/character-factory@9e09f0e744fd526f65a71811dfecbafd64b20d75 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/character-factory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9e09f0e744fd526f65a71811dfecbafd64b20d75 -
Trigger Event:
release
-
Statement type:
File details
Details for the file character_factory-0.1.1-py3-none-any.whl.
File metadata
- Download URL: character_factory-0.1.1-py3-none-any.whl
- Upload date:
- Size: 5.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aec95c24f7343e1e3fe7febf822c74f6daf89c22fb5a0e900b401d564d3975fa
|
|
| MD5 |
997b06ce40d439257fd34c156b72bbde
|
|
| BLAKE2b-256 |
674d290c89948c55e8a8ca12834dd37ba0023e342d38eaadbd2f88c55a7595cd
|
Provenance
The following attestation bundles were made for character_factory-0.1.1-py3-none-any.whl:
Publisher:
release.yml on character-factory/character-factory
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
character_factory-0.1.1-py3-none-any.whl -
Subject digest:
aec95c24f7343e1e3fe7febf822c74f6daf89c22fb5a0e900b401d564d3975fa - Sigstore transparency entry: 2692348956
- Sigstore integration time:
-
Permalink:
character-factory/character-factory@9e09f0e744fd526f65a71811dfecbafd64b20d75 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/character-factory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9e09f0e744fd526f65a71811dfecbafd64b20d75 -
Trigger Event:
release
-
Statement type: