Public betaActively developed. Capabilities and coverage are evolving.Release notes

DOCUMENTATION

A useful first
five minutes.

Start locally, inspect what the OS exposes, and build a baseline you can explain.

1. Install the beta

Download a verified package. The portable package runs on Python 3.10+ and uses your current browser; it needs no runtime packages in this mode. Native packaging and collector support are separate: inspect the support matrix before use.

Unzip the portable package and use the launcher for your OS. To run from a terminal inside its folder:

python3 -m displaydna --live

On Windows, use py -3 -m displaydna --live. The standalone Mac app, when offered, includes Python. That beta is not Developer ID signed or notarized.

2. Inspect the current environment

The app opens a local 127.0.0.1 dashboard. Use the exact URL it prints; the random port is expected. Open Display profiles to see OS identity, active settings, raw EDID when available, checksum results and collector provenance.

The layout uses OS-reported desktop coordinates. On a Retina display, active pixel dimensions can differ from logical desktop dimensions. A preferred EDID timing is a capability, not an obligation to run that mode.

Do not run as administrator by default. DisplayDNA does not request screen-recording or accessibility access. OS policy or a restricted session may still limit metadata.

3. Try the included demo

The Demo workspace contains six synthetic snapshots. It shows refresh changes, a virtual display, duplicate identities, malformed EDID, mirroring and disconnection without reading your actual hardware. The dashboard labels simulated data.

python3 -m displaydna --demo

4. Set a baseline

Once your setup is in a known state, choose Use current as baseline in Comparisons. Future snapshots can reveal changed profile bytes, settings, identity fields and topology. The raw byte view includes exact offsets; the readable view preserves context.

Connector IDs can change after OS or driver updates. Added or removed records are not cryptographic proof of hardware changes. Incomplete inventories do not create confirmed physical disconnection events.

5. Read the evidence, not just the label

Expand a finding to inspect its rule, evidence, source and confidence. A malformed profile, duplicate identity or virtual display can have legitimate causes. Configurable thresholds and disabled rules are available in Coverage & settings.

Unavailable means unknown.

Global screenshot, recording and screen-sharing detection is not implemented. A quiet timeline does not rule out capture, and EDID cannot reliably reveal downstream capture hardware. Anomalies do not establish intent or misconduct.

Capture indicators and the Peek-o-Meter

The Peek-o-Meter scores observed concern from 0 to 100. It is not a system-cleanliness score, cheating probability or exam clearance. Missing coverage, stale samples, paused monitoring, demo data and imported history stay explicit.

Live metadata checks watch bounded screenshot folders and known capture/sharing executable names every five seconds, independently of EDID collection. Clipboard image-format checks are optional and off by default; Linux clipboard monitoring is unavailable.

A screenshot-like file may have been copied, and an open application may be idle. No screen or clipboard contents are read. Reliable system-wide capture absence cannot be established.

Configure activity sampling, recent-event windows, monitored folders and optional probes in Coverage & settings. Review evidence and your test provider’s rules before drawing conclusions.

History, import and replay

History is stored locally in SQLite. Identical raw EDID blobs are deduplicated, unchanged samples are skipped, and retention/count limits are adjustable. Replay walks saved frames without running live collectors.

Import binary EDID, plain hexadecimal, or a DisplayDNA JSON session. The app preserves malformed bytes for research and reparses derived fields. Export the selected raw EDID from its profile, or export a session with its baseline and original profile bytes.

Imports are historical evidence. They are not fresh OS observations. Exports may contain serials and topology; share them deliberately.

Language, appearance and accessibility

Open Language & accessibility in the header to choose your language and reading preferences. The language selector keeps you on the equivalent page.

English, Persian, Spanish, French, Hebrew, Simplified Chinese and Japanese are available on the website and in the tool. Persian and Hebrew use right-to-left layouts.

Appearance settings include system, light, dark and high contrast, with text size, reduced motion and underlined links. Preferences stay on your device. Original evidence is preserved.

These translations have not yet had professional review. Manual VoiceOver and NVDA testing is still pending; no accessibility certification is claimed.

Local storage and resource controls

  • macOS: ~/Library/Application Support/DisplayDNA
  • Windows: %LOCALAPPDATA%\DisplayDNA
  • Linux: ${XDG_DATA_HOME:-~/.local/share}/displaydna

Override with --data-dir PATH. Default fallback polling is 60 seconds, adjustable from 10–3600 seconds. macOS and Linux use available display events as wakeups. Pause stops automatic collection; an explicit Refresh can still collect a live sample.

Reported memory is peak backend RSS; browser/webview resources are separate. CPU, collection time, disk bytes and deduplication counts are measured locally. History is unencrypted. Stop the app before removing its data directory to delete history.

Full privacy note ↗

If something is missing

No raw EDID

The OS may not expose it, the driver may cache or override it, or a profile may not match unambiguously. Some Mac built-in panels expose no raw EDID. Known OS identity stays visible independently; missing bytes alone are not an anomaly.

No display layout on Linux

Current layout requires an accessible X11 session and xrandr. Wayland layout is not implemented; advertised DRM modes are not presented as active settings.

The local page says reconnecting

Confirm the app is still running. Reopen the exact printed local URL after restarting it. If a port was specified and is busy, omit --port to use another available port.

macOS blocks the standalone beta

The initial beta app is not Developer ID signed or notarized. Check its provenance and checksum and follow your organization’s software policy. Do not disable platform protections. The Python portable package is an alternative for environments that permit it.

Report an issue

Include the version, OS, whether the issue occurs in Demo or Live, and collector errors. Redact serials and identifying data before attaching exports. Contact support.

Analytics preferences

Allow optional Google Analytics to help us understand website page visits and basic browser information. Your display profiles and EDID are never included. Advertising features are disabled.

Google receives request metadata when analytics is enabled. You can change your choice here at any time.

Read the privacy details