Operator — internal; no customer surface links here
boots clean
page $0
billed render stage
noindex
Turns one portrait into a talking character — the module’s own description of
itself. The page is the roster and the instructions; the making itself is a command-line run.
Its region helper is fully in-browser — pick your image with the file chooser, drag
the MOUTH and EYES boxes onto the face, and the page prints the command line with your dragged
numbers already filled in. Nothing uploads: the image becomes a local blob URL and the
page’s only two network reads are the character roster and its manifests.
- authors
- 5 visemes + a blink + 3 idle-life poses —
9 renders in all, alignment-baked against the base
- output
public/avatar-lab/characters/<id>/ + a row in characters/index.json
- racked now
- 3 characters — two photo-real, one vector rig
- the renders
- both photo-real characters carry all 9 frames on disk, and every
frame carries a content credential naming
gpt-image 2.0 — so the billed
stage’s output is checkable even though independent verification has not yet re-run it
- cost
- page and region helper $0; the render step is $0.40–0.70 one-time
per character (the module’s own figure); runtime stays $0/min
- the command
- a template — it carries your measured
--mouth and
--eyes, and you supply the image path and the name
- then
- each finished character carries an Open in Lab link into the
Avatar Lab, where it speaks against a local clip
Reachable today from four pages — the studio index’s
“five 2D engines” section, and the tab row shared by the Avatar Lab, the Expression
Lab and the Hybrid Overlay Lab.
Operator — internal quality bench; the darkest door here
boots clean
one inbound door
$0
voice copilot billed
Spot the line, fix it, check it at every size a customer sees. Pick a face, drive it
through idle / listening / thinking / speaking, then shrink the stage to half, to a 130px
console, to a 104px widget — artifacts hide at scale. Three tools sit beside it: the
zone tuner, a voice copilot that takes plain speech (“mouth down a touch”)
and files anything deeper for the coding agent, and a freestyle tester that fires the
model’s own express_self payloads — including a deliberate bad value, to
watch the reject path work.
- roster
- 21 faces in three groups, the bench’s own labels —
7 hybrid portraits (3 shipped + 4 branded), 12 Alive cast, 2 photo-real
- tuner
- 5 zone dials: centre X, eye line, eye spread, mouth Y, feature scale
- output
- a draft in this browser, then EXPORT downloads
face-tuning.json
— which a human must place at public/alive-site/face-tuning.json
- who reads it
- four readers: every hybrid face mounted through the shared widget
module, the marketplace cards, the live cast, and the Face Overlay Lab
- known gap
- the estate already has a live, permission-gated, audited save route for
exactly this file, and this bench does not use it — the export is a hand-carry.
Registered as
OWED-CF1. The gap is verified; the fix is not built
- billed lane
- the copilot’s own button reads
🎙 TALK (live voice — billed usage). Nothing spends until it is pressed
Reachable today from one page — the Avatar Lab’s own QC-bench
section, whose door button arrived with the 2026-08-06 serve. The day before it was reachable
from nothing at all. This card is the second door.
Operator + customer — one of two floor doors a visitor already walks
boots clean
page $0
live agent billed
noindex
The expression workbench for the drawn faces — where a look is tried on, not just
previewed. A visitor reaches it on their own: the front page and the gallery link straight into
it with a sample face already loaded (?face=sample-owl-advisor and three others),
which makes it a customer-facing surface as well as an operator one. Anything written on
this card has to read well to both.
- surface
- 6 canvases, 129 form controls in the DOM
- authors
- avatar and creature profiles over the sample faces
- output
- browser storage, plus two downloads — its maker modules save a
profile as
<name>.avatar.json or <name>.creature.json.
No authoring on this page writes to the server
- cost
- $0 for every face it draws; its Connect live agent button is the
exception — that mints a real OpenAI Realtime session through the voice sidecar and
spends usage
Reachable today from seven pages, two of them customer surfaces —
the front page and the gallery, plus the studio index, the test bench, and the Avatar, Hybrid
and Factory tab row.
Operator — casting and rig work
boots clean
page $0
LIVE button billed
7 modules on load
The hand-drawn lane’s workshop, linked from the test bench: fit a new base under the rig
with the onion-skin view, name the cast, download the prepared PNG, and copy the exact go-word
that runs the casting pipeline. It drives the Sketch-Line engine — the one whose
line never sits still, because every stroke is drawn twice and the jitter seed re-rolls every
90 ms.
- surface
- 2 canvases, 73 controls, 4 quality levels + 3 backgrounds
- rigs on disk
- 5 —
dean-hardhat, and four miles-* variants
- authors
- a prepared cast base and the casting instruction for the pipeline
- output
- a downloaded
base-<name>-<mode>.png plus a named cast in
browser storage; the rig files themselves are written by the pipeline, not here
- cost
- $0 for all the drawing work; the red LIVE button is the exception
— its own tooltip reads paid per use, and the eighth module on disk loads only
when it is pressed
Reachable today from six pages — the studio index, the test bench,
the sketch engine card, the docs spine, the suite and the Avatar Lab.
Built for crew — but the front page sends visitors here, and the gate is a curtain, not a lock
boots clean
client-side curtain
dials $0
8 billed controls
8/8 verified moving
Eight families of drawn expression lines, four dials each — smile lines, forehead,
frown, crow’s feet, tear troughs, marionette, mental crease, neck — with an amount, an
X, a Y and a size on every one, under a single on/off master. They are authored per face: set
them where the drawing wants them, and they live with the expression rather than sitting on
top of it.
- where
- the Face Overlay Lab’s control column — the one page that shows
them. Two other files carry the same 32 dials and hide the column by CSS; those two are
byte-identical twins of each other
- measured
- 32 of 32 dials present, master present, and all 8 families change
the drawn face when driven from minimum to maximum — over 1 300 canvas pixels
each, in every run of this probe, sampled off
#faceCv, not off slider values
- output
- for a live-cast base, saved through the permission-gated, audited
PUT /api/admin/face-tuning — which whitelists all 32 dials — using an
admin token; for any other base, a downloaded face-tuning-export-<base>.json
- reach
- authored on the drawn 2D lane. The 3D live-VRM plate is painted by the same
face engine and its binding accepts these knobs, but no shipped 3D surface sets them
today
- gate
- a crew username and password covers the view — but it is deterrence,
not access control. The check runs in the browser, the page’s bytes hand all 32 dials
to anyone who asks, and appending
?shot removes the prompt with no credential at
all (verified). Only the save route carries a real server-side permission check
- cost
- the dials themselves are $0 — but this is the most expensive door
on the floor: 8 controls on it carry a billed label, and it is the only door
that calls a paid API host directly (OpenAI, ElevenLabs and Gemini speech). All eight are
opt-in, and each says so on its face
Reachable today from eight pages — more than any other door here,
and one of them is the front page. But not one of those links names these dials: the
studio index’s card calls the page a face overlay lab and stops there. The problem was never
reach. It was naming. This card names them.