# Release 0.23.0 (possibly to be 1.0.0)

**URL:** https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959
**Category:** Announce
**Created:** [September 13, 2017, 3:29pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959 "2017-09-13T15:29:28Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)
#### Post date: [September 13, 2017, 3:29pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/1 "2017-09-13T15:29:28Z")

</div>

It’s been two and a half month since 0.22.0, but finally 0.23.0 is here. It comes with quite a long list of changes, some of them breaking, since I’ve been reviewing all the parts that I wasn’t happy with yet and cleaning them up. I also worked on the docs, where I noticed and removed some methods that seemed superfluous.

Unless something really bad is found, I’m going to release this, maybe with some minor fixes, as 1.0.0 in two weeks (end of September). If you’re using ProseMirror, trying to upgrade and reporting anything that goes wrong would be very helpful.

You’ll find a new [guide](http://prosemirror.net/docs/guide/), more [examples](http://prosemirror.net/examples/), and a somewhat more polished [reference manual](http://prosemirror.net/docs/ref/) on the website. Those probably contain typos still, since I only read them once after I wrote them, so if you read them, issues or pull requests are appreciated.

# Release notes

## [prosemirror-model](http://prosemirror.net/docs/ref/version/0.23.0.html#model) 0.23.0 (2017-09-13)

### Breaking changes

[`ResolvedPos.marks`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ResolvedPos.marks) no longer takes a parameter (you probably want [`marksAcross`](http://prosemirror.net/doc/ref/version/0.23.0.html#model.ResolvedPos.marksAcross) if you were passing true there).

Attribute and mark constraints in [content expressions](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeSpec.content) are no longer supported (this also means the `prosemirror-schema-table` package, which relied on them, is no longer supported). In this release, mark constraints are still (approximately) recognized with a warning, when present.

[`ContentMatch`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ContentMatch) objects lost a number of methods: `matchNode`, `matchToEnd`, `findWrappingFor` (which can be easily emulated using the remaining API), and `allowsMark`, which is now the responsibility of [node types](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeType.allowsMarkType) instead.

[`ContentMatch.validEnd`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ContentMatch.validEnd) is now a property rather than a method.

[`ContentMatch.findWrapping`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ContentMatch.findWrapping) now returns an array of plain node types, with no attribute information (since this is no longer necessary).

The `compute` method for attributes is no longer supported.

Fragments no longer have an `offsetAt` method.

`DOMParser.schemaRules` is no longer public (use [`fromSchema`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.DOMParser%5EfromSchema) and get the resulting parser’s `rules` property instead).

The DOM parser option `topStart` has been replaced by [`topMatch`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ParseOptions.topMatch).

The `DOMSerializer` methods `nodesFromSchema` and `marksFromSchema` are no longer public (construct a serializer with [`fromSchema`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.DOMSerializer%5EfromSchema) and read its `nodes` and `marks` properties instead).

### Bug fixes

Fix issue where whitespace at node boundaries was sometimes dropped during content parsing.

Attribute default values of `undefined` are now allowed.

### New features

[`contentElement`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ParseRule.contentElement) in parse rules may now be a function.

The new method [`ResolvedPos.marksAcross`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ResolvedPos.marksAcross) can be used to find the set of marks that should be preserved after a deletion.

[Content expressions](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeSpec.content) are now a regular language, meaning all the operators can be nested and composed as desired, and a bunch of constraints on what could appear next to what have been lifted.

The starting content match for a node type now lives in [`NodeType.contentMatch`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeType.contentMatch).

Allowed marks are now specified per node, rather than in content expressions, using the [`marks`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeSpec.marks) property on the node spec.

Node types received new methods [`allowsMarkType`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeType.allowsMarkType), [`allowsMarks`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeType.allowsMarks), and [`allowedMarks`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.NodeType.allowedMarks), which tell you about the marks that node supports.

The [`style`](http://prosemirror.net/docs/ref/version/0.23.0.html#model.ParseRule.style) property on parse rules may now have the form `"font-style=italic"` to only match styles that have the value after the equals sign.

## [prosemirror-transform](http://prosemirror.net/docs/ref/version/0.23.0.html#transform) 0.23.0 (2017-09-13)

### Breaking changes

[`Step.toJSON`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.Step.toJSON) no longer has a default implementation.

Steps no longer have an `offset` method. Map them through a map created with [`StepMap.offset`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.StepMap%5Eoffset) instead.

The `clearMarkup` method on [`Transform`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.Transform) is no longer supported (you probably needed [`clearIncompatible`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.Transform.clearIncompatible) anyway).

### Bug fixes

Pasting a list item at the start of a non-empty textblock now wraps the textblock in a list.

Marks on open nodes at the left of a slice are no longer dropped by [`Transform.replace`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.Transform.replace).

### New features

`StepMap` now has a static method [`offset`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.StepMap%5Eoffset), which can be used to create a map that offsets all positions by a given distance.

Transform objects now have a [`clearIncompatible`](http://prosemirror.net/docs/ref/version/0.23.0.html#transform.Transform.clearIncompatible) method that can help make sure a node’s content matches another node type.

## [prosemirror-view](http://prosemirror.net/docs/ref/version/0.23.0.html#view) 0.23.0 (2017-09-13)

### Breaking changes

The `onFocus`, `onBlur`, and `handleContextMenu` props are no longer supported. You can achieve their effect with the [`handleDOMEvents`](http://prosemirror.net/docs/ref/version/0.23.0.html#view.EditorProps.handleDOMEvents) prop.

### Bug fixes

Fixes occasional crash when reading the selection in Firefox.

Putting a table cell on the clipboard now properly wraps it in a table.

The view will no longer scroll into view when receiving a state that isn’t derived from its previous state.

### New features

Transactions caused by a paste now have their “paste” meta property set to true.

Adds a new view prop, [`handleScrollToSelection`](http://prosemirror.net/docs/ref/version/0.23.0.html#view.EditorProps.handleScrollToSelection) to override the behavior of scrolling the selection into view.

The new editor prop [`clipboardTextSerializer`](http://prosemirror.net/docs/ref/version/0.23.0.html#view.EditorProps.clipboardTextSerializer) allows you to override the way a piece of document is converted to clipboard text.

Adds the editor prop [`clipboardTextParser`](http://prosemirror.net/docs/ref/version/0.23.0.html#view.EditorProps.clipboardTextParser), which can be used to define your own parsing strategy for clipboard text content.

[`DecorationSet.find`](http://prosemirror.net/docs/ref/version/0.23.0.html#view.DecorationSet.find) now supports passing a predicate to filter decorations by spec.

## [prosemirror-inputrules](http://prosemirror.net/docs/ref/version/0.23.0.html#inputrules) 0.23.0 (2017-09-13)

### Breaking changes

Schema-specific rule-builders `blockQuoteRule`, `orderedListRule`, `bulletListRule`, `codeBlockRule`, and `headingRule`, along with the `allInputRules` array, are no longer included in this module.

## [prosemirror-commands](http://prosemirror.net/docs/ref/version/0.23.0.html#commands) 0.23.0 (2017-09-13)

### Breaking changes

`joinForward` and `joinBackward` no longer fall back to selecting the next node when no other behavior is possible. There are now separate commands `selectNodeForward` and `selectNodeBackward` that do this, which the base keymap binds as fallback behavior.

[`baseKeymap`](http://prosemirror.net/docs/ref/version/0.23.0.html#commands.baseKeymap) no longer binds keys for `joinUp`, `joinDown`, `lift`, and `selectParentNode`.

### New features

New commands [`selectNodeForward`](http://prosemirror.net/docs/ref/version/0.23.0.html#commands.selectNodeForward) and [`selectNodeBackward`](http://prosemirror.net/docs/ref/version/0.23.0.html#commands.selectNodeBackward) added.

## [prosemirror-schema-list](http://prosemirror.net/docs/ref/version/0.23.0.html#schema-list) 0.23.0 (2017-09-13)

### Bug fixes

The [`splitListItem` command](http://prosemirror.net/docs/ref/version/0.23.0.html#schema-list.splitListItem) now splits the parent list item when executed in a (trailing) empty list item in a nested list.

---

<div class="post-metadata">

### Author: ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)
#### Post date: [September 14, 2017, 8:22am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/2 "2017-09-14T08:22:21Z")

</div>

Hey, it looks like I can no longer import buildKeymap from the example setup. Is that on purpose and is there some other way to do that now?

---

<div class="post-metadata">

### Author: ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)
#### Post date: [September 14, 2017, 2:13pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/3 "2017-09-14T14:13:11Z")

</div>

> [@johanneswilm](#):
>
> it looks like I can no longer import buildKeymap from the example setup

That looks like a mistake I made while changing the module syntax to import/export. I’ve released prosemirror-example-setup 0.23.1 with a fix.

---

<div class="post-metadata">

### Author: ![kiejo](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/kiejo/32/64_2.png) [@kiejo](https://discuss.prosemirror.net/u/kiejo)
#### Post date: [September 19, 2017, 7:18am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/4 "2017-09-19T07:18:32Z")

</div>

Thanks for the update! 🙂 I’m in the process of upgrading to 0.23 and so far there seems to be one breaking change which I’m not sure how to handle yet:

> [@marijn](#):
>
> The compute method for attributes is no longer supported.

What is the reason that this method is no longer supported? I was so far using it to generate unique guids for certain node types, which worked well. As nodes can get created as part of normal editing without custom commands being involved, I’m not sure how I would go about ensuring that newly created nodes always have a unique guid attribute. Any suggestions how I could handle this without the `compute` method?

---

<div class="post-metadata">

### Author: ![rsaccon](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/rsaccon/32/70_2.png) [@rsaccon](https://discuss.prosemirror.net/u/rsaccon)
#### Post date: [September 19, 2017, 8:02am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/5 "2017-09-19T08:02:31Z")

</div>

I am facing exactly the same problem as @kiejo and as first thought I considered to re-architect that part of my app to get rid of those unique computed guids, but have yet to come up with a solution …

---

<div class="post-metadata">

### Author: ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)
#### Post date: [September 19, 2017, 8:24am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/6 "2017-09-19T08:24:41Z")

</div>

> [@kiejo](#):
>
> I was so far using it to generate unique guids for certain node types, which worked well.

I don’t think it did — those guids would end up being duplicated when you duplicated the node, for example by copy-pasting. The only solid way to assign unique ids, as far as I’m aware, is to have an `appendTransaction` handler scan the document for missing or duplicate ids and fix them.

---

<div class="post-metadata">

### Author: ![rsaccon](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/rsaccon/32/70_2.png) [@rsaccon](https://discuss.prosemirror.net/u/rsaccon)
#### Post date: [September 19, 2017, 8:37am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/7 "2017-09-19T08:37:10Z")

</div>

@marijn thanks, yeah, the `appendTransaction` seems to be a much better approach.

---

<div class="post-metadata">

### Author: ![kiejo](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/kiejo/32/64_2.png) [@kiejo](https://discuss.prosemirror.net/u/kiejo)
#### Post date: [September 19, 2017, 8:41am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/8 "2017-09-19T08:41:10Z")

</div>

> [@marijn](#):
>
> I don’t think it did — those guids would end up being duplicated when you duplicated the node, for example by copy-pasting.

My solution to this was to write a `toDOM` and `parseDOM` method which would not serialize or deserialize the guid attribute, which made it use the computed value instead. I tested this in Chrome and the nodes get unique computed values when I copy and paste.  
Are there any other cases besides copy and paste that would actually need to be handled? If this handles all cases, I’m not sure I would prefer the approach of using `appendTransaction` to handle this.

---

<div class="post-metadata">

### Author: ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)
#### Post date: [September 19, 2017, 9:14am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/9 "2017-09-19T09:14:27Z")

</div>

> [@kiejo](#):
>
> Are there any other cases besides copy and paste that would actually need to be handled?

You are likely to see some weird effects in corner cases in, for example, the replace-fitting algorithm, where it might generate nodes and then get confused when they don’t have the expected identical markup. In general, node creation taking new information out of a side channel (the random number generator) goes against the grain of this system (which tries to be as referentially transparent as possible).

---

<div class="post-metadata">

### Author: ![kiejo](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/kiejo/32/64_2.png) [@kiejo](https://discuss.prosemirror.net/u/kiejo)
#### Post date: [September 19, 2017, 9:25am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/10 "2017-09-19T09:25:00Z")

</div>

That makes sense, thanks for clearing this up! In that case I’ll implement it using the suggested `appendTransaction` approach.

---

<div class="post-metadata">

### Author: ![kapouer](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/kapouer/32/227_2.png) [@kapouer](https://discuss.prosemirror.net/u/kapouer)
#### Post date: [September 19, 2017, 5:40pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/11 "2017-09-19T17:40:25Z")

</div>

@rsaccon i’m very interested in a typical implementation of this. I tried the parseDOM/toDOM, also i tried several things with node views, and indeed, there’s always some case that screw the whole thing.

---

<div class="post-metadata">

### Author: ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)
#### Post date: [September 21, 2017, 7:12pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/13 "2017-09-21T19:12:00Z")

</div>

I cannot figure how the marks attribute of the node is supposed to work with v. 0.23. Say I have two mark types (`comment` and `anchor`) that I want to allow on the inline content of the text block node called `title`. In the definition of each of the marks I added `group: "annotation"`.

So as part of the definition of title I add either `marks: "annotation"` or `marks: "comment anchor"` but in both cases it will refuse to put comments or anchor marks on the content of the title node. Only if I take the `marks` line away entirely, it will allow me to add the marks. But then there are no restrictions at all for titles, and that’s not what I wanted. I looked through the repos and documentation, but I cannot find examples for restricting marks.

The entire definition of title looks like this:

```auto
let title = {
    content: "text*",
    marks: "comment anchor",
    group: "part",
    defining: true,
    parseDOM: [{
        tag: "div.article-title"
    }],
    toDOM(node) {
        return ["div", {
            class: 'article-part article-title'
        }, 0]
    }
}
```

---

<div class="post-metadata">

### Author: ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)
#### Post date: [September 21, 2017, 9:13pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/14 "2017-09-21T21:13:23Z")

</div>

> [@johanneswilm](#):
>
> I cannot figure how the marks attribute of the node is supposed to work with v. 0.23.

Your code was right, but there was a bug in the library breaking this. I’ve released prosemirror-model 0.23.1 with a fix.

---

<div class="post-metadata">

### Author: ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)
#### Post date: [September 21, 2017, 9:15pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/15 "2017-09-21T21:15:17Z")

</div>

Great! thanks so much!

---

<div class="post-metadata">

### Author: ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)
#### Post date: [September 25, 2017, 8:28am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/16 "2017-09-25T08:28:31Z")

</div>

We’re almost at the end of the month. One more breaking change was proposed, which I think was a good idea, and some small fixes were made, so I’ve just released 0.24.0 as a second candidate for 1.0.

# Release Notes

## [prosemirror-transform](http://prosemirror.net/docs/ref/version/0.24.0.html#transform) 0.24.0 (2017-09-25)

### Breaking changes

The `setNodeType` method on transforms is now more descriptively called [`setNodeMarkup`](http://prosemirror.net/docs/ref/version/0.24.0.html#transform.Transform.setNodeMarkup). The old name will continue to work with a warning until the next release.

## [prosemirror-view](http://prosemirror.net/docs/ref/version/0.24.0.html#view) 0.24.0 (2017-09-25)

### New features

The [`clipboardTextParser`](http://prosemirror.net/docs/ref/version/0.24.0.html#view.EditorProps.clipboardTextParser) prop is now passed a context position.

## [prosemirror-history](http://prosemirror.net/docs/ref/version/0.24.0.html#history) 0.24.0 (2017-09-25)

### New features

It is no longer necessary to manually enable the `preserveItems` option to the history plugin when using collaborative editing. (This behavior is now automatically enabled when necessary.)

## [prosemirror-model](http://prosemirror.net/docs/ref/version/0.23.0.html#model) 0.23.1 (2017-09-21)

### Bug fixes

`NodeType.allowsMarks` and `allowedMarks` now actually work for nodes that allow only specific marks.

## [prosemirror-gapcursor](http://prosemirror.net/docs/ref/version/0.23.0.html#gapcursor) 0.23.1 (2017-09-19)

### Bug fixes

Moving out of a table with the arrow keys now creates a gap cursor when appropriate.

---

<div class="post-metadata">

### Author: ![kiejo](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/kiejo/32/64_2.png) [@kiejo](https://discuss.prosemirror.net/u/kiejo)
#### Post date: [September 26, 2017, 10:06am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/17 "2017-09-26T10:06:14Z")

</div>

@kapouer, @rsaccon I just implemented a very rudimentary mechanism to handle unique IDs using `appendTransaction` and thought I’d share it here. This mechanism assumes that the attribute with the unique ID is set to `null` by default.  
This can probably be optimized and maybe there’s a better way to implement this, but it’s what I came up with for now and hope that it’s helpful to others.

```javascript
import {Plugin} from 'prosemirror-state'

// :: (?Object) → Plugin
//
// config::
//
// key:: string
// The name of the attributes which store unique ids.
//
// generateId:: (Node) -> string
// The function which should be used to generate new ids.
export function uniqueIds(config) {
  return new Plugin({
    state: {
      init() { return null },
      apply() { return null },
    },

    appendTransaction(transactions, oldState, newState) {
      const ids = {}
      const tr = newState.tr
      let modified = false
      newState.doc.descendants((node, pos) => {
        const {[config.key]: id, ...rest} = node.attrs
        if (typeof id != 'undefined') {
          if (id == null || ids[id]) {
            // Id is not set or already taken => generate and set a new id
            const newId = config.generateId(node)
            tr.setNodeMarkup(pos, null, {[config.key]: newId, ...rest})
            ids[newId] = true
            modified = true
          }
          else
            ids[id] = true
        }
      })

      if (modified)
        return tr
    },
  })
}

```

An example of using the `Plugin` would look like this:

```javascript
EditorState.create({
  schema,
  plugins: [
    uniqueIds({
      key: 'guid',
      generateId(node) { return uuidV4() }
    })
  ]
})

```

---

<div class="post-metadata">

### Author: ![bradleyayers](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/bradleyayers/32/350_2.png) [@bradleyayers](https://discuss.prosemirror.net/u/bradleyayers)
#### Post date: [September 26, 2017, 11:01pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/18 "2017-09-26T23:01:39Z")

</div>

Interesting plugin! What’s the use-case for something like this?

---

<div class="post-metadata">

### Author: ![rsaccon](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/rsaccon/32/70_2.png) [@rsaccon](https://discuss.prosemirror.net/u/rsaccon)
#### Post date: [September 26, 2017, 11:27pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/19 "2017-09-26T23:27:29Z")

</div>

@kiejo, looks great, thanks for creating this.@bradleyayers, when I needed something like this, I was experimenting with components (well, just prosemirror custom nodes) for scroll navigation, and to provide the dom element of the the scroll targets I dom-queried for that unique id. It is just an implementation detail, there are probably other ways to achieve the same.

---

<div class="post-metadata">

### Author: ![rsaccon](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/rsaccon/32/70_2.png) [@rsaccon](https://discuss.prosemirror.net/u/rsaccon)
#### Post date: [September 26, 2017, 11:31pm UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/20 "2017-09-26T23:31:45Z")

</div>

@marijn, I stumbled upon [https://github.com/ProseMirror/prosemirror-changeset](https://github.com/ProseMirror/prosemirror-changeset). Is this used anywhere on the site or the examples ? Couldn’t find any …

---

<div class="post-metadata">

### Author: ![kiejo](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/kiejo/32/64_2.png) [@kiejo](https://discuss.prosemirror.net/u/kiejo)
#### Post date: [September 27, 2017, 6:09am UTC](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959/21 "2017-09-27T06:09:31Z")

</div>

> [@bradleyayers](#):
>
> Interesting plugin! What’s the use-case for something like this?

These are two example use cases where we use unique document node IDs:

- We generate meta data from the document content including the number of open and closed tasks. To efficiently keep this meta data up-to-date and in sync with all clients, we need to be able to identify the task nodes.
- We allow our users to right click on a table inside a document to export it as CSV. Here we use a unique ID to tell the server which table we would like to export as there might be many tables inside the same document.

But there are a few more use cases, that I have in mind, which we’re planning to implement and which will make use of unique node IDs.

[Next page](https://discuss.prosemirror.net/t/release-0-23-0-possibly-to-be-1-0-0/959.md?page=2)
