> ## Documentation Index
> Fetch the complete documentation index at: https://velt.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Core CRDT Library

> Release Notes of Changes Affecting All CRDT Libraries

### Libraries

* `@veltdev/crdt`
* `@veltdev/crdt-react`

<Update label="4.5.9-beta.3" description="December 10, 2025">
  ### Improvements

  * \[**Core**]: Improved CRDT store initialization by replacing user-based detection with `veltInitState`. Streamlines internal store creation logic.
</Update>

<Update label="4.5.9-beta.1" description="December 9, 2025">
  ### Bug Fixes

  * \[**Core**]: Fixed multi-tab synchronization for same user. When the same user edits content in multiple tabs, all tabs now sync correctly.
</Update>

<Update label="4.5.8" description="November 15, 2025">
  ### Improvements

  * \[**Core**]: Released stable version 4.5.8 of all CRDT packages (except BlockNote packages). This version includes Tiptap v3 support and resolves the initialContent issue in tiptap-crdt-react.
</Update>

<Update label="4.5.8-beta.2" description="November 11, 2025">
  ### New Features

  * \[**Developer Tools**]: Added `window.VeltCrdtStoreMap` global interface to inspect and monitor CRDT stores during development. Access store values directly in the browser console using `VeltCrdtStoreMap.get(id)` or `VeltCrdtStoreMap.getAll()`. Subscribe to store updates and monitor registration events for debugging collaborative data synchronization. [Learn more](/realtime-collaboration/crdt/setup/core#veltcrdtstoremap)

  <Tabs>
    <Tab title="React / Next.js">
      ```jsx theme={null}
      // Get a specific store
      const storeInstance = window.VeltCrdtStoreMap.get('my-store-id');
      if (storeInstance) {
        const currentValue = storeInstance.getValue();
        console.log('Current store value:', currentValue);

        // Subscribe to store changes
        const unsubscribe = storeInstance.subscribe((newValue) => {
          console.log('Store updated:', newValue);
        });
      }

      // Get all registered stores
      const allStores = window.VeltCrdtStoreMap.getAll();
      console.log('All stores:', allStores);

      // Access the stores map directly
      const storesMap = window.VeltCrdtStoreMap.stores;
      console.log('Stores map:', storesMap);

      // Listen for store registration events
      window.addEventListener('veltCrdtStoreRegister', (event) => {
        console.log('Store registered:', event.detail);
      });

      // Listen for store unregistration events
      window.addEventListener('veltCrdtStoreUnregister', (event) => {
        console.log('Store unregistered:', event.detail);
      });
      ```
    </Tab>

    <Tab title="Other Frameworks">
      ```html theme={null}
      <script>
      // Get a specific store
      const storeInstance = window.VeltCrdtStoreMap.get('my-store-id');
      if (storeInstance) {
        const currentValue = storeInstance.getValue();
        console.log('Current store value:', currentValue);

        // Subscribe to store changes
        const unsubscribe = storeInstance.subscribe((newValue) => {
          console.log('Store updated:', newValue);
        });
      }

      // Get all registered stores
      const allStores = window.VeltCrdtStoreMap.getAll();
      console.log('All stores:', allStores);

      // Access the stores map directly
      const storesMap = window.VeltCrdtStoreMap.stores;
      console.log('Stores map:', storesMap);

      // Listen for store registration events
      window.addEventListener('veltCrdtStoreRegister', (event) => {
        console.log('Store registered:', event.detail);
      });

      // Listen for store unregistration events
      window.addEventListener('veltCrdtStoreUnregister', (event) => {
        console.log('Store unregistered:', event.detail);
      });
      </script>
      ```
    </Tab>
  </Tabs>
</Update>

<Update label="4.5.7" description="October 31, 2025">
  ### Bug Fixes

  * \[**Core**]: Fixed `initialContent` not being applied when no server-side data exists. You can now set initial content in CRDT libraries, and it will be used when the document is empty.
</Update>

<Update label="4.5.1-beta.1" description="October 28, 2025">
  ### Bug Fixes

  * \[**Core**]: Fixed CRDT synchronization issue affecting document changes in Velt CRDT SDK.
</Update>

<Update label="4.5.0-beta.9" description="September 2, 2025">
  ### Bug Fixes

  * \[**Core**]: Fixed an issue with where versions were not being saved correctly in some cases.
</Update>

<Update label="4.5.0-beta.8" description="August 28, 2025">
  ### Bug Fixes

  * \[**Core**]: Fixed an issue where last keystroke was not synced in some cases. Also fixed synchronization issues with React Flow nodes and edges.
</Update>

<Update label="4.5.0-beta.6" description="August 8, 2025">
  ### New Features

  * \[**Security**]: Enhanced security for CRDTs with a new `encryptionProvider`. This allows you to provide custom encryption and decryption methods to secure your collaborative data.
  * See [Custom Encryption](/realtime-collaboration/crdt/setup/core#custom-encryption) for setup instructions.
</Update>

<Update label="4.5.0-beta.4" description="July 22, 2025">
  ### New Features

  * \[**Core**]: Introduced versioning support for CRDT stores. You can now save snapshots of your collaborative data, list previously saved versions, and restore the store to a specific version. This feature is currently supported for `text` and `array` data types.
</Update>

<Update label="4.5.0-beta.3" description="July 16, 2025">
  ### New Features

  * \[**Core**]: Introduced our latest CRDT Libraries based on Yjs:
    * `@veltdev/crdt`: Framework-agnostic CRDT stores (array, map, text, xml), versioning, subscriptions, and syncing via the Velt client.
    * `@veltdev/crdt-react`: React Hook wrapper for CRDT integration.
    * `@veltdev/tiptap-crdt`: Purpose built CRDT library for Tiptap Editor to enable multiplayer editing.
</Update>
