docs: describe bug reports instead of telemetry

Update the site privacy policy (no telemetry/analytics, bug-report only, v1.2)
and the README/apple README to reflect that only user-submitted bug reports
remain.
This commit is contained in:
2026-08-02 10:03:29 +02:00
parent 3e18378610
commit ac6e837560
3 changed files with 36 additions and 47 deletions

View File

@@ -127,18 +127,18 @@ people, especially when using **Anyone with this transfer**.
- Native SwiftUI apps on iOS, iPadOS, and macOS; Compose apps on Android, - Native SwiftUI apps on iOS, iPadOS, and macOS; Compose apps on Android,
Windows, and Linux Windows, and Linux
- Strict custom HTTPS relay profiles with safe apply and rollback - Strict custom HTTPS relay profiles with safe apply and rollback
- Opt-in diagnostics with transfer contents, invitations, and file paths - Optional user-submitted bug reports with transfer contents, invitations, and
excluded file paths excluded
## Privacy by design ## Privacy by design
- **No hosted transfer copy.** VniDrop does not upload file contents to its - **No hosted transfer copy.** VniDrop does not upload file contents to a bug-report
diagnostics service or a VniDrop storage bucket. service or a VniDrop storage bucket.
- **Encrypted in transit.** Iroh connections are authenticated and encrypted - **Encrypted in transit.** Iroh connections are authenticated and encrypted
end to end, including when a relay is needed. end to end, including when a relay is needed.
- **Local control.** Transfer history and sharing state stay on the device. - **Local control.** Transfer history and sharing state stay on the device.
- **Sensitive invitations.** An invitation can grant access, so it is - **Sensitive invitations.** An invitation can grant access, so it is
deliberately excluded from product logs and diagnostics. deliberately excluded from product logs and bug reports.
- **Explicit access.** Approval is required by default, and stopping a share - **Explicit access.** Approval is required by default, and stopping a share
removes access immediately. removes access immediately.

View File

@@ -114,7 +114,7 @@ The Rust core (iroh network stack) links `SystemConfiguration`, `Security`, and
Screens mirror the Compose UI in `shared/`. Two deliberate simplifications: Screens mirror the Compose UI in `shared/`. Two deliberate simplifications:
- Empty-state Lottie animations are rendered as SF Symbols (no `lottie-ios` - Empty-state Lottie animations are rendered as SF Symbols (no `lottie-ios`
dependency); swap in `lottie-ios` if exact-parity animation is required. dependency); swap in `lottie-ios` if exact-parity animation is required.
- The full diagnostics/telemetry stack (`diagnostics/*`) is stubbed behind - Bug reporting is stubbed behind `BugReportService` (`NoopBugReportService`) and
`BugReportService` / `DiagnosticsBuildConfig` and lands in a later phase; the UI a real transport lands in a later phase. There is no telemetry or crash
hides the diagnostics toggle when not compiled in. auto-reporting.
``` ```

View File

@@ -3,14 +3,14 @@ import type { Metadata } from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Privacy policy", title: "Privacy policy",
description: description:
"How VniDrop handles transfers, local app data, optional diagnostics, bug reports, and website visits.", "How VniDrop handles transfers, local app data, optional bug reports, and website visits.",
}; };
const sections = [ const sections = [
["scope", "Scope"], ["scope", "Scope"],
["transfers", "Transfers"], ["transfers", "Transfers"],
["local-data", "Local data"], ["local-data", "Local data"],
["diagnostics", "Diagnostics"], ["bug-reports", "Bug reports"],
["website", "Website"], ["website", "Website"],
["permissions", "Permissions"], ["permissions", "Permissions"],
["providers", "Service providers"], ["providers", "Service providers"],
@@ -29,9 +29,9 @@ export default function PrivacyPage() {
<h1>Privacy Policy</h1> <h1>Privacy Policy</h1>
<p> <p>
This policy explains what moves between devices, what stays local, and what is sent This policy explains what moves between devices, what stays local, and what is sent
only when you choose to share diagnostics or a bug report. only when you choose to submit a bug report.
</p> </p>
<p className="privacy-meta">Effective July 16, 2026 · Version 1.1</p> <p className="privacy-meta">Effective August 2, 2026 · Version 1.2</p>
</div> </div>
</section> </section>
@@ -56,7 +56,7 @@ export default function PrivacyPage() {
<p> <p>
VniDrop has no user accounts and does not upload your transfer to a VniDrop file VniDrop has no user accounts and does not upload your transfer to a VniDrop file
store. Files travel over an authenticated, end-to-end encrypted connection. store. Files travel over an authenticated, end-to-end encrypted connection.
Product diagnostics are opt-in; a bug report is sent only when you submit one. VniDrop has no telemetry or analytics; a bug report is sent only when you submit one.
</p> </p>
</div> </div>
@@ -64,7 +64,7 @@ export default function PrivacyPage() {
<h2>Scope and who VniDrop means</h2> <h2>Scope and who VniDrop means</h2>
<p> <p>
This policy covers the official VniDrop website, the VniDrop applications for This policy covers the official VniDrop website, the VniDrop applications for
Android, iOS, macOS, Windows, and Linux, and the diagnostics service configured by Android, iOS, macOS, Windows, and Linux, and the bug-report service configured by
the official project. For an official release, VniDrops data controller is the the official project. For an official release, VniDrops data controller is the
individual publisher named in the applicable app-store listing. In this policy, individual publisher named in the applicable app-store listing. In this policy,
VniDrop, we, and us also include the maintainers acting on that publishers VniDrop, we, and us also include the maintainers acting on that publishers
@@ -72,7 +72,7 @@ export default function PrivacyPage() {
</p> </p>
<p> <p>
VniDrop is open-source software. A build distributed or operated by someone else VniDrop is open-source software. A build distributed or operated by someone else
may use different networking infrastructure, diagnostics settings, or website may use different networking infrastructure, bug-report settings, or website
hosting. That distributor is responsible for explaining its own practices. hosting. That distributor is responsible for explaining its own practices.
</p> </p>
</section> </section>
@@ -117,9 +117,9 @@ export default function PrivacyPage() {
<ul> <ul>
<li>device identity and networking keys used to establish secure connections;</li> <li>device identity and networking keys used to establish secure connections;</li>
<li>active shares, transfer history, receiver requests, progress, and status;</li> <li>active shares, transfer history, receiver requests, progress, and status;</li>
<li>app preferences, including access and diagnostics choices;</li> <li>app preferences, including access choices;</li>
<li>download destinations and locally managed transfer data; and</li> <li>download destinations and locally managed transfer data; and</li>
<li>an anonymous installation identifier used only for diagnostics correlation.</li> <li>an anonymous installation identifier used only for bug-report correlation.</li>
</ul> </ul>
<p> <p>
This information remains until you remove the relevant history, stop or delete a This information remains until you remove the relevant history, stop or delete a
@@ -129,33 +129,27 @@ export default function PrivacyPage() {
</p> </p>
</section> </section>
<section id="diagnostics" className="policy-section"> <section id="bug-reports" className="policy-section">
<h2>Optional diagnostics and bug reports</h2> <h2>Optional bug reports</h2>
<h3>Automatic product diagnostics</h3>
<p> <p>
Official releases indicate in the app settings whether automatic product VniDrop has no automatic telemetry, usage analytics, or crash auto-reporting.
diagnostics are included. When included, automatic usage events and crash reports Nothing is sent to a bug-report service unless you explicitly submit a report.
are disabled until you enable Share diagnostics. If enabled, VniDrop may send an
anonymous installation ID, app version, platform, sparse event names and properties,
crash type and message, a redacted stack trace, timestamps, and recent in-app
breadcrumbs. You can turn this off at any time; doing so also removes pending local
crash reports.
</p> </p>
<h3>User-submitted bug reports</h3> <h3>User-submitted bug reports</h3>
<p> <p>
A bug report is separate from the diagnostics toggle and is sent only when you press A bug report is sent only when you press submit. It can contain what you say
submit. It can contain what you say happened, what you expected, reproduction steps, happened, what you expected, reproduction steps, an optional contact email, app and
an optional contact email, app and platform versions, an anonymous installation ID, platform versions, an anonymous installation ID, device name and model, operating
device name and model, operating system, network and battery information, recent system, network and battery information, and optional recent logs. You can exclude
breadcrumbs, and optional recent logs. You can exclude logs before submitting. logs before submitting.
</p> </p>
<h3>Data deliberately excluded</h3> <h3>Data deliberately excluded</h3>
<p> <p>
Automatic diagnostics are designed to exclude transfer contents, invitations, and Bug reports are designed to exclude transfer contents, invitations, and file paths.
file paths. Before diagnostic text or optional logs are sent, VniDrop applies rules Before optional logs are sent, VniDrop applies rules intended to redact invitation
intended to redact invitation tokens, endpoint identifiers, absolute paths, file and tokens, endpoint identifiers, absolute paths, file and content URIs, and platform
content URIs, and platform document identifiers. No redaction system is perfect, so document identifiers. No redaction system is perfect, so review anything you type
review anything you type into a bug report and avoid including secrets. into a bug report and avoid including secrets.
</p> </p>
</section> </section>
@@ -223,7 +217,7 @@ export default function PrivacyPage() {
<dt>Cloudflare</dt> <dt>Cloudflare</dt>
<dd> <dd>
Proxies website requests and provides DNS, security, and abuse controls. When Proxies website requests and provides DNS, security, and abuse controls. When
the optional diagnostics service is configured, it uses Cloudflare Workers, D1, the optional bug-report service is configured, it uses Cloudflare Workers, D1,
and R2. and R2.
</dd> </dd>
</div> </div>
@@ -300,11 +294,7 @@ export default function PrivacyPage() {
<td>Until you delete them, clear app data, or uninstall</td> <td>Until you delete them, clear app data, or uninstall</td>
</tr> </tr>
<tr> <tr>
<th scope="row">Pending local crash reports</th> <th scope="row">Server bug reports</th>
<td>Up to 30 days and 20 reports; deleted when diagnostics is disabled</td>
</tr>
<tr>
<th scope="row">Server diagnostics and bug reports</th>
<td>The current project configuration is 90 days, with scheduled deletion</td> <td>The current project configuration is 90 days, with scheduled deletion</td>
</tr> </tr>
<tr> <tr>
@@ -317,7 +307,7 @@ export default function PrivacyPage() {
<p> <p>
Operational backups, provider logs, and deletion backlogs may persist briefly beyond Operational backups, provider logs, and deletion backlogs may persist briefly beyond
the stated period where necessary for security, integrity, or legal obligations. If the stated period where necessary for security, integrity, or legal obligations. If
the production diagnostics retention configuration changes, this policy should be the production bug-report retention configuration changes, this policy should be
updated to match it. updated to match it.
</p> </p>
</section> </section>
@@ -325,7 +315,6 @@ export default function PrivacyPage() {
<section id="choices" className="policy-section"> <section id="choices" className="policy-section">
<h2>Your choices and rights</h2> <h2>Your choices and rights</h2>
<ul> <ul>
<li>Enable or disable Share diagnostics in VniDrop settings.</li>
<li> <li>
Submit a bug report only when you choose, omit contact information, and exclude Submit a bug report only when you choose, omit contact information, and exclude
logs. logs.
@@ -343,7 +332,7 @@ export default function PrivacyPage() {
<p> <p>
Depending on where you live, privacy law may provide rights to access, correct, Depending on where you live, privacy law may provide rights to access, correct,
delete, restrict, or object to processing of personal information. Because VniDrop delete, restrict, or object to processing of personal information. Because VniDrop
has no account and automatic diagnostics use an anonymous installation ID, we may has no account and bug reports use an anonymous installation ID, we may
not be able to connect a server record to you without additional information. Use not be able to connect a server record to you without additional information. Use
the contact method below and provide only what is needed to locate your submission. the contact method below and provide only what is needed to locate your submission.
</p> </p>
@@ -353,7 +342,7 @@ export default function PrivacyPage() {
<h2>Security</h2> <h2>Security</h2>
<p> <p>
VniDrop uses authenticated end-to-end encrypted connections, content verification, VniDrop uses authenticated end-to-end encrypted connections, content verification,
deny-by-default share access, bounded diagnostics payloads, redaction, and safe file deny-by-default share access, bounded bug-report payloads, redaction, and safe file
publishing that avoids silently replacing an existing file. No system can guarantee publishing that avoids silently replacing an existing file. No system can guarantee
absolute security. Keep invitations private, verify receiver names, keep your device absolute security. Keep invitations private, verify receiver names, keep your device
updated, and stop sharing when a transfer is finished. updated, and stop sharing when a transfer is finished.