
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@loopkit/javascript
Advanced tools
A complete analytics SDK for tracking events, user identification, and behavioral analytics in web applications. Now built with TypeScript for better developer experience and type safety.
npm install @loopkit/javascript
<script src="https://cdn.loopkit.ai/js/loopkit.min.js"></script>
import LoopKit from '@loopkit/javascript';
// Initialize - auto tracking starts immediately!
LoopKit.init('your-api-key-here');
// ✅ automatically tracking page views, clicks, and errors
// Track custom events manually
LoopKit.track('button_clicked', {
button_name: 'signup',
page: '/homepage',
});
// Identify a user
LoopKit.identify('user_123', {
email: 'user@example.com',
plan: 'pro',
});
const LoopKit = require('@loopkit/javascript');
// Initialize with configuration
LoopKit.init('your-api-key-here', {
debug: true,
batchSize: 50,
flushInterval: 30,
});
// Track server-side events
LoopKit.track('user_signup', {
method: 'email',
source: 'landing_page',
});
LoopKit automatically tracks common user interactions and events out of the box. All auto tracking features are enabled by default for zero-configuration setup:
| Feature | Default | Event Type | Description |
|---|---|---|---|
enableAutoCapture | ✅ true | page_view | Page loads and navigation |
enableAutoClickTracking | ✅ true | click | Button, link, and element clicks |
enableErrorTracking | ✅ true | error | JavaScript errors and exceptions |
enableSessionTracking | ✅ true | session_start, session_end | User session lifecycle tracking |
enableAutoCapture: true)page_view events with URL, path, title, and referrerurl, path, search, title, referrerenableAutoClickTracking: true)click events with element details and page contextelement_type, element_text, element_id, element_class, element_tag, element_href, page, page_title, page_url, positionenableErrorTracking: true)error events with error details and stack tracesmessage, filename, lineno, colno, stack, timestampenableSessionTracking: true)session_start and session_end events with session metadatasession_start: When SDK initializes, after session timeout, or after resetsession_end: Before session timeout, when SDK is reset, or on page unloadsessionTimeout)session_start: sessionId, previousSessionId (if continuing from another session)session_end: sessionId, duration (in seconds), reason (timeout, reset, unload)// Just initialize with your API key - auto tracking starts immediately!
LoopKit.init('your-api-key');
// The SDK will now automatically track:
// ✅ Page views when users navigate
// ✅ Clicks on buttons, links, etc.
// ✅ JavaScript errors that occur
// ✅ Session start/end events
// ✅ Session management
You can disable specific auto tracking features if needed:
LoopKit.init('your-api-key', {
enableAutoCapture: false, // Disable page view tracking
enableAutoClickTracking: false, // Disable click tracking
enableErrorTracking: false, // Disable error tracking
enableSessionTracking: false, // Disable session tracking
sessionTimeout: 60 * 60, // Custom session timeout (1 hour, in seconds)
});
The SDK is built with TypeScript and exports comprehensive type definitions:
import type {
// Configuration
LoopKitConfig,
LogLevel,
RetryBackoff,
// Events
TrackEvent,
IdentifyEvent,
GroupEvent,
ClickEventProperties,
BatchEventInput,
TrackOptions,
// Interfaces
ILoopKit,
IStorageManager,
ISessionManager,
IQueueManager,
INetworkManager,
// Convenience aliases
Config,
Event,
Options,
} from '@loopkit/javascript';
const config: LoopKitConfig = {
apiKey: 'your-key',
baseURL: 'https://api.example.com',
batchSize: 50,
flushInterval: 30,
debug: true,
logLevel: 'info',
// Auto tracking (all enabled by default)
enableAutoCapture: true, // Page view tracking
enableAutoClickTracking: true, // Click tracking
enableErrorTracking: true, // Error tracking
enableSessionTracking: true, // Auto session tracking
sessionTimeout: 30 * 60, // Session timeout in seconds (30 minutes)
respectDoNotTrack: true,
onBeforeTrack: (event) => {
// Modify event before tracking
return { ...event, timestamp: new Date().toISOString() };
},
onAfterTrack: (event, success) => {
if (!success) {
console.warn('Failed to track event:', event);
}
},
onError: (error) => {
console.error('LoopKit error:', error);
},
};
The SDK sends events to separate, dedicated endpoints:
POST /tracks with payload { tracks: [...] }POST /identifies with payload { identifies: [...] }POST /groups with payload { groups: [...] }Each endpoint receives an array of the respective event type wrapped in a named property. This allows for better API performance and easier backend processing.
LoopKit.init(apiKey, config?)Initialize the SDK with your API key and optional configuration.
LoopKit.init('your-api-key', {
debug: false,
batchSize: 50,
flushInterval: 30,
// Auto tracking features (enabled by default - shown here for reference)
enableAutoCapture: true, // Auto page view tracking
enableAutoClickTracking: true, // Auto click tracking
enableErrorTracking: true, // Auto error tracking
enableSessionTracking: true, // Auto session tracking
sessionTimeout: 30 * 60, // Session timeout in seconds (30 minutes)
respectDoNotTrack: true,
onBeforeTrack: (event) => {
// Modify event before tracking
return event;
},
onAfterTrack: (event, success) => {
// Handle tracking result
console.log(`Event ${event.name} ${success ? 'sent' : 'failed'}`);
},
onError: (error) => {
// Handle errors
console.error('LoopKit error:', error);
},
});
LoopKit.track(eventName, properties?, options?)Track a custom event with optional properties.
LoopKit.track('purchase_completed', {
amount: 99.99,
currency: 'USD',
product_id: 'pro_plan',
});
Note: Timestamps are automatically added to all events. You don't need to manually include timestamp in your properties - the SDK handles this automatically at the event level.
LoopKit.trackBatch(events)Track multiple events in a single batch.
LoopKit.trackBatch([
{ name: 'page_view', properties: { page: '/home' } },
{ name: 'button_clicked', properties: { button: 'cta' } },
]);
LoopKit.identify(userId, properties?)Associate events with a specific user.
LoopKit.identify('user_123', {
email: 'user@example.com',
plan: 'enterprise',
signup_date: '2024-01-15',
});
LoopKit.group(groupId, properties?, groupType?)Associate the user with an organization or group.
LoopKit.group(
'company_abc',
{
name: 'Acme Corp',
plan: 'enterprise',
employee_count: 500,
},
'organization'
);
LoopKit.flush()Manually flush all queued events.
await LoopKit.flush();
LoopKit.getQueueSize()Get the current number of events in the queue.
const queueSize = LoopKit.getQueueSize();
console.log(`${queueSize} events queued`);
Reset the SDK state (useful for logout).
LoopKit.reset();
LoopKit.configure({
// API Settings
baseURL: 'https://api.loopkit.ai/v1',
// Batching
batchSize: 50, // Events per batch
flushInterval: 30, // Seconds between flushes
maxQueueSize: 1000, // Maximum events to queue
// Performance
enableCompression: true, // Gzip requests
requestTimeout: 10000, // Request timeout (ms)
// Debugging
debug: false, // Enable debug logs
logLevel: 'info', // 'error', 'warn', 'info', 'debug'
// Auto-capture (Browser only) - All enabled by default for zero-config setup
enableAutoCapture: true, // Auto-track page views
enableAutoClickTracking: true, // Auto-track click events
enableErrorTracking: true, // Auto-track JS errors
enableSessionTracking: true, // Auto-track session start/end
sessionTimeout: 30 * 60, // Session timeout in seconds (30 minutes)
// Privacy
respectDoNotTrack: true, // Honor DNT header
enableLocalStorage: true, // Use localStorage for persistence
// Retry Logic
maxRetries: 3, // Number of retry attempts
retryBackoff: 'exponential', // 'exponential' or 'linear'
// Callbacks
onBeforeTrack: (event) => {
// Modify event before tracking
return event;
},
onAfterTrack: (event, success) => {
// Handle tracking result
console.log(`Event ${event.name} ${success ? 'sent' : 'failed'}`);
},
onError: (error) => {
// Handle errors
console.error('LoopKit error:', error);
},
});
# Install dependencies
npm install
# Build the SDK
npm run build
# Build and watch for changes
npm run build:watch
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Lint code
npm run lint
# Format code
npm run format
# 1. Increment version in package.json
# 2. Deploy to CDN
yarn deploy:cdn
# 3. Publish to NPM
npm publish --access public
MIT License. See LICENSE for details.
FAQs
JavaScript SDK for LoopKit analytics platform
We found that @loopkit/javascript demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.