Updated: 2026-08-01
Shipping direction: free Planar Photo Mapping Beta
Public-store status: NOT READY
This is the source of truth. Build success, repository polish, or a screenshot does not equal Play/App Store acceptance or physical dimensional validation.
Draft PR #110 (feat/print-calibration-suite) is stacked on draft PR #108. It
adds persistent appearance, TM-CAL-1, Print Path Profiles, four-corner planar
rectification, coin/custom/manual fallbacks, and corrected export metadata.
Local compatibility analysis and focused tests pass at commit 54400a9, and
the calibration PDFs passed mathematical and 96/300 DPI visual inspection.
Authoritative hosted checks are BLOCKED before execution by the GitHub
account’s failed-payment/spending-limit state. Physical printer, stencil,
camera, coin, iOS, and final-ruler evidence remains NOT TESTED. PR #110 must not
be described as green or ready.
The former blank-canvas → dual-photo → “flatten” product path was not a defensible mapping system. The beta now uses one registered coordinate system: capture/import a photo, calibrate two points in that image, trace over it, place a PNG in image coordinates, and export physical PDF geometry from stored px/mm.
The app describes this honestly as planar. It does not model a curved surface.
| Area | Current evidence | Status |
|---|---|---|
| Stabilization PR #101 | Final head 80f5731; all required CI jobs green; merged as f4eb683 |
Verified and merged |
| Planar schema/calibration | v2 model, source-image points, validation, round-trip tests | Verified in feature CI |
| Photo workflow | bounded off-isolate normalization, atomic project-owned copy, explicit camera state machine | Verified in automated tests; device QA pending |
| Trace | photo-backed separate strokes, finger/stylus pointer input, undo/redo | Implemented; device gesture QA pending |
| PNG design | import/normalize, drag, scale, rotation, persistence, transparent sample | Verified in tests/renders; device QA pending |
| physical layout, vector strokes, PNG transform, ruler/instructions, oversize refusal | Implemented; physical print pending | |
| Monetization/privacy | ads, IAP, ATT, paywall, trial, Sentry removed; local-first startup | Verified by source/dependency/manifest gates |
| Android | API 36 APK/AAB green; AAB validated; exact APK clean-installed/started on x86_64 | Not Play-ready |
| iOS | Xcode 26 no-sign build green; privacy manifest included | Not TestFlight-ready |
| Public assets | generated sample inputs, six reproducible product renders, animated walkthrough, demo script | Implemented; final store screenshots pending |
| Project lifecycle | per-project JSON/media directory, safe replacement/deletion, startup temp cleanup | Verified in deterministic storage tests |
| Save ordering | serialized, debounced coordinator with flush/retry/error state | Verified with slow/failing stores |
| First-party license | Bradley C. Peter confirmed as 2025–2026 proprietary holder in issue #109 | Verified; repository remains private |
| Third-party notices | Noto Sans OFL, dependency inventory, in-app license viewer, owner-recorded logo provenance | Verified |
The current planar branch no longer writes one SharedPreferences blob while
leaving copied media behind. Each resumable project owns a private
projects/<project-id>/ directory containing recoverable JSON and imported
media. Replacements commit the new file and project state before deleting an
old TatMapper-owned file. Full deletion removes the project directory, while
canonical containment checks refuse external paths. Bundled samples use asset
paths and create no project directory.
ProjectSaveCoordinator permits one store write at a time, coalesces rapid
changes, flushes on close/lifecycle transitions, and keeps the workflow open
when persistence fails. The artist can retry, explicitly discard, or remain on
the current screen.
Image ingestion caps input at 32 MiB and 24 million source pixels, rejects damaged/unsupported/extreme-aspect inputs, requires at least 256 pixels per dimension, bakes EXIF orientation, and limits the normalized working image to 4096 pixels on its longest side without upscaling. Decode, resize, and encode run outside the UI isolate; the verified result is atomically renamed into the project directory. Design PNG pixels, including white and near-white artwork, are preserved.
The disconnected dual-photo, OpenCV/body-patch, native FFI, old session, settings, paywall/trial/ad, stylus prototype, and web compatibility source was removed from the shipping tree. Git history remains the archive. A direct dependency and generated-plugin allowlist prevents those surfaces from returning silently.
Issue #109 records Bradley C. Peter as the 2025–2026 proprietary copyright
holder and the creator/owner of the current TatMapper logo. The canonical
license and third-party notice now reflect that decision, the old MIT and
conflicting commercial files remain removed, and both dedicated license gates
pass at PR #108 head 64f09bd. The repository remains private; no merge,
production signing, store upload, or public source distribution is authorized.
PR #101 final head passed:
Runs: 29833677602, 29833677847, and 29833677536. The detailed baseline,
bundletool inspection, emulator startup, and limitations are in
evidence/release-readiness/2026-07-21/stabilization.md.
Product head eb21257 passed Flutter CI run 29854728917 and Release
Readiness run 29854728975:
Bundletool 1.18.3 validated the exact AAB and reported package
com.tatmapper.app, version 2.0.0 (versionCode 3), min SDK 24, target SDK
36, and armeabi-v7a, arm64-v8a, and x86_64 native libraries. The manifest
contains camera plus Android’s app-scoped dynamic-receiver permission; no
Internet, broad storage, audio, billing, ad-ID, or AdMob permission/metadata is
present.
The exact CI APK was clean-installed on the API 36 Pixel_7a x86_64 AVD.
Package metadata matched the values above, the TatMapper process remained alive,
and filtered logcat contained no TatMapper fatal exception, ANR, or E/flutter.
am start -W timed out because the emulator system image never set
sys.boot_completed; this is recorded as an environment limitation and not as
a complete UI-flow pass.
Artifact checksums and command-level evidence are in
evidence/release-readiness/2026-07-21/planar-beta.md.
google_mobile_ads, in_app_purchase,
app_tracking_transparency, sentry_flutter, and paywall/trial code removed
from the beta dependency/startup path.PrivacyInfo.xcprivacy declares no tracking, no collected data types,
and no first-party required-reason API after SharedPreferences removal.Owner authority or hardware is required for:
No secrets or user photos belong in source control.
TatMapper is release ready only when the applicable boxes above have linked evidence, signed builds install through the stores’ test channels, the primary flow passes on representative real hardware, and the 100 mm printed fixture meets a written tolerance. Until then, status language is verified, failed, not tested, or blocked—never “should work” or “mostly ready.”