# HTML tables in a native chat renderer

[Journal](/journal/)

September 5, 2026 · [guides](/journal/#guides)



A native table model preserves spans and nested tables by measuring rows before it places spanning cells in an overlay.

![A native phone frame holds a table grid with a verdigris row-span overlay and a smaller table nested inside one cell.](/_astro/html-tables-in-a-native-chat-renderer.DAhT3Aqp_Z1krKY8.avif)

A native chat surface cannot host complex HTML table markup in a WebView. Our Muniment Mobile renderer parses the table and draws it with native views.

Row measurement establishes the space that a spanning cell will occupy.

## Three facts place each cell

Each cell records its colspan, rowspan, and starting column.

The renderer first draws the in-flow rows and records each row height. A cell with a rowspan greater than one then sits in an overlay.

That overlay cell takes the sum of the measured row heights it covers.

## A nested table stays inside its cell

A nested table remains a child of its parent cell. It does not become a second document beside the outer table.

## Four tests hold the layout boundary

Our Muniment Mobile tests lock four cases:

1.  A cell spans two rows.
2.  A cell contains a nested table.
3.  A colspan occupies more than one column.
4.  An outer table still parses when one cell contains another table.

## The record stops before visual parity

This evidence does not prove visual parity with GitHub. The native layout is not a pixel match for GitHub CSS tables.

We did not measure scroll cost or paint time. Illegal rowspan values that extend past the table are not a compatibility claim.

Visitors cannot install Muniment Mobile today. This article records the staged renderer evidence without publishing an installation path.

This evidence comes from our Muniment Mobile note pinned to commit `395383bd4309a28a1281a450d8193bc7bd2131ae`.
