4 live 1 building on the bench: Pehra Pro, Snap Receipt last shipped

Projects

photo_markup

Status
Released
Platforms
All six Flutter platforms
Version
1.0.2 on pub.dev
Pub points
160/160
Since
August 2026
Publisher
Verified publisher velzosoft.com
Stack
Dart · Flutter
Last shipped
Links

Why does the arrow on your inspection photo point at the wrong thing on another screen?

Because it was saved in pixels.

photo_markup stores every mark as a fraction of the image. The same markup renders correctly in a 48-pixel thumbnail, a full-screen tablet editor and a 4,000-pixel export.

A photo_markup export: a red box around a house, a blue arrow at a crack in its wall, an orange ellipse around the sun and a green freehand line, flattened onto the example app's sample picture.
Box, ellipse, arrow and freehand marks, flattened by MarkupFlattener into a 1,000-pixel PNG. No text mark: it's rendered under flutter test, where every font is a placeholder.

Decisions

  • Vector data is the source of truth. The flattened image is a derived artifact.
  • One painter for the editor, the viewer and the export, so all three produce identical geometry.
  • Forward-compatible both ways. An older app can open and re-save a newer document without destroying what it doesn't understand.
  • No fit option on the viewer, on purpose. Letterboxing would misalign the markup. Wrap it in a FittedBox instead.
  • A "not supported yet" list in the README.

Under the hood

  • Box, ellipse, arrow, freehand and text tools. Pinch-zoom, pan, and one-finger drawing while zoomed. Undo and redo.
  • Exports draw at output resolution, never upscale, and cap size by default, because a 12-megapixel image in memory is about 48 MB.
  • JPEG encoding runs off the main thread. No platform channels.
  • 37 tests.