SnapSparrow Spec Addendum

Final Gaps & Corrections

Supplements the main spec and the native-scaling amendment

Manifest text sizing correction

Amends: §9 Typography reference

The annotation body text was specced at 36px (canvas), matching the caption size. This is too small — the manifest is a standalone text section that users read without the visual context of the images above. It needs more presence.

Updated manifest type scale
ElementOld sizeNew sizeRationale
Annotation body text36px42pxPrimary reading text of the manifest — needs to be comfortable at arm's length
Annotation type label28px28pxNo change — metadata stays subordinate
Annotation image ref28px28pxNo change
Manifest section header28px32pxSlight bump for visual weight parity with updated body
Annotation badge diameter64px64pxNo change
Spacing between entries48px56pxSlightly more air between entries at larger body size

Caption text (beneath images in the grid) stays at 36px italic — its context is established by proximity to the image, so it can afford to be quieter.

Background & surface colors

Amends: not previously specified

The export background is a warm off-white — not pure white. This is one of the strongest editorial signals in the composition; it makes the export feel like paper and differentiates it from the white backgrounds of messaging apps, docs, and tools where it gets pasted.

#F4F2ED
Export background — warm cream/parchment
#FFFFFF
Image card background — pure white
#2C2C2A
Primary text — warm near-black
#5F5E5A
Secondary text — warm gray
#888780
Tertiary text — light warm gray
#D85A30
Brand accent — coral (vertical bars only)

The warm cream background combined with white image cards creates a subtle depth — the images sit on the page rather than floating in void. JPG export should use #F4F2ED as the fill, not transparency.

Image card clarification

Amends: §4 Image cards

Screenshots bleed to the card edges — no inner padding. The card's border-radius clips the corners of the screenshot. This maximizes the image display area and avoids the "picture frame" effect that padding creates.

padding: 0
overflow: hidden
border-radius: 16px (clips screenshot corners)
border: 1px solid rgba(0,0,0,0.08)
background: #FFFFFF (visible only if screenshot has transparency)
Edge case rules

1 image

Single-image export. The image is always 12-col (full width), regardless of native size or annotation count. The scale ceiling rule is relaxed for single-image exports — the user chose to export one image, and it should fill the composition.

If the single image has 0 annotations, the manifest section is omitted entirely. The export is: title block → image (with optional caption) → footer.

2 images

Two-image export. The algorithm assigns spans normally based on priority and scale ceiling:

If both images have similar priority and scale ceiling >= 6:
  → 6 + 6 (balanced pair)

If one image has significantly higher priority:
  → 8 + 4 (or 4 + 8, per zigzag — though with
     only one asymmetric row, zigzag is moot)

If one image has a low scale ceiling (e.g., 3–4 col):
  → 9 + 3 or 8 + 4, with the small image in the
     narrower slot

Never stack 2 images as two sequential 12-col rows —
  always compose as a single row unless aspect ratios
  make it impossible (e.g., two extreme portraits).

3 images

Three-image export. Natural compositions:

4 + 4 + 4 (if all similar priority/size)
8 + 4 top row, 12 bottom row (if one is clearly hero)
12 top row, 6 + 6 bottom row
6 + 3 + 3 (if one primary, two small)

The packing algorithm handles this naturally — no special-casing needed beyond the standard rules.

0 annotations

An export with zero annotations across all images omits the manifest section entirely. The export is: title block → image grid (with optional captions) → footer. The superline still shows "0 ANNOTATIONS" for completeness.

Many images (8+)

No special handling. The packing algorithm continues filling rows. The export gets taller. For the stitched JPG output, the image simply extends vertically. For PDF and multi-file outputs, see pagination (deferred).

Output format

Default: stitched JPG

The primary export is a single tall JPG image at 3000px width. This is paste-friendly (Slack, iMessage, email, docs) and requires no special viewer.

Width: 3000px (fixed)
Height: variable (content-dependent)
Format: JPEG
Quality: 92% (balance of file size and screenshot text clarity)
Background: #F4F2ED (filled, not transparent)
Color space: sRGB
Font rendering: Cal Sans and Source Sans 3 rasterized at canvas resolution

Option: PDF

PDF export with fonts embedded (Cal Sans, Source Sans 3). Pagination rules are deferred — for v1, render as a single continuous page matching the stitched JPG layout.

Deferred: Multi-page PDF pagination. Open questions: Does the manifest start on its own page? Do page headers repeat the title? Do badge numbers reset per page? Revisit after v1 validates the single-page layout.

Option: multi-file JPGs

Splits the export into separate JPG files. Split points occur between image grid rows — never mid-row. Each file includes the title block as a header and the footer. The manifest appears only in the final file.

Deferred: Exact split-point logic (height threshold? fixed number of rows per file?). Revisit alongside PDF pagination.

Remaining open questions

Deferred for real-world validation

QuestionContext
Scale floor: 50% or lower?Very large screenshots (4K captures) may hit 50% at 12-col. Is that too aggressive?
3+6+3 compositionCentered hero with small companions — looks great in theory, needs real-content validation
Portrait / extreme portrait cutoffAt what aspect ratio should a portrait image be treated as "extreme" and trigger special handling?
PDF / multi-file paginationPage break rules, header repetition, badge numbering across pages
JPG quality vs file size92% is a starting point — may need adjustment based on typical screenshot content (text-heavy = needs higher quality)
Annotation badge scalingShould badge size scale with image size, or stay fixed? Fixed is simpler but may look oversized on 3-col images