Sokol Net
elix22/Sokol.NET
Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…
Drive ARKit-blendshape-rigged head/face models in Unity with the wearer's facial expressions on Meta VR via Meta Movement SDK (face tracking + A2E).
$ npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-face-tracking --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/hz-unity-face-tracking .claude/skills/hz-unity-face-tracking && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hz-unity-face-tracking" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-tracking into .claude/skills/hz-unity-face-tracking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-face-tracking", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-trackingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-face-tracking --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/hz-unity-face-tracking .agents/skills/hz-unity-face-tracking && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hz-unity-face-tracking" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-tracking into .agents/skills/hz-unity-face-tracking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-face-tracking", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-face-tracking --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/hz-unity-face-tracking .cursor/skills/hz-unity-face-tracking && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hz-unity-face-tracking" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-tracking into .cursor/skills/hz-unity-face-tracking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-face-tracking", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/meta-quest/agentic-tools.git --path skills/hz-unity-face-tracking--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-face-tracking --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/hz-unity-face-tracking .gemini/skills/hz-unity-face-tracking && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hz-unity-face-tracking" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-tracking into .gemini/skills/hz-unity-face-tracking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-face-tracking", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install meta-quest/agentic-tools hz-unity-face-trackingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/hz-unity-face-tracking .github/skills/hz-unity-face-tracking && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hz-unity-face-tracking" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-tracking into .github/skills/hz-unity-face-tracking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-face-tracking", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install meta-quest/agentic-tools hz-unity-face-tracking --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/meta-quest/agentic-tools.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/hz-unity-face-tracking .opencode/skills/hz-unity-face-tracking && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hz-unity-face-tracking" agent skill from https://github.com/meta-quest/agentic-tools/tree/main/skills/hz-unity-face-tracking into .opencode/skills/hz-unity-face-tracking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hz-unity-face-tracking", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
hz-unity-face-trackingDrive ARKit-blendshape-rigged head/face models in Unity with the wearer's facial expressions on Meta VR via Meta Movement SDK (face tracking + A2E).
Hz Unity Face Tracking is an agent skill from meta-quest/agentic-tools. Drive ARKit-blendshape-rigged head/face models in Unity with the wearer's facial expressions on Meta VR via Meta Movement SDK (face tracking + A2E). Use when a user has an FBX with the 52 ARKit blendshapes (any prefix, L/R suffixes) and wants it to animate from face tracking on Quest Pro / Quest 3 / Quest 3S.
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files.
It sits in Game Development. It works with Android. The repository describes itself as: Agent Skills for Meta Quest/Horizon OS VR Development. The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3a8553d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (C#), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Hz Unity Face Tracking loads about 3.7k tokens when it runs, and up to ~6.9k if it reads all its reference files. Until then it costs about 84 tokens; SKILL.md has 1,435 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from meta-quest/agentic-tools at commit 3a8553d, republished under its Apache-2.0 licence (© meta-quest). 1,435 words, ~3,687 tokens.
.claude/skills/hz-unity-face-tracking/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.End-to-end recipe to make a head/face model rigged with the standard 52 ARKit blendshapes animate from the wearer's face on Meta VR. Uses the public OVRCustomFace extension hook — no OVR_INTERNAL_CODE, ships to 3P.
The model's blendshape names must follow the ARKit naming convention (camelCase, _L/_R suffixes, e.g. eyeBlink_L, jawOpen, mouthSmile_R). An optional prefix like blendShape2.eyeBlink_L is automatically stripped.
Packages/manifest.json:com.meta.xr.sdk.core (Meta XR Core — provides OVRFaceExpressions, OVRCustomFace)com.meta.xr.sdk.movement (Meta Movement SDK — A2E + retargeting helpers)Assets/Oculus/OculusProjectConfig.asset (verify via Project Settings → Meta XR):faceTrackingSupport: 1 (Supported) or 2 (Required)eyeTrackingSupport: 1 if the rig has gazeAssets/Plugins/Android/AndroidManifest.xml) permissions:<uses-feature android:name="oculus.software.face_tracking" android:required="false" /><uses-permission android:name="com.oculus.permission.FACE_TRACKING" /><uses-permission android:name="android.permission.RECORD_AUDIO" /> (required for A2E)oculus.software.eye_tracking + com.oculus.permission.EYE_TRACKINGOVRManager.FaceTrackingDataSources including Audio (A2E) — if you skip Audio, mouth motion is visual-only.After any change to OculusProjectConfig, regenerate the manifest (see Regenerating the manifest below).
ARKitOVRCustomFace script (in references/ARKitOVRCustomFace.cs) into the project.OVRFaceExpressions component to the OVRCameraRig (or anywhere in the scene).SkinnedMeshRenderer, add ARKitOVRCustomFace. Adding the component triggers Reset(), which auto-populates the blendshape→FaceExpression mapping by scanning the mesh's blendshape names.FaceExpressions field to the OVRFaceExpressions instance.ARKitEyeGazeBlendshapeDriver in (see Eye tracking below).That's the whole flow. Details below.
Don't rely on OVRFaceExpressions.EyesLook* for eye gaze. Those fields are derived from face-camera visuals, not the dedicated eye tracker. On Quest Pro they're often zero or noisy even when face tracking is otherwise working. The right API is OVREyeGaze, which taps the eye tracker directly.
For ARKit rigs with eyeLook* blendshapes (no eye bones), this skill ships ARKitEyeGazeBlendshapeDriver:
OVREyeGaze components (one per eye, TrackingMode = HeadSpace).CenterEyeAnchor).eyeLookUp/Down_{L,R}, yaw → eyeLookIn/Out_{L,R} (with the ARKit "_In = toward nose" convention).LateUpdate, so it overrides whatever ARKitOVRCustomFace wrote in Update.For rigs with eye bones (no eyeLook* blendshapes), skip the blendshape decomposition and just parent OVREyeGaze to each eye bone with ApplyRotation = true — the component will rotate the bone directly.
CenterEyeAnchor (or your head transform): LeftEyeGaze, RightEyeGaze.OVREyeGaze to each. Set Eye = Left / Right, TrackingMode = HeadSpace, ApplyPosition = false, ApplyRotation = true, ConfidenceThreshold = 0.5.ARKitEyeGazeBlendshapeDriver to the head's SkinnedMeshRenderer GameObject (alongside ARKitOVRCustomFace). Wire leftEye, rightEye, and referenceFrame (= CenterEyeAnchor).maxAngleDeg (default 30°) and smoothing (default 0.4) to taste.Copy references/ARKitOVRCustomFace.cs into Assets/Scripts/ARKitOVRCustomFace.cs. It defines the public, 3P-shippable ARKit ↔ OVR FaceExpression table and a MapBlendshapes() method that scans SkinnedMeshRenderer.sharedMesh.GetBlendShapeName(i), strips any prefix before the last ., lowercases, and matches against the table. Unmatched mesh blendshapes are set to OVRFaceExpressions.FaceExpression.Max (sentinel — skipped at runtime).
Project settings:
Project Settings → Meta XR → Face Tracking Support = Supported
Project Settings → Meta XR → Eye Tracking Support = Supported (if needed)Then regenerate the manifest.
Against a live Editor, call the SDK's generator through run_script — the type resolves directly, so
no reflection is needed:
// AgentScripts/UpdateManifest.cs
public static class UpdateManifest
{
public static string Run()
{
OVRManifestPreprocessor.GenerateOrUpdateAndroidManifest(true); // silentMode: true
return "ok";
}
}unity command run_script --file AgentScripts/UpdateManifest.cs --entry UpdateManifest.Run --format jsonsilentMode: true is required — without it the generator opens a modal dialog that blocks the
request. Then confirm the face-tracking entries from the checklist above actually landed in
Assets/Plugins/Android/AndroidManifest.xml. See hz-unity-meta-core-sdk for the full manifest
workflow and the rule against hand-editing managed entries.
Alternatives: the Editor menu Meta → Tools → Update AndroidManifest.xml, or the
meta_update_android_manifest tool if you are on a Unity MCP server with the Meta Unity extension.
Scene Hierarchy
├── OVRCameraRig (OVRQuickActionsAPI.AddOVRInteractionRig(), or the
│ │ OVRCameraRig prefab; meta_add_camerarig under MCP)
│ └── (add) OVRFaceExpressions component
└── YourHeadModel
└── ...SkinnedMeshRenderer GO...
├── SkinnedMeshRenderer (existing)
└── (add) ARKitOVRCustomFace component
└── FaceExpressions = the OVRFaceExpressions ref
└── retargetingType = Custom (set automatically by base when overriding)
└── Mappings[] = auto-filled on Reset()
└── BlendShapeStrengthMultiplier = 100 (default; OVR weights are 0–1, mesh wants 0–100)If the head has multiple SkinnedMeshRenderers (e.g. separate teeth/tongue meshes), add ARKitOVRCustomFace to each one.
On OVRCameraRig's OVRManager component:
MapBlendshapes() runs automatically when the component is added (Reset()) and from OnValidate() when Mappings is empty. If you need to remap manually (e.g. after re-importing the FBX), use the component's inspector context menu → Map Blendshapes, or from a script:
go.GetComponent<ARKitOVRCustomFace>().MapBlendshapes();Against a live Editor via run_script, the project script's type is directly referenceable (it lives
in Assets/), so just call it:
// AgentScripts/Remap.cs
using UnityEngine;
public static class Remap
{
public static string Run(string modelName)
{
var smr = GameObject.Find(modelName).GetComponentInChildren<SkinnedMeshRenderer>();
smr.gameObject.GetComponent<ARKitOVRCustomFace>().MapBlendshapes();
return $"Remapped {smr.sharedMesh.blendShapeCount} blendshapes on {smr.name}";
}
}unity command run_script --file AgentScripts/Remap.cs --entry Remap.Run --args '["YourHeadModel"]' --format json
unity command save_scene --format jsonUnder a Unity MCP server the OVR/MSDK types are not visible to the dynamic assembly, so the
reflection-free workaround there is SendMessage:
GameObject.Find("YourHeadModel")
.GetComponentInChildren<SkinnedMeshRenderer>().gameObject
.SendMessage("MapBlendshapes", SendMessageOptions.RequireReceiver);In Editor, with Meta XR Link / Quest Link, enter Play mode and make faces. The model should mirror them. Driving that loop from the CLI:
unity command clear_console --format json
unity command editor_play --format json # blocks until play mode is live
# --- the wearer now makes faces; ask the user to confirm before continuing ---
unity command get_console_logs --severity error --format json
unity command editor_stop --format jsonDo not chain these four back to back. editor_stop immediately after editor_play leaves no
time for anyone to make a face, so the check proves nothing. Enter Play mode, tell the user to make
faces and report what they see, and only then read the log and stop.
On device, build APK, side-load (metavr app install <apk>), grant Face Tracking + Microphone permissions on first launch, and stream metavr adb logcat --follow --tag Unity while making faces to catch mapping errors.
Check the mapping at edit time: inspect the ARKitOVRCustomFace component. Mappings.Length should equal SkinnedMeshRenderer.sharedMesh.blendShapeCount. The Console log from MapBlendshapes() reports mapped X/N blendshapes — X should be 50 (or 52 if the FBX has all of them). Read the serialized array length without opening the Inspector — --field takes a SerializedProperty path, so it wants the [SerializeField] backing field _mappings on OVRCustomFace, not the public Mappings property, which is not serialized:
unity command get_serialized_fields --target <head GO> --component ARKitOVRCustomFace --field _mappings --format json| Symptom | Cause / fix |
|---|---|
mapped 0/N in Console | Mesh blendshape names don't follow ARKit convention. Verify with mesh.GetBlendShapeName(i). Names must match e.g. eyeBlink_L, jawOpen — case-insensitive, prefix before last . is stripped. |
| Face is frozen | OVRFaceExpressions not assigned, or scene has no OVRCameraRig/OVRManager with face tracking enabled. Check OVRFaceExpressions.FaceTrackingEnabled and ValidExpressions at runtime. |
| Mouth doesn't move when speaking | A2E disabled. Enable Audio under OVRManager → Face Tracking Data Sources, and ensure RECORD_AUDIO permission is granted on device. |
| Eyes don't blink | Mesh's eyelid shapes aren't named eyeBlink_L/_R. Either rename, or add a custom row to ARKitTable. |
| Eyes don't move (look around) | You're relying on OVRFaceExpressions.EyesLook* instead of OVREyeGaze — switch to ARKitEyeGazeBlendshapeDriver. |
| Eye gaze in wrong direction | Note the deliberate ARKit ↔ OVR swap: ARKit's eyeLookIn_L (eye looking nose-ward, i.e. right) maps to OVR EyesLookRightL. The table already does this — don't "fix" it. |
| Weights look half-strength or clamped | BlendShapeStrengthMultiplier defaults to 100 because Unity blendshapes are 0–100 while OVR is 0–1. Don't lower this unless intentional. |
cannot change access modifiers when overriding compile error | Base method is protected internal in another assembly. The override must use protected (not protected internal) — already correct in the supplied script. |
_mappings out of sync with shared mesh assertion at Start | Mesh changed since mapping was generated. Re-run MapBlendshapes() via the component context menu. |
The 52 ARKit shapes don't 1:1 a FACS-based OVR enum. Notable choices baked into ARKitTable:
browInnerUp, cheekPuff, mouthFunnel, mouthPucker, mouthRollLower, mouthRollUpper) pick only the L-side OVR expression. If your model has obviously asymmetric mouth/brow when the user uses these expressions and you want true symmetric drive, subclass and additively sum L+R in a custom MapBlendshapes (use SlothARKitFaceDriver-style per-blendshape sum). For most heads the L-only choice is fine because the face is roughly symmetric and the asymmetry is below visual threshold.eyeLookIn/Out are deliberately swapped per side relative to OVR's left/right semantics (see Troubleshooting).mouthClose → LipsToward (closest FACS analogue).tongueOut → TongueOut (requires HorizonOS ≥ 65 + tongue tracking; otherwise stays at 0).SKILL.md — this filereferences/ARKitOVRCustomFace.cs — drop-in OVRCustomFace subclassreferences/ARKitEyeGazeBlendshapeDriver.cs — OVREyeGaze → eyeLook* blendshape driver (LateUpdate)MonoBehaviour driver that reads OVRFaceExpressions[expr] and writes blendshape weights directly: works, but doesn't integrate with MSDK's correctives, eye constraints, or future retargeting upgrades. Use only if you can't extend OVRCustomFace.OVRCustomFace + RetargetingType.ARKitBlendshapes: clean, but guarded behind #if OVR_INTERNAL_CODE in the public Oculus Integration package — not 3P-shippable.OVRCustomFace + RetargetingType.Custom + GetCustomBlendShapeNameAndExpressionPairs override (this skill): fully public API, shippable, and gets all base-class behavior (data validity gating, weight scaling, mesh assertion).© meta-quest, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in skills/hz-unity-face-tracking of meta-quest/agentic-tools.
Open the folder on GitHubat commit 3a8553d
Hz Unity Face Tracking next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Hz Unity Face Tracking this skillmeta-quest/agentic-tools | 215 | — | ~3.7k | Automated safety check: Pass | Apache-2.0 | |
| Sokol Netelix22/Sokol.NET | 154 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Unity Vrc World SDK 3niaka3dayo/agent-skills-vrc-udon | 332 | — | ~7.8k | Automated safety check: Pass | MIT | |
| Ue Buildgetsentry/sentry-unreal | 173 | — | ~1k | Automated safety check: Pass | MIT | |
| Scenario Godot Performance Exportscenario-labs/skills | 931 | — | ~5.1k | Automated safety check: Notes | MIT | |
| Godot Admob Troubleshootpoingstudios/godot-admob-plugin | 632 | — | ~812 | Automated safety check: Pass | MIT |
elix22/Sokol.NET
Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…
niaka3dayo/agent-skills-vrc-udon
VRChat World SDK 3 guide for scene and Inspector setup, component placement, optimization, and upload.
getsentry/sentry-unreal
Build the SentryPlayground sample project for a target platform
scenario-labs/skills
A skill your agent uses when a Godot game stutters, drops frames, hitches when entering new areas, overheats a phone, or must ship: profiling and Performance monitors, CPU or GPU bound, draw calls…
poingstudios/godot-admob-plugin
Provides instructions to diagnose ad loading errors, handle error codes, open the Ad Inspector, and resolve integration issues in GDScript and C.
poingstudios/godot-admob-plugin
Provides instructions to configure, integrate, and verify third-party mediation networks (AppLovin, Meta Audience Network, Unity Ads, etc.) in GDScript and C.
meta-quest/agentic-tools
Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements.
meta-quest/agentic-tools
Upgrades Meta VR apps to newer Horizon OS SDK versions — migration guides, deprecated API replacements, changelog.
meta-quest/agentic-tools
Builds WebXR experiences for Meta VR and Horizon OS using the Immersive Web SDK (IWSDK) — ECS architecture, Three.js integration, spatial UI.
meta-quest/agentic-tools
Build multi-window Meta Horizon OS experiences with the MetaVrx Layout SDK in Jetpack Compose or React Native.
meta-quest/agentic-tools
Scaffolds new Meta VR and Horizon OS projects after the build path is selected — Standard Android, Meta Spatial SDK, Unity, Unreal, or WebXR.
meta-quest/agentic-tools
Analyzes Meta VR and Horizon OS VR performance using Perfetto traces — frame timing, CPU/GPU bottlenecks, render pass analysis.
Works with
Categories
Drive ARKit-blendshape-rigged head/face models in Unity with the wearer's facial expressions on Meta VR via Meta Movement SDK (face tracking + A2E). Hz Unity Face Tracking is an agent skill from meta-quest/agentic-tools. Drive ARKit-blendshape-rigged head/face models in Unity with the wearer's facial expressions on Meta VR via Meta Movement SDK (face tracking + A2E).
Hz Unity Face Tracking fits situations like: A user has an FBX with the 52 ARKit blendshapes (any prefix; L/R suffixes) and wants it to animate from face tracking on Quest Pro / Quest 3 / Quest 3S.
Run `npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a claude-code`. Or copy the skill folder (skills/hz-unity-face-tracking in meta-quest/agentic-tools) into .claude/skills/hz-unity-face-tracking in your project. Claude Code loads it when a task matches its description.
Run `npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a codex`. Or copy the skill folder (skills/hz-unity-face-tracking in meta-quest/agentic-tools) into .agents/skills/hz-unity-face-tracking in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add meta-quest/agentic-tools --skill hz-unity-face-tracking -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hz-unity-face-tracking, .gemini/skills/hz-unity-face-tracking, .github/skills/hz-unity-face-tracking and .opencode/skills/hz-unity-face-tracking in your project.
Going by SKILL.md and its folder, Hz Unity Face Tracking needs C# for the scripts in its folder.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Hz Unity Face Tracking is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Hz Unity Face Tracking: Sokol Net (elix22/Sokol.NET, 154 stars), Unity Vrc World SDK 3 (niaka3dayo/agent-skills-vrc-udon, 332 stars), Ue Build (getsentry/sentry-unreal, 173 stars) and Scenario Godot Performance Export (scenario-labs/skills, 931 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
meta-quest (a GitHub organization) maintains it in meta-quest/agentic-tools, which has 215 GitHub stars. The repository holds 34 skills in this directory. The repository was last updated on September 24, 2026.
Source: meta-quest/agentic-tools on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.