diff --git a/marketing/drafts/privacy-page.md b/marketing/drafts/privacy-page.md
index 72e6f77..f626bc8 100644
--- a/marketing/drafts/privacy-page.md
+++ b/marketing/drafts/privacy-page.md
@@ -1,6 +1,7 @@
-# `/privacy` — replacement copy, prepared and not applied
+# `/privacy` — replacement copy, FRE-354 corrections applied 2026-11-04
-**Status:** patch ready for the CTO's read. The page file is unchanged; nothing here is published.
+**Status:** applied on branch `faq/from-objections-2026-10-29` (commit after `bb6cf27`), per the CTO's FRE-354 verdict — "apply the corrections above and the page is signed." The two copy decisions the verdict delegated to the CMO are taken: the **fuller iPhone paragraph** (its push-token evidence row is recorded in the evidence table below and routed to FRE-333's owner to append to the signed inventory), and the **full (c) block with the LAN/tailnet sentence**, which pulls the corresponding Section 3 clause in. Nothing here is published; the sponsor's merge + push on card [`392a8465`](/FRE/issues/FRE-326#interaction-392a8465) is still the deploy step.
+**Sequencing fact this application rests on:** no The-Nook release tag contains FRE-355's merge (`6e74b261`; newest tag `v0.15.0` predates it), so every build in users' hands still starts Sentry unconditionally — paragraph (b) keeps the always-on form, and the *Contingency* swap is owed in the same commit that first ships FRE-355 in a release.
**Patch:** `marketing/drafts/privacy-page.patch` — applies cleanly to `c1c498e` (`git apply --check`, verified 2026-10-29; parse-checked with esbuild, not the site suite).
**Evidence base:** [FRE-333 `egress-inventory`](/FRE/issues/FRE-333#document-egress-inventory) rev 1, eleven destinations, file:line per row, read at `The-Nook` `3c3ba7ee`; and the same document's §G, which proposed a page text. This patch is the §G text **corrected against the inventory** — the differences are listed below, each with the row that forces it.
**Why this exists:** [FRE-326](/FRE/issues/FRE-326) + [FRE-334](/FRE/issues/FRE-334#document-decision) recorded option A — the privacy claim is withdrawn everywhere, and no privacy claim returns until the inventory exists, `/privacy` matches it, the CTO verifies both, and the sponsor approves the replacement copy. The inventory landed on 2026-10-29. This is the page half.
@@ -11,12 +12,12 @@
| Audience | Someone deciding whether to pay $10 for a tool that reads their prompts. They read this page *before* the FAQ. |
| Channel | `nook.freno.me/privacy`, one page |
| Owner | CMO (copy + commit), CTO (verification), sponsor (approval of the replacement copy), Chief of Staff (publish switch) |
-| Date | Prepared 2026-10-29. Target apply **2026-11-03**, in the same push as `c1c498e` (FRE-323) and the FRE-326 FAQ patch. Not a public date. |
+| Date | Prepared 2026-10-29. Applied 2026-11-04 on the branch with the FRE-354 corrections; `Last Updated` on the page reads the apply date (November 4, 2026) — re-check it against the actual deploy date at push. Not a public date. |
| What has to be true before it ships | 1) CTO signs the page against `The-Nook` HEAD, paragraph by paragraph — [FRE-354](/FRE/issues/FRE-354), due 2026-11-02. 2) Sponsor accepts the replacement copy. 3) The Sentry paragraph matches the build being deployed — see *Contingency*. 4) It deploys in the same push as the FAQ withdrawal; a page that discloses Sentry next to a FAQ that still says "anonymous usage telemetry" is worse than either alone. |
## What changed against the live page
-The live page (fetched 2026-10-29T09:2xZ and again 09:4xZ, HTTP 200, `Last Updated: August 26, 2026`, unchanged) says the app "runs locally on your device and sends only the minimal data required for trial and licensing" and lists four things. Against the inventory that is wrong in two directions: it **omits** Sentry (crash reports with IP address and macOS username, every launch, no off switch), the relay and its install ID, the licence key crossing to the relay, sealed phone payloads, weather coordinates going to the relay *and* to Apple, the GeoIP third parties, the speed test, the changelog fetch, bug-report contents and update checks. It also calls the hardware UUID "masked", which the code contradicts — it sends the raw `IOPlatformUUID`.
+The live page (fetched 2026-10-29T09:2xZ and again 09:4xZ, HTTP 200, `Last Updated: August 26, 2026`, unchanged) says the app "runs locally on your device and sends only the minimal data required for trial and licensing" and lists four things. Against the inventory that is wrong in two directions: it **omits** Sentry (crash reports with IP address, every launch, no off switch), the relay and its install ID, the licence key crossing to the relay, sealed phone payloads, weather coordinates going to the relay *and* to Apple, the GeoIP third parties, the speed test, the changelog fetch, bug-report contents and update checks. It also calls the hardware UUID "masked", which the code contradicts — it sends the raw `IOPlatformUUID`.
The replacement is organised by *connection*, not by *data type*, because that is how a reader checks it: eleven rows in the inventory, ten of them reachable from the page, one (Sentry) prominent because it is the only one with no off switch.
@@ -30,7 +31,7 @@ The replacement is organised by *connection*, not by *data type*, because that i
| 2 | (d) Weather: relay registration implied only with Phone | (d) adds that Weather registers **even with Phone off, and on a licensed Mac that registration presents the license key** | §A.3 + §D.2. `SidecarController.weather()` routes through the same `keystore.relayCredential(licenseKey:)` as the phone path (`SidecarController.swift:269-279`, `SidecarRelayAPI.swift:298-312`). §G under-disclosed it. |
| 3 | (a) trial/activate/status only | (a) adds `/deactivate` (key + UUID) and the trial email (email + UUID, sent once) | §A.2, `/D.4`. §G omitted both endpoints. |
| 4 | (i) "The email you give at trial start or checkout delivers your license key" | (i) checkout delivers the key; a trial email is one reminder before the trial ends | `LicenseService.submitTrialEmail` + `OnboardingExtrasStep` say the trial email is an expiry reminder; the key is issued at purchase. §G's sentence promised a key that the trial email does not deliver. |
-| 5 | (b) Sentry: opt-in, "off unless you turn it on" | (b) describes today's build: on every launch, no off switch, IP + macOS username; the opt-in form is the *Contingency* swap | The patch must be true on the build it deploys with. See *Contingency* for the sequence call. |
+| 5 | (b) Sentry: opt-in, "off unless you turn it on" | (b) describes the build users run today: on every launch, no off switch, IP address; the opt-in form is the *Contingency* swap | The patch must be true on the build it deploys with. See *Contingency* for the sequence call. FRE-354 removed the username: `sendDefaultPii` sets the IP only. |
| 6 | No (j) | (j) carries the CTO's FRE-322 §2 code fact, with the remote-machine exception | Not required for truth; it is the one favourable sentence, and the CTO may decline it. Delete the block if he does. |
Two facts the inventory corrected and the page does not repeat wrongly: Sparkle's automatic checks are **off by default** here (`UpdateManager` owns the schedule; FRE-322 §2.4 said "on by default" and is stale on this row), and the UUID is **raw, not masked**.
@@ -39,16 +40,17 @@ Two facts the inventory corrected and the page does not repeat wrongly: Sparkle'
| Paragraph | What it now says | Evidence at `3c3ba7ee` |
|---|---|---|
-| (a) Licensing/trial | raw UUID + device name; every launch while trialing; key-only once licensed; deactivate sends key + UUID; trial email sends email + UUID once; fails open | `LicenseService.swift:316-325` (`/trial`), `:277-290` (`/status`), `:247-262` (`/activate`), `:286-302` (`/deactivate`), `:219-231` (`/trial-email`) |
-| (b) Crash reporting | on for every launch, **no off switch**; carries IP + macOS username; never prompts or code | `Sources/NookApp/main.swift:272-279` — `sendDefaultPii = true`, `tracesSampleRate = 1.0`, no preference gates it |
-| (c) Phone relay | off by default; install ID + license key at registration; sealed payloads; relay sees devices/timing/volume, not content | `SidecarRelayAPI.swift:150-160`, `docs/sidecar-frames.md` (sealing), inventory §B |
+| (a) Licensing/trial | raw UUID + device name; every launch while trialing; key-only once licensed; deactivate sends key + UUID; trial email sends email + UUID once; trial/status fail open, activation needs a connection once | `LicenseService.swift:300-313` (`/trial`), `:271-284` (`/status`), `:247-262` (`/activate`), `:286-302` (`/deactivate`), `:219-231` (`/trial-email`) |
+| (b) Crash reporting | on for every launch, **no off switch**; carries IP address, plus session pings and a per-install Sentry ID; no username | `Sources/NookApp/main.swift:272-279` — `sendDefaultPii = true`, `tracesSampleRate = 1.0`, no preference gates it |
+| (c) Phone relay | off by default; relay is the default path, LAN/tailnet direct pairing available; install ID + license key at registration; sealed payloads; relay sees device IDs/names/platforms, timing and volume, not content | `SidecarRelayAPI.swift:144-153`, `SidecarPayload.swift:484-490`, `RemoteEndpoint.swift:14-24`, `docs/sidecar-frames.md` (sealing), inventory §B |
| (d) Weather | 0.1° grid snapped **on the Mac**; registers with the relay even with the phone off, licence key included on a licensed Mac; Apple sees place lookups and position | `WeatherForecast.swift:25-30`, `SidecarController.swift:269-279`, `SidecarRelayAPI.swift:298-312`, `WeatherLocation.swift:14-77`, `:89-143` |
| (e) Network panel | third-party IP lookup sees your IP; speed test uploads zeros only | `NetworkInfoService.swift:82,276`, `SpeedTest.swift:10-11,36` |
| (f) Update checks | ship **off**; turning them on fetches `freno.me`, app version + IP | `UpdateManager.swift:48-55` (`automaticallyChecksForUpdates = false`, default key false) |
| (g) Changelog | fetches release notes from `freno.me` | `ChangelogRelease.swift:75-78` |
| (h) Bug reports | user-sent only; machine snapshot listed in full | `BugReportClient.swift:44-94`, `BugReportSnapshot.swift:17-36` |
| (i) Email/payment | checkout email delivers the key; trial email is a reminder; Stripe | `LicenseService.swift:219-231`, `OnboardingExtrasStep.swift:86-110` |
-| (j) What does not leave your Mac | hook dials the local socket, bridge only listens, helper has no networking; two paths carry agent data across the network, both user-switched: remote machines over SSH and the sealed phone relay | `hook/transport.go:143` (`resolveBridge`), `BridgeBindPlan.swift:9-23`, inventory §B + §C |
+| (j) What does not leave your Mac | hook and bridge are not a cloud service; helper has no networking; two paths carry agent data across the network, both user-switched: remote machines over SSH or the tailnet, and the sealed phone relay | `hook/transport.go:143` (`resolveBridge`), `BridgeBindPlan.swift:9-23`, `RemoteEndpoint.swift:14-24`, inventory §B + §C |
+| iPhone companion (TestFlight beta) | same Sentry config as the Mac (IP only, no username, session pings); other traffic is the phone connection in (c) plus the APNs push token given to the relay | `ios/AgentNookMobile/App.swift:12-20`, `RelayLink.pair` `RelayLink.swift:104-118`, `updatePushToken` `:226-232` — row added per FRE-354; append to the FRE-333 inventory |
## Contingency — the Sentry paragraph is the only one that moves
@@ -58,7 +60,7 @@ Two facts the inventory corrected and the page does not repeat wrongly: Sparkle'
**Sequence call, and who owns it.** Shipping (b)-with-no-off-switch is honest, but it puts "no off switch" in front of a buyer during launch week. The better order is the build change first, then this page — that is a build/priority call, not mine: it is proposed on the board as [FRE-355](/FRE/issues/FRE-355) (Senior Engineer, date proposed 2026-11-06, CTO to confirm), and if the CTO says the build change cannot land before the page, the page ships with today's text. Publishing the truthful-today version is never *blocked* by that choice; the *preferred* order is the other way.
-**This is why (b) must not be softened on the way out.** If the opt-in setting ships but `sendDefaultPii` stays true, (b)'s opt-in form is false again (it says nothing about the username). The paragraph and the build change move together or neither does.
+**This is why (b) must not be softened on the way out.** If the opt-in setting ships but `tracesSampleRate` or session tracking stays on, (b)'s opt-in form is incomplete again — it names only "crash and error reports" while performance traces and session pings still flow. The paragraph and the build change move together or neither does. (FRE-354 rewrote this warning: the original named a macOS username that sentry-cocoa never sends.)
## If the CTO declines paragraph (j)
diff --git a/marketing/drafts/privacy-page.patch b/marketing/drafts/privacy-page.patch
index 11032ff..52f873b 100644
--- a/marketing/drafts/privacy-page.patch
+++ b/marketing/drafts/privacy-page.patch
@@ -1,8 +1,8 @@
diff --git a/src/routes/nook/privacy.tsx b/src/routes/nook/privacy.tsx
-index da0cc1d..f357ded 100644
+index da0cc1d..b6d6a27 100644
--- a/src/routes/nook/privacy.tsx
+++ b/src/routes/nook/privacy.tsx
-@@ -1,9 +1,17 @@
+@@ -1,9 +1,25 @@
/**
* The Nook privacy policy — `nook.freno.me/privacy`.
*
@@ -14,36 +14,46 @@ index da0cc1d..f357ded 100644
+ * destinations, file:line evidence per row. When the app's egress changes,
+ * this page changes in the same commit — not later.
+ *
-+ * The crash-reporting paragraph below describes the build that ships today:
++ * The crash-reporting paragraph below describes the build users run today:
+ * Sentry starts unconditionally in `Sources/NookApp/main.swift:272-279`, with
-+ * `sendDefaultPii = true`, and there is no off switch in Settings. If an
-+ * opt-in setting ships, paragraph (b) is replaced by the shorter form held in
-+ * `marketing/drafts/privacy-page.md` §"Contingency" in the same commit that
-+ * makes it true.
++ * `sendDefaultPii = true`, and there is no off switch in Settings. The opt-in
++ * build change is merged on The-Nook master (FRE-355, 6e74b261) but no release
++ * tag carries it yet, so the page must keep the always-on form until the first
++ * release that contains it — then paragraph (b) is replaced by the shorter
++ * form held in `marketing/drafts/privacy-page.md` §"Contingency" in the same
++ * commit that makes it true.
++ *
++ * Corrected against the CTO's /privacy verdict (FRE-354): no macOS username
++ * from Sentry (sendDefaultPii sets the IP only), session pings named, (a)
++ * fail-open scoped, (c) relay-path qualified with the direct-pair sentence,
++ * (j) "not a cloud service" with the tailnet path, the iPhone paragraph added
++ * (TestFlight beta is in users' hands), and section 3 says "content".
*/
import { buildMainSiteUrl } from "~/lib/subdomain-url";
import { PageHead } from "~/components/PageHead";
-@@ -21,39 +29,118 @@ export default function NookPrivacyPolicy() {
+@@ -21,39 +37,137 @@ export default function NookPrivacyPolicy() {
The Nook's Privacy Policy
-
Last Updated: August 26, 2026
-+
Last Updated: October 29, 2026
++
Last Updated: November 4, 2026
- Welcome to The Nook ('We', 'Us', 'Our').
- Your privacy is important to us. This policy explains what we collect,
- why, and how it is handled. The app itself runs locally on your device
- and sends only the minimal data required for trial and licensing.
-+ The Nook runs on your Mac. Your prompts, your code and your agent
-+ sessions are processed on your device. This page lists every
-+ connection the app makes over the network, what each one sends, and
++ The Nook runs on your Mac, and the iPhone and Apple Watch companion
++ is in TestFlight beta. Your prompts, your code and your agent
++ sessions are processed on your own devices. This page lists every
++ connection the apps make over the internet — and the local-network
++ and tailnet paths the phone can use — what each one sends, and
+ whether you can turn it off.
- 1. Data We Collect
-+ 1. What leaves your Mac
++ 1. What leaves your devices
@@ -57,37 +67,44 @@ index da0cc1d..f357ded 100644
+ hardware UUID and device name to our licensing server
+ (freno.me). The UUID enforces the 14-day trial and the 3-device
+ activation limit and stops a trial being reset by reinstalling
-+ the app; the device name is so you can recognize the Mac among
-+ your activations. While you are on the trial, this is sent at
-+ each launch. Once you are licensed, each launch re-checks only
-+ that your key has not been revoked. Deactivating a Mac sends the
-+ license key and that Mac's UUID. If you add an email during
-+ the trial, that request carries the email and the UUID, and it
-+ is sent once. All of these calls fail open: with no connection,
-+ the app keeps working, because license verification itself is
-+ offline.
++ the app; the device name is stored with the activation so the
++ Mac can be identified in your license records. While you are on
++ the trial, this is sent at each launch. Once you are licensed,
++ each launch re-checks only that your key has not been revoked.
++ Deactivating a Mac sends the license key and that Mac's
++ UUID. If you add an email during the trial, that request
++ carries the email and the UUID, and it is sent once. The trial
++ and status checks fail open: with no connection, an unexpired
++ trial or a stored license keeps working, because license
++ verification itself is offline. Activating a new license needs
++ a connection once.
+
+
+
(b) Crash and error reporting:
Crash
-+ reports, error events, hang reports and performance traces are
-+ sent to Sentry, our crash-reporting processor, and this is on
-+ for every launch in this version — there is no setting that
-+ turns it off. Each report carries the app version, the macOS
-+ version, the Mac model and what the app was doing when it
-+ failed, and Sentry also receives your IP address and your macOS
-+ username. Reports never include your prompts, your code or your
++ reports, error events, hang reports, session pings, and
++ performance traces are sent to Sentry, our crash-reporting
++ processor, and this is on for every launch in this version —
++ there is no setting that turns it off. Each report carries the
++ app version, the macOS version, the Mac model and what the app
++ was doing when it failed, and Sentry also receives your IP
++ address. Reports never include your prompts, your code or your
+ session content.
+
+
+
(c) Phone connection:
The phone
-+ connection ships off and is yours to enable. When you turn it
-+ on, your Mac registers with our relay (nook-relay.freno.me)
-+ using a random install ID, and a licensed Mac presents its
-+ license key once at registration. Everything your Mac and your
-+ phone then exchange — session updates, approvals, replies — is
-+ encrypted end-to-end: the relay routes it and cannot read it.
-+ The relay can see which devices are connected, when, and how
-+ much traffic they exchange.
++ connection ships off and is yours to enable. With the default
++ relay path, turning it on registers your Mac with our relay
++ (nook-relay.freno.me) using a random install ID, and a licensed
++ Mac presents its license key once at registration. Everything
++ your Mac and your phone then exchange — session updates,
++ approvals, replies — is encrypted end-to-end: the relay routes
++ it and cannot read it. On the relay path, the relay can see
++ which devices are connected — their IDs, names and platforms —
++ when, and how much traffic they exchange.
++
++
++ You can also pair over your LAN or tailnet instead; those paths
++ carry the same sealed traffic and do not use the relay.
+
+
+
(d) Weather:
If you add the Weather
@@ -122,11 +139,8 @@ index da0cc1d..f357ded 100644
+
+
(g) Changelog:
Opening Settings ›
+ Changelog fetches the release notes from freno.me.
-
-
--
(b) Device name:
The Nook sends your
-- Mac's name so you can recognize the device in your license
-- activations. It is not used for any other purpose.
++
++
+
(h) Bug reports:
only what you choose
+ to send. If you write a bug report, you decide what it says.
+ Bug reports also include a machine snapshot — macOS version, Mac
@@ -135,9 +149,9 @@ index da0cc1d..f357ded 100644
+ optional contact email is used only to reply to you.
--
(c) Email:
The email you provide at
-- checkout is used to deliver your license key and to look up your
-- order.
+-
(b) Device name:
The Nook sends your
+- Mac's name so you can recognize the device in your license
+- activations. It is not used for any other purpose.
+
(i) Your email and payment:
The email
+ you give at checkout delivers your license key and looks up your
+ order. An email you add during the trial is used for one
@@ -145,23 +159,36 @@ index da0cc1d..f357ded 100644
+ Stripe; we never see or store your card details.
+-
(c) Email:
The email you provide at
+- checkout is used to deliver your license key and to look up your
+- order.
++
(j) What does not leave your Mac:
The
++ hook and the bridge that connect your agents to The Nook are
++ not a cloud service: the hook dials the bridge on your Mac, and
++ the bridge only listens. Two paths carry agent data across the
++ network, and both are switched on by you: if you add a remote
++ machine, the hook on that machine dials this Mac over SSH or
++ your tailnet; and if you use the phone connection, the session
++ updates, approvals and replies described in (c) travel through
++ the relay, sealed end to end. The privileged helper that
++ controls fans and charging has no networking code at all.
+
+
-
(d) Payment:
Payments are processed by
- Stripe. We never see or store your card details.
-+
(j) What does not leave your Mac:
The
-+ hook and the bridge that connect your agents to The Nook talk to
-+ nothing but your Mac — the hook dials the local bridge socket,
-+ and the bridge only listens. Two paths carry agent data across
-+ the network, and both are switched on by you: if you add a
-+ remote machine, the hook on that machine dials this Mac over
-+ SSH; and if you use the phone connection, the session updates,
-+ approvals and replies described in (c) travel through the relay,
-+ sealed end to end.
-+ The privileged helper that controls fans and charging has no
-+ networking code at all.
++
The iPhone companion.
The iPhone and
++ Apple Watch app is in TestFlight beta. It runs the same Sentry
++ reporting: the app version, iOS version, iPhone model, session
++ pings and your IP address, with the same no-off-switch. Those
++ reports never include your prompts, code or session content.
++ Its other network traffic is the phone connection in (c) — the
++ relay, or a direct LAN/tailnet link — plus, if you allow
++ notifications, the push token it gives the relay so Apple can
++ deliver them.
-@@ -63,9 +150,11 @@ export default function NookPrivacyPolicy() {
+@@ -63,9 +177,11 @@ export default function NookPrivacyPolicy() {
2. How We Use It
@@ -176,7 +203,7 @@ index da0cc1d..f357ded 100644
-@@ -74,9 +163,11 @@ export default function NookPrivacyPolicy() {
+@@ -74,9 +190,13 @@ export default function NookPrivacyPolicy() {
3. Data Security
@@ -184,10 +211,12 @@ index da0cc1d..f357ded 100644
- to our servers uses TLS. Your license key is stored in the macOS
- Keychain on your Mac.
+ License keys are signed and verified with Ed25519 and stored in
-+ the macOS Keychain. Phone traffic is encrypted end-to-end with
-+ keys your own devices generate at pairing; our relay holds no key
-+ that can read it. Every connection described on this page uses
-+ TLS.
++ the macOS Keychain. The session content your Mac and phone
++ exchange is encrypted end-to-end with keys your devices generate
++ at pairing; our relay holds no key that can read it, though it
++ can read the routing metadata described in (c). Every internet
++ connection described on this page uses TLS; the direct
++ LAN/tailnet paths use the same end-to-end encryption.
diff --git a/src/routes/nook/privacy.tsx b/src/routes/nook/privacy.tsx
index f357ded..b6d6a27 100644
--- a/src/routes/nook/privacy.tsx
+++ b/src/routes/nook/privacy.tsx
@@ -6,12 +6,20 @@
* destinations, file:line evidence per row. When the app's egress changes,
* this page changes in the same commit — not later.
*
- * The crash-reporting paragraph below describes the build that ships today:
+ * The crash-reporting paragraph below describes the build users run today:
* Sentry starts unconditionally in `Sources/NookApp/main.swift:272-279`, with
- * `sendDefaultPii = true`, and there is no off switch in Settings. If an
- * opt-in setting ships, paragraph (b) is replaced by the shorter form held in
- * `marketing/drafts/privacy-page.md` §"Contingency" in the same commit that
- * makes it true.
+ * `sendDefaultPii = true`, and there is no off switch in Settings. The opt-in
+ * build change is merged on The-Nook master (FRE-355, 6e74b261) but no release
+ * tag carries it yet, so the page must keep the always-on form until the first
+ * release that contains it — then paragraph (b) is replaced by the shorter
+ * form held in `marketing/drafts/privacy-page.md` §"Contingency" in the same
+ * commit that makes it true.
+ *
+ * Corrected against the CTO's /privacy verdict (FRE-354): no macOS username
+ * from Sentry (sendDefaultPii sets the IP only), session pings named, (a)
+ * fail-open scoped, (c) relay-path qualified with the direct-pair sentence,
+ * (j) "not a cloud service" with the tailnet path, the iPhone paragraph added
+ * (TestFlight beta is in users' hands), and section 3 says "content".
*/
import { buildMainSiteUrl } from "~/lib/subdomain-url";
import { PageHead } from "~/components/PageHead";
@@ -29,17 +37,19 @@ export default function NookPrivacyPolicy() {
The Nook's Privacy Policy
-
Last Updated: October 29, 2026
+
Last Updated: November 4, 2026
- The Nook runs on your Mac. Your prompts, your code and your agent
- sessions are processed on your device. This page lists every
- connection the app makes over the network, what each one sends, and
+ The Nook runs on your Mac, and the iPhone and Apple Watch companion
+ is in TestFlight beta. Your prompts, your code and your agent
+ sessions are processed on your own devices. This page lists every
+ connection the apps make over the internet — and the local-network
+ and tailnet paths the phone can use — what each one sends, and
whether you can turn it off.
- 1. What leaves your Mac
+ 1. What leaves your devices
@@ -48,37 +58,44 @@ export default function NookPrivacyPolicy() {
hardware UUID and device name to our licensing server
(freno.me). The UUID enforces the 14-day trial and the 3-device
activation limit and stops a trial being reset by reinstalling
- the app; the device name is so you can recognize the Mac among
- your activations. While you are on the trial, this is sent at
- each launch. Once you are licensed, each launch re-checks only
- that your key has not been revoked. Deactivating a Mac sends the
- license key and that Mac's UUID. If you add an email during
- the trial, that request carries the email and the UUID, and it
- is sent once. All of these calls fail open: with no connection,
- the app keeps working, because license verification itself is
- offline.
+ the app; the device name is stored with the activation so the
+ Mac can be identified in your license records. While you are on
+ the trial, this is sent at each launch. Once you are licensed,
+ each launch re-checks only that your key has not been revoked.
+ Deactivating a Mac sends the license key and that Mac's
+ UUID. If you add an email during the trial, that request
+ carries the email and the UUID, and it is sent once. The trial
+ and status checks fail open: with no connection, an unexpired
+ trial or a stored license keeps working, because license
+ verification itself is offline. Activating a new license needs
+ a connection once.
(b) Crash and error reporting:
Crash
- reports, error events, hang reports and performance traces are
- sent to Sentry, our crash-reporting processor, and this is on
- for every launch in this version — there is no setting that
- turns it off. Each report carries the app version, the macOS
- version, the Mac model and what the app was doing when it
- failed, and Sentry also receives your IP address and your macOS
- username. Reports never include your prompts, your code or your
+ reports, error events, hang reports, session pings, and
+ performance traces are sent to Sentry, our crash-reporting
+ processor, and this is on for every launch in this version —
+ there is no setting that turns it off. Each report carries the
+ app version, the macOS version, the Mac model and what the app
+ was doing when it failed, and Sentry also receives your IP
+ address. Reports never include your prompts, your code or your
session content.
(c) Phone connection:
The phone
- connection ships off and is yours to enable. When you turn it
- on, your Mac registers with our relay (nook-relay.freno.me)
- using a random install ID, and a licensed Mac presents its
- license key once at registration. Everything your Mac and your
- phone then exchange — session updates, approvals, replies — is
- encrypted end-to-end: the relay routes it and cannot read it.
- The relay can see which devices are connected, when, and how
- much traffic they exchange.
+ connection ships off and is yours to enable. With the default
+ relay path, turning it on registers your Mac with our relay
+ (nook-relay.freno.me) using a random install ID, and a licensed
+ Mac presents its license key once at registration. Everything
+ your Mac and your phone then exchange — session updates,
+ approvals, replies — is encrypted end-to-end: the relay routes
+ it and cannot read it. On the relay path, the relay can see
+ which devices are connected — their IDs, names and platforms —
+ when, and how much traffic they exchange.
+
+
+ You can also pair over your LAN or tailnet instead; those paths
+ carry the same sealed traffic and do not use the relay.
(d) Weather:
If you add the Weather
@@ -131,16 +148,26 @@ export default function NookPrivacyPolicy() {
(j) What does not leave your Mac:
The
- hook and the bridge that connect your agents to The Nook talk to
- nothing but your Mac — the hook dials the local bridge socket,
- and the bridge only listens. Two paths carry agent data across
- the network, and both are switched on by you: if you add a
- remote machine, the hook on that machine dials this Mac over
- SSH; and if you use the phone connection, the session updates,
- approvals and replies described in (c) travel through the relay,
- sealed end to end.
- The privileged helper that controls fans and charging has no
- networking code at all.
+ hook and the bridge that connect your agents to The Nook are
+ not a cloud service: the hook dials the bridge on your Mac, and
+ the bridge only listens. Two paths carry agent data across the
+ network, and both are switched on by you: if you add a remote
+ machine, the hook on that machine dials this Mac over SSH or
+ your tailnet; and if you use the phone connection, the session
+ updates, approvals and replies described in (c) travel through
+ the relay, sealed end to end. The privileged helper that
+ controls fans and charging has no networking code at all.
+
+
+
The iPhone companion.
The iPhone and
+ Apple Watch app is in TestFlight beta. It runs the same Sentry
+ reporting: the app version, iOS version, iPhone model, session
+ pings and your IP address, with the same no-off-switch. Those
+ reports never include your prompts, code or session content.
+ Its other network traffic is the phone connection in (c) — the
+ relay, or a direct LAN/tailnet link — plus, if you allow
+ notifications, the push token it gives the relay so Apple can
+ deliver them.
@@ -164,10 +191,12 @@ export default function NookPrivacyPolicy() {
License keys are signed and verified with Ed25519 and stored in
- the macOS Keychain. Phone traffic is encrypted end-to-end with
- keys your own devices generate at pairing; our relay holds no key
- that can read it. Every connection described on this page uses
- TLS.
+ the macOS Keychain. The session content your Mac and phone
+ exchange is encrypted end-to-end with keys your devices generate
+ at pairing; our relay holds no key that can read it, though it
+ can read the routing metadata described in (c). Every internet
+ connection described on this page uses TLS; the direct
+ LAN/tailnet paths use the same end-to-end encryption.