Telesense

Zero-dependency behavioural telemetry SDK. One script tag, full event capture, clean JS API.

less than 20 kB zero dependencies UMD + ESM TypeScript ready Touch support MIT
<script src="https://cdn.jsdelivr.net/npm/telesense/dist/tele.umd.min.js"></script>
Events captured
0
Clicks/Taps
0
Scroll depth
0%
Queue size
0
📱 Detecting device... — Touch events are automatically captured.
Live event stream
all
click/tap
touchstart
touchmove
touchend
scroll
mousemove
custom
Interaction heatmap

🖱️ Mouse moves / 👆 Touch drags — dots accumulate in real time.

API playground

Try the API in your browser console — or use the buttons below
// output appears here

Integration examples

Drop-in (script tag)
<!-- 1. Configure (optional) --> <script> window.TELE_CONFIG = { endpoint: '/telemetry', flushInterval: 5000 }; </script> <!-- 2. Load SDK --> <script src="tele.umd.min.js"></script> <!-- 3. tele is globally available --> <script> tele.on('click', ev => { console.log('clicked', ev.x, ev.y); }); </script>
ES module / bundler
import tele from 'tele-js'; tele.config({ endpoint: '/telemetry' }); // Subscribe to events tele.on('*', ev => analytics.push(ev)); // Fire custom events tele.track('signup_complete', { plan: 'pro', userId: 'u_123' }); // Custom transport (e.g. send to your own backend) tele.config({ onFlush: events => myApi.post(events) });
Multiple isolated instances
import tele from 'tele-js'; // Separate sessions per user role const adminTele = tele.create({ sessionId: `admin-${user.id}`, endpoint: '/admin-telemetry', capture: { mousemove: false } }); const guestTele = tele.create({ endpoint: '/guest-telemetry', flushInterval: 10000 });
Selective capture + masking
// Disable what you don't need tele.config({ capture: { mousemove: false, // skip heatmap data touchmove: false, // disable touch move tracking keydown: false, // no keystroke logging } }); // Sensitive fields auto-masked: // <input type="password"> → key: '[masked]' // <input name="card*"> → key: '[masked]' // autocomplete="cc-*" → key: '[masked]' // Stop capture entirely tele.stop(); // Resume tele.start();