Skip to content

CKEditor 5 Integration

WriteTrack includes a first-party CKEditor 5 plugin, compatible with the unified ckeditor5 package v42+ and tested against v47.5.

Install WriteTrack alongside CKEditor 5:

Terminal window
npm i writetrack ckeditor5
import { ClassicEditor, Essentials, Paragraph, Bold, Italic } from 'ckeditor5';
import { WriteTrackPlugin } from 'writetrack/ckeditor';
ClassicEditor.create(document.querySelector('#editor'), {
plugins: [Essentials, Paragraph, Bold, Italic, WriteTrackPlugin],
writetrack: {
license: 'your-license-key',
},
}).then((editor) => {
// Access WriteTrack data when needed
const plugin = editor.plugins.get('WriteTrack');
const data = plugin.tracker.getData();
});

Pass options via the writetrack config key:

ClassicEditor.create(element, {
plugins: [, /* ... */ WriteTrackPlugin],
writetrack: {
license: 'your-license-key',
userId: 'user-123',
contentId: 'document-456',
metadata: { formName: 'signup' },
autoStart: true, // default
},
});
OptionTypeDefaultDescription
licensestringundefinedWriteTrack license key
userIdstringundefinedUser identifier included in metadata
contentIdstringundefinedContent identifier included in metadata
metadataRecord<string, unknown>undefinedAdditional metadata
autoStartbooleantrueStart tracking when editor is ready
wasmUrlstringundefinedURL to WASM binary for analysis
persistbooleanfalseEnable IndexedDB session persistence (requires contentId)

The plugin is retrieved via CKEditor’s plugin system:

const plugin = editor.plugins.get('WriteTrack');
// Get the tracker instance
const tracker = plugin.tracker;
// Get typing data
const data = tracker.getData();
// Check tracking status
const isTracking = plugin.isTracking;

If you prefer not to use the plugin, you can attach WriteTrack directly to CKEditor’s editable element:

import WriteTrack from 'writetrack';
import { ClassicEditor, Essentials, Paragraph } from 'ckeditor5';
ClassicEditor.create(document.querySelector('#editor'), {
plugins: [Essentials, Paragraph],
}).then((editor) => {
// Wait for UI to be ready, then attach
editor.ui.once('ready', () => {
const element = editor.ui.getEditableElement();
const tracker = new WriteTrack({
target: element,
license: 'your-license-key',
});
tracker.start();
});
});

The plugin automatically stops tracking and cleans up when the editor is destroyed:

await editor.destroy(); // WriteTrack is stopped automatically
import type { WriteTrackPluginOptions } from 'writetrack/ckeditor';