PIV Desk - notice The app's agent prompt is derived from the agent skill "openpiv" (@k-dense-ai/openpiv, skill version 1.1, skill author OpenPIV Team, tested against openpiv 0.25.4) - its single-pass pipeline scripts/runner.py, its validation, units and multi-pass guidance, and scripts/analyze.py - in the repository k-dense-ai/scientific-agent-skills. https://github.com/k-dense-ai/scientific-agent-skills (skills/openpiv) The skill's front matter declares the BSD-3-Clause license; the repository is MIT-licensed. No text of the skill is redistributed verbatim; the prompt was rewritten for this app. The in-browser analysis (piv.js, pivkit.js) is an independent JavaScript implementation of the behaviour of openpiv 0.25.4 (OpenPIV, https://github.com/OpenPIV/openpiv-python, GPLv3): pyprocess.extended_search_area_piv with its intensity normalisation, masking, linear/circular FFT correlation (including the one-column-short inverse transform of the linear path), Gaussian / centroid / parabolic sub-pixel peaks and peak2peak / peak2mean ratios; get_coordinates; validation.sig2noise_val, global_val and local_median_val; filters.replace_outliers and lib.replace_nans; scaling.uniform; tools.transform_coordinates; tools.save's vectors.txt format; tools.rgb2gray's weights; and the skill's analyze.py statistics, vorticity and strain. No OpenPIV source code, test data or images are included: the page was written from the documented behaviour and checked against the installed package's outputs. imgio.js reads PNG, TIFF, BMP and JPEG the way imageio / Pillow present them to openpiv. The synthetic pairs are generated by synth.js (Gaussian particle images, Lamb-Oseen vortex, uniform shift, shear layer) and are the page's own. Verification (2026-09-27): 526 image pairs - 490 random synthetic pairs over window, overlap, search area, correlation, sub-pixel, ratio, threshold, validation, replacement and drop_invalid settings, and 36 runs over the six image pairs bundled with openpiv 0.25.4 - 175,637 vectors in total. 175,631 raw vectors agreed with openpiv within 0.001 px per frame and every signal-to-noise ratio within 0.01%; 1 validation flag differed. The 6 remaining vectors lie in the normalised (search area > window) path, where openpiv computes in single precision and a near-zero point next to the correlation peak makes the sub-pixel fit sensitive to rounding. vectors.txt matches openpiv's file line for line except for last-digit differences in about 9% of lines.