Privacy
Updated Online Protractor
We keep it simple: no account, no database, no server-side image storage. If analytics are added later, they will be privacy-friendly, disclosed here, and never track image contents.
Exact browser-side workflow
When you use Use image, drag & drop, paste (Ctrl+V) or camera capture:
- File pick / drop / paste / capture → the browser gives the tool a
FileorBlob. No upload starts. - Type & size gate → only
image/png, image/jpeg, image/webpand ≤12 MB pass; otherwise an inline error shows. - Local decode →
URL.createObjectURL(file)creates ablob:URL; anHTMLImageElementloads it viasrc=blob:…. The file never leaves your device. Camera usesnavigator.mediaDevices.getUserMedia→<video>→ canvas capture → sameblob:path. - Render → the image is drawn in the SVG
#image-layer(Astro static, client JS only). Pan/zoom/rotate are CSS/SVG transforms; no network request. - Revoke → on clear, replace or page hide/unload we call
URL.revokeObjectURL()— theblob:URL is invalidated and memory freed. Nothing persists inlocalStorageorIndexedDB. - Export → PNG export uses
canvas.toBloblocally; JSON/CSV are text dumps of your points — also local.
blob: load. Close the image and the blob: entry disappears.What we don't collect
- No image uploads, no server-side processing.
- No image contents stored, fingerprinted or used for training.
- No fake reviews, ratings, or user counts.
- Analytics, when enabled, is URL/page-level only, never pixel data.
Analytics — privacy-aware
We use minimal, privacy-friendly analytics only with allowed events. No image contents, filenames, or exact image data are ever sent. We respect Do Not Track and Global Privacy Control.
tool_interaction_start— first drag of center/ray (mode only).angle_changed_meaningfully— angle bucket (≈5°) after drag, not exact pixels.copy_angle— Copy button (unit only).toggle_radians— Degrees/Radians switch.snap_changed— snap value.image_mode_open— picker/sample/camera open (source only).image_loaded— successful local decode (no filename, no dimensions).language_changed/theme_changed— new locale/theme.
Payload is {event, path, locale, ts} plus low-cardinality fields above. No cookies, no image bytes, no filenames. Endpoint is disabled by default (window.__ANALYTICS_ENDPOINT unset); when configured it uses navigator.sendBeacon with keepalive. Localhost logs to console only.
Camera permission
Camera requires HTTPS and your explicit permission. Deny leaves the tool fully usable via file → we show a local error and never retry without your click. See image guide.