Skip to content

ProseMirror Integration

WriteTrack includes a first-party ProseMirror plugin, compatible with prosemirror-state v1.0+ and tested against v1.4.

Install WriteTrack alongside your ProseMirror packages:

Terminal window
npm i writetrack prosemirror-state prosemirror-view prosemirror-model
import { EditorState } from 'prosemirror-state';
import { EditorView } from 'prosemirror-view';
import { schema } from 'prosemirror-schema-basic';
import { WriteTrackPlugin, WriteTrackPluginKey } from 'writetrack/prosemirror';
const state = EditorState.create({
schema,
plugins: [
WriteTrackPlugin({
license: 'your-license-key',
}),
],
});
const view = new EditorView(document.querySelector('#editor'), { state });
// Access WriteTrack data when needed
const pluginState = WriteTrackPluginKey.getState(view.state);
const data = pluginState.tracker.getData();

Pass options to the WriteTrackPlugin() function:

WriteTrackPlugin({
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 view is created
wasmUrlstringundefinedURL to WASM binary for analysis
persistbooleanfalseEnable IndexedDB session persistence (requires contentId)

Use the WriteTrackPluginKey to read plugin state from the editor:

import { WriteTrackPluginKey } from 'writetrack/prosemirror';
const pluginState = WriteTrackPluginKey.getState(view.state);
// Get the tracker instance
const tracker = pluginState.tracker;
// Get typing data
const data = tracker.getData();
// Check tracking status
const isTracking = pluginState.isTracking;

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

import WriteTrack from 'writetrack';
import { EditorState } from 'prosemirror-state';
import { EditorView } from 'prosemirror-view';
import { schema } from 'prosemirror-schema-basic';
const state = EditorState.create({ schema });
const view = new EditorView(document.querySelector('#editor'), { state });
const tracker = new WriteTrack({
target: view.dom,
license: 'your-license-key',
});
tracker.start();

The plugin automatically stops tracking when the view is destroyed:

view.destroy(); // WriteTrack is stopped automatically
import type {
WriteTrackPluginOptions,
WriteTrackPluginState,
} from 'writetrack/prosemirror';