Local Character › Methodology · Last reviewed 2026-10-09

Methodology

Every claim this site makes about speed, size or privacy is listed here with how it was measured. Measurements were taken by the developer on an Apple Silicon Mac (Apple GPU) in Chromium with WebGPU, on the live site, in September 2026. Other hardware will differ.

The pipeline

JobModelRuntime in the browserSizeLicence
Chat repliesGemma 4 E2B (instruction-tuned), gemma-4-E2B-it-webLiteRT-LM web (@litert-lm/core 0.17.1) on WebGPU; needs WebAssembly JSPI and relaxed SIMD1,469,099,526 bytes downloaded (gemma-4-E2B-it-slim.tflite.gz), rebuilt in the browser into the 2,008,432,640-byte original layoutGemma Terms of Use
Scene picturesDreamShaper 8 with an LCM scheduler, 4 steps, 512×512ONNX Runtime Web on WebGPU; weights stored as int8 and dequantized in the graphabout 1.03 GBCreativeML OpenRAIL-M
Spoken repliesKokoro-82M (int8 weights, fp32 maths), 28 English voicesONNX Runtime Web on WebGPU; the final iSTFT runs in JavaScriptabout 0.11 GBApache-2.0
Speech inputWhisper base (fp32 encoder and merged decoder)ONNX Runtime Web 1.27 on WebGPU, greedy decoding; log-mel features computed in JavaScriptabout 0.29 GBMIT

Smaller downloads since 2026-10-07, measured against the original files with greedy decoding and fixed seeds. Chat: the per-layer embedding rows of 78,038 tokens in scripts the app never writes (Cyrillic, Devanagari, Arabic, Hangul, Thai and others) are left out of the download and restored as zeros on load. Replies in the app's languages, German and code were byte-identical on 20 test prompts. Replies written in Russian, Korean or Hindi break, and the app already answers those languages in English. The file is then gzipped and kept zipped on the device. Voice: on 18 clips, naturalness (UTMOS) was 4.385 against 4.387 for the original, with transcription accuracy unchanged within noise. Pictures: 8 fixed-seed prompts gave the same compositions and faces with small changes in detail, at about 2.5 s a picture instead of 2.1 s. Readers who downloaded the earlier files keep them.

Model files are served by SHA-256 from models.skillsafe.ai, SkillSafe's registry of vetted model files, and kept in the browser's Cache Storage after the first download. The ONNX models (pictures, voice and speech input) share one GPU queue, so they run one at a time instead of colliding.

Measured results

WhatResultHowDate
Chat reply time6-8 s per reply in a 71-message chatLive site, cached model2026-09-29
Chat reply time, 35-turn scripted testmean 8.1 s, slowest 13 s (the previous MediaPipe runtime: mean 17.8 s, slowest 39 s)Same 35 turns replayed on both runtimes2026-09-28
Time to first wordabout 0.3 s, flat across turnsThe conversation keeps its attention cache between turns2026-09-28
Chat model ready after reloadabout 4 s from the cached fileLive site2026-09-29
Voice, cold startabout 28 s to the first soundFirst reply after a reload; the app pre-warms the voice model to hide this2026-09-24
Speech recognition accuracyToken ids identical to Python ONNX Runtime on the same audio; log-mel features within 2×10-5 of the reference WhisperFeatureExtractorIndependent reference implementation, same input2026-09-24
Picture model downloadabout 2 minutes for 2.2 GBFirst picture on a fast connection2026-09-24

Weak results, stated plainly

How privacy is enforced

The app has no chat endpoint to send messages to. Characters, chats and personas are written to the browser's IndexedDB; model files go to Cache Storage. The hosting platform sets a Content-Security-Policy that limits which hosts the page can contact. The privacy page lists every network request the app makes.

Open Local Character →