Skip to content

Changelog

Scorecard empty-state polish and writetracker UX improvements.

  • Scorecard cells and detail panel no longer show “flagged” status when session has insufficient data
  • Empty compact charts no longer display placeholder text
  • Fixed scorecard flag section appearing on empty sessions

Redesigned scorecard with new chart components, share/download actions, and improved empty-state handling.

  • New 6-cell grid with compact chart previews for each analysis category
  • Content origin bar showing typed vs pasted proportion at a glance
  • Share and download action buttons with PNG export
  • <wt-edit-beeswarm> — per-keystroke edit visualization
  • <wt-badge> — headline metric badges for key session stats
  • More responsive chart rendering
  • Improved license validation error messages
  • Reduced false positives for paste-heavy sessions
  • Fixed paste source labeling in scorecard
  • Fixed indicator formatting and priority ordering

Detection improvements and bug fixes.

  • Enhanced modifier key tracking for automation detection
  • Three new indicators targeting uniform timing, headless execution, and synthetic input patterns
  • Reduced false positives for autocomplete and paste-heavy sessions
  • Richer burst analysis diagnostics
  • Fixed paste event capture in nested contenteditable elements
  • Fixed stale timestamps on persisted session restore
  • Fixed analysis.version reporting hardcoded 1.0.0 instead of SDK version
  • Fixed persistence race condition on async session restore
  • Fixed chart rendering artifacts on speed timeline

Better editor integration, active session tracking, and improved paste-edit heuristics.

Editor Input Source Classification New

Section titled “Editor Input Source Classification ”

All editor integrations now classify the source of each input event — keyboard, paste, drop, cut, autocomplete, spellcheck, composition, undo, redo, or api. Uses editor transaction metadata with W3C beforeinput fallback for plain elements. New inputSourceProvider option for custom integrations.

Track how long a user has been actively writing without rolling your own timer. on('tick', handler) fires every second while the session is active and the tab is visible, providing activeTime and totalTime in milliseconds. getActiveTime() returns active time on demand.

  • Per-paste reworkRatio metric tracking edits within paste regions over a 60-second window
  • 6 aggregate paste metrics in PasteEditSummary
  • New WT-105/106/107 paste rework indicators

New analysis category that classifies temporal windows as planning, drafting, or revision using existing keystroke metrics. Outputs phase transition matrix for flow visualization, aggregate time-in-phase percentages, and per-segment phase labels with confidence scores.

Three new first-party editor integrations:

  • Lexical (writetrack/lexical) — cursor tracking via $getSelection()
  • Slate (writetrack/slate) — element-to-path cursor tracking
  • TinyMCE (writetrack/tinymce) — inline mode with init/destroy lifecycle
  • Paste-edit correlation metrics — track edits within paste regions
  • Fixed false Physical Plausibility flags caused by dwell time encoding bugs
  • Improved burst ratio and timing threshold accuracy
  • Zero-latency events now flagged as physically implausible
  • Documentation hardening and stale reference cleanup

This release adds a visualization module with 9 chart components, a redesigned session scorecard, and improvements across the analysis pipeline.

New writetrack/viz subpath export with chart components rendered as web components powered by Observable Plot.

  • Analysis charts — SpeedTimeline, CompositionTimeline, RhythmHeatmap, PauseDistribution
  • Event-detail charts — Sparkline, DocumentGrowth, DocumentRibbon, EditWaterfall, CorrectionsBubble
  • Session scorecard — Experimental <wt-scorecard> implementation with indicator grid, detail panels, and integrity verification
  • Theming — CSS custom properties with warm editorial palette (light/dark), overridable fonts via --wt-scorecard-font-*
  • Extract functions — Standalone data-extraction functions for each chart, usable without web components
  • Hover tooltips — Interactive tooltips on all chart components
  • LTTB downsampling — Time-series charts automatically downsample large datasets via WASM for responsive rendering
  • Improved analysis module with new indicators and metrics for more accurate detection of automated and authentic writing patterns
  • Fixed paste content capture in ProseMirror/TipTap editors
  • Fixed contenteditable cursor position tracking
  • Fixed WASM loading reliability across deployment environments

  • Improved bundler compatibility — WASM analysis module works reliably across webpack 5, Rollup, Next.js, and Vite
  • Bug fixes — Improvements to the customer portal

This release improves analysis accuracy and adds convenience methods for managing persisted sessions.

  • New analysis features — Enhanced timing, behavioral, and revision pattern detection for more accurate indicators
  • Consistent indicator codes — Indicators now use a category-prefixed scheme (WT-1xx through WT-6xx)
  • All integrations (TipTap, CKEditor, ProseMirror, Quill, React hook, Vue hook) now support persist and wasmUrl option passthrough

New writetrack/verify subpath export for standalone session verification without a DOM element.


The latest version of WriteTrack introduces typing pattern analysis, session persistence, and expanded input capture.

WriteTrack now includes an integrated analysis engine. Each indicator returns a standardized diagnostic code and human-readable explanation. Results include a signed integrity proof.

  • Content origin — typed vs. pasted vs. autocompleted ratio
  • Timing authenticity — keystroke rhythm and variability
  • Session continuity — tab-away events and behavioral shifts
  • Physical plausibility — input consistency checks
  • Revision behavior — correction rate and editing patterns
  • Temporal patterns — speed variation, fatigue, and burst detection

Sessions can now survive page reloads. Pass persist: true with a contentId to automatically save session state to IndexedDB and restore it on the next page load. New clearPersistedData() method for cleanup.

  • IME composition supportCJK input methods, dead keys, and accent input now tracked correctly
  • Tab blur detection — keystrokes arriving while the tab is backgrounded are identified
  • Paste source classification — pastes categorized by source
  • Programmatic insertion — now captures the browser’s inputType for finer-grained classification
  • Fixed memory leak where event listeners weren’t removed on stop()
  • Improved accuracy of behavioral analysis
  • Various fixes to contenteditable support and React hook

We’ve added support for the most popular rich-text editors via dedicated imports. Each editor library is an optional peer dependency, only included in your bundle if you use it.

  • TipTap – headless and extensible (writetrack/tiptap)
  • CKEditor 5 – feature-rich, used by enterprise teams (writetrack/ckeditor)
  • ProseMirror – low-level toolkit for custom editors (writetrack/prosemirror)
  • Quill – lightweight and easy to get started (writetrack/quill)
  • Consolidated API reference into a single page
  • Improved styling and clarity across all docs pages
  • Documentation now accurately reflects the public npm package API

This release introduces the output sink system for routing session data to external services, alongside broader browser support and improved event capture.

New .pipe() API for routing session data to one or more destinations. Ships with built-in sinks for Webhook, Datadog, Segment, and OpenTelemetry, plus support for custom sinks.

  • isTrusted flag — Keystroke events now include the browser’s isTrusted property to distinguish real user input from synthetic events
  • Programmatic insertion detection — Browser autofill, predictive text, and other non-keystroke insertions are captured as dedicated events
  • Context fields — New userId, contentId, and metadata constructor options that flow through to getData() output and all sinks
  • Broader browser support for license validation — now works in Chrome 37+, Firefox 34+, Safari 11+, Edge 12+

Initial release of the SDK and writetrack.dev.

  • Keystroke Capture — Keydown/keyup events with high-resolution timestamps, dwell time, flight time, cursor position and selection tracking
  • Paste & Edit Tracking — Clipboard event capture with before/after text states, selection events via mouse/keyboard/programmatic methods, edit sequence pattern detection, revision depth tracking
  • Privacy-First Architecture — Client-side only processing, no data transmitted externally, offline license validation, no PII collection or device fingerprinting
  • Framework Support — React hook (useWriteTrack), Vue 3 composable, Next.js (App Router and Pages Router), vanilla JS
  • Multi-Format Output — ESM, CommonJS, and browser bundle. Zero dependencies
  • Getting Started — Introduction, quickstart guide, configuration reference
  • Framework Guides — React, Vue, and Next.js integration walkthroughs
  • Core API — WriteTrack class reference, feature extraction guide, full TypeScript type definitions
  • Advanced — Data schema specification, privacy and security guidance
  • Reference — API quick-reference tables, testing strategies, troubleshooting guide
  • Authentication — Email/password login and signup with email verification
  • License Dashboard — License tier display, expiry tracking
  • Domain Management — Add/remove licensed domains with tier-based limits