npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@cooljapan/oxihuman

v0.1.1

Published

WebAssembly bindings for OxiHuman — full browser-ready API

Readme

oxihuman-wasm

Part of the OxiHuman workspace — privacy-first, client-side human body generator in pure Rust.

Status: Stable | Tests: 168 passing | API: 68 WasmEngine methods | Version: 0.1.1 | Updated: 2026-03-13

WebAssembly bindings for OxiHuman — full browser-ready API via wasm-bindgen. A single WasmEngine struct exposes the entire OxiHuman pipeline to JavaScript/TypeScript, enabling privacy-preserving, client-side human body generation with no server round-trips.


Feature Flags

[features]
default = []
wasm = ["dep:wasm-bindgen", "dep:js-sys"]

The wasm feature is optional. Enable it when targeting browser/Node.js environments via wasm-bindgen. Without it, the crate still compiles for testing and native use.


Installation

[dependencies]
oxihuman-wasm = { version = "0.1.1", features = ["wasm"] }

Structs

WasmEngine

Main body generator. Exposes the full OxiHuman pipeline as 68 public #[wasm_bindgen] methods. Holds base mesh data, loaded morph targets, parameter state, physics proxies, and animation frame buffer.

ParticleSystem

Point particle system with configurable emit_rate and lifetime control. Created via WasmEngine::create_particle_system() and stepped via step_particles().

Particle

Represents a single active particle. Carries position (Float32Array), velocity (Float32Array), and age (f32).


WasmEngine API — 68 Methods

Initialization (4)

| Method | Description | |--------|-------------| | new_from_obj_bytes(bytes) | Create engine from raw OBJ mesh bytes | | new_strict() | Create engine with strict validation policy profile | | load_target_bytes(name, bytes) | Load a morph target from raw .target file bytes | | load_zip_pack_bytes(bytes) | Load a ZIP asset pack; returns the number of targets loaded |

Target Management (8)

| Method | Description | |--------|-------------| | list_loaded_targets() | Return JSON array of all loaded target names | | loaded_target_count() | Return count of currently loaded targets | | load_target_from_json(json) | Load a morph target from JSON descriptor | | unload_target(name) | Remove a named target from the engine | | set_target_weight_by_name(name, weight) | Set blend weight [0.0–1.0] for a named target | | get_target_weight_by_name(name) | Get current blend weight for a named target | | target_count() | Total number of registered targets (loaded + unloaded) | | get_loaded_target_names() | Return JS array of loaded target name strings |

Parameter Control (7)

| Method | Description | |--------|-------------| | set_height(value) | Set body height parameter (metres) | | set_weight(value) | Set body weight parameter (normalized) | | set_muscle(value) | Set musculature parameter | | set_age(value) | Set age parameter | | set_param(key, value) | Set any named parameter by string key | | reset_params() | Reset all body parameters to defaults | | reset_all_weights() | Reset all morph target blend weights to zero |

JSON Import/Export (4)

| Method | Description | |--------|-------------| | export_params_json() | Serialize current parameter state to JSON | | import_params_json(json) | Restore parameter state from JSON | | get_measurements_json() | Return computed body measurements (height, circumferences, etc.) as JSON | | export_anim_json() | Serialize recorded animation frames to JSON |

Mesh Building (3)

| Method | Description | |--------|-------------| | build_mesh_bytes() | Build binary mesh buffer containing positions, normals, UVs, and indices | | export_quantized_bytes() | Export mesh in QMSH quantized binary format (compact, lossy) | | get_scene_json() | Return scene description JSON (nodes, cameras, lights) |

Physics (5)

| Method | Description | |--------|-------------| | get_physics_proxies_json() | Return collision proxy shapes as JSON | | get_physics_rig_json() | Return full physics rig descriptor as JSON | | get_capsule_chains_json() | Return capsule chain descriptors for limbs as JSON | | step_physics(dt) | Step physics simulation by dt seconds (stub) | | set_wind(x, y, z) | Set wind force vector for cloth/particle systems (stub) |

Animation (7)

| Method | Description | |--------|-------------| | record_anim_frame() | Record current parameter state as an animation frame | | clear_anim_frames() | Clear all recorded animation frames | | anim_frame_count() | Return number of recorded frames | | seek_anim_frame(index) | Restore parameter state to a recorded frame by index | | play_anim_step() | Advance playback by one frame, wrapping at end | | get_anim_fps() | Get current animation playback rate (frames per second) | | set_anim_fps(fps) | Set animation playback rate |

Query & Analysis (6)

| Method | Description | |--------|-------------| | get_vertex_count() | Return number of vertices in the built mesh | | get_index_count() | Return number of triangle indices in the built mesh | | get_curvature_map() | Return per-vertex curvature values as Float32Array | | get_geodesic_distances(origin_index) | Return geodesic distances from origin vertex as Float32Array | | query_sphere_near_point(x, y, z, radius) | Return JSON array of vertex indices within sphere | | get_mesh_segments() | Return JSON segment map (body part regions by vertex range) |

Presets & Proportions (5)

| Method | Description | |--------|-------------| | set_params_from_preset(preset_name) | Apply a named parameter preset (e.g., "athletic", "average") | | apply_preset_by_name(name) | Apply preset including morph target weights | | get_body_proportions_json() | Return computed proportional ratios as JSON | | get_param_summary_json() | Return a summary of all parameters and their current values as JSON | | set_allowlist(names) | Restrict which targets are eligible for blending |

LOD & Shaders (2)

| Method | Description | |--------|-------------| | get_lod_scene_json() | Return multi-LOD scene JSON (LOD0–LOD3 meshes) | | list_builtin_shaders() | Return JSON array of built-in shader descriptor names |

Cache (2)

| Method | Description | |--------|-------------| | has_cached_mesh() | Return true if a built mesh is cached and parameters are unchanged | | reset_incremental_cache() | Invalidate the incremental mesh build cache |

Particles (2)

| Method | Description | |--------|-------------| | create_particle_system(emit_rate, lifetime) | Create a new ParticleSystem with given parameters | | step_particles(system, dt) | Advance a particle system by dt seconds |

Expressions (2)

| Method | Description | |--------|-------------| | apply_expression_blend(expression_json) | Apply a facial expression blend from JSON descriptor | | get_cloth_state() | Return current cloth simulation state as JSON (stub) |


Free Functions

| Function | Description | |----------|-------------| | parse_mesh_bytes_header(buffer) | Parse the format header from a binary mesh buffer; returns JSON with format version and field offsets |


JavaScript/TypeScript Usage

import init, { WasmEngine } from "oxihuman-wasm";

await init();

// Load base mesh from an OBJ file
const objBytes = new Uint8Array(await fetch("human_base.obj").then(r => r.arrayBuffer()));
const engine = WasmEngine.new_from_obj_bytes(objBytes);

// Load a ZIP asset pack with morph targets
const packBytes = new Uint8Array(await fetch("targets.zip").then(r => r.arrayBuffer()));
const count = engine.load_zip_pack_bytes(packBytes);
console.log(`Loaded ${count} targets`);

// Set body parameters
engine.set_height(1.75);
engine.set_weight(0.4);
engine.set_muscle(0.6);
engine.set_age(30.0);

// Build mesh and use binary data
const meshBytes = engine.build_mesh_bytes();

// Export parameters
const paramsJson = engine.export_params_json();
console.log(JSON.parse(paramsJson));

// Query measurements
const measurements = JSON.parse(engine.get_measurements_json());
console.log(measurements);

Architecture Notes

  • All heavy computation runs in the browser's WebAssembly sandbox — no server communication, no data leakage.
  • WasmEngine is !Send and single-threaded by design. For parallel workloads, use multiple instances in separate Web Workers.
  • Physics methods (step_physics, set_wind) and get_cloth_state are currently stubs returning placeholder data; full simulation is implemented in oxihuman-physics.
  • The wasm feature gate keeps native builds free of wasm-bindgen overhead, allowing the crate to be used in test harnesses and CLI pipelines without a browser target.

v0.1.1 Internal Refactor

engine.rs is now a thin re-export module (7 lines). The implementation has been split into four focused source files with no public API changes:

| File | Contents | |------|----------| | engine_core.rs | WasmEngine, ParticleSystem, Particle struct definitions and initialization | | engine_anim.rs | Animation recording, playback, and frame management methods | | engine_targets.rs | Morph target loading, unloading, and weight management methods | | engine_io.rs | JSON import/export, mesh building, physics, query, and preset methods |

Tests were moved to wasm_tests.rs. All public #[wasm_bindgen] method signatures are unchanged.


License

Apache-2.0 — Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)