by scccc6ut
表情头盔 · 会表情的 AI 员工头像 — expressive, zero-dependency helmet avatar for AI agents (MIT)
# Add to your Claude Code skills
git clone https://github.com/scccc6ut/npfacenpface is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by scccc6ut. 表情头盔 · 会表情的 AI 员工头像 — expressive, zero-dependency helmet avatar for AI agents (MIT). It has 54 GitHub stars.
npface's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/scccc6ut/npface" and add it to your Claude Code skills directory (see the Installation section above).
npface is primarily written in TypeScript. It is open-source under scccc6ut on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh npface against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
npface renders a small helmet-shaped face — a deep-navy rounded square helmet, white visor slot, two neon-green rounded-square eyes (the npcrew brand mark, flat 2D) — and makes it emote. Expressions come entirely from the two eyes, the visor and tiny helmet motions: blinks, squint-smiles, wide eyes, side glances, sleepy half-lids, reading saccades, a radar-like "searching" circle, dizzy X-eyes, z z z, nods, head tilts, breathing.
Give it a semantic state name and it takes care of the rest:
face.set('thinking'); // → idle → thinking → search-docs → search-web → working → proud …
sleep · wake · idle · blink · happy · proud (complete) · thinking · search-docs · search-web · working · waiting · error (dizzy) · sad (tired) — plus aliases (searching, rag, browsing, tired …; searchDocs / search_docs are normalised too), unknown names fall back to idle, and you can register your own.requestAnimationFrame loop). ~9 KB gzip.npface-react): <Npface state="working" />. Vue can follow.prefers-reduced-motion (static poses + minimal transitions), role="img" + aria-label.npm i npface # core — vanilla / any framework
npm i npface-react # React bindings (depends on npface)
CDN / no build step:
<script src="https://unpkg.com/npface/dist/npface.min.js"></script>
<script>
const face = npface.createNpface('#avatar', { state: 'idle', size: 64 });
</script>
Vanilla
import { createNpface } from 'npface';
const face = createNpface(document.querySelector('#avatar')!, {
state: 'idle', // initial state (alias: emotion)
size: 48, // px, or any CSS length string
colors: { body: '#0f1d3a', visor: '#fff', eye: '#c7f636' },
follow: true, // eyes follow the pointer (alias: gaze)
});
face.set('thinking'); // switch with a spring transition
face.pulse('proud'); // play once, then fall back to the previous state
face.pulse('blink'); // a single blink
face.look(0.6, -0.3); // look in a direction (-1..1); face.look(null) releases
face.follow(false);
face.destroy();
React
import { useRef } from 'react';
import { Npface, type NpfaceHandle } from 'npface-react';
export function Employee({ status }: { status: string }) {
const face = useRef<NpfaceHandle>(null);
return (
<button onClick={() => face.current?.pulse('happy')}>
<Npface ref={face} state={status} size={48} follow />
</button>
);
}
npface-react is marked "use client" and works with Next.js App Router. Props map 1:1 to the options below; changing state triggers a transition. The imperative handle (pulse, blink, look, follow, setColors, …) is the core instance.
createNpface(target, options?) → Npfacetarget is an element or CSS selector; the <svg> is appended to it.
| option | type | default | description |
|---|---|---|---|
state / emotion |
string |
'idle' |
initial state (aliases ok, unknown → idle) |
size |
number | string |
48 |
px or CSS length ('100%', '3rem') |
colors |
{ body, visor, eye, rim, zzz } |
brand palette | any subset; rim is an optional helmet outline |
theme |
'light' | 'dark' | 'auto' |
'auto' |
picks the default palette (auto = prefers-color-scheme) |
follow / gaze |
boolean |
false |
eyes (and a bit of head) follow the pointer |
reducedMotion |
boolean | 'auto' |
'auto' |
auto honours prefers-reduced-motion: no breathing / blink / gaze, quick critically-damped transitions |
pauseOffscreen |
boolean |
true |
stop animating while out of view |
label |
string |
state name | aria-label |
states |
Record<string, StateDef> |
— | extra / overriding states for this instance |
className |
string |
— | extra classes on the <svg> |
onChange |
(state, prev) => void |
— | after every state change |
| member | description |
|---|---|
el |
the <svg> (class="npface", data-state="…") |
state |
current state name |
set(name, { immediate? }) |
switch state; immediate snaps |
pulse(name, ms?) |
play once then return (default duration per state, else 1500 ms) |
blink() |
blink now |
follow(on) |
pointer gaze on/off |
look(x, y) / look(null) |
fixed gaze direction |
setColors(partial) · setSize() · setTheme() · setLabel() |
runtime tweaks |
destroy() |
stop & remove |
Also exported: STATES, STATE_NAMES, ALIASES, registerState(name, def), resolveStateName(), BASE_EYE, BASE_HEAD, SPRINGS, PALETTE, LIGHT_COLORS, DARK_COLORS, and the geometry helpers (HELMET_PATH, eyePath, …) for static rendering.
| state | look | meaning | notes |
|---|---|---|---|
idle |
resting | breathing, random glances, auto-blink | |
blink |
automatic | pulse('blink') / blink() for a manual one |
|
happy |
pleased | smile arches + a bounce; good as a pulse | |
proud |
task complete | alias complete, `d |