Skip to content

Commit a606ca5

Browse files
gitcommit90claude
andcommitted
site: add Terms of Service, Privacy Policy, and contact email
- /terms and /privacy — generic, self-hosting-honest legal pages in the manual's visual style, effective July 24 2026 - contact email build@1helm.com surfaced on both pages, the manual footer, the legacy template footer, and a half-opacity legal line on the storybook's closing frame - routes served statically alongside / and /manual, added to the sitemap and to test/site.mjs coverage Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent ad37f08 commit a606ca5

10 files changed

Lines changed: 178 additions & 5 deletions

File tree

site/content.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,4 @@ export const pages = {
6060
"/docs/install/windows-wsl": installWsl, "/docs/self-hosting": selfHosting,
6161
};
6262
export const redirects = { "/download": "/download/macos", "/install": "/docs/getting-started", "/why": "/manifesto", "/architecture": "/docs/architecture" };
63-
export const sitemapPaths = ["/", "/manual", ...Object.keys(pages)];
63+
export const sitemapPaths = ["/", "/manual", "/terms", "/privacy", ...Object.keys(pages)];

site/manual.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,12 @@ <h2><span class="mark">FAQ</span></h2>
254254
<span>·</span>
255255
<a href="/github">GitHub ↗</a>
256256
<span>·</span>
257+
<a href="mailto:build@1helm.com">build@1helm.com</a>
258+
<span>·</span>
259+
<a href="/terms">Terms</a>
260+
<span>·</span>
261+
<a href="/privacy">Privacy</a>
262+
<span>·</span>
257263
<span>Free · open source · model-agnostic</span>
258264
</footer>
259265

site/privacy.html

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<meta name="description" content="Privacy policy for 1helm.com and the self-hosted 1Helm software: your workspace lives on your machine.">
7+
<title>1Helm — Privacy Policy</title>
8+
<link rel="icon" type="image/png" href="/assets/story/app-icon.png">
9+
<link rel="stylesheet" href="/assets/manual.css">
10+
</head>
11+
<body>
12+
13+
<header>
14+
<a class="brand" href="/"><img src="/assets/story/app-icon.png" alt="1Helm">1Helm</a>
15+
<nav>
16+
<a href="/">the story</a>
17+
<a href="/manual">manual</a>
18+
<a class="hide-sm" href="/github">GitHub ↗</a>
19+
<a href="/download/macos">Download</a>
20+
</nav>
21+
</header>
22+
23+
<div class="wrap single">
24+
<main>
25+
<h1 class="page-title">Privacy <span class="mark">Policy</span></h1>
26+
<p class="legal-meta">Effective date: July 24, 2026 · Contact: <a class="b plainlink" href="mailto:build@1helm.com">build@1helm.com</a></p>
27+
28+
<section>
29+
<h2><span class="mark">The short version</span></h2>
30+
<p>1Helm is self-hosted. Your workspace — messages, files, memory, threads, credentials, agents, and everything they produce — lives on <span class="b">your</span> machine. We don't operate your installation, we can't see into it, and we don't receive its contents.</p>
31+
</section>
32+
<section>
33+
<h2><span class="mark">This website</span></h2>
34+
<p>1helm.com has no accounts, no sign-ups, and sets no tracking cookies of its own. Like most web servers, it keeps standard operational logs (IP address, user agent, requested pages, timestamps) used only to run and secure the service, and reviewed only for that purpose. The site is delivered through Cloudflare, which processes requests under its own privacy policy.</p>
35+
</section>
36+
<section>
37+
<h2><span class="mark">Downloads</span></h2>
38+
<p>Releases are hosted on GitHub. When you download 1Helm, GitHub processes that request under GitHub's privacy policy.</p>
39+
</section>
40+
<section>
41+
<h2><span class="mark">Email</span></h2>
42+
<p>If you email <a class="b plainlink" href="mailto:build@1helm.com">build@1helm.com</a>, we receive your address and message. We use them to reply and for nothing else. We don't sell or share your information — there's nothing to sell.</p>
43+
</section>
44+
<section>
45+
<h2><span class="mark">Your self-hosted workspace</span></h2>
46+
<p>When your installation talks to AI model providers, the content you route to them is sent to those providers using <span class="b">your</span> accounts, under their terms and privacy policies. You choose which providers to connect and what to send. Provider credentials are stored on your machine, in host-owned storage — they never pass through us.</p>
47+
</section>
48+
<section>
49+
<h2><span class="mark">Changes &amp; contact</span></h2>
50+
<p>If this policy changes, the effective date above will be updated. Questions: <a class="b plainlink" href="mailto:build@1helm.com">build@1helm.com</a>.</p>
51+
</section>
52+
53+
</main>
54+
</div>
55+
56+
<footer>
57+
<a href="/">← back to the story</a>
58+
<span>·</span>
59+
<a href="/manual">the ship's manual</a>
60+
<span>·</span>
61+
<a href="mailto:build@1helm.com">build@1helm.com</a>
62+
<span>·</span>
63+
<a href="/terms">Terms</a>
64+
<span>·</span>
65+
<a href="/privacy">Privacy</a>
66+
</footer>
67+
68+
</body>
69+
</html>

site/public/assets/manual.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,7 @@
231231
header nav a.hide-sm { display: none; }
232232
}
233233
.plainlink { text-decoration: none; }
234+
235+
/* legal pages */
236+
.wrap.single { grid-template-columns: 1fr; max-width: 820px; }
237+
.legal-meta { color: #85857e; font-size: 0.95rem; margin: 0.6rem 0 2.2rem; }

site/public/assets/story.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,3 +533,11 @@
533533
.channel-shot { height: clamp(180px, 40vh, 360px); }
534534
.stack { display: flex; flex-direction: column; align-items: center; gap: 0.35rem; }
535535
.frame-inner.wide { max-width: 1200px; }
536+
537+
/* half-opacity legal line (final frame) */
538+
.legal {
539+
opacity: 0.5;
540+
font-size: clamp(0.8rem, 1.5vw, 0.95rem);
541+
color: var(--ink);
542+
}
543+
.legal a { color: inherit; }

site/server.mjs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const PRODUCT_PUBLIC = join(ROOT, "public");
1111
const pkg = JSON.parse(readFileSync(join(ROOT, "package.json"), "utf8"));
1212
const STORY_HTML = readFileSync(join(import.meta.dirname, "story.html"), "utf8");
1313
const MANUAL_HTML = readFileSync(join(import.meta.dirname, "manual.html"), "utf8");
14+
const STATIC_PAGES = { "/": STORY_HTML, "/manual": MANUAL_HTML, "/terms": readFileSync(join(import.meta.dirname, "terms.html"), "utf8"), "/privacy": readFileSync(join(import.meta.dirname, "privacy.html"), "utf8") };
1415
const VERSION = String(pkg.version || "");
1516
const HOST = process.env.SITE_HOST || "127.0.0.1";
1617
const PORT = Number(process.env.SITE_PORT || process.env.PORT || 8130);
@@ -92,8 +93,8 @@ const server = createServer((req, res) => {
9293
});
9394
return;
9495
}
95-
if (path === "/" || path === "/manual") {
96-
answer(res, 200, path === "/" ? STORY_HTML : MANUAL_HTML, {
96+
if (STATIC_PAGES[path]) {
97+
answer(res, 200, STATIC_PAGES[path], {
9798
"content-type": "text/html; charset=utf-8",
9899
"cache-control": "public, max-age=300, stale-while-revalidate=3600",
99100
});

site/story.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ <h1>Welcome <span class="mark">aboard</span>.</h1>
315315
<a class="cta ghost" href="/manual">Read the ship's manual</a>
316316
</div>
317317
<p class="specnote">Free. Open source. Model-agnostic. The Model-T of the modern age — get in, buckle up. We've got places to go.</p>
318+
<p class="legal">© 2026 1Helm · <a href="mailto:build@1helm.com">build@1helm.com</a> · <a href="/terms">Terms</a> · <a href="/privacy">Privacy</a></p>
318319
</div>
319320
</section>
320321

site/template.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ function footer(version) {
3131
<div><h2>Install</h2><a href="/docs/install/macos">Apple Silicon Mac</a><a href="/docs/install/linux">Linux & VPS</a><a href="/docs/install/windows-wsl">Windows + WSL</a><a href="/download/macos">Download v${esc(version)}</a></div>
3232
<div><h2>Project</h2><a href="/github">GitHub</a><a href="https://github.com/gitcommit90/1Helm/releases">Releases</a><a href="https://github.com/gitcommit90/1Helm/issues">Issues</a><a href="/docs/architecture">Architecture</a></div>
3333
</div>
34-
<div class="footer-floor"><span>Open source · self-hosted · your machines, your memory, your model fabric.</span><span>1Helm v${esc(version)}</span></div>
34+
<div class="footer-floor"><span>Open source · self-hosted · your machines, your memory, your model fabric.</span><span><a href="mailto:build@1helm.com">build@1helm.com</a> · <a href="/terms">Terms</a> · <a href="/privacy">Privacy</a> · 1Helm v${esc(version)}</span></div>
3535
</footer>`;
3636
}
3737

site/terms.html

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<meta name="description" content="Terms of service for the 1Helm website and the open-source, self-hosted 1Helm software.">
7+
<title>1Helm — Terms of Service</title>
8+
<link rel="icon" type="image/png" href="/assets/story/app-icon.png">
9+
<link rel="stylesheet" href="/assets/manual.css">
10+
</head>
11+
<body>
12+
13+
<header>
14+
<a class="brand" href="/"><img src="/assets/story/app-icon.png" alt="1Helm">1Helm</a>
15+
<nav>
16+
<a href="/">the story</a>
17+
<a href="/manual">manual</a>
18+
<a class="hide-sm" href="/github">GitHub ↗</a>
19+
<a href="/download/macos">Download</a>
20+
</nav>
21+
</header>
22+
23+
<div class="wrap single">
24+
<main>
25+
<h1 class="page-title">Terms of <span class="mark">Service</span></h1>
26+
<p class="legal-meta">Effective date: July 24, 2026 · Contact: <a class="b plainlink" href="mailto:build@1helm.com">build@1helm.com</a></p>
27+
28+
<section>
29+
<h2><span class="mark">1. Agreement</span></h2>
30+
<p>These terms apply to the 1Helm website (1helm.com) and to the 1Helm software you can download from it. By using the site or the software, you agree to them. If you don't agree, don't use them.</p>
31+
</section>
32+
<section>
33+
<h2><span class="mark">2. The software</span></h2>
34+
<p>1Helm is free, open-source software released under the <a class="b plainlink" href="https://github.com/gitcommit90/1Helm/blob/main/LICENSE">MIT License</a>. The full license text ships with the source code and governs your use, copying, modification, and redistribution of the software. In short: you can do nearly anything with it, and it comes with no warranty.</p>
35+
</section>
36+
<section>
37+
<h2><span class="mark">3. Self-hosting means it's yours</span></h2>
38+
<p>1Helm runs on your own hardware. You are the operator of your installation: your machine, your data, your backups, your uptime, and your security posture are your responsibility. You're also responsible for making sure your use of 1Helm — and anything your agents do at your direction — complies with the laws that apply to you.</p>
39+
</section>
40+
<section>
41+
<h2><span class="mark">4. Third-party services</span></h2>
42+
<p>1Helm connects to services you choose — AI model providers (such as ChatGPT, Claude, Gemini, or xAI accounts), Gmail, GitHub, Cloudflare, and others. Your use of those services is governed by their own terms, and you're responsible for keeping your accounts with them in good standing. 1Helm is not affiliated with or endorsed by those providers.</p>
43+
</section>
44+
<section>
45+
<h2><span class="mark">5. The website</span></h2>
46+
<p>This website exists to describe 1Helm and distribute its releases. Don't abuse it: no attempting to disrupt it, probe it beyond good-faith security research, or use it to distribute anything unlawful. Security issues can be reported privately via GitHub's vulnerability reporting for the 1Helm repository.</p>
47+
</section>
48+
<section>
49+
<h2><span class="mark">6. No warranty</span></h2>
50+
<p>The site and the software are provided <span class="b">"as is"</span>, without warranty of any kind, express or implied — including merchantability, fitness for a particular purpose, and non-infringement. AI models make mistakes; review consequential output before acting on it.</p>
51+
</section>
52+
<section>
53+
<h2><span class="mark">7. Limitation of liability</span></h2>
54+
<p>To the maximum extent permitted by law, the 1Helm contributors will not be liable for any indirect, incidental, special, consequential, or exemplary damages — including lost data, lost profits, or business interruption — arising from your use of the site or the software.</p>
55+
</section>
56+
<section>
57+
<h2><span class="mark">8. Changes</span></h2>
58+
<p>These terms may be updated from time to time; the effective date above reflects the latest revision. Continued use after a change means you accept the updated terms.</p>
59+
</section>
60+
<section>
61+
<h2><span class="mark">9. Contact</span></h2>
62+
<p>Questions about these terms: <a class="b plainlink" href="mailto:build@1helm.com">build@1helm.com</a>.</p>
63+
</section>
64+
65+
</main>
66+
</div>
67+
68+
<footer>
69+
<a href="/">← back to the story</a>
70+
<span>·</span>
71+
<a href="/manual">the ship's manual</a>
72+
<span>·</span>
73+
<a href="mailto:build@1helm.com">build@1helm.com</a>
74+
<span>·</span>
75+
<a href="/terms">Terms</a>
76+
<span>·</span>
77+
<a href="/privacy">Privacy</a>
78+
</footer>
79+
80+
</body>
81+
</html>

test/site.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ test("standalone 1helm.com website serves independent product and documentation
2424
const manual = await (await fetch(`${base}/manual`)).text();
2525
assert.match(manual, /The Ship's/);
2626
assert.match(manual, /Do I really need a dedicated computer/);
27-
for (const path of ["/manual", "/product", "/manifesto", "/security", "/faq", "/docs", "/docs/install/macos", "/docs/install/linux", "/docs/install/windows-wsl", "/docs/skills", "/docs/verification", "/docs/connections"]) {
27+
const privacy = await (await fetch(`${base}/privacy`)).text();
28+
assert.match(privacy, /build@1helm\.com/);
29+
assert.match(home, /build@1helm\.com/);
30+
for (const path of ["/manual", "/terms", "/privacy", "/product", "/manifesto", "/security", "/faq", "/docs", "/docs/install/macos", "/docs/install/linux", "/docs/install/windows-wsl", "/docs/skills", "/docs/verification", "/docs/connections"]) {
2831
const response = await fetch(base + path); assert.equal(response.status, 200, path);
2932
assert.match(response.headers.get("content-security-policy") || "", /default-src 'self'/);
3033
}

0 commit comments

Comments
 (0)