# Events & analytics taxonomy

Transport today: `localStorage` key `glim_events_v1` via `storeEvent(kind, data)` in `index.html`.  
No third-party analytics in repo at pack time. Cap ~80 events client-side.

## North star

**Starter or `glim.js` downloads** (activation).  
Inputs: feedback yes-rate; Pro/Team notify emails; demo asks.  
Kill: after 50 honest feedback taps, yes &lt; 20% → rethink job *(launch.html / site)*.

## Event catalog

| kind | When | Properties |
|---|---|---|
| `gallery_pick` | Click creature card | `id`, `free` |
| `gallery_configure` | Double-click → configurator | `id`, `free` |
| `gallery_filter` | Free/All filter | `mode` |
| `demo_ask` | Send on live demo | `live` (bool), `chars` |
| `config_type` | Creature select change | `id` |
| `copy_code` | Copy snippet | `tab`, `type` |
| `download_starter` | Download offline starter | `type`, `bytes`, `offline: true` |
| `download_lib` | Download glim.js | `bytes` |
| `feedback` | Feedback submit | `interest`, `hasEmail`, `hasNote` |
| `signals_export` | Copy signals JSON | `n` |
| `intent_open` | Open waitlist dialog | `tier` (`pro`\|`team`\|`studio`) |
| `intent_submit` | Submit waitlist | `tier`, `hasEmail`, `hasNote` |

Common envelope: `{ kind, at: ISO8601, ...data }`.

## Library runtime events (not localStorage)

| Event | Emitter | Payload |
|---|---|---|
| `state` | `presence.on('state')` | `PresenceState` |
| `settle` | after held `say()` types out | full string |

## Do not track (yet)

PII beyond voluntary email in mailto/intent · keystrokes · raw message contents in analytics (demo stores `chars` length only).
