Shoot 50–500 photos on site. Download to laptop. Open Bridge or a folder. Cross-reference each photo against codes in a printed standard. Type findings into Word. Drop images one-by-one. Re-format for the firm template.
4–8 hours of post-site work per inspection. Inconsistent deliverables across staff. No durable link between a photo, a code reference, and the report it appeared in. Easy to lose a finding when the spreadsheet shifts.
A local Flask web app that opens at localhost:5000. Drop a folder of inspection photos. Tag, group, write — every change persists to SQLite, JPEG EXIF, and XMP sidecars at the same time.
Capture metadata: title, subject, notes. Keyboard-first, autocomplete from prior entries.
Press A–Z, draw a region. Code-linked, severity-colored, regulation-referenced.
Cluster images into named areas — by time, GPS, both, or folder. Drag, split, merge.
Designed for the inspector who doesn't want to look at the screen — eyes on the photo, hands on the keys.
tags.xlsxCode · Issue Summary · Code Reference · Severity · Color. The same file feeds every downstream report.
Timestamp gap — split when minutes between shots exceeds threshold.
GPS radius — cluster photos within N metres.
Hybrid — timestamp first, then GPS-merge nearby clusters and GPS-split distant ones in the same time window.
Folder structure — respect what the inspector already organised.
Drag thumbnails between rows. Click a gap badge to split mid-area. Merge button between two areas. Re-clustering preserves anything the user hand-grouped.
Gap analysis shows orange when the next photo is far in time or distance — surfaces the splits the algorithm missed.
.tagger.db — fast queries, source of truth during the session. Folders, images, tags, areas, junction tables.
Codes written as IPTC Keywords + XMP-dc:Subject. Bounding boxes serialised as TAGGER_RECTS JSON in UserComment.
Portable durable record alongside each image. Move the folder, the data moves with it.
If the database dies, sync rebuilds it from XMP. If the app dies, the photos still carry every code and region they were ever tagged with — readable in Bridge, Lightroom, or any EXIF tool.
No cloud, no SaaS, no telemetry. Inspection data — often confidential, sometimes privileged — never leaves the laptop. Defensible by default.
Stdlib HTTP (urllib). Raw sqlite3, no ORM. Vanilla JS + Bootstrap, no npm. ExifTool as a single binary on PATH.
EXIF writes, thumbnail generation, folder scans all run in daemon threads. The UI never freezes during a 1000-photo ingest.
Built for the actual hardware engineers use. Forward-slash URIs, os.path for filesystem, ExifTool for the EXIF quirks of iPhone JPEGs.
WYSIWYG report editor — render pages to PNG, overlay drag handles, write layout overrides back to TOML. All layout values already templated.
Area-level GPS pins — one map pin per area centroid, replacing per-photo clutter.
Multi-site reports — combine areas across folders into one consolidated deliverable.
FieldLog → TAR adapter — mobile field-capture pipes directly into the tagger queue.
AI tag suggestions — local YOLO/OCR backends already prototyped; suggest codes from the photo itself.