diff --git a/helwasm/assets/fonts/Inter-400.woff2 b/helwasm/assets/fonts/Inter-400.woff2
new file mode 100644
index 0000000..91dc3e8
Binary files /dev/null and b/helwasm/assets/fonts/Inter-400.woff2 differ
diff --git a/helwasm/assets/fonts/Inter-500.woff2 b/helwasm/assets/fonts/Inter-500.woff2
new file mode 100644
index 0000000..91dc3e8
Binary files /dev/null and b/helwasm/assets/fonts/Inter-500.woff2 differ
diff --git a/helwasm/assets/fonts/Inter-600.woff2 b/helwasm/assets/fonts/Inter-600.woff2
new file mode 100644
index 0000000..91dc3e8
Binary files /dev/null and b/helwasm/assets/fonts/Inter-600.woff2 differ
diff --git a/helwasm/assets/fonts/JetBrainsMono-400.woff2 b/helwasm/assets/fonts/JetBrainsMono-400.woff2
new file mode 100644
index 0000000..2ca6ac6
Binary files /dev/null and b/helwasm/assets/fonts/JetBrainsMono-400.woff2 differ
diff --git a/helwasm/assets/fonts/JetBrainsMono-500.woff2 b/helwasm/assets/fonts/JetBrainsMono-500.woff2
new file mode 100644
index 0000000..2ca6ac6
Binary files /dev/null and b/helwasm/assets/fonts/JetBrainsMono-500.woff2 differ
diff --git a/helwasm/assets/fonts/Poppins-600.woff2 b/helwasm/assets/fonts/Poppins-600.woff2
new file mode 100644
index 0000000..e721556
Binary files /dev/null and b/helwasm/assets/fonts/Poppins-600.woff2 differ
diff --git a/helwasm/assets/fonts/Poppins-700.woff2 b/helwasm/assets/fonts/Poppins-700.woff2
new file mode 100644
index 0000000..568b553
Binary files /dev/null and b/helwasm/assets/fonts/Poppins-700.woff2 differ
diff --git a/helwasm/assets/fonts/text-security-disc.woff2 b/helwasm/assets/fonts/text-security-disc.woff2
new file mode 100644
index 0000000..658e00d
Binary files /dev/null and b/helwasm/assets/fonts/text-security-disc.woff2 differ
diff --git a/helwasm/index.html b/helwasm/index.html
index 50a00ae..0a48e59 100644
--- a/helwasm/index.html
+++ b/helwasm/index.html
@@ -5,17 +5,13 @@
LesS/KEY — password generator
+
-
-
-
+
@@ -49,6 +45,13 @@
master always produce the same password — so there is nothing secret to leak,
sync, or back up, and you only ever remember one phrase.
+
+ Private by design. Everything happens on your device. Your master
+ password and the passwords it generates are never sent anywhere, never stored on a
+ server, and never logged — there is no account, no sync, and no tracking. The app is a
+ single page plus a WebAssembly module, with its fonts bundled in; once it has loaded,
+ it makes no network requests at all.
+
Quick password
@@ -62,8 +65,9 @@
Console
The full command line — type help for every command. Your list of
- names lives only in this browser (localStorage); use Export /
- Import to move it (e.g. to and from a Notion page).
+ names lives only in this browser (localStorage), never on a server; use
+ Export / Import to move it yourself (e.g. to and
+ from a Notion page).
@@ -77,7 +81,7 @@
Runs the real hel engine compiled to WebAssembly — the exact same generator as the
- command-line tool. Nothing is ever sent to a server.
+ command-line tool. No server, no account, no tracking — nothing to leak.
@@ -88,8 +92,9 @@
Quick password
Deterministic — the same name + master always regenerate the same
- password. The result updates live as you type. Nothing is stored unless
- you press Store.
+ password. The result updates live as you type, entirely in your browser —
+ your master and the generated password never leave this device. Nothing is
+ stored unless you press Store.
@@ -132,6 +137,7 @@
@@ -470,7 +476,7 @@
bg.addEventListener("click", (e) => e.target === bg && bg.classList.remove("show"))
);
- appendLine('# LesS/KEY ready — runs the real hel core via WASM. Try: help');
+ appendLine('# LesS/KEY ready — runs entirely in your browser (WASM); nothing is sent to a server. Try: help');
}
boot();
diff --git a/helwasm/style.css b/helwasm/style.css
index 0c0f06e..325ab5e 100644
--- a/helwasm/style.css
+++ b/helwasm/style.css
@@ -20,14 +20,18 @@
--radius: 16px;
}
+/* Self-hosted fonts — bundled with the app so it makes NO external requests and
+ talks to no third party (no Google Fonts, no CDN). Latin subset only. */
+@font-face { font-family:"Poppins"; font-style:normal; font-weight:600; font-display:swap; src:url("./assets/fonts/Poppins-600.woff2") format("woff2"); }
+@font-face { font-family:"Poppins"; font-style:normal; font-weight:700; font-display:swap; src:url("./assets/fonts/Poppins-700.woff2") format("woff2"); }
+@font-face { font-family:"Inter"; font-style:normal; font-weight:400; font-display:swap; src:url("./assets/fonts/Inter-400.woff2") format("woff2"); }
+@font-face { font-family:"Inter"; font-style:normal; font-weight:500; font-display:swap; src:url("./assets/fonts/Inter-500.woff2") format("woff2"); }
+@font-face { font-family:"Inter"; font-style:normal; font-weight:600; font-display:swap; src:url("./assets/fonts/Inter-600.woff2") format("woff2"); }
+@font-face { font-family:"JetBrains Mono"; font-style:normal; font-weight:400; font-display:swap; src:url("./assets/fonts/JetBrainsMono-400.woff2") format("woff2"); }
+@font-face { font-family:"JetBrains Mono"; font-style:normal; font-weight:500; font-display:swap; src:url("./assets/fonts/JetBrainsMono-500.woff2") format("woff2"); }
/* Masked-secret font: dots glyphs so the real chars stay selectable/copyable.
WebKit/Blink use -webkit-text-security; Firefox falls back to this font. */
-@font-face {
- font-family: "text-security-disc";
- src: url("https://cdn.jsdelivr.net/npm/text-security/dist/text-security-disc.woff2") format("woff2"),
- url("https://cdn.jsdelivr.net/npm/text-security/dist/text-security-disc.woff") format("woff");
- font-display: swap;
-}
+@font-face { font-family:"text-security-disc"; font-display:swap; src:url("./assets/fonts/text-security-disc.woff2") format("woff2"); }
* { margin: 0; padding: 0; box-sizing: border-box; }
html { height: 100%; }
@@ -115,6 +119,13 @@ main { padding: clamp(20px, 3vw, 34px) 0 56px; display: grid; gap: clamp(16px, 2
.about-grid h4 { font-family: var(--disp); font-weight: 600; font-size: 14px; color: var(--ink); margin-bottom: 5px; }
.about-grid p { font-size: 13.5px; }
.about-note { font-family: var(--mono); font-size: 12px; margin-top: 10px; }
+/* Privacy callout — make the "no server" promise visually prominent. */
+.about-privacy {
+ margin: 6px 0 2px; padding: 13px 16px; border-radius: 12px;
+ border: 1px solid var(--line); border-left: 3px solid var(--ocean);
+ background: rgba(27, 65, 97, 0.045); color: var(--ink); font-size: 14.5px; max-width: 76ch;
+}
+.about-privacy strong { color: var(--ocean); }
@media (max-width: 680px) { .about-grid { grid-template-columns: 1fr; } }
/* Cards */