Skip to content

docs: correct drift against privacytracker main - #2

Merged
AdamXweb merged 3 commits into
mainfrom
docs/accuracy-sweep-2026-08
Aug 9, 2026
Merged

docs: correct drift against privacytracker main#2
AdamXweb merged 3 commits into
mainfrom
docs/accuracy-sweep-2026-08

Conversation

@adamXbot

@adamXbot adamXbot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Audit of every page against the privacytracker tree at origin/main. Each item below was verified in the source, not inferred.

Wrong, not just stale

AUDITOR_DISABLE_AUTO_UPDATE does not exist. hardening.mdx told Tier 3 operators to set it in a launchd plist to stop the desktop auto-updater. There is no such variable anywhere in the codebase — the updater plugin is registered unconditionally in src-tauri/src/main.rs and plugins.updater.active is true. An operator following that guide gets a plist entry that does nothing and believes updates are off. Replaced with the two workarounds that do work (run Docker on those hosts, or block the update endpoint).

The env var table was missing the entire network-exposure surface. It listed three variables and stated "that's the entire surface area". PRIVACYTRACKER_ALLOWED_HOSTS, PRIVACYTRACKER_NETWORK_EXPOSED, PRIVACYTRACKER_TRUST_PROXY and PRIVACYTRACKER_BIND_HOST were undocumented — so someone putting the app on a LAN had nothing explaining why the browser cannot load it (Host allowlist), or that AUDITOR_ADMIN_TOKEN becomes mandatory once a non-loopback host is listed. Semantics taken from lib/deployment-trust.ts.

Chinese ships, and the docs said it doesn't. locales/zh.json is at exact key parity with en.json (4763 keys each) and i18n.ts declares SUPPORTED_LOCALES = ["en", "zh"]. The page said "today that means English only". Also corrected the resolution mechanism — the locale comes from the NEXT_LOCALE cookie, not from app settings.

Stale references

Was Now
tools/ios-app-import/ ×9 scripts/ios-app-import/ — there is no tools/ directory, so the cookbook's "clone just that directory" link 404s
blob/main/SECURITY.md blob/main/.github/SECURITY.md
tests/setup-env.ts tests/helpers/setup-env.ts
tests/profile-presets.test.ts tests/app/profile-presets.test.ts
tests/scraper.test.ts tests/app/scraper-fixture.test.ts

The scraper entry also had the wrong workflow: it told contributors to drop captured payloads into tests/fixtures/scraper/, which does not exist. The real pattern stubs global.fetch against an in-file payload.

Incomplete

develop/feature-flags.mdx described a "five-module split" under a warning not to break the layering. Seven modules exist — feature-flag-usage.ts and feature-flag-wired.ts were missing. Both are Developer-Options-only and affect nothing in resolution, which the new rows say explicitly.

Verification

node scripts/check-docs.mjs passes (39 linked files).

Not addressed here — needs a decision

  • The MCP server is undocumented. privacykey/pt-mcp (@privacytracker/mcp) registers 11 tools, its own README documents 4, and the package is not published to npm — so the npx -y @privacytracker/mcp instruction in that README does not work. Documenting it here first needs the publish question settled.
  • Multi-device tracking is undocumented. /dashboard/settings/devices plus 11 API routes (/api/devices/*, /api/device-sync/*, /api/device-actions/*) ship today with no prose page and no OpenAPI coverage.
  • The OpenAPI spec covers 58 of 110 routes. No phantom endpoints — everything documented exists — but the devices, imports-queue, shortlist and diagnostics families are absent.

Adam added 2 commits August 7, 2026 13:09
Verified every claim below against the privacytracker tree at origin/main.

Configuration
- Document the network-exposure env vars, which were entirely absent:
  PRIVACYTRACKER_ALLOWED_HOSTS, _NETWORK_EXPOSED, _TRUST_PROXY, _BIND_HOST.
  The page previously listed three variables and asserted "that's the entire
  surface area", so anyone exposing an instance beyond loopback had no
  documentation for the Host allowlist that blocks them, or for the admin
  token becoming mandatory once it is exposed.
- Document PRIVACYTRACKER_DATA_DIR, PRIVACYTRACKER_RUNTIME and WORKER_DISABLED.
- Drop NODE_V8_COVERAGE from the product config table; it is a Node flag.
- Chinese ships. locales/zh.json is at full key parity with en.json (4763
  keys) and i18n.ts declares SUPPORTED_LOCALES = ["en", "zh"], but the page
  claimed English only. Also correct the locale source: it resolves from the
  NEXT_LOCALE cookie, not from app settings.

Hardening / Tauri
- AUDITOR_DISABLE_AUTO_UPDATE does not exist anywhere in the codebase. The
  hardening guide told Tier 3 operators to set it in a launchd plist, which
  silently does nothing. Replace with the real position: the updater plugin
  is registered unconditionally and plugins.updater.active is true, so there
  is no opt-out — the workarounds are running Docker or blocking the update
  endpoint.

Feature flags
- The module table listed five modules; seven exist. Add feature-flag-usage.ts
  and feature-flag-wired.ts, noting neither affects resolution.

Dead references
- tools/ios-app-import/ -> scripts/ios-app-import/ (9 occurrences; the repo
  has no tools/ directory, so the cookbook's "clone just that directory"
  link 404s).
- SECURITY.md -> .github/SECURITY.md.
- tests/setup-env.ts -> tests/helpers/setup-env.ts.
- tests/profile-presets.test.ts -> tests/app/profile-presets.test.ts.
- tests/scraper.test.ts -> tests/app/scraper-fixture.test.ts, and describe the
  pattern that file actually uses (fetch stubbed against an in-file payload);
  there is no tests/fixtures/scraper/ directory to drop captures into.
The Plausible integration domain and three README/CONTRIBUTING links pointed
at docs.privacytracker.io, which is neither the agreed scheme nor a domain
that resolves. The convention across the estate is
docs.<product>.privacykey.org — docs-privacysentinel already uses it.
Devices shipped with no page at all — a settings screen, a two-phase re-sync
diff, and cfgutil backup/uninstall, none of it written down. Added under Get
Started, after Configuration.

Sourced from lib/devices.ts, lib/device-sync.ts, lib/device-actions.ts, the
nine device API routes, and the devices.* strings in locales/en.json.

Two things worth having in writing:

- Orphaning. Removing an app from its only device untracks it entirely and
  takes its history with it. The diff flags every such row with wouldOrphan,
  and the same sweep runs on device delete. Nobody could learn that from the
  docs before doing it.

- The uninstall gates. Audience must be self, flag.devopts.cfgutil_uninstall
  must be on (off by default), and a backup must be under 24h old. The
  audience gate is a deliberate product position — guardian mode cannot reach
  across and remove apps from a supervised device — and it deserved to be
  stated rather than left in a source comment.
@AdamXweb
AdamXweb merged commit 77b2080 into main Aug 9, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants