The easiest way maybe this:
#set page(
background: grid(columns: (1cm,) * 21, rows: (1cm,) * 30, stroke: 0.1mm),
)
#set page(background: context grid(
columns: (1cm,) * calc.ceil(page.width.cm()),
rows: (1cm,) * calc.ceil(page.height.cm()),
stroke: 0.1mm
))
Kind of related: Add support for inside/center/outside strokes (change stroke bounding box). Zero page margins issue · Issue #5741 · typst/typst · GitHub
Or this:
#let cm-grid = tiling(size: (1cm, 1cm), square(stroke: 0.1mm))
// #set page(fill: cm-grid)
#block(fill: cm-grid, lorem(70))
With tiling, it’s easy to apply to stuff other than page. Much more dynamic, but you won’t be able to place ordered labels.

