Skip to content

Commit ffd535f

Browse files
sjvrensburgclaude
andcommitted
docs: add privacy policy page for Microsoft Store submission
RailReader2 collects no data — the policy documents what is stored locally (config, annotations, recent files) and confirms no network requests are made. Added to sitemap and linked from all page footers. URL: https://sjvrensburg.github.io/railreader2/privacy.html Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 94ec07e commit ffd535f

4 files changed

Lines changed: 163 additions & 0 deletions

File tree

docs/guide.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,7 @@ <h3>Available tools</h3>
701701
<a href="index.html">Home</a> &middot;
702702
<a href="https://github.com/sjvrensburg/railreader2">Source</a> &middot;
703703
<a href="https://github.com/sjvrensburg/railreader2/releases">Releases</a> &middot;
704+
<a href="privacy.html">Privacy</a> &middot;
704705
MIT License
705706
</p>
706707
</footer>

docs/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ <h2>Keyboard Shortcuts</h2>
470470
railreader2 &mdash;
471471
<a href="https://github.com/sjvrensburg/railreader2">source</a> &middot;
472472
<a href="https://github.com/sjvrensburg/railreader2/releases">releases</a> &middot;
473+
<a href="privacy.html">privacy</a> &middot;
473474
MIT License
474475
</p>
475476
</footer>

docs/privacy.html

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
<!DOCTYPE html>
2+
<html lang="en" data-theme="dark">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Privacy Policy — railreader2</title>
7+
<meta name="description" content="Privacy policy for railreader2 — a desktop PDF viewer that collects no personal data.">
8+
<meta name="author" content="Stéfan Janse van Rensburg">
9+
<link rel="canonical" href="https://sjvrensburg.github.io/railreader2/privacy.html">
10+
<link rel="icon" href="img/logo.png" type="image/png">
11+
<link rel="sitemap" type="application/xml" href="sitemap.xml">
12+
<link rel="preconnect" href="https://fonts.googleapis.com">
13+
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700&family=Fira+Mono:wght@400;500&display=swap" rel="stylesheet">
14+
<link rel="stylesheet" href="style.css">
15+
</head>
16+
<body>
17+
18+
<a href="#main-content" class="skip-link">Skip to main content</a>
19+
20+
<header class="header">
21+
<div class="header__left">
22+
<span class="header__logo"><img src="img/logo.png" alt="railreader2 icon" width="59" height="32">railreader2</span>
23+
<nav>
24+
<a href="index.html">Home</a>
25+
<a href="guide.html">User Guide</a>
26+
<a href="https://github.com/sjvrensburg/railreader2">GitHub</a>
27+
</nav>
28+
</div>
29+
<button class="theme-toggle" onclick="toggleTheme()" aria-label="Toggle light/dark mode" title="Toggle light/dark mode">
30+
<span id="theme-icon"></span>
31+
</button>
32+
</header>
33+
34+
<main class="content" id="main-content">
35+
<h1>Privacy Policy</h1>
36+
<p class="subtitle">Last updated: 15 March 2026</p>
37+
38+
<section class="guide-section">
39+
<h2>Summary</h2>
40+
<p>
41+
<strong>railreader2 does not collect, transmit, or store any personal data.</strong>
42+
It is a fully offline desktop application. No analytics, no telemetry, no network
43+
requests, no accounts.
44+
</p>
45+
</section>
46+
47+
<section class="guide-section">
48+
<h2>Data stored locally</h2>
49+
<p>
50+
railreader2 stores the following data on your computer only, in the
51+
platform-standard application data directory:
52+
</p>
53+
<ul>
54+
<li><strong>Configuration</strong> &mdash; your settings (zoom thresholds, colour effects,
55+
UI preferences) in a JSON file. No personal information is included.</li>
56+
<li><strong>Annotations and bookmarks</strong> &mdash; highlights, notes, and bookmarks
57+
you create on PDF documents, stored as JSON files in the application data directory.</li>
58+
<li><strong>Recent files list</strong> &mdash; paths to recently opened PDFs, stored in
59+
the configuration file for convenience. These are local file paths only.</li>
60+
</ul>
61+
<p>
62+
None of this data leaves your computer. You can delete all stored data at any time
63+
via <strong>Help &rarr; Clean Up Temp Files</strong> in the application, or by
64+
removing the configuration directory manually:
65+
</p>
66+
<ul>
67+
<li><strong>Linux:</strong> <code>~/.config/railreader2/</code></li>
68+
<li><strong>Windows:</strong> <code>%APPDATA%\railreader2\</code></li>
69+
<li><strong>macOS:</strong> <code>~/Library/Application Support/railreader2/</code></li>
70+
</ul>
71+
</section>
72+
73+
<section class="guide-section">
74+
<h2>Network access</h2>
75+
<p>
76+
railreader2 makes <strong>no network requests</strong>. PDF rendering, layout analysis
77+
(via the bundled ONNX model), and all other features run entirely on your device.
78+
The application does not check for updates, send crash reports, or communicate with
79+
any server.
80+
</p>
81+
</section>
82+
83+
<section class="guide-section">
84+
<h2>Third-party services</h2>
85+
<p>
86+
railreader2 does not integrate with any third-party services, advertising networks,
87+
or analytics platforms.
88+
</p>
89+
<p>
90+
The optional <strong>AI Agent CLI</strong> (available only when building from source)
91+
can connect to an OpenAI-compatible API if you configure it with your own API key.
92+
This component is not included in the distributed application and is entirely
93+
opt-in. Your API key and any data sent to the API are governed by the respective
94+
API provider's privacy policy, not this one.
95+
</p>
96+
</section>
97+
98+
<section class="guide-section">
99+
<h2>Children's privacy</h2>
100+
<p>
101+
railreader2 does not collect any data from any user, including children.
102+
</p>
103+
</section>
104+
105+
<section class="guide-section">
106+
<h2>Changes to this policy</h2>
107+
<p>
108+
If this policy changes, the updated version will be posted at this URL. Since
109+
railreader2 collects no data, substantive changes are unlikely.
110+
</p>
111+
</section>
112+
113+
<section class="guide-section">
114+
<h2>Contact</h2>
115+
<p>
116+
For questions about this privacy policy, open an issue on
117+
<a href="https://github.com/sjvrensburg/railreader2/issues">GitHub</a>.
118+
</p>
119+
</section>
120+
121+
</main>
122+
123+
<footer class="footer">
124+
<p>
125+
railreader2 &mdash;
126+
<a href="index.html">Home</a> &middot;
127+
<a href="https://github.com/sjvrensburg/railreader2">Source</a> &middot;
128+
<a href="https://github.com/sjvrensburg/railreader2/releases">Releases</a> &middot;
129+
MIT License
130+
</p>
131+
</footer>
132+
133+
<script>
134+
function getPreferredTheme() {
135+
var stored = localStorage.getItem('rr2-theme');
136+
if (stored) return stored;
137+
return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';
138+
}
139+
140+
function applyTheme(theme) {
141+
document.documentElement.setAttribute('data-theme', theme);
142+
document.getElementById('theme-icon').textContent = theme === 'dark' ? '\u2600\uFE0F' : '\uD83C\uDF19';
143+
}
144+
145+
function toggleTheme() {
146+
var current = document.documentElement.getAttribute('data-theme');
147+
var next = current === 'dark' ? 'light' : 'dark';
148+
localStorage.setItem('rr2-theme', next);
149+
applyTheme(next);
150+
}
151+
152+
applyTheme(getPreferredTheme());
153+
</script>
154+
</body>
155+
</html>

docs/sitemap.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,10 @@
1212
<changefreq>monthly</changefreq>
1313
<priority>0.8</priority>
1414
</url>
15+
<url>
16+
<loc>https://sjvrensburg.github.io/railreader2/privacy.html</loc>
17+
<lastmod>2026-03-15</lastmod>
18+
<changefreq>yearly</changefreq>
19+
<priority>0.3</priority>
20+
</url>
1521
</urlset>

0 commit comments

Comments
 (0)