Skip to content
Back to skills

Opencharm Face System

ASecurity

Use when adding or changing a charm face (mood), colour or agent state, or any code that renders faces (web, CLI, firmware, emulator). Covers the source of truth, regeneration and the face rules.

  • 4 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 5, 2026
ai-agentstypescriptreact

Works with

  • cursor
  • cli

Security analysis

A100/100

Scanned October 5, 2026

npx -y skills add opencharm-labs/opencharm --skill opencharm-face-system --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Opencharm Face System?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Opencharm Face System
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/opencharm-labs-opencharm-face-system/badge)](https://www.skillsdirectory.com/skills/opencharm-labs-opencharm-face-system)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: opencharm-face-system
description: Use when adding or changing a charm face (mood), colour or agent state, or any code that renders faces (web, CLI, firmware, emulator). Covers the source of truth, regeneration and the face rules.
---

# OpenCharm face system

## Source of truth

`packages/design/src/charm-face.js` defines faces (`FACES`, `ORDER`), colours (`COLORS`), states (`STATES`) and the signal colour. Everything else is generated or reads the generated data:

- `npm run design:export` → `packages/design/faces.json` (checked for freshness by `npm test`).
- TypeScript reads it through `@opencharm-labs/design/faces` (`facesData`) with types from `@opencharm-labs/design/types`.
- `npm run design:export` also writes the firmware header `firmware/core/src/generated/faces.h`; never hand-copy glyphs.

## Rules

- A face is two eye glyphs and an optional mouth, drawn in Geist Mono 800, identity colour on true black.
- Orange `#FF5A1F` means only "it needs you" (the `ask` face and the decision layout).
- Flat: no glow, no gradients. Motion (blink, glance, pop, typed line, cursor) timings live in `packages/design/tokens.json`.
- Alive (spec 005): breathing, double and slow blinks, pondering while thinking, `squish()` on key down, `setVoiceLevel()` while listening, eyes on the finger. Change motion in `charm-face.js` and `firmware/core/src/ui/lvgl_view.cpp` together; behaviour (reactions, sleep, greeting) lives in `firmware/core/src/app.cpp`.
- Layouts: face, speech, decision.

## Adding a mood

1. Add it to `FACES` and `ORDER` in `charm-face.js` (fields are documented in `faces.json` → `fields`).
2. `npm run design:export`, then `npm test` (data tests check ids, states → faces, hex colours, effects).
3. Update the moods table in `OPENCHARM.md` ("The face").

## Mapping a state to a face

Edit `STATES` in `charm-face.js`: `id`, `face` (an existing face id), `name`, `when`, `trigger`. Regenerate, test, update `OPENCHARM.md` ("Agent states → faces").

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.