Skip to content

uGo eyes — web version of the face (standard 0.1)

Status as of 03.11.2026. In development — in the repository ume-eyes, folder packages/ume_face/web/, not yet adopted, not yet built into any product and not installed on any device. The German version follows below: Deutsch.

For IT, technicians and integration partners

Technical reference for developers who embed the face in a product without Flutter (operator interface of the transport robots, large screens). It is not written as operating instructions for end users.

What it is

The uGo eyes are the face of the URG products, always in the same variant. The web version draws the face on a canvas, without libraries, and takes every measurement, colour, time, particle count and moment text from one value list, gesicht_standard.json (standard „Gesicht und Momente“, version 0.1). The Flutter version in the same package uses the same list.

File Purpose
ugo-augen.js ES module: mountUgoAugen(canvas, options), behaviour and drawing
index.html full-screen page (content security policy default-src 'self')
seite.js start of the full-screen page, publishes window.uGoAugen
vorschau.js preview controls, loaded only with vorschau=1
ugo-augen.css style sheet, colours come from the value list
gesicht_standard.json byte copy of the value list
schrift/ font Nunito (SIL Open Font License 1.1) with licence text
GESICHT-HERKUNFT.md SHA-256 of every file

Products take the folder as a byte copy and record the source commit and the SHA-256 in their own GESICHT-HERKUNFT.md; a test in the product compares them.

Full-screen page

Serve the folder over HTTP(S) from one origin and open index.html. The page loads nothing from other addresses and works without internet.

Parameter Values Default
sprache de, en, fr, es, it, nl (moment texts) de
ton an, aus (birthday melody and browser voice) aus
schlaf milliseconds without input until the face falls asleep 60000
vorschau 1 = controls, push to talk, text input, shortcuts (team only) off

Without vorschau=1 there is no microphone, no speech recognition and no button on the page. In the preview the speech recognition of the browser may send the audio to a cloud service of the browser maker (assumption, not measured); the preview is a tool for the team only.

Embedding

import { ladeStandard, mountUgoAugen, setzeFarben } from './ugo-augen.js';
const standard = await ladeStandard();
setzeFarben(document.documentElement, standard);
const face = mountUgoAugen(document.querySelector('canvas'), {
  standard, untertitel: document.querySelector('#untertitel'), sprache: 'en',
});
face.moment('losfahren');

Options: standard (required), untertitel (element for subtitles), sprache, ton (default false), schlafMs, reduziert (default from the system setting „reduce motion“, followed while running when not set), erlaubteHerkunft (list of additional origins for postMessage), kanalName. The returned object has setEmotion, moment, state, say, look, emotions and destroy.

Messages

JSON objects; unknown fields are ignored.

Message Fields Effect
set_emotion emotion: neutral, friendly, happy, curious, thoughtful, surprised, empathetic, embarrassed, love, starstruck, sleepy, birthday expression for 8 s, then friendly; unknown, empty or null → neutral. love: 8 hearts, starstruck: 16 sparks (only if no moment runs), sleepy: sleeps, birthday: party without the own song (the voice assistant sings), at least 14 s, at most 40 s
moment name: losfahren, danke, wow, geburtstag, hallo, sorge, schlafen, gluecklich; value only for geburtstag: first name, at most 24 characters moment as in the standard; geburtstag plays the own song with subtitles, minimum 14 s
state state: idle, listening, thinking, speaking state of the face
say text (at most 300 characters), optional emotion subtitle, state speaking
look direction: left, right, up, center gaze for 1.2 s or until the next message (the eyes follow the direction of travel)

The state error (expression „concern“, no particles, no moments) can be set only by the embedding application through state('error') of the returned object, and it ends only with state('idle') of the same object. Messages from outside can neither set nor end error, and cannot set sleeping.

Moments behave as in the Flutter version:

  • A new moment replaces the running one; the same moment started again runs its full time again.
  • set_emotion with a different emotion ends the running moment, also the birthday. The emotion of the running moment (for example love during losfahren, birthday during the birthday) keeps it.
  • The first name is trimmed; a blank value counts as no name („dear friend“).

Transport

Way Rule
window.uGoAugen (full-screen page) setEmotion, moment, state, say, look, emotions, for the application that shows the page
BroadcastChannel("ugo-augen") same origin only (browser rule)
postMessage only from the same origin or from an origin in erlaubteHerkunft; everything else is ignored. The full-screen page accepts only its own origin

Subtitles are always set as text, never as HTML.

Privacy and accessibility

  • Subtitles leave the page after fading out (at once with „reduce motion“); a first name does not remain in the page or for screen readers after the moment.
  • No camera, no microphone, no storage, no statistics. A first name for the birthday song lives only in memory for the duration of the moment.
  • With „reduce motion“ there are no hearts, sparks, balloons or confetti (factor 0 in the value list); the expression stays; no idle glances; the face appears without the start-up drawing.
  • The canvas is labelled for screen readers as an image („Face of the robot“, in the page language).
  • Subtitles at least 18 px, contrast to the background above 4.5 : 1.
  • The browser voice (ton=an) may use a cloud service of the browser maker (assumption, not measured); default is off.

Data location

The face itself sends no data. Where products send data elsewhere: data in Europe, data centre Frankfurt.


uGo-Augen — Web-Fassung des Gesichts (Standard 0.1)

Stand 03.11.2026. In Entwicklung — im Repository ume-eyes, Ordner packages/ume_face/web/, noch nicht übernommen, in kein Produkt eingebaut und auf keinem Gerät installiert.

Für IT, Techniker und Integrationspartner

Technische Referenz für Entwickler, die das Gesicht in ein Produkt ohne Flutter einbinden (Bedienoberfläche der Transportroboter, große Bildschirme). Keine Bedienungsanleitung für Endnutzer.

Worum es geht

Die uGo-Augen sind das Gesicht der URG-Produkte, immer in derselben Variante. Die Web-Fassung zeichnet das Gesicht auf einer Zeichenfläche (Canvas), ohne Bibliotheken, und nimmt alle Maße, Farben, Zeiten, Teilchenzahlen und Momenttexte aus einer Werteliste, gesicht_standard.json (Standard „Gesicht und Momente“, Fassung 0.1). Die Flutter-Fassung im selben Paket nutzt dieselbe Liste.

Datei Zweck
ugo-augen.js ES-Modul: mountUgoAugen(canvas, optionen), Verhalten und Zeichnen
index.html Vollbildseite (Inhaltsrichtlinie default-src 'self')
seite.js Start der Vollbildseite, setzt window.uGoAugen
vorschau.js Vorschau-Bedienung, nur mit vorschau=1 geladen
ugo-augen.css Gestaltung, Farben kommen aus der Werteliste
gesicht_standard.json bytegleiche Kopie der Werteliste
schrift/ Schrift Nunito (SIL Open Font License 1.1) mit Lizenztext
GESICHT-HERKUNFT.md SHA-256 jeder Datei

Produkte übernehmen den Ordner als bytegleiche Kopie und tragen Quell-Commit und SHA-256 in ihre eigene GESICHT-HERKUNFT.md ein; ein Test im Produkt vergleicht sie.

Vollbildseite

Den Ordner über HTTP(S) von einer Herkunft ausliefern und index.html öffnen. Die Seite lädt nichts von fremden Adressen und läuft ohne Internet.

Parameter Werte Vorgabe
sprache de, en, fr, es, it, nl (Momenttexte) de
ton an, aus (Geburtstagsmelodie und Browserstimme) aus
schlaf Millisekunden ohne Eingabe bis zum Einschlafen 60000
vorschau 1 = Bedienleiste, Sprechtaste, Texteingabe, Tastenkürzel (nur fürs Team) aus

Ohne vorschau=1 gibt es auf der Seite kein Mikrofon, keine Spracherkennung und keine Taste. In der Vorschau kann die Spracherkennung des Browsers den Ton an einen Cloud-Dienst des Browserherstellers senden (Annahme, nicht gemessen); die Vorschau ist nur ein Werkzeug fürs Team.

Einbinden

import { ladeStandard, mountUgoAugen, setzeFarben } from './ugo-augen.js';
const standard = await ladeStandard();
setzeFarben(document.documentElement, standard);
const gesicht = mountUgoAugen(document.querySelector('canvas'), {
  standard, untertitel: document.querySelector('#untertitel'), sprache: 'de',
});
gesicht.moment('losfahren');

Optionen: standard (Pflicht), untertitel (Element für Untertitel), sprache, ton (Vorgabe false), schlafMs, reduziert (Vorgabe aus der Systemeinstellung „Bewegung reduzieren“, ohne Angabe wird eine Änderung im Betrieb übernommen), erlaubteHerkunft (Liste weiterer Herkünfte für postMessage), kanalName. Das zurückgegebene Objekt hat setEmotion, moment, state, say, look, emotions und destroy.

Nachrichten

JSON-Objekte; unbekannte Felder werden ignoriert.

Nachricht Felder Wirkung
set_emotion emotion: neutral, friendly, happy, curious, thoughtful, surprised, empathetic, embarrassed, love, starstruck, sleepy, birthday Ausdruck für 8 s, dann friendly; unbekannt, leer oder null → neutral. love: 8 Herzen, starstruck: 16 Funken (nur ohne laufenden Moment), sleepy: schläft ein, birthday: Feier ohne eigenes Lied (der Sprachassistent singt), mindestens 14 s, höchstens 40 s
moment name: losfahren, danke, wow, geburtstag, hallo, sorge, schlafen, gluecklich; value nur bei geburtstag: Vorname, höchstens 24 Zeichen Moment nach Standard; geburtstag spielt das eigene Lied mit Untertiteln, mindestens 14 s
state state: idle, listening, thinking, speaking Zustand des Gesichts
say text (höchstens 300 Zeichen), optional emotion Untertitel, Zustand speaking
look direction: left, right, up, center Blick für 1,2 s oder bis zur nächsten Nachricht (Augen folgen der Fahrtrichtung)

Den Zustand error (Ausdruck „Sorge“, keine Teilchen, keine Momente) setzt nur die einbindende Anwendung über state('error') des zurückgegebenen Objekts, und er endet nur mit state('idle') desselben Objekts. Nachrichten von außen können error weder setzen noch beenden und sleeping nicht setzen.

Momente verhalten sich wie in der Flutter-Fassung:

  • Ein neuer Moment ersetzt den laufenden; derselbe Moment, erneut gestartet, läuft wieder seine volle Zeit.
  • set_emotion mit einer anderen Emotion beendet den laufenden Moment, auch den Geburtstag. Die Emotion des laufenden Moments (etwa love bei losfahren, birthday beim Geburtstag) lässt ihn weiterlaufen.
  • Der Vorname wird um Leerzeichen gekürzt; ein leerer Wert gilt als kein Name („dear friend“).

Übermittlung

Weg Regel
window.uGoAugen (Vollbildseite) setEmotion, moment, state, say, look, emotions, für die Anwendung, die die Seite zeigt
BroadcastChannel("ugo-augen") nur gleiche Herkunft (Regel des Browsers)
postMessage nur von gleicher Herkunft oder von einer Herkunft aus erlaubteHerkunft; alles andere wird ignoriert. Die Vollbildseite nimmt nur die eigene Herkunft an

Untertitel werden immer als Text gesetzt, nie als HTML.

Datenschutz und Barrierefreiheit

  • Untertitel verlassen die Seite nach dem Ausblenden (bei „Bewegung reduzieren“ sofort); ein Vorname bleibt nach dem Moment weder in der Seite noch für Bildschirmleser stehen.
  • Keine Kamera, kein Mikrofon, kein Speichern, keine Statistik. Ein Vorname für das Geburtstagslied steht nur für die Dauer des Moments im Arbeitsspeicher.
  • Mit „Bewegung reduzieren“ gibt es keine Herzen, Funken, Ballons oder Konfetti (Faktor 0 in der Werteliste); der Ausdruck bleibt; keine Blickwechsel in Ruhe; das Gesicht erscheint ohne Hochfahr-Zeichnung.
  • Die Zeichenfläche ist für Bildschirmleser als Bild beschriftet („Gesicht des Roboters“, in der Sprache der Seite).
  • Untertitel mindestens 18 px, Kontrast zum Hintergrund über 4,5 : 1.
  • Die Browserstimme (ton=an) kann einen Cloud-Dienst des Browserherstellers nutzen (Annahme, nicht gemessen); Vorgabe ist aus.

Datenort

Das Gesicht selbst sendet keine Daten. Wo Produkte Daten weitergeben: Daten in Europa, Rechenzentrum Frankfurt.