---
title: RangeRef API
slug: docs/github-example/rangeref-api
docTags: 
createdAt: 2026-05-05T15:31:38.496Z
---

`RangeRef` objects keep a specific range in a document synced over time as new operations are applied to the editor. It is created using the `Editor.rangeRef` method. You can access their property `current` at any time for the up-to-date `Range` value. When you no longer need to track this location, call `unref()` to free the resources. The `affinity` refers to the direction the `RangeRef` will go when a user inserts content at the edges of the `Range`. `inward` means that the `Range` tends to stay the same size when content is inserted at its edges, and `outward` meaans that the `Range` tends to grow when content is inserted at its edges.

```typescript
interface RangeRef {
  current: Range | null
  affinity: 'forward' | 'backward' | 'outward' | 'inward' | null
  unref(): Range | null
}
```

For example:

```typescript
const selectionRef = Editor.rangeRef(editor, editor.selection, {
  affinity: 'inward',
})
// Allow the user to do stuff which might change the selection
Transforms.unwrapNodes(editor)
Transforms.select(editor, selectionRef.unRef())
```

- [Instance methods](docId\:IBzj-o4MpklAlxgijmSma)
- [Static methods](docId\:IBzj-o4MpklAlxgijmSma)
  - [Transform methods](docId\:IBzj-o4MpklAlxgijmSma)

## Instance methods

### `unRef() => Range`

Call this when you no longer need to sync this range.
It also returns the current value.

## Static methods

### Transform methods

### `RangeRef.transform(ref: RangeRef, op: Operation)`

Transform the range refs current value by an `op`.
The editor calls this as needed, so normally you won't need to.
