Install
openclaw skills install @gv66co/fitcheck-workout-readinessFace scan from the browser camera in 60 seconds: stress, a heart-rate estimate, mood, micro-expressions, eye contact, genuine smile, composure and, with the microphone on, voice tension, as a summary the agent turns into JSON. Use when the user explicitly asks for a face scan, a stress or heart-rate check from the camera, a before-and-after comparison, a challenge with friends or the deception challenge game. Optional: analyse a photo or clip the user hands over through the EmoPulse API with their own RapidAPI key from the environment; that file is uploaded. Not a medical device. Built on EmoPulse, a patented on-device perception architecture.
openclaw skills install @gv66co/fitcheck-workout-readinessSixty seconds on camera and you see what your face is broadcasting right now: stress, a heart-rate estimate, mood, micro-expressions, eye contact, genuine smile and composure, plus voice tension if the microphone is on. Scan before and after, compare the two, or turn it into a challenge with friends. It runs in the browser at emo.city, nothing to install.
The pasted summary looks like this (numbers are an example):
EMOCITY SCAN REPORT
---
Emotion: neutral
Felt-vs-shown: 18%
Stress: 34%
Genuineness: 72%
Eye Contact: 81%
HR: 74bpm
HRV: 42ms
Voice Tension: 20%
Micro-Expressions: 3
Standout moments: 2
---
Turn it into:
{
"mood": "neutral",
"stress": 34,
"heart_rate_bpm": 74,
"hrv_ms": 42,
"eye_contact": 81,
"genuineness": 72,
"felt_vs_shown": 18,
"voice_tension": 20,
"micro_expressions": 3,
"standout_moments": 2
}
HR: N/A becomes null, a missing HRV line becomes null, percentages are integers from 0 to 100.
Before and after: return {"before": {...}, "after": {...}, "change": {"stress": -12, "heart_rate_bpm": -9, "eye_contact": 4}} plus one sentence in plain words.
Challenge: return {"players": [{"name": "Ana", "stress": 22, "eye_contact": 88, "genuineness": 80, "felt_vs_shown": 12}], "calmest": "Ana", "steadiest_eyes": "Ana", "most_genuine_smile": "Ana"}. In the deception challenge the lowest felt_vs_shown wins. Keep scoreboards in the conversation; do not write them to files.
null means the signal was too weak (light, movement); never report 0.The engine behind the scan is also a hosted API, EmoPulse Face Analysis: https://rapidapi.com/emocity/api/emopulse-face-analysis (free BASIC plan, 50 requests a month; every plan has a hard monthly limit, so a key cannot run up overage charges). Unlike the browser scan, this path uploads the file. Run it only when all three hold:
EMOPULSE_RAPIDAPI_KEY, which the user sets in their own environment; suggest a dedicated key they can revoke. Never ask for the key in the chat, never print it, never write it to a file. If it is not set, send them to the RapidAPI page and stop.The key goes to curl through standard input, so it never appears in command arguments:
printf 'X-RapidAPI-Key: %s\n' "$EMOPULSE_RAPIDAPI_KEY" | curl -s -X POST "https://emopulse-face-analysis.p.rapidapi.com/api/v1/analyze/image" \
-H @- \
-H "X-RapidAPI-Host: emopulse-face-analysis.p.rapidapi.com" \
-F "file=@/path/to/photo.jpg"
Photo: JPG or PNG up to 10 MB, up to 4 faces. Clip: MP4 or MOV up to 100 MB to /api/v1/analyze/video, same command. The response has faces_detected and a faces list; map each face to the same JSON keys: avg_stress to stress, dominant_emotion to mood, avg_eye_contact to eye_contact, avg_authenticity to genuineness, avg_deception to felt_vs_shown, plus micro_expressions and genuine_smiles. The API does not return a heart rate; set heart_rate_bpm to null. If faces_detected is 0, say no face was found and stop.
The camera and microphone are processed in the browser and never uploaded; what is sent is anonymous usage analytics and, for signed-in users, their summary scores saved to their account. The optional API path above uploads the one file the user chose.