Methodology

How Stitchpaper works

What happens between uploading an image and printing a chart, written so you can judge the output rather than trust it.

Everything runs on your device

Stitchpaper is a static website. There is no server that receives images or patterns. When you upload a photo, the browser reads the file, hands it to a web worker on your machine, and the worker returns a grid of stitches. Projects are saved in your browser's local storage and can be downloaded as a JSON file. This is why there is no account and why the site works offline once loaded.

Image to stitches

  1. Resample. The image is scaled so its width equals the stitch width you chose (up to 300). Each resulting pixel is a candidate stitch. In pixel-art mode, resampling uses nearest-neighbor so hard edges stay hard.
  2. Optional background removal. If enabled, pixels connected to the border that share a near-uniform color are marked as "no stitch". Transparent pixels are always left unstitched.
  3. Cluster colors in Lab. Pixel colors are converted to CIELAB, a color space where distance roughly matches how different two colors look to a person, and clustered into the number of colors you chose. Clustering is deterministic: the same image and settings give the same chart every time. Pixels are weighted so that small but distinct regions (an eye, a highlight) are less likely to be absorbed by a large neighbor.
  4. Match each cluster to floss. Each cluster center is matched to the nearest DMC color by Euclidean distance in Lab. (CIEDE2000 is on the roadmap; on this dataset the two agree in most cases.)
  5. No dithering. Dithering makes a screen preview look more photographic but scatters single stitches across the fabric. Stitchpaper does not dither. It may be offered later as an explicit option.

Cleanup

Clean isolated stitches removes stitches whose color is used by none of their neighbors and replaces them with the neighbor color that appears most. It is intentionally conservative: it does not try to recognize an eye or a letter, so check fine details after running it. Every cleanup is one undo step.

Floss estimates

Estimate per color = stitches × thread per stitch × 1.2, expressed in 8-meter skeins of two strands pulled from six-strand floss.

Thread per stitch is modeled as two diagonal front legs plus two straight back legs for the fabric count you set. The 20% allowance covers starts, ends, tails and waste. Real usage varies with tension, routing and how often you finish off, so buy one skein more of any color near a whole-skein boundary. The CSV export shows the assumption next to every number.

Thread data

The palette has 454 DMC six-strand colors with number, name and an RGB value. It is normalized from the CSV in PaulMakesStuff/Python_Cross_Stitch (MIT license; retrieved 5 September 2026; the file's SHA-256 is recorded in the source). The upstream CSV does not document how its RGB values were measured, so they are treated as community approximations. Nothing has been calibrated against physical floss, some current DMC colors are missing, and discontinued codes have not been reconciled. Before Stitchpaper claims a complete or accurate catalog, it will need controlled comparison against real skeins. The DMC color chart carries the same caveat.

Charts and PDFs

The PDF is drawn as vectors: a grid with bold lines every ten stitches, one symbol per color chosen from a tested set for contrast, a thread key with DMC number, name, symbol and stitch count, and page tiles with coordinates. The stitched preview on the first page is rasterized from the same renderer the studio uses on screen.

What it cannot do yet

These are listed in the project roadmap and will be removed from this list as they ship. If something here is wrong, use the contact page.