How do I stop TipTap adding p tags to my li items?

Oh… looks like it may have pitfalls? Could you instead remove at render time with a custom htmlAgility pack parser… though could have issues when <p> are required?
Alternatively you could use a block in the rte to insert a repeatable textstring.. and then control the render?

Here’s Perplexity’s take…

ProseMirror (tiptap 's underlying editor framework) insists on putting <p> (paragraph) tags inside <li> (list items) because of how its schema is designed and how it handles document structure. In ProseMirror’s schema for list items, the content model for a list item is defined to expect block content, commonly starting with a paragraph. This is to maintain consistency and full editing capabilities like splitting, wrapping, and nesting within list items.

The main reasons are:

  1. Schema Design & Editing Consistency: ProseMirror requires list items to contain block nodes (e.g., paragraphs) rather than inline text directly so that commands like splitting the list item or adding new ones will work correctly. Lists in ProseMirror rely on a text block structure inside the
  2. to maintain consistent behavior during user input and editing.
  3. Editing Commands Dependence: Commands like splitListItem expect the list item to have at least one block-level text node such as a paragraph at its root. Removing the paragraph or switching to inline-only content breaks or complicates default list commands.
  4. HTML Specification Context: The HTML spec itself allows list items to contain block-level elements including paragraphs, so wrapping content in <p> inside <li> is valid HTML. Although simple lists sometimes have direct text inside <li>, the spec permits block content to maintain semantic clarity.
  5. Practical Editing Considerations: Wrapping each list item’s content in a paragraph helps visually separate lines, preserve spacing, and control editing caret movements, which are important in rich text editors.

So, ProseMirror’s insistence on paragraphs inside list items is a design choice aligned with both editing needs and valid HTML semantics. Although it’s not mandatory in all HTML usage to have <p> inside <li>, it is the default block content model for most rich text editors to ensure predictable and flexible editing