portrait-webCLI

photo to VRM ● 100% local · zero egress GitHub
Choose a photo of a face to begin.

Start from a photo. The page reads the face on your device, makes a face-blendshape GLB from it, and drives a base VRM's expression blendshapes from that GLB's morphs. Optionally it moves the VRM's face shape, hair shape and colors toward the photo. The skeleton, skin weights and existing blendshapes are not changed, and the hairstyle can be re-laid as waves, curls or coils or switched to a cut preset (no new hair is added).

Stays on this device

Your photo, the face GLB made from it, and everything derived from them are processed in this page and are never sent to any server. The face model runs locally from files served with this page (nothing from a CDN). The page makes GET requests only, and the whole thing works with the network off once the page has loaded.

Approximate, not a likeness guarantee

The binding makes the VRM's expressions drivable from the face source. The shape and color matching below is a rough, measured nudge (eye size and spacing, mouth, jaw, profile depth; skin, hair, eye and brow color); an anime base will still look like an anime character.

1 · Inputs

Face photo

or

A clear, front-facing face. The photo stays on this device.

On-device face model: loading…

Already have a face-blendshape GLB? Use it instead of a photo

Base VRM

Use your own VRM instead (a local file or a URL)
2 · Match the photo

Optional and approximate; everything is applied to the VRM's own geometry and materials.

Re-lays each lock as a wave, curl or coil on the VRM's own hair cards; a cut preset replaces the photo's silhouette; braids, buns and ponytails are not possible.

Pulls hair that the lift has raised off the skull back toward it, so it does not look like a wig; 0 keeps the full lift.

100%
70%

The hairstyle is the VRM's own hair cards, scaled, shifted and optionally re-laid; the texture guessed from the photo is a rough estimate you can override. The body and the skeleton are not changed, and the photo's texture is not painted onto the avatar. With a face GLB instead of a photo only the skin tone applies (there are no measurements or hair/eye/brow colors in it).

Network audit
(no requests)