Skip to content
All projects
ToolIn active development

KeepWall

Photograph forty-five handwritten cards. Print them as one wall, at true size.

Overview

A design and print app for memory walls: phone photos of handwritten cards go in, and a colour-managed, print-ready PDF of a 24 × 36 in board comes out. Twenty designs, a full editor, and a layout engine that works in inches so one document prints at any size.

The problem

A wall of forty-five handwritten cards is a physical object: it gets printed at 24 × 36 inches, by a shop, in ink. The design existed as twenty HTML prototypes that could only hand over the frame, the type and the grid positions — the scans themselves were placed at print time in Canva or by the shop. And an app that looks right on screen is not a print artifact. Screen colour is not ink colour, a layout that fits the viewport can still run off the sheet, and a PDF can drop half its letters while passing every structural check made of it.

The approach

A document pipeline where everything is inches and pixels appear only at render time, so one document prints at any DPI and moves between sheet sizes without re-solving. The editor preview and the print worker import the same modules — not a bundle, not a copy — and a gate has Chromium and Node render the same seeds and compare the display list and the SVG byte for byte, because if the two ever disagree the customer finds out after the money and the paper are spent. The tradeoff is taken where it matters: print faces are embedded whole rather than subset, which takes a vector board from 8 KB to 357 KB, after the subsetter was found silently dropping glyph outlines on six of the fourteen faces while leaving widths, positions and the copyable text correct.

Outcome

  • The layout gate runs 207,354 card placements across every surface, card count and mode — zero containment violations, and it found three of the bugs it now guards
  • A justified layout mode gains a mean 8.2 points of sheet coverage over the grid and is never worse on any surface and count pair; 20 cards on 24 × 36 goes from 69% to 90%
  • Unattended ingest lands a mean corner error of 0.36% of the card's diagonal, a worst deskew of 0.07°, 45/45 correct orientation, at ~175 ms a photo
  • Output is vector, so a 36 × 48 in board is 10 KB rather than the 622 MB it would be as full-resolution raster, and the render is byte-reproducible
  • CMYK output refuses to run without an ICC profile and embeds it as the file's OutputIntent, replacing a formula that had no press, no paper and no ink in it

What it does

  • Twenty designs, one editor

    Every design is reachable and applies whole — palette, type, arrangement, tilt and header placement. Switching design re-solves the layout around the cards you already placed rather than rebuilding them, because changing your mind about the look is not a reason to lose forty-five photographs.

  • Photos in, cards out

    Detect, deskew and crop from ordinary phone photos, with the aspect snapped to the shape a wishing card actually is. Corners come from intersecting fitted edges rather than hull vertices, which recovers a corner the blurred image no longer contains.

  • It refuses rather than guesses

    A card running off the frame, a scan that fills it, or a printed border that reads as background are each caught and flagged for a re-shoot. Unattended means nobody is watching, so a confident wrong crop has to be stopped here.

  • A board never finishes on a hole

    Dealing spare cells row-major left the last row short and flush left — the everyday case, not an edge one, at 68% of surface and count pairs. Surplus is now spent from the bottom row upward and each short row centred, without disturbing the containment proof.

  • A file the print shop can use

    TrimBox, BleedBox and MediaBox say where the guillotine cuts, and crop marks start at the bleed edge rather than inside art about to be trimmed through. Fonts are embedded whole and every glyph is read back out of the bytes the file actually carries.

  • Works on the shop's wifi

    Self-hosted faces, a cache-first service worker and offline install — which is the point when you are standing in a print shop with a board to show them.

Ask about KeepWall

Want something like this, or curious how a piece of it works? Send a note — it reaches me tagged with this project, so I have the context before I reply.

Replies within 24h on business days.