Changelog
v0.14.0 Current
Section titled “v0.14.0 ”Maintenance release with minor improvements to types, scorecards, and detection.
- Typed
analyzeEvents()signature that accepts wrapped{ data, analysis }input directly. - New
{ errors: 'throw' }mode onanalyzeEvents()with four typed exception classes (LicenseError,InputValidationError,WasmLoadError,AnalysisError). createSessionReport()accepts wrapped input for round-tripping server-analyzed reports back into<wt-scorecard>.- Typed
on()/off()event handlers via a new exportedWriteTrackEventsmap. <wt-*>custom elements now type correctly indocument.querySelector().analyzeEvents()andcreateSessionReport()optionlicenseKeyrenamed tolicenseto match the client constructor.
Scorecards
Section titled “Scorecards”<wt-scorecard>empty-state placeholder +wt-scorecard-errorevent whensetData()receives no analysis. Customisable via the newempty-state-textattribute.loadPlot()warns once when@observablehq/plotis missing.
Detection
Section titled “Detection”- Accuracy improvements across multiple indicators.
physicalPlausibility.metrics.uncoveredCaseCountrenamed toshiftlessUppercaseCount.- WT-400 indicator output may now emit
params.shiftlessUppercasePctin place ofparams.pcton one of its branches.
v0.13.0
Section titled “v0.13.0”Dictation detection and session metadata.
Dictation New
Section titled “Dictation ”Dictated input is now tracked as a distinct content origin, alongside typed, pasted, and autocompleted content. Works on desktop and iOS.
- Reported via
charactersByOrigin.dictatedand as'dictation'in the content origin union. - Per-event rework ratio distinguishes raw input from content revised afterwards.
- Appears in the session timeline and the
<wt-origin-bar>chart. - Heavy-dictation sessions produce full analysis.
Session Metadata New
Section titled “Session Metadata ”New captureContext option on WriteTrackOptions and the editor binding shared options. Whatever string you pass through — e.g. 'checkout', 'signup', 'support-form' — surfaces as getData().metadata.captureContext for downstream routing and analytics.
Bug Fixes
Section titled “Bug Fixes”- Mobile:
keydownevents now report the correct character instead ofUnidentified. - Scorecard detail panel text refreshes when new analysis data is set.
- Analysis without a valid license now returns
licensed: falseandsufficientData: false, rather than looking like a valid empty session.
v0.12.2
Section titled “v0.12.2”Bug Fixes
Section titled “Bug Fixes”- Fixed paste events from rich-text editors being misclassified as autocomplete.
- Fixed internal copy-paste not being recognised when editors transform clipboard content.
v0.12.1
Section titled “v0.12.1”Bug Fixes
Section titled “Bug Fixes”- Fixed standalone chart components not rendering outside of
<wt-scorecard>.
v0.12.0
Section titled “v0.12.0”Refreshed detection indicators and a smarter active-time model.
Detection Refresh New
Section titled “Detection Refresh ”- New indicators across timing authenticity, physical plausibility, and temporal/revision categories.
- Writing-process phase detection (added in v0.8.0) graduated to a flagged category.
- A handful of brittle older indicators were retired in the same pass.
- Sessions analyzed under v0.12.0 may flag differently than under v0.11.0. See the new Analysis Reference for the metrics behind each indicator.
Thinking Pauses & Active Time New
Section titled “Thinking Pauses & Active Time ”New 3-tier gap model (typing pause, thinking pause, idle break) distinguishes deliberate cognitive pauses from idle breaks, so long sessions are no longer penalised for time the writer spends thinking or away from the keyboard.
New fields on SessionContinuityAnalysis.activeTime: activeDurationMs, idleDurationMs, activeWindows, thinkingPauseCount, idleBreakCount. New types: ActiveTimeResult, ActiveTimeWindow.
WriteTrackController New
Section titled “WriteTrackController ”A framework-agnostic state controller exported from writetrack directly. The React and Vue hooks are built on it, and it’s now available for custom integrations that need reactive isReady, analysis, and error state. New types: ControllerState, ControllerOptions.
Optional Observable Plot
Section titled “Optional Observable Plot”@observablehq/plot is now a true optional peer dependency so there’s no need to import it if your application doesn’t use charts.
Standalone Analysis
Section titled “Standalone Analysis”analyzeEvents()now throws a clear error when called without a license orwasmUrl, instead of failing silently downstream.- New
aggregateData()helper for combining multiple sessions before running analysis.
Bug Fixes
Section titled “Bug Fixes”- Fixed chart rendering during active sessions.
- Consolidated duration formatting across charts and badges; rewritten chart subtitles and an expanded glossary.
v0.11.0
Section titled “v0.11.0”Event subscriptions, hook improvements, new visualization charts, analysis helpers, and a TinyMCE rewrite.
Event-Driven API Breaking
Section titled “Event-Driven API ”on() now returns an unsubscribe function instead of this. Replace chained .on() calls with individual assignments if you need to unsubscribe.
New methods: off(event, handler), removeAllListeners(event?).
New events: ready, stop, change, analysis (opt-in with throttle), wasm:ready, wasm:error.
React & Vue Hooks
Section titled “React & Vue Hooks”Hooks now expose isReady, analysis, and error state directly – no more manual on() wiring for the most common use cases.
TipTap
Section titled “TipTap”isReady added to extension storage. New writetrack:ready editor event for sibling components that need to react to tracker readiness.
TinyMCE
Section titled “TinyMCE”Rewritten as a native PluginManager.add() plugin targeting TinyMCE 6+. Adds iframe mode support. See the TinyMCE integration docs for the updated setup.
Analysis Helpers New
Section titled “Analysis Helpers ”New writetrack/analysis subpath with convenience accessors for common analysis fields:
getSessionDurationMs(analysis)getTypingSpeed(analysis)getContentOriginBreakdown(analysis)
Visualization
Section titled “Visualization”<wt-document-growth>– updated to show process, product, and cursor position as separate series with opt-inprocess,cursor, andpausesattributes- Pause duration shown on a secondary axis; configurable threshold via
extractProcessData(data, minPauseMs) <wt-composition-timeline mode="focus">– new mode highlighting periods where the writer tabbed away from the document- Edit beeswarm chart flipped to top-down orientation for natural reading order
- Scorecard polish – download button, inline header actions, clickable QR, improved empty states
stopAndWait()method for safe teardown in persist mode
onTickandonReadycallbacks now available on all editor bindings (Quill, ProseMirror, CKEditor, Lexical)SessionAnalysistypes tightened – required fields no longer typed as optional
v0.10.1
Section titled “v0.10.1”Scorecard empty-state polish and writetracker UX improvements.
Bug Fixes
Section titled “Bug Fixes”- 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
v0.10.0
Section titled “v0.10.0”Redesigned scorecard with new chart components, share/download actions, and improved empty-state handling.
Redesigned Scorecard New
Section titled “Redesigned Scorecard ”- 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
Improvements
Section titled “Improvements”- More responsive chart rendering
- Improved license validation error messages
- Reduced false positives for paste-heavy sessions
Bug Fixes
Section titled “Bug Fixes”- Fixed paste source labeling in scorecard
- Fixed indicator formatting and priority ordering
v0.9.1
Section titled “v0.9.1”Detection improvements and bug fixes.
Detection
Section titled “Detection”- 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
Bug Fixes
Section titled “Bug Fixes”- Fixed paste event capture in nested contenteditable elements
- Fixed stale timestamps on persisted session restore
- Fixed
analysis.versionreporting hardcoded1.0.0instead of SDK version - Fixed persistence race condition on async session restore
- Fixed chart rendering artifacts on speed timeline
v0.9.0
Section titled “v0.9.0”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.
Active Session Duration New
Section titled “Active Session Duration ”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.
Paste-Edit Analysis
Section titled “Paste-Edit Analysis”- Per-paste
reworkRatiometric tracking edits within paste regions over a 60-second window - 6 aggregate paste metrics in
PasteEditSummary - New WT-105/106/107 paste rework indicators
v0.8.0
Section titled “v0.8.0”Writing Process Stage Detection New
Section titled “Writing Process Stage Detection ”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.
Editor Integrations New
Section titled “Editor Integrations ”Three new 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
Analysis & Bug Fixes
Section titled “Analysis & Bug Fixes”- 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
v0.7.0
Section titled “v0.7.0”This release adds a visualization module with 9 chart components, a redesigned session scorecard, and improvements across the analysis pipeline.
Visualization Module New
Section titled “Visualization Module ”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
Analysis
Section titled “Analysis”- Improved analysis module with new indicators and metrics for more accurate detection of automated and authentic writing patterns
Bug Fixes
Section titled “Bug Fixes”- Fixed paste content capture in ProseMirror/TipTap editors
- Fixed contenteditable cursor position tracking
- Fixed WASM loading reliability across deployment environments
v0.6.1
Section titled “v0.6.1”- Improved bundler compatibility — WASM analysis module works reliably across webpack 5, Rollup, Next.js, and Vite
- Bug fixes — Improvements to the customer portal
v0.6.0
Section titled “v0.6.0”This release improves analysis accuracy and adds convenience methods for managing persisted sessions.
Analysis Improvements
Section titled “Analysis Improvements”- 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)
Persistence Management New
Section titled “Persistence Management ”listPersistedSessions()— List all stored sessions without creating a tracker instancedeletePersistedSession()— Delete sessions bycontentId, useful for cleanup when users delete content
Editor Integrations
Section titled “Editor Integrations”- All integrations (TipTap, CKEditor, ProseMirror, Quill, React hook, Vue hook) now support
persistandwasmUrloption passthrough
Verification API New
Section titled “Verification API ”New writetrack/verify subpath export for standalone session verification without a DOM element.
v0.5.0
Section titled “v0.5.0”The latest version of WriteTrack introduces typing pattern analysis, session persistence, and expanded input capture.
Analysis Module New
Section titled “Analysis Module ”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
Session Persistence New
Section titled “Session Persistence ”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.
Capture Improvements
Section titled “Capture Improvements”- IME composition support — CJK 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
inputTypefor finer-grained classification
Bug Fixes
Section titled “Bug Fixes”- Fixed memory leak where event listeners weren’t removed on
stop() - Improved accuracy of behavioral analysis
- Various fixes to contenteditable support and React hook
v0.4.3
Section titled “v0.4.3”Editor Integrations New
Section titled “Editor Integrations ”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)
Documentation
Section titled “Documentation”- Consolidated API reference into a single page
- Improved styling and clarity across all docs pages
v0.3.1
Section titled “v0.3.1”- Documentation now accurately reflects the public npm package API
v0.3.0
Section titled “v0.3.0”This release introduces the output sink system for routing session data to external services, alongside broader browser support and improved event capture.
Output Sinks New
Section titled “Output Sinks ”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.
Event Capture New
Section titled “Event Capture ”isTrustedflag — Keystroke events now include the browser’sisTrustedproperty 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, andmetadataconstructor options that flow through togetData()output and all sinks
Browser Support
Section titled “Browser Support”- Broader browser support for license validation — now works in Chrome 37+, Firefox 34+, Safari 11+, Edge 12+
v0.1.0
Section titled “v0.1.0”Initial release of the SDK and writetrack.dev.
SDK New
Section titled “SDK ”- 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
Documentation New
Section titled “Documentation ”- 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
Customer Portal New
Section titled “Customer Portal ”- 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