-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhn-radar-privacy.html
More file actions
290 lines (247 loc) Β· 14.8 KB
/
Copy pathhn-radar-privacy.html
File metadata and controls
290 lines (247 loc) Β· 14.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Privacy Policy β NODUS HN Radar</title>
<link rel="canonical" href="https://nodus-ai.app/hn-radar-privacy" />
<link rel="stylesheet" href="hn-radar-privacy.css">
</head>
<body>
<nav>
<a class="nav-logo" href="https://nodus-ai.app">NODUS</a>
<a class="nav-back" href="hn-radar.html">β Back to HN Radar</a>
</nav>
<div class="hero">
<div class="hero-label">Legal Β· HN Radar</div>
<h1>Privacy Policy</h1>
<p>NODUS HN Radar browser extension Β· Last updated: July 2026 Β· v0.16.15</p>
</div>
<div class="page">
<!-- TOC -->
<div class="toc">
<div class="toc-title">Contents</div>
<ol>
<li><a href="#overview">Overview</a></li>
<li><a href="#local-data">Data stored locally on your device</a></li>
<li><a href="#endpoints">External endpoints explained</a></li>
<li><a href="#translation">In-browser translation</a></li>
<li><a href="#never">What we never do</a></li>
<li><a href="#rights">Your rights (LGPD / GDPR / CCPA)</a></li>
<li><a href="#contact">Contact</a></li>
</ol>
</div>
<!-- 1. OVERVIEW -->
<div class="section">
<span class="section-anchor" id="overview"></span>
<h2><span class="icon">π</span> 1. Overview</h2>
<div class="highlight">
<p><strong>NODUS HN Radar is a fully local-first browser extension.</strong> It enhances reading experience on news.ycombinator.com and surfaces rising posts via the public Hacker News API. There is no server, no account, no login, no cloud sync, and no telemetry.</p>
</div>
<p>This is a sibling product to the main NODUS extension (AI conversation capture) and to NODUS YT Radar. Each has its own separate privacy policy:</p>
<ul class="check">
<li>Main NODUS β <a href="privacy.html" style="color:#ff8c42;">privacy.html</a></li>
<li>YT Radar β <a href="yt-radar-privacy.html" style="color:#ff8c42;">yt-radar-privacy.html</a></li>
<li>HN Radar β this document</li>
</ul>
<p>HN Radar connects to three endpoints β two belonging to <strong>Hacker News itself</strong>, and one small NODUS server used only for a footer promotion:</p>
<div class="card">
<div class="card-title"><span class="badge badge-green">required</span> news.ycombinator.com</div>
<p>The site you are reading. The content script enhances pages you load yourself β no proactive fetching.</p>
</div>
<div class="card">
<div class="card-title"><span class="badge badge-green">required</span> hacker-news.firebaseio.com</div>
<p>Hacker News's public Firebase API. Used to fetch trending lists (Top / Show / Ask / Best) and individual item details for the Radar dashboard.</p>
</div>
<div class="card">
<div class="card-title"><span class="badge badge-green">new Β· v0.16.15</span> worker-ph-radar.mmcarvalho-dev.workers.dev</div>
<p>Powers a rotating banner in the extension's footer that cross-promotes other NODUS extensions (e.g. PH Radar). The extension sends only an opaque promotion ID when a banner is shown or clicked, used solely to count aggregate impressions/clicks. No personal data, browsing history, or Hacker News content is ever sent to this server.</p>
</div>
</div>
<!-- 2. LOCAL DATA -->
<div class="section">
<span class="section-anchor" id="local-data"></span>
<h2><span class="icon">πΎ</span> 2. Data stored locally on your device</h2>
<p>All of the following is stored in <code>chrome.storage.local</code> and never sent anywhere unless described in Section 3.</p>
<div class="storage-row">
<div class="storage-key">settings</div>
<div class="storage-desc">Your preferences: theme, font size, reading width, highlight toggles, interface language, translation settings, zebra color/intensity, etc.</div>
</div>
<div class="storage-row">
<div class="storage-key">visited</div>
<div class="storage-desc">Map of HN post IDs you have clicked from the front page, with timestamps. Used to gray out visited posts. 30-day TTL with auto-pruning.</div>
</div>
<div class="storage-row">
<div class="storage-key">pinned</div>
<div class="storage-desc">Posts you explicitly pinned via the π icon: id, title, url, domain, score snapshot, comments count, age text, tags, and pinned timestamp.</div>
</div>
<div class="storage-row">
<div class="storage-key">collapsedCards</div>
<div class="storage-desc">Map of pinned card IDs that you collapsed in the side panel, so the state persists across sessions.</div>
</div>
<div class="storage-row">
<div class="storage-key">recentTags</div>
<div class="storage-desc">List of the last 40 tag names you used, for the autocomplete suggestions when adding a new tag.</div>
</div>
<div class="storage-row">
<div class="storage-key">mutedDomains</div>
<div class="storage-desc">List of domains you chose to mute. Posts from those domains are hidden in the Radar.</div>
</div>
<div class="storage-row">
<div class="storage-key">radar</div>
<div class="storage-desc">Snapshots of HN post data (score, comment count) over time, used to compute velocity. Auto-pruned: only posts currently in trending lists are kept.</div>
</div>
<div class="storage-row">
<div class="storage-key">opActiveCache</div>
<div class="storage-desc">Cache of "Original Poster has replied" detection results per post ID. 10-minute TTL.</div>
</div>
<div class="storage-row">
<div class="storage-key">comments_<postId></div>
<div class="storage-desc">Cached top comments for posts you hovered to preview. 10-minute TTL.</div>
</div>
<div class="highlight" style="margin-top:24px;">
<p>Uninstalling the extension automatically clears all of the above. There is no user account, no email collection, and no way for NODUS to identify you from any of this data.</p>
</div>
</div>
<!-- 3. ENDPOINTS -->
<div class="section">
<span class="section-anchor" id="endpoints"></span>
<h2><span class="icon">π</span> 3. External endpoints explained</h2>
<p>The extension only fetches from three domains, all declared in <code>host_permissions</code> and visible to your browser before install.</p>
<h3>3a. Hacker News website</h3>
<div class="endpoint-block">
<div class="endpoint-header">
<span class="endpoint-url">https://news.ycombinator.com/*</span>
<span class="badge badge-green">content script only</span>
</div>
<div class="endpoint-body">
<p>The content script injects CSS and small DOM enhancements (pin buttons, type badges, translation buttons) on pages you load yourself. The extension does not proactively fetch HN pages in the background.</p>
<p class="data-sent"><strong>Data sent to HN by the extension:</strong> none beyond what your browser already sends when you load the site.</p>
</div>
</div>
<h3>3b. Hacker News public Firebase API</h3>
<div class="endpoint-block">
<div class="endpoint-header">
<span class="endpoint-url">https://hacker-news.firebaseio.com/v0/topstories.json</span>
<span class="badge badge-green">required</span>
</div>
<div class="endpoint-body">
<p>Returns the array of currently trending post IDs. Same source the official HN front page uses.</p>
<p class="data-sent"><strong>Data sent:</strong> nothing identifying β just the request.</p>
</div>
</div>
<div class="endpoint-block">
<div class="endpoint-header">
<span class="endpoint-url">β¦/v0/{best,show,ask}stories.json</span>
<span class="badge badge-green">required when tab active</span>
</div>
<div class="endpoint-body">
<p>Same as above for the Best, Show HN and Ask HN tabs of the Radar dashboard.</p>
</div>
</div>
<div class="endpoint-block">
<div class="endpoint-header">
<span class="endpoint-url">β¦/v0/item/<id>.json</span>
<span class="badge badge-green">required per post</span>
</div>
<div class="endpoint-body">
<p>Fetches public details for each post or comment shown in the Radar or in a hover preview.</p>
<p class="data-sent"><strong>Data sent:</strong> the post ID. No identifier of you.</p>
</div>
</div>
<p style="font-size:13px; color:#64748b;">Hacker News and Y Combinator may log these requests according to their own policies. The extension itself adds no headers, cookies, or auth.</p>
<h3>3c. NODUS ecosystem cross-promo (worker-ph-radar)</h3>
<div class="endpoint-block">
<div class="endpoint-header">
<span class="endpoint-url">GET https://worker-ph-radar.mmcarvalho-dev.workers.dev/cross-promo?target=hn-radar</span>
<span class="badge badge-green">required for footer banner</span>
</div>
<div class="endpoint-body">
<p>Fetches the pool of active NODUS ecosystem promotions to show in the extension's footer (e.g. an ad for PH Radar). Refreshed at most every 10 minutes, cached locally in between.</p>
<p class="data-sent"><strong>Data sent:</strong> nothing identifying β just the request. No post IDs, browsing data, or HN content.</p>
</div>
</div>
<div class="endpoint-block">
<div class="endpoint-header">
<span class="endpoint-url">POST β¦/cross-promo/impression Β· POST β¦/cross-promo/click</span>
<span class="badge badge-green">optional Β· technical/interaction only</span>
</div>
<div class="endpoint-body">
<p>Sent when a footer promotion is shown or clicked, purely to count aggregate impressions/clicks for that promotion.</p>
<p class="data-sent"><strong>Data sent:</strong> a single opaque promotion ID (e.g. <code>cross-hn-to-ph</code>). No user identifier, IP-based profile, or personal data of any kind is attached or stored against you.</p>
</div>
</div>
</div>
<!-- 4. TRANSLATION -->
<div class="section">
<span class="section-anchor" id="translation"></span>
<h2><span class="icon">π</span> 4. In-browser translation</h2>
<div class="highlight">
<p><strong>Translations happen entirely on your device.</strong> HN Radar uses Chrome's built-in Translator API (Chrome 138+), which downloads a small language model locally on first use and translates text without sending it to any server.</p>
</div>
<p>This means:</p>
<ul class="check">
<li>No text leaves your browser when translating.</li>
<li>No API key, no cost, no usage tracking.</li>
<li>Translation works offline once the language pair model is downloaded.</li>
<li>Cache of translations is local-only and cleared with the extension.</li>
</ul>
<p>If your browser does not support the Translator API (Firefox or older Chrome), the translation features simply do nothing β there is no fallback to any cloud translation service.</p>
</div>
<!-- 5. NEVER -->
<div class="section">
<span class="section-anchor" id="never"></span>
<h2><span class="icon">π«</span> 5. What we never do</h2>
<ul class="check cross">
<li>Sell your data to any third party</li>
<li>Send anything that identifies you to NODUS servers (only an opaque promotion ID, for the footer banner's aggregate stats)</li>
<li>Track which posts you read, click, or pin</li>
<li>Track websites you visit outside news.ycombinator.com</li>
<li>Use third-party analytics or advertising SDKs</li>
<li>Read or store your HN comments, replies, or account data</li>
<li>Access microphone, camera, clipboard, or downloads</li>
<li>Inject ads or affiliate links</li>
<li>Require an account, login, or email</li>
<li>Sync your tags, pins, or preferences to any cloud</li>
</ul>
</div>
<!-- 6. RIGHTS -->
<div class="section">
<span class="section-anchor" id="rights"></span>
<h2><span class="icon">βοΈ</span> 6. Your rights (LGPD / GDPR / CCPA)</h2>
<p>HN Radar is compliant with the Brazilian LGPD, the EU GDPR, and compatible with CCPA. Since all data is local and the extension does no profiling or cross-site tracking, most rights are exercised directly through your browser.</p>
<h3>Rights you have</h3>
<ul class="check">
<li><strong>Access</strong> β All local data is visible at <code>chrome://extensions</code> β HN Radar β Inspect views β Application β Storage</li>
<li><strong>Deletion</strong> β Uninstalling the extension clears everything. You can also clear just the extension's data in your browser settings</li>
<li><strong>Portability</strong> β Local data is plain JSON in <code>chrome.storage.local</code>; you can export it from DevTools</li>
<li><strong>Opt-out</strong> β Disable the Lens master toggle at any time to stop all DOM modifications. Close the side panel to stop Radar fetches</li>
</ul>
<h3>Legal basis for processing</h3>
<p>Reading the public HN site and the public HN Firebase API is processed under <strong>legitimate interest</strong> (delivering the reading-layer feature you opted into by installing the extension). No personally identifying data is processed at all.</p>
</div>
<!-- 7. CONTACT -->
<div class="section">
<span class="section-anchor" id="contact"></span>
<h2><span class="icon">βοΈ</span> 7. Contact</h2>
<p>For privacy questions or feature requests:</p>
<div class="card">
<div class="card-title">π§ Email</div>
<p>mmcarvalho.dev@gmail.com</p>
</div>
<div class="card">
<div class="card-title">π Project site</div>
<p><a href="hn-radar.html" style="color:#ff8c42;">nodus-ai.app/hn-radar</a></p>
</div>
<p style="margin-top:24px; font-size:13px; color:#475569;">This policy may be updated when new features are added. Material changes will be noted in the extension's release notes on the Chrome Web Store and Firefox AMO. Continued use after a policy change constitutes acceptance of the updated policy.</p>
</div>
</div>
<footer>
<p>Β© 2026 NODUS Β· <a href="https://nodus-ai.app">Home</a> Β· <a href="hn-radar.html">HN Radar</a> Β· <a href="privacy.html">NODUS Privacy</a> Β· HN Radar Privacy</p>
</footer>
<script src="lang-switcher.js"></script>
<script src="/products-menu.js" defer></script>
<script src="/resources-menu.js" defer></script>
<script src="/about-menu.js" defer></script>
</body>
</html>