# /glint — third-party notices

/glint is a free, non-commercial research demonstration of webcam eye tracking that runs entirely in the browser.
It uses the third-party components below. Full license texts are in this directory.

---

## 1. UniGaze gaze-estimation models

- **Work:** UniGaze — Jiawei Qin, Xucong Zhang, Yusuke Sugano, *UniGaze: Towards Universal Gaze Estimation via
  Large-scale Pre-Training*, WACV 2026, [arXiv:2502.02307](https://arxiv.org/abs/2502.02307).
  Code: <https://github.com/ut-vision/UniGaze>.
- **Weights used:** `unigaze_l16_joint.safetensors` (sha256 `bec5e71a47960f4aa3d901682671b75d500e38d80f5f84ebf3e093bffb60e3c3`)
  and `unigaze_b16_joint.safetensors` (sha256 `2580d707b1395840ecabe7906e2cb35705f38c4ddb0be9c3c38ebb2d5546ffb8`) from
  <https://huggingface.co/UniGaze/UniGaze-models>, revision `d3f8335cd4b7d249adbc32389986ce49b52f6f72`.
- **License:** ModelGo Attribution-NonCommercial-ResponsibleAI License, Version 2.0 (MG-BY-NC-RAI-2.0, "May 2025"
  text), © 2024 National University of Singapore (license text). Full text: [`UniGaze-MG-BY-NC-RAI-2.0.txt`](UniGaze-MG-BY-NC-RAI-2.0.txt)
  (byte-identical to the `LICENSE.txt` published with the weights). The model files are hosted on Hugging Face (the
  repository and revision in `config/models.json`, `baseUrl`) together with this license text (`LICENSE.txt`) and a
  modification notice (`NOTICE.md`).
- **Non-commercial only.** The licence grants rights for NonCommercial purposes only. The models, the files derived
  from them and their outputs may not be used primarily for commercial advantage or monetary compensation.
- **Responsible-AI restrictions (§2.2(c)).** Anyone using these models, including through this page, agrees not to
  use them for, among others: illegal purposes; harming minors; fraud; harming others with personal data;
  defamatory or threatening purposes; impersonation; fully automated decision-making that adversely affects legal
  rights; discrimination; exploiting vulnerable groups; **providing medical advice or medical results interpretation
  intended as a substitute for professional medical advice, diagnosis, or treatment**; or fully automated
  decision-making in justice, law enforcement, immigration or asylum. See the license for the exact wording.
- **Modification notice (§2.2(a)(ii)).** The published model files are Derivative Materials, modified for this page
  on **2026-09-23**: `L.onnx`, `L32.onnx`, `Lf16w.onnx`, `L16.onnx` (from UniGaze-L/16 joint) and `B.onnx`,
  `B32.onnx`, `B16.onnx` (from UniGaze-B/16 joint), with the side files `L.head.json` / `B.head.json` and
  `L.stats.json` / `B.stats.json`. Modifications:
  - converted from PyTorch to ONNX (opset 17, static input shape 1×3×224×224, explicit attention instead of fused
    scaled-dot-product attention), with the ImageNet mean/std normalization moved into the graph (the input is RGB
    in [0,1]);
  - a second output (the backbone's normalized class-token feature that the original head consumes) was exposed
    next to the gaze output; the head itself is unchanged;
  - tensor, node and output names were replaced: input `x`, outputs `y` (gaze pitch and yaw, radians) and `z` (the
    feature);
  - graphs simplified with onnxslim; precision per file: `L32` and `B32` fp32; `L16` and `B16` fp16
    (onnxconverter-common, head kept in fp32); `Lf16w` and `B` fp16 weight storage with fp32 arithmetic; `L`
    (`q8mix`) 8-bit weight-only quantization (`MatMulNBits`) except the eight most quantization-sensitive linear
    layers, which keep fp16-stored weights;
  - `L.head.json` / `B.head.json` contain the unchanged output-layer weights, and `L.stats.json` / `B.stats.json`
    contain feature means/standard deviations computed with these models (see §3).
  - `L.bin` / `L.json` (added 2026-09-27): the `Lf16w` weights repacked unchanged (fp16) into one flat buffer in the
    layout of the page's WebGPU engine, with a JSON manifest of offsets. This is the file the page loads.
- **Attribution.** Model outputs shown on this page are produced by UniGaze. /glint is not affiliated with or endorsed
  by the UniGaze authors or the Licensor.

### Training data of the UniGaze `*_joint` models (as published by the authors)

The released `joint` weights were fine-tuned for gaze on the training splits of five datasets, after MAE
pre-training on about 1.6 M normalized face images. These datasets are **not** redistributed here, but their terms
are the reason the models are restricted to non-commercial use:

| Stage | Dataset (split used by UniGaze) | Terms (summary; see each dataset's own license) |
|---|---|---|
| gaze fine-tuning | ETH-XGaze (60 of the 80 training subjects) | CC BY-NC-SA 4.0 plus additional terms |
| gaze fine-tuning | GazeCapture (training split) | research-only license |
| gaze fine-tuning | MPIIFaceGaze (participants p00–p09) | CC BY-NC-SA 4.0 |
| gaze fine-tuning | EYEDIAP (CS and FT sessions, participants 1–8) | EULA, non-commercial research |
| gaze fine-tuning | Gaze360 (training split) | research-only; commercial use, including models trained on it, is prohibited |
| MAE pre-training | VGGFace2, VFHQ, CelebV-Text, FaceSynthetics, SFHQ-T2I, FFHQ (novel views), XGaze-Dense | each under its own terms, predominantly research / non-commercial |

## 2. MediaPipe

- **Face Mesh V2** (the landmark model inside MediaPipe's `face_landmarker.task`, float16, version 1), © Google LLC.
  `assets/facemesh.bin.gz` (gzipped) / `assets/facemesh.json` hold its weights, converted to float32 and repacked for
  the page's WebGPU implementation of the network (2026-09-27); the network and its outputs are unchanged. No MediaPipe code is
  loaded.
- **Hands (lite)**: the palm detector `palm_detection_lite.tflite` and the hand landmark model
  `hand_landmark_lite.tflite` (float16), © Google LLC, from <https://storage.googleapis.com/mediapipe-assets/>.
  `assets/hands.bin.gz` (gzipped) / `assets/hands.json` hold their weights, repacked for the page's WebGPU
  implementation of the networks (`gpu/hands.js`; converted 2026-09-28 for the page's earlier /eyes); the networks and
  their outputs are unchanged. They run only while the picture plate's light is on (key D). No MediaPipe code is
  loaded.
- **Face Blendshapes V2** (`face_blendshapes.tflite` inside the same `face_landmarker.task`, float16), © Google LLC.
  `assets/expr/blendshapes.onnx.gz` (gzipped) holds it converted to ONNX (tools/convert_blendshapes.py, 2026-09-30;
  its 52 scores within 6e-6 of MediaPipe's own), its weights stored as the float16 values they are and cast to float32
  in the graph (scripts/glint/fp16.py, 2026-10-04: the same scores); run by ONNX Runtime Web. No MediaPipe code is
  loaded.
- **Canonical face model** (`canonical_face_model.obj`) and the face geometry's Procrustes landmark basis
  (`geometry_pipeline_metadata_landmarks.pbtxt`), © Google LLC, from MediaPipe's `modules/face_geometry/data`.
  `assets/face.json` holds the model's 468 vertices (cm, rounded to 0.001) and the basis's landmarks and weights
  (2026-10-04): the emotion plate's head is posed by them (`bust.js`). No MediaPipe code is loaded on the page; the
  repository's `scripts/glint/bust.py` runs MediaPipe's face landmarker (Apache-2.0) once, offline, to register the
  head's scan.
- **License:** Apache License 2.0 — [`MediaPipe-Apache-2.0.txt`](MediaPipe-Apache-2.0.txt) (the `LICENSE` file of
  <https://github.com/google-ai-edge/mediapipe>). The model card states "Licensed under Apache License, Version 2.0".

## 3. Data used to compute shipped statistics

`L.stats.json` and `B.stats.json` (feature means and standard deviations used by personal calibration)
were computed from images of **MPIIFaceGaze** participants p00–p09 (Xucong Zhang, Yusuke Sugano, Mario Fritz,
Andreas Bulling, *It's Written All Over Your Face: Full-Face Appearance-Based Gaze Estimation*, CVPRW 2017;
<https://www.collaborative-ai.org/research/datasets/MPIIFaceGaze/>), licensed CC BY-NC-SA 4.0. These statistics
are provided under the same terms. No dataset images are distributed.

## 4. ONNX Runtime Web

- **onnxruntime-web 1.30.0**, © Microsoft Corporation: `assets/ort/ort.wasm.bundle.min.mjs` (the npm package's file
  less its last line, the comment naming a source map that is not shipped) and `assets/ort/ort-wasm-simd-threaded.wasm.gz`
  (the package's `.wasm`, gzipped: unchanged once unzipped), self-hosted (no CDN). It runs the heart-rate model, the
  blendshapes model and the emotion model on the CPU (WebAssembly, one thread), each in a worker of its own.
- **License:** MIT — [`onnxruntime-MIT.txt`](onnxruntime-MIT.txt). Third-party components compiled into ONNX Runtime
  are listed in [`onnxruntime-ThirdPartyNotices.txt`](onnxruntime-ThirdPartyNotices.txt) (from
  <https://github.com/microsoft/onnxruntime/blob/v1.30.0/ThirdPartyNotices.txt>).

## 5. ME-rPPG (heart rate from the face video)

- **Work:** ME-rPPG — Kegang Wang, Jiankai Tang, Yuxuan Fan, Jiatong Ji, Yuanchun Shi, Yuntao Wang, *Memory-efficient
  Low-latency Remote Photoplethysmography through Temporal-Spatial State Space Duality*,
  [arXiv:2504.01774](https://arxiv.org/abs/2504.01774) (2025). Code and weights: <https://github.com/KegangWangCCNU/ME-rPPG>
  (`model.onnx`, `state.json`; trained on the RLAP dataset by the authors).
- **License:** MIT, Copyright (c) 2025 汪汪 (the ME-rPPG author) — [`ME-rPPG-MIT.txt`](ME-rPPG-MIT.txt) (the repository's `LICENSE`).
- **Files:** `assets/rppg/me.onnx.gz` (the published `model.onnx` simplified with onnxslim; same inputs, outputs and
  numerical results: max |Δ| 0 on 300 real face crops), `assets/rppg/me_state.bin.gz` (the published initial recurrent
  state `state.json`, stored as float32 in input order) and `assets/rppg/me_state.json` (tensor names, shapes, offsets,
  sha256 of both files unzipped). The two binaries are gzipped. Self-hosted.
- The heart-rate estimate combines this model's pulse with the classical POS method (Wang, den Brinker, Stuijk,
  de Haan, IEEE TBME 64(7), 2017; implemented in `pulse.js`). Pupil size (`pupil.js`) uses no third-party model.

## 6. EmotiEffLib (the face's emotion, valence and arousal)

- **MT-EmotiEffNet-B0** (`enet_b0_8_va_mtl.onnx`), © Andrey V. Savchenko and contributors, from
  <https://github.com/sb-ai-lab/EmotiEffLib> (`models/affectnet_emotions/onnx/`), shipped as
  `assets/expr/emotion.onnx.gz` (gzipped; sha256 6dc9521a… unzipped); run by ONNX Runtime Web (emotion.js).
- **Changed for this page (2.43, 2026-10-01):** only its last layer (`classifier.weight`, `classifier.bias`: the
  1280 → 10 classifier) was retrained, on face crops from CREMA-D and ExpW (research/v242_emotion.md); the rest of
  the network is as released (sha256 c43e056a… before the change). 2.47 (2026-10-04): its weights stored as float16
  and cast to float32 in the graph (scripts/glint/fp16.py; the 8813ef9d… float32 model's outputs within 0.003, its
  class probabilities within 0.001), half the download.
- **License:** Apache License 2.0 — [`EmotiEffLib-Apache-2.0.txt`](EmotiEffLib-Apache-2.0.txt). The network was trained
  on AffectNet, whose agreement limits the dataset to non-commercial research and educational use; this page uses the
  model for research only.
- **CREMA-D** (Cao, Cooper, Keutmann, Gur, Nenkova and Verma, IEEE Trans. Affective Computing 2014;
  <https://github.com/CheyneyComputerScience/CREMA-D>): the retrained layer contains information from CREMA-D, which is
  made available under the Open Database License v1.0 (<https://opendatacommons.org/licenses/odbl/1-0/>); its contents
  under the Database Contents License v1.0.
- **ExpW** (Zhang, Luo, Loy and Tang, "From Facial Expression Recognition to Interpersonal Relation Prediction", IJCV
  2018): its images are web photos and no licence is stated for the set; it was used for research only, and so are
  these weights.

## 7. The Head of David (the emotion plate's head)

- **Work:** *Head of David*, plaster cast after Michelangelo's David (Statens Museum for Kunst, Copenhagen, inv. KAS2232;
  the cropped bust cast 1899), its 3-D scan published by the SMK in the public domain (CC0 1.0):
  <https://api.smk.dk/api/v1/download-3d/ht24wq097_smk55-kas2232-head-of-david.stl>.
- **Used:** `assets/david.bin.gz` (scripts/glint/bust.py, 2026-10-04): the scan, its stand cut off and the cut capped,
  simplified to 160,000 triangles, registered onto MediaPipe's canonical face (MediaPipe's face landmarker run on a
  render of it), each carved eyeball rigged to turn about its centre (unturned, the scan as it is), with each point's
  normal and ambient occlusion; drawn engraved by `bust.js`.
- **License:** CC0 1.0 Universal (no rights reserved); credited here.

## Fonts

The page's type is served from assets/fonts: the Latin subsets of Archivo (Omnibus-Type, variable width and weight),
IBM Plex Mono 400 and 500 (IBM) and Cormorant Garamond Italic (Christian Thalmann), as Google Fonts distributes them, each
under the SIL Open Font License 1.1 (Archivo-OFL-1.1.txt, IBMPlexMono-OFL-1.1.txt, CormorantGaramond-OFL-1.1.txt;
"Plex" is a Reserved Font Name of IBM Corp.).

## 8. The gaze keyboard's language model and word lists (the keyboard plate)

- **Qwen3.5-0.8B** (Qwen team, Alibaba Cloud), Apache License 2.0: <https://huggingface.co/Qwen/Qwen3.5-0.8B>. Used
  unmodified in the text-only ONNX export `onnx-community/Qwen3.5-0.8B-Text-ONNX` (`model_q4f16`), which the page
  downloads from Hugging Face on first use of the keyboard and runs on the device's GPU to rank words in context. Not
  affiliated with or endorsed by the Qwen team.
- **Transformers.js** 4.3.0 (Hugging Face), Apache License 2.0, loaded from cdn.jsdelivr.net to run it
  (<https://github.com/huggingface/transformers.js>).
- **Word frequencies** in `assets/words/words.txt`: derived from the English 50k list of
  hermitdave/FrequencyWords (OpenSubtitles 2018), CC BY-SA 4.0 (<https://github.com/hermitdave/FrequencyWords>);
  modified (contractions rejoined, fragments dropped; `assets/words/build.py`). `words.txt` is shared under
  CC BY-SA 4.0.
- **Word-pair statistics** in `assets/words/bigrams.bin`: counted from WikiText-103 (Merity et al. 2016, from
  Wikipedia; CC BY-SA 3.0) and DailyDialog (Li et al. 2017; CC BY-NC-SA 4.0: non-commercial). `bigrams.bin` is shared
  under CC BY-NC-SA 4.0.

## 9. The picture plate (its pictures, the models that edit them)

- **`assets/still-life.jpg`**: a still life made for this page on 2026-10-18 with Qwen Image 2.1 Turbo (Qwen team,
  Alibaba Cloud) through OpenRouter, from a text prompt alone (no reference images), shipped as JPEG. Not affiliated
  with or endorsed by the Qwen team.
- **`assets/sketch.jpg`**: a still life with a drawing on an easel, supplied by the page's owner on 2026-10-20 (their
  second version; from their PNG, 1672 × 941, shipped as JPEG); the page's first picture (the arrow keys: the other).
- **The edits** (`picture.js`, `painter.js`) are made by models on OpenRouter with the viewer's own key, from the
  viewer's browser: the viewer's words by ElevenLabs Scribe v2, the picture by Qwen Image 2.1 Turbo or Google's Nano
  Banana 2 Lite (Gemini 3.1 Flash Lite Image). With the viewer's own ElevenLabs key as well (optional), the words are
  read as they are said by ElevenLabs Scribe v2 Realtime, straight from the browser (`scribe.js`). Nothing is sent
  without a key given in this browser. Not affiliated with or endorsed by ElevenLabs.

## 10. DepthART and TypeGPU (the picture plate's light, key D; off by default)

- **Model:** DepthART relative depth, small, 448 × 448 — Feng Xue, Wu Chen, Mingshuai Zhao, Guofeng Zhong, Anlong Ming,
  Haozhe Wang, Dianqiao Lei, Zhaowen Lin, Haiyang Zhang, Nicu Sebe, *DepthART: Scaling Foundation Monocular Depth to
  Tiny Models*, ACM Multimedia 2026 (<https://github.com/xuefeng-cvr/DepthART>, weights
  <https://huggingface.co/Fengxue93/DepthART>). The page downloads Software Mansion's unofficial conversion
  `depthart-relative-s-448-balanced.depthart` (13,662,992 bytes, sha256
  `e6d7b65bd2888771790d3cc3ad827133f0b014f05010347b6fc6fc891ff9e19c`) from
  <https://huggingface.co/reczkok/depthart-typegpu>, revision `913a7c13ddfbd48549279555d1db98172e8e5e0d`, the first
  time the light is turned on (unchanged; not redistributed here). It estimates the depth of the picture shown, never
  of the camera's image.
- **License:** Apache License 2.0 — [`DepthART-Apache-2.0.txt`](DepthART-Apache-2.0.txt) and the conversion's NOTICE,
  [`DepthART-NOTICE.txt`](DepthART-NOTICE.txt) (both as published with the weights). Apache-2.0 is the license both
  model repositories declare (Fengxue93/DepthART and reczkok/depthart-typegpu).
- **Upstream terms:** the conversion's NOTICE says the upstream project carried no LICENSE file; since 2026-09-11
  (commit `b307c123`) <https://github.com/xuefeng-cvr/DepthART> has one: the DepthART authors' own materials are
  under CC BY 4.0 (attribution: the work cited above). Its README adds that the DepthART checkpoints were trained with
  supervision generated by Depth Anything V2-L (<https://github.com/DepthAnything/Depth-Anything-V2>), whose weights
  are under CC BY-NC 4.0, and asks users to respect such third-party terms, including restrictions on commercial use.
  This page is non-commercial.
- **Code:** `assets/depth/depthart.js` bundles the inference and the relighting of TypeGPU's "Monocular Light Injection"
  example (<https://github.com/software-mansion/TypeGPU>, `apps/typegpu-docs/src/examples/image-processing/
  monocular-light-injection`, commit `b819e002333793f1deb252ce918879af9ff49af8`) with the typegpu library 0.12.6 and its
  dependencies tinyest 0.3.4, typed-binary 4.3.3 (MIT) and tsover-runtime 0.0.7 (Apache-2.0), as built for the page's
  earlier /eyes (esbuild + unplugin-typegpu). Modified: the relighting samples its image from a plain texture instead
  of an external texture; a small entry module drives it on the page's GPU device (`relight.js` gives it the picture).
  © 2025 Software Mansion, MIT License; all texts in [`TypeGPU-MIT.txt`](TypeGPU-MIT.txt).
- Not affiliated with or endorsed by the DepthART authors or Software Mansion.

## 11. The timbre plate (its instruments, its dissonance)

- **Instruments and renderer:** `assets/timbre/*.bin.gz` are the ten instrument atlases of eualethic.com/synthesis
  (format `timbre-atlas-web/3`, built 2026-10-24), gzipped here and otherwise unchanged; `synth/atlas.js`, `synth/latent.js` and `synth/worklet.js` are
  that page's latent operations and real-time renderer (an AudioWorklet port of timbre's `synth.py`), without its
  tuning, its MPE expression, its scheduled notes and its display.
- **Chord map:** `synth/map.js` and `synth/map-worker.js` are that page's chord map (`map.js`, `mapworker.js`) at
  its detail of 25 cents, without its setting, drawn here in this page's figures' style; `synth/dissonance-gpu.js` is
  eualethic.com/dissonance's `distilled/gpu.js` (its chords scored on the GPU), unchanged.
- **Nocturne:** `synth/nocturne.js` is eualethic.com/synthesis's demo track, unchanged: Chopin, Nocturne in D-flat
  major, Op. 27 No. 2, played live at the 2015 International Piano-e-Competition, from the MAESTRO dataset v3.0.0
  (Google Magenta, https://magenta.tensorflow.org/datasets/maestro), shared under its license, CC BY-NC-SA 4.0
  (https://creativecommons.org/licenses/by-nc-sa/4.0/).
- **Dissonance:** `synth/dissonance.js` and `synth/fft.js` are eualethic.com/dissonance's distilled estimator
  (`distilled/estimator.js`, from AndisDraguns/Misc `fast_dissonance.py`: a small network trained to reproduce that
  site's estimator) and its real FFT (`fast/fft.js`, without its complex FFT and inverse); `assets/dissonance` holds
  its model, weights and WebAssembly network (`model.json`, `weights.bin`, `net.wasm`, gzipped here and otherwise
  unchanged).

## Fonts

The page's type is served from assets/fonts: the Latin subsets of Archivo (Omnibus-Type, variable width and weight),
IBM Plex Mono 400 and 500 (IBM) and Cormorant Garamond Italic (Christian Thalmann), as Google Fonts distributes them, each
under the SIL Open Font License 1.1 (Archivo-OFL-1.1.txt, IBMPlexMono-OFL-1.1.txt, CormorantGaramond-OFL-1.1.txt;
"Plex" is a Reserved Font Name of IBM Corp.).
