frontend-observability
A portable, framework-agnostic field-side observability system for any React or React Native app. Establishes one typed event taxonomy (canonical event-name constants, never inline strings), a best-effort non-blocking provider fan-out so a failing or absent analytics provider can never...
npx skills add sickn33/agentic-awesome-skills --skill frontend-observability --agent claude-code
Same command for any agent — swap --agent for codex, cursor, copilot.
Weekly change comes from our own snapshots, not the repository page — it measures attention, not adoption.
What it does
Implements a portable observability system for React and React Native apps. It defines a single typed set of event constants, exposes a single entry point track(event, props), and fans out to multiple analytics adapters in a non-blocking, SSR-safe manner. It enforces a consent gate so no telemetry runs before opt-in, and provides a hook-based client-side API via a provider to access track without affecting server components.
How it works
- Central event taxonomy: events live in a constants/analytics.ts file as ANALYTICS_EVENTS with an AnalyticsEvent union type; events are referenced via ANALYTICS_EVENTS.* and never as string literals.
- Single entry point: track(event, props) is the unified function; it checks consent (hasConsent()) and then iterates analyticsAdapters, calling each adapter inside a try/catch to prevent a failing provider from breaking others.
- Adapters: each provider has a tiny function (event, props) => void guarded by SSR-safe checks (e.g., window presence, provider readiness). The registry analyticsAdapters is exported and mutable for testability.
- Platform support: separate firebase adapters for web and native, loaded via lazy/guarded imports or platform-specific files; the track fan-out remains stable across platforms.
- SSR-safe provider: AnalyticsProvider exposes a useAnalytics() hook; outside a provider or on server, useAnalytics returns a no-op track function. A TrackedGithubLink component demonstrates using the hook client-side.
- Real-user vitals: web-vitals integration reports to track with event name 'web_vital' and properties like name, value, rating, id, reusing the same fan-out.
- Consent and privacy: hasConsent gates all dispatch; track returns early if consent is absent.
When to use it
Use this skill when you need a portable, framework-agnostic field-side observability system for any React or React Native app. It establishes a typed event taxonomy, best-effort non-blocking fan-out, field vitals, and consent gating, serving as a field complement to the frontend-lighthouse lab skill.
What it can touch
- Adapters: googleAnalyticsAdapter, clarityAdapter, firebaseAdapter, firebase.native adapter, plus others (registry shows multiple entries).
- Event taxonomy: ANALYTICS_EVENTS constants and AnalyticsEvent union.
- Web vitals reporting via reportWebVitals which calls track with a web_vital event.
- Consent and privacy: hasConsent() gating in track and consent.ts.
Caveats
- The risk is marked as critical. The implementation relies on browser globals and optional providers; SSR-safe guards are required to prevent crashes.
- No inline strings for event names; must use ANALYTICS_EVENTS.* constants.
- The system depends on external provider scripts (e.g., GA, Clarity, PostHog) being loaded at runtime; adapters guard for absence and errors to avoid breaking the app.
# Frontend Observability (the field side) ## When to Use Use this skill when you need a portable, framework-agnostic field-side observability system for any React or React Native app. Establishes one typed event taxonomy (canonical event-name constants, never inline strings), a best-effort non-blocking provider fan-out so a failing or absent analytics provider can never... > Portable skill — readable by Claude Code, OpenCode, Codex, Cursor, Windsurf, and others. > This skill describes a **field-side observability system** — event taxonomy, provider fan-out, > real-user vitals, error reporting, consent — not a dashboard or a specific vendor. It is the > **field complement to the frontend-lighthouse skill**: Lighthouse is the _lab_ gate (synthetic, > pre-merge); this is the _field_ (what real users actually experience). It lives in a > `services/analytics/` module per the **frontend-architecture** skill. The goal: you can answer "what are real users doing, and what are they experiencing?" — with a **typed event vocabulary** (no stringly-typed `track("clicked_thing")` scattered everywhere), a fan-out that is **best-effort** (a broken provider never breaks the app), real **Core Web Vit
- When to Use
- 0. The five core ideas
- 1. Directory layout
- 2. The event taxonomy (typed, never inline)
- 3. Best-effort, non-blocking fan-out
- 3.1 Firebase Analytics — one adapter, two platforms
- 4. The provider + hook (SSR-safe entry)
- 5. Real-user Core Web Vitals (the lab/field loop)
- 6. Consent and privacy gating
- 7. Error reporting at boundaries
- 8. Provider & framework adapters
- 9. Conventions checklist (enforce in review)
- 10. How to apply this skill
- Publishing / installing this skill
What does the frontend-observability skill do?
A portable, framework-agnostic field-side observability system for any React or React Native app. Establishes one typed event taxonomy (canonical event-name constants, never inline strings), a best-effort non-blocking provider fan-out so a failing or absent analytics provider can never...
How do I install it?
Run `npx skills add sickn33/agentic-awesome-skills --skill frontend-observability --agent claude-code` — it drops the skill into your project so the agent can pick it up. Swap the --agent value for codex, cursor or copilot if you use one of those.
Where does this skill come from?
From sickn33/agentic-awesome-skills, a repository with 44,414 stars. We read it straight from the repository tree rather than a submitted listing, so what you see here is what is actually published.
Is a popular skill a good skill?
Not necessarily. Stars measure attention, not adoption — a repository can trend for a week and be abandoned. That is why we show the weekly change from our own snapshots next to the total, instead of a single flattering number.