Claude-skill-registry logrocket
Implements session replay and error tracking with LogRocket for debugging user issues. Use when adding session recording, error monitoring, and performance tracking to React applications.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/logrocket" ~/.claude/skills/majiayu000-claude-skill-registry-logrocket && rm -rf "$T"
manifest:
skills/data/logrocket/SKILL.mdsource content
LogRocket
Session replay platform with error tracking, performance monitoring, and product analytics. Captures every user interaction for debugging.
Quick Start
npm install logrocket logrocket-react
Basic Setup
// logrocketSetup.ts import LogRocket from 'logrocket'; LogRocket.init('your-app-id/your-project');
// main.tsx - Import setup FIRST import './logrocketSetup'; import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; ReactDOM.createRoot(document.getElementById('root')!).render( <React.StrictMode> <App /> </React.StrictMode> );
User Identification
import LogRocket from 'logrocket'; // Identify user after login function onLogin(user) { LogRocket.identify(user.id, { name: user.name, email: user.email, // Custom attributes subscriptionType: user.plan, createdAt: user.createdAt, }); } // Anonymous session (before login) LogRocket.identify('anonymous-user-123');
Custom Events
import LogRocket from 'logrocket'; // Basic event LogRocket.track('Button Clicked'); // Event with properties LogRocket.track('PurchaseComplete', { revenue: 42.99, productCategory: 'Clothing', productSku: 4887369299, couponApplied: true, customerSegments: ['aef34b', '97cb20'], }); // Form submission LogRocket.track('FormSubmitted', { formName: 'contact', success: true, }); // Feature usage LogRocket.track('FeatureUsed', { featureName: 'export', format: 'csv', });
React Error Boundary
import LogRocket from 'logrocket'; import setupLogRocketReact from 'logrocket-react'; // After LogRocket.init() setupLogRocketReact(LogRocket);
This automatically captures:
- React component errors
- Error boundary crashes
- Component stack traces
Manual Error Logging
import LogRocket from 'logrocket'; try { // risky operation } catch (error) { LogRocket.captureException(error); } // With extra context LogRocket.captureException(error, { tags: { component: 'PaymentForm', userId: 'user_123', }, extra: { orderId: 'order_456', attemptNumber: 3, }, });
Console Logging
LogRocket captures console logs automatically. Add custom context:
import LogRocket from 'logrocket'; // Log with structured data LogRocket.log('Processing order', { orderId: 'order_123', items: 3 }); LogRocket.info('User action', { action: 'checkout_started' }); LogRocket.warn('Rate limit approaching', { remaining: 10 }); LogRocket.error('Payment failed', { reason: 'insufficient_funds' });
Redux Integration
import LogRocket from 'logrocket'; import { createStore, applyMiddleware } from 'redux'; const store = createStore( rootReducer, applyMiddleware(LogRocket.reduxMiddleware()) );
With Redux Toolkit
import { configureStore } from '@reduxjs/toolkit'; import LogRocket from 'logrocket'; const store = configureStore({ reducer: rootReducer, middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(LogRocket.reduxMiddleware()), });
Network Request Logging
LogRocket captures network requests automatically. Sanitize sensitive data:
LogRocket.init('app-id/project', { network: { requestSanitizer: (request) => { // Remove authorization header if (request.headers['Authorization']) { request.headers['Authorization'] = '[REDACTED]'; } // Sanitize request body if (request.body) { const body = JSON.parse(request.body); if (body.password) { body.password = '[REDACTED]'; } request.body = JSON.stringify(body); } return request; }, responseSanitizer: (response) => { // Sanitize response body if (response.body) { const body = JSON.parse(response.body); if (body.token) { body.token = '[REDACTED]'; } response.body = JSON.stringify(body); } return response; }, }, });
Privacy & Sanitization
Mask Sensitive Data
LogRocket.init('app-id/project', { dom: { // Mask all inputs inputSanitizer: true, // Mask specific elements textSanitizer: true, // Mask by CSS selector privateAttributeBlocklist: ['data-private'], }, });
HTML Masking
<!-- Mask specific elements --> <input type="password" data-private /> <div data-private>Sensitive content</div> <!-- Or use CSS class --> <div class="lr-hide">Hidden from replay</div>
Block Recording
<!-- Completely hide from DOM --> <div data-logrocket-hidden> This content won't appear in recordings </div>
Conditional Recording
Only record certain users or conditions:
import LogRocket from 'logrocket'; // Check condition before initializing if (shouldRecordUser(user)) { LogRocket.init('app-id/project'); LogRocket.identify(user.id, { name: user.name }); } // Or start/stop recording LogRocket.startRecording(); LogRocket.stopRecording();
Sample Rate
LogRocket.init('app-id/project', { shouldSendData: () => { // Record 10% of sessions return Math.random() < 0.1; }, });
Session URL
Get the session URL for support tickets:
import LogRocket from 'logrocket'; LogRocket.getSessionURL((sessionURL) => { // Send to support system console.log('Session URL:', sessionURL); // Or add to error reports Sentry.setExtra('sessionURL', sessionURL); });
Integration with Error Tracking
Sentry
import * as Sentry from '@sentry/react'; import LogRocket from 'logrocket'; LogRocket.getSessionURL((sessionURL) => { Sentry.configureScope((scope) => { scope.setExtra('sessionURL', sessionURL); }); });
Custom Integration
import LogRocket from 'logrocket'; LogRocket.getSessionURL((sessionURL) => { // Add to your error tracking errorTracker.setContext('logrocket_session', sessionURL); // Or send to your backend fetch('/api/session', { method: 'POST', body: JSON.stringify({ sessionURL, userId: currentUser.id }), }); });
Next.js Integration
// app/providers.tsx 'use client'; import { useEffect } from 'react'; import LogRocket from 'logrocket'; import setupLogRocketReact from 'logrocket-react'; export function LogRocketProvider({ children }: { children: React.ReactNode }) { useEffect(() => { if (typeof window !== 'undefined') { LogRocket.init('app-id/project'); setupLogRocketReact(LogRocket); } }, []); return <>{children}</>; }
// app/layout.tsx import { LogRocketProvider } from './providers'; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <body> <LogRocketProvider> {children} </LogRocketProvider> </body> </html> ); }
Configuration Options
LogRocket.init('app-id/project', { // Console options console: { isEnabled: true, shouldAggregateConsoleErrors: true, }, // Network options network: { isEnabled: true, requestSanitizer: (request) => request, responseSanitizer: (response) => response, }, // DOM options dom: { isEnabled: true, inputSanitizer: true, textSanitizer: false, baseHref: 'https://yourdomain.com', }, // Release tracking release: process.env.NEXT_PUBLIC_VERSION, // Parent domain (for cross-subdomain tracking) parentDomain: 'yourdomain.com', // Merge IDs (connect anonymous with identified) mergeImmediately: true, });
TypeScript
import LogRocket from 'logrocket'; interface UserTraits { name: string; email: string; plan: 'free' | 'pro' | 'enterprise'; createdAt: string; } function identifyUser(userId: string, traits: UserTraits) { LogRocket.identify(userId, traits); } interface PurchaseEvent { productId: string; amount: number; currency: string; } function trackPurchase(event: PurchaseEvent) { LogRocket.track('Purchase', event); }
Performance Monitoring
LogRocket automatically captures:
- Page load times
- First Contentful Paint (FCP)
- Largest Contentful Paint (LCP)
- Time to Interactive (TTI)
- Network request timing
Access in the LogRocket dashboard under Performance.
Best Practices
- Initialize early - Import setup file before other modules
- Identify users - Connect sessions to user accounts
- Sanitize data - Never record passwords or tokens
- Use conditional recording - Sample in production
- Track key events - Conversions, errors, feature usage
- Integrate with error tracking - Link sessions to Sentry/etc
- Use private attributes - Mark sensitive DOM elements