event-tracking
Skill288 starsChanged 52 days agoMITView on GitHub
Add event tracking calls to Vue/Nuxt components in the Insights app using the useTrackEvent composable. Use this skill whenever a developer asks to "track" a user action or page view, "add analytics", "instrument" a component, "fire an event", implement an event from the events catalog, or wire up tracking for anything in the Insights frontend — even if they just say "track when the user clicks X" or "add tracking to this page".
1 other project uses a version of this.
Adopted by
Most recently taken up by
- dilolabs/nosiatheir own version, first seen Oct 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- dilolabs/nosia★ 211same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository12 other files it gives its agents.
- AGENTS.mdAGENTS.md
- adrSkill
- commitSkill
- db-migrateSkill
- dcoSkill
- fix-security-findingSkill
- fix-vulnsSkill
- preflightSkill
- review-prSkill
- setup-docsSkill
- setupSkill
- tech-writerSkill
The file
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 3 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 33
Adding events for a new feature: create events/<feature>.ts, define its <Feature>EventKey enum and <FEATURE>_EVENT_DEFINITIONS record, then …
- Very specific: line 47
Always use the feature-specific key enum (e.g.
- Very specific: line 71
Always start by reading references/events-catalog.md to find the event that matches what the developer described.
- Distinctive: line 73
If no catalog entry matches, note this to the developer and suggest the closest match or a new entry following the conventions at the …
- Distinctive: line 84
Read the target component or page file before making any changes.
- Very specific: line 94
Place trackEvent(...) inside the action handler, after the main logic succeeds.
- Very specific: line 111
Place inside onMounted(). Add to an existing onMounted if one already exists.
- Very specific: line 121
If the event requires data that loads asynchronously (e.g.
- Distinctive: line 158
No TypeScript errors introduced
- Very specific: line 176
Place after the await so it only fires on success:
- Very specific: line 222
Add EventFeature.MY_FEATURE to the EventFeature enum in base.ts.
- Very specific: line 224
Add the new events to references/events-catalog.md under a new section.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Event Tracking — Insights App
Status: Ready for rollout, but Segment dispatch is currently disabled in
frontend/composables/useTrackEvent.tspending alignment with the analytics team. Events still persist to the internaleventstable via/api/events. Re-enable by uncommenting the$trackblock in the composable.
What this skill does
Helps you add the right trackEvent() call to the right place in the codebase, using the catalog-approved event definitions.
File structure
frontend/app/components/shared/types/events/
├── base.ts # EventType, EventFeature enums; EventDefinition interface
├── index.ts # EventKey union type; aggregated EVENT_DEFINITIONS record
└── collections.ts # CollectionsEventKey enum + COLLECTIONS_EVENT_DEFINITIONS
<feature>.ts # (future) FeatureEventKey enum + FEATURE_EVENT_DEFINITIONS
frontend/composables/useTrackEvent.ts # just the tracking functionAdding events for a new feature: create events/<feature>.ts, define its <Feature>EventKey enum and <FEATURE>_EVENT_DEFINITIONS record, then re-export both from index.ts.
index.ts shape:
export type EventKey = CollectionsEventKey; // | FutureFeatureEventKey | ...
export const EVENT_DEFINITIONS: Record<EventKey, EventDefinition> = {
...COLLECTIONS_EVENT_DEFINITIONS,
// ...FUTURE_FEATURE_EVENT_DEFINITIONS,
};How to use
Always use the feature-specific key enum (e.g. CollectionsEventKey), not the union EventKey type. The composable itself only needs useTrackEvent — the key enum comes from the feature's events file.
import { useTrackEvent } from '~~/composables/useTrackEvent';
import { CollectionsEventKey } from '~/components/shared/types/events/collections';
const { trackEvent } = useTrackEvent();
trackEvent({
key: CollectionsEventKey.CREATE_COLLECTION,
properties: { newCollectionId, isPrivate }, // catalog-defined fields only — optional
});name, type, and feature are looked up automatically from EVENT_DEFINITIONS — never pass them in the call.
source (current URL) and entrySource (referrer) are captured automatically — never pass them manually.
The call is always fire-and-forget: errors are caught inside the composable and never bubble up.
Step-by-step workflow
1. Read the events catalog
Always start by reading references/events-catalog.md to find the event that matches what the developer described. The catalog is organized by feature section (e.g. "Community Collections"). Note the enum value and properties columns — use those exactly.
If no catalog entry matches, note this to the developer and suggest the closest match or a new entry following the conventions at the bottom of the catalog.
2. Identify the target file and feature
Infer the feature from context (e.g. "track when the user creates a collection" → Community Collections). This tells you which key enum to import:
| Feature | Key enum | Import path |
| Community Collections | CollectionsEventKey | ~/components/shared/types/events/collections |
| (future features) | <Feature>EventKey | ~/components/shared/types/events/<feature> |
Read the target component or page file before making any changes. You need to understand:
- Whether
useTrackEventis already imported - For feature events: which function handles the user action
- For page events: whether
onMountedalready exists
3. Insert the tracking call
Feature events
Place trackEvent(...) inside the action handler, after the main logic succeeds.
const handleCreateCollection = async () => {
const result = await createCollection(...)
trackEvent({
key: CollectionsEventKey.CREATE_COLLECTION,
properties: { newCollectionId: result.id, isPrivate: form.isPrivate },
})
}For abandonment events, fire when the user dismisses or navigates away without completing the flow — typically on modal close before the success state is reached.
Page events
Place inside onMounted(). Add to an existing onMounted if one already exists.
onMounted(() => {
trackEvent({ key: CollectionsEventKey.VIEW_DISCOVER_COLLECTIONS });
});Events that need async data (e.g. viewerType)
If the event requires data that loads asynchronously (e.g. collection details needed to determine viewerType), use watch with { once: true } instead of onMounted:
watch(
data,
(collection) => {
if (!collection) return;
trackEvent({
key: CollectionsEventKey.VIEW_COLLECTION,
properties: {
collectionId: collection.id,
viewerType:
collection.ssoUserId && user.value?.sub === collection.ssoUserId ? 'owner' : 'guest',
},
});
},
{ once: true },
);4. Add the imports (if missing)
import { useTrackEvent } from '~~/composables/useTrackEvent';
import { CollectionsEventKey } from '~/components/shared/types/events/collections';Then destructure at the top level of <script setup>:
const { trackEvent } = useTrackEvent();The ~~ alias points to frontend/, ~ points to frontend/app/. Neither is auto-imported.
5. Verify
- No TypeScript errors introduced
- The tracking call does not change the control flow of existing logic
- Properties only include fields listed in the catalog for that event
Common patterns
Properties with runtime values
// Good
properties: { collectionId: collection.id, isPrivate: collection.isPrivate }
// Bad
properties: { collectionId: 'collectionId', isPrivate: 'isPrivate' }Tracking after async operations
Place after the await so it only fires on success:
await updateCollection(payload);
trackEvent({
key: CollectionsEventKey.UPDATE_COLLECTION,
properties: { collectionId, changedFields },
});Multiple events in one handler
Track each separately in the right order.
Adding events for a new feature
Create
frontend/app/components/shared/types/events/<feature>.ts:import { EventFeature, EventType, type EventDefinition } from './base'; export enum MyFeatureEventKey { DO_THING = 'do-thing', } export const MY_FEATURE_EVENT_DEFINITIONS: Record<MyFeatureEventKey, EventDefinition> = { [MyFeatureEventKey.DO_THING]: { key: MyFeatureEventKey.DO_THING, type: EventType.FEATURE, name: 'Do thing', feature: EventFeature.MY_FEATURE, allowedProperties: [], }, };In
index.ts, extend the union and spread intoEVENT_DEFINITIONS:export type EventKey = CollectionsEventKey | MyFeatureEventKey; export const EVENT_DEFINITIONS = { ...COLLECTIONS_EVENT_DEFINITIONS, ...MY_FEATURE_EVENT_DEFINITIONS, };- Add
EventFeature.MY_FEATUREto theEventFeatureenum inbase.ts. - Add the new events to
references/events-catalog.mdunder a new section.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

