diff --git a/docs/src/docPages/api/commands.md b/docs/src/docPages/api/commands.md
index fcbb5fab..a8103d8b 100644
--- a/docs/src/docPages/api/commands.md
+++ b/docs/src/docPages/api/commands.md
@@ -166,6 +166,7 @@ Have a look at all of the core commands listed below. They should give you a goo
| ----------------------- | --------------------------------------------------------- | ------------------------------------ |
| .clearNodes() | Normalize nodes to a simple paragraph. | [More](/api/commands/clear-nodes) |
| .createParagraphNear() | Create a paragraph nearby. | [More](/api/commands/create-paragraph-near) |
+| .deleteNode() | Delete a node. | [More](/api/commands/delete-node) |
| .extendMarkRange() | Extends the text selection to the current mark. | [More](/api/commands/extend-mark-range) |
| .exitCode() | Exit from a code block. | [More](/api/commands/exit-code) |
| .joinBackward() | Join two nodes backward. | [More](/api/commands/join-backward) |
diff --git a/docs/src/docPages/api/commands/delete-node.md b/docs/src/docPages/api/commands/delete-node.md
new file mode 100644
index 00000000..42c7357b
--- /dev/null
+++ b/docs/src/docPages/api/commands/delete-node.md
@@ -0,0 +1,3 @@
+# deleteNode
+
+
diff --git a/docs/src/links.yaml b/docs/src/links.yaml
index 9bcb0e7b..8d507417 100644
--- a/docs/src/links.yaml
+++ b/docs/src/links.yaml
@@ -140,6 +140,9 @@
- title: createParagraphNear
link: /api/commands/create-paragraph-near
type: draft
+ - title: deleteNode
+ link: /api/commands/delete-node
+ type: draft
- title: deleteRange
link: /api/commands/delete-range
type: draft
diff --git a/packages/core/src/commands/deleteNode.ts b/packages/core/src/commands/deleteNode.ts
new file mode 100644
index 00000000..447134a7
--- /dev/null
+++ b/packages/core/src/commands/deleteNode.ts
@@ -0,0 +1,36 @@
+import { NodeType } from 'prosemirror-model'
+import getNodeType from '../helpers/getNodeType'
+import { RawCommands } from '../types'
+
+declare module '@tiptap/core' {
+ interface Commands {
+ deleteNode: {
+ /**
+ * Delete a node.
+ */
+ deleteNode: (typeOrName: string | NodeType) => ReturnType,
+ }
+ }
+}
+
+export const deleteNode: RawCommands['deleteNode'] = typeOrName => ({ tr, state, dispatch }) => {
+ const type = getNodeType(typeOrName, state.schema)
+ const $pos = tr.selection.$anchor
+
+ for (let depth = $pos.depth; depth > 0; depth -= 1) {
+ const node = $pos.node(depth)
+
+ if (node.type === type) {
+ if (dispatch) {
+ const from = $pos.before(depth)
+ const to = $pos.after(depth)
+
+ tr.delete(from, to).scrollIntoView()
+ }
+
+ return true
+ }
+ }
+
+ return false
+}
diff --git a/packages/core/src/extensions/commands.ts b/packages/core/src/extensions/commands.ts
index 4c06b154..889dc44b 100644
--- a/packages/core/src/extensions/commands.ts
+++ b/packages/core/src/extensions/commands.ts
@@ -4,6 +4,7 @@ import * as clearContent from '../commands/clearContent'
import * as clearNodes from '../commands/clearNodes'
import * as command from '../commands/command'
import * as createParagraphNear from '../commands/createParagraphNear'
+import * as deleteNode from '../commands/deleteNode'
import * as deleteRange from '../commands/deleteRange'
import * as deleteSelection from '../commands/deleteSelection'
import * as enter from '../commands/enter'
@@ -54,6 +55,7 @@ export { clearContent }
export { clearNodes }
export { command }
export { createParagraphNear }
+export { deleteNode }
export { deleteRange }
export { deleteSelection }
export { enter }
@@ -109,6 +111,7 @@ export const Commands = Extension.create({
...clearNodes,
...command,
...createParagraphNear,
+ ...deleteNode,
...deleteRange,
...deleteSelection,
...enter,