Skip to contents

Use this for provenance verification and authenticity claims. The function extracts timestamps from multiple sources within the canvas archive and combines them to produce a forensically defensible creation window. The start time comes from high-confidence MP4 metadata (QuickTime epoch), while the stop time uses filtered tile modification times with timezone inference.

Method: 1. **Start (high confidence)**: Earliest non-empty timelapse MP4 `mvhd` creation time, stored in UTC (QuickTime epoch). 2. **Timezone inference**: Compare MP4 UTC times with ZIP entry local times to infer the artist's device timezone offset. 3. **Stop (moderate confidence)**: Latest tile/chunk write time, filtered to exclude "resave windows" (bulk updates when re-opening the file), then converted to UTC using the inferred offset.

Usage

verify_creation_period(
  path,
  tile_threshold = 200L,
  resave_minutes = 10L,
  offset_max_days = 90,
  mp4_zip_window_days = 180,
  verbose = TRUE
)

Arguments

path

Character. Path to a .procreate file (ZIP archive) or an already- extracted directory. The function auto-detects the type based on file vs directory and .procreate extension.

tile_threshold

Integer >= 50. Number of tiles modified in the exact same second that indicates a bulk resave (not genuine editing). When this many tiles share a timestamp, that second is excluded from stop time calculation. Default 200.

resave_minutes

Integer >= 1. Time window (in minutes) around Document.archive modification time to consider for resave detection. Bulk tile updates within this window are treated as resave artifacts. Default 10.

offset_max_days

Integer. Maximum days allowed between an MP4 UTC time and its corresponding ZIP entry local time when inferring timezone offset. Pairs with larger gaps are excluded as outliers. Default 90.

mp4_zip_window_days

Integer. Window (± days) around the median ZIP entry modification time to accept MP4 creation times as valid. MP4 times outside this window may be stale (from copied/reused canvases). Default 180.

verbose

Logical. If TRUE (default), prints a one-line summary with start/stop times, inferred offset, and confidence levels.

Value

List with creation window data:

start_utc

POSIXct. Estimated creation start time in UTC

stop_utc

POSIXct. Estimated creation end time in UTC

interval_utc

lubridate::interval. The creation window as an interval object for duration calculations

tz_offset_hours

Numeric. Inferred timezone offset in hours (e.g., -7 for PDT). NA if inference failed

start_confidence

Character. Confidence level for start time (e.g., "high (mp4 mvhd UTC)")

stop_confidence

Character. Confidence level for stop time (e.g., "moderate (tile writes filtered; tz inferred)")

document_archive_mtime_local

POSIXct. Modification time of Document.archive in local timezone

counts_per_second

table. Distribution of tile counts per second

resave_seconds

POSIXct vector. Timestamps identified as resave artifacts and excluded

n_mp4_segments

Integer. Count of timelapse MP4 segments found

n_tile_files

Integer. Count of tile/chunk files found

Details

Compute a defensible creation window (start → stop) for a Procreate canvas. Works with a zipped `.procreate` file or an already unzipped folder.

See also

Other canvas validation functions: assess_procreate_canvas(), valid-canvas