Methodology · Print-true

How the millimeters stay true.

"Prints at actual size" is a claim every printable-paper site makes, including the ones whose sheets arrive at 94% scale. This page doesn't ask you to believe the claim — it shows the geometry, names the one print setting that decides everything, and gives you a ruler test that catches any error.

SVG unitsreal mm Rescalingnone at 100% Uploads0 Watermarksnone

These aren't marketing numbers — the sections below show where each one comes from and how to check the result on paper.

The geometry: real millimeters, whole cells

Every sheet on this site is an SVG whose coordinate system is declared in physical units — a line drawn at coordinate 50 is a line 50 millimeters from the paper's edge, not 50 screen pixels of something. When you pick a spacing, the page computes the printable area (your sheet minus your margin), derives how many whole cells fit, and centers the pattern so the edges never end in sliced partial squares. The counts in the readout strip are derived from that arithmetic, not hardcoded — change the spacing and watch them recompute. At print time the page also declares the paper size to your browser as exactly the sheet you chose, so there is nothing left for the print pipeline to resize.

The fit-to-page trap

Most printable paper online is a fixed PDF, and most print dialogs default to "Fit to page" or "Shrink to fit" — a setting that rescales the whole document, typically down a few percent, so its content clears the printer's margins. That's the entire mechanism behind wrong-measuring paper: a 5 mm grid printed at 94% is a 4.7 mm grid, and it looks completely normal. The one setting that matters is scale: set it to 100% (sometimes labeled "Actual size") and leave it there. Because these sheets keep their pattern inside a print-safe margin by construction, 100% clips nothing — there is no reason for the dialog to shrink anything, ever. Check that setting once and every sheet after it prints true.

Verify it with a ruler

Print one sheet of graph paper at the default 5 mm spacing, then measure across ten cells: the span should read 50.0 mm. Measuring across ten cells instead of one is deliberate — it divides your reading error by ten. A half-millimeter misread on a single cell would look like a 10% error; across ten cells the same misread is 1%, so any real discrepancy stands out unmistakably. (Working in inches? Ten cells of 0.25 in spacing should span 63.5 mm, or exactly 2.5 inches.) If the span comes up short, your print dialog is scaling — set it to 100% and print again. This one test verifies the whole chain: the geometry, the page sizing, and your printer's honesty.

What never exists here

No uploads — the sheet is generated inside your tab, and nothing you configure ever leaves your device; there is no server-side code that could receive it. No watermarks, because the paper is yours, not an advertisement for this site. No accounts and no sign-ups. No storage of any kind — no cookies, no local storage, not even a settings byte; close the tab and every trace of your session is gone. And when you choose "Save as PDF" in the print dialog, it's your browser generating that PDF, on your device — this site never creates, stores, or touches a file on any server, because it doesn't have one.

The honest limits

Consumer printers can't print to the paper's edge — every model has a mechanical dead zone of a few millimeters where the rollers grip. The default margin here is 12.7 mm (half an inch), which sits inside that dead zone on essentially every consumer printer, and the margin control stops at 5 mm rather than pretending zero works everywhere. Line weights below about 0.2 mm render inconsistently on consumer hardware, which is why the default is 0.3 mm. Borderless printing isn't promised: it depends on printer modes that rescale on some models, which would defeat the whole point. Finally, what's exact is the geometry handed to your browser — paper itself can drift a fraction of a percent with humidity, which is one more reason the ruler test on your printout is the measurement that counts.

Try it