aboutsummaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-10-11 23:43:34 +0200
committerChristophe Besson <cbesson@gmail.com>2026-10-11 23:43:35 +0200
commitf6f107e02c7a4aa7326c9a82310a239327d81ed6 (patch)
tree2b7c891774460ab01593f17f490ed41fce1b5c91 /packages
parent1667fdcb1a621296eefc5ed90d846c1f77715c76 (diff)
downloadmeshbay-f6f107e02c7a4aa7326c9a82310a239327d81ed6.tar.gz
feat(hub): tell the person at sign-up what the hub keeps and why
A line under the Register button: creating an account accepts the hub's terms of use, and the law requires the hub to keep the connection log (IP address, date, action) for one year, even after the account is deleted. It links to the legal pages of the hub in use, so a self-hosted hub shows its own operator's documents. A notice, not a checkbox: the account rests on the contract and the log on a legal obligation, so there is no consent to ask for, and one that blocks sign-up would be neither free nor withdrawable. legalUrl() moves to platform.js, shared by the sidebar and the form. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'packages')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/app.js10
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/auth-page.js9
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/de.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/en.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/es.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/it.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js1
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/platform.js17
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/style.css8
14 files changed, 44 insertions, 10 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/app.js b/packages/meshbay-hub/src/meshbay_hub/static/app.js
index 579d1dd..b45903a 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/app.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/app.js
@@ -504,20 +504,12 @@ function Sidebar({ groups, presence, indexProgressPct, route, menuOpen, role, sh
})
}
</div>
- <a class="sidebar-legal" href="${legalUrl()}" target="_blank" rel="noopener">
+ <a class="sidebar-legal" href="${platform.legalUrl()}" target="_blank" rel="noopener">
${t('sidebar.legal')}</a>
</aside>
`;
}
-// The legal pages of the hub in use: the page's own origin in a browser, the
-// configured hub in the application. A new tab either way: the application
-// refuses to navigate away from its interface and hands a new window to the
-// system browser instead, and in a browser it keeps the session on screen.
-function legalUrl() {
- return `${platform.hubBase().replace(/\/$/, '')}/legal/`;
-}
-
// ── Home Page ────────────────────────────────────────────────────────────────
function NotificationFeed({ notifications, onMarkRead, onPurge }) {
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/auth-page.js b/packages/meshbay-hub/src/meshbay_hub/static/auth-page.js
index 57db475..e014f61 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/auth-page.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/auth-page.js
@@ -571,6 +571,11 @@ export function RegisterPage() {
`;
}
+ // The legal line under the button is a notice, not a checkbox. The account
+ // is held under the terms (a contract) and the connection log under a legal
+ // obligation; neither rests on consent, and a box nobody may leave unticked
+ // would be asking for one that is not free (GDPR art. 7.4) and could not be
+ // withdrawn — the log is kept for its year whatever the person answers.
return html`
<${AuthShell}>
<div class="card login-card">
@@ -609,6 +614,10 @@ export function RegisterPage() {
<button type="submit" disabled=${loading || (captcha.enabled && !captcha.token)}>
${loading ? t('register.loading') : t('register.submit')}
</button>
+ <p class="register-legal">
+ ${t('register.legal_notice')}
+ <a href=${platform.legalUrl()} target="_blank" rel="noopener">${t('sidebar.legal')}</a>
+ </p>
</form>
<div class="login-footer">
${t('register.has_account')} <a href="#/login">${t('register.login_link')}</a>
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js
index d8381e1..c190efa 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/de.js
@@ -66,6 +66,7 @@ export default {
'register.submit': 'Konto erstellen',
'register.loading': 'Konto wird erstellt …',
'register.has_account': 'Sie haben bereits ein Konto?',
+ 'register.legal_notice': "Mit dem Erstellen eines Kontos akzeptieren Sie die Nutzungsbedingungen dieses Hubs. Das Gesetz verpflichtet ihn, ein Protokoll Ihrer Verbindungen (IP-Adresse, Datum, Aktion) ein Jahr lang aufzubewahren, auch nach der Löschung Ihres Kontos.",
'register.login_link': 'Anmelden',
'register.recovery_title': 'Speichern Sie Ihren Wiederherstellungsschlüssel',
'register.recovery_intro': 'Dieser Schlüssel stellt Ihre Gruppenidentitäten wieder her, falls Sie jemals Ihre Passphrase vergessen. Bewahren Sie ihn in einem Passwortmanager oder an einem sicheren Ort auf.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js
index 07c885d..df85791 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/en.js
@@ -69,6 +69,7 @@ export default {
'register.submit': 'Register',
'register.loading': 'Creating account...',
'register.has_account': 'Already have an account?',
+ 'register.legal_notice': "By creating an account, you accept this hub's terms of use. The law requires it to keep a log of your connections (IP address, date, action) for one year, even after your account is deleted.",
'register.login_link': 'Login',
'register.recovery_title': 'Save your recovery key',
'register.recovery_intro': 'This key restores your group identities if you ever forget your passphrase. Store it in a password manager or somewhere safe.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js
index a6fb30f..50c08cc 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js
@@ -65,6 +65,7 @@ export default {
'register.submit': 'Crear la cuenta',
'register.loading': 'Creando la cuenta...',
'register.has_account': '¿Ya tiene una cuenta?',
+ 'register.legal_notice': "Al crear una cuenta, acepta las condiciones de uso de este hub. La ley le obliga a conservar durante un año el registro de sus conexiones (dirección IP, fecha, acción), incluso después de eliminar su cuenta.",
'register.login_link': 'Iniciar sesión',
'register.recovery_title': 'Guarde su clave de recuperación',
'register.recovery_intro': 'Esta clave restaura sus identidades de grupo si alguna vez olvida su frase de contraseña. Guárdela en un gestor de contraseñas o en un lugar seguro.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js
index c38be75..a56c9ef 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/fr.js
@@ -65,6 +65,7 @@ export default {
'register.submit': 'Créer le compte',
'register.loading': 'Création du compte...',
'register.has_account': 'Vous avez déjà un compte ?',
+ 'register.legal_notice': "En créant un compte, vous acceptez les conditions d'utilisation de ce hub. La loi l'oblige à conserver un an le journal de vos connexions (adresse IP, date, action), même après la suppression de votre compte.",
'register.login_link': 'Se connecter',
'register.recovery_title': 'Enregistrez votre clé de récupération',
'register.recovery_intro': "Cette clé restaure vos identités de groupe si vous oubliez un jour votre phrase secrète. Conservez-la dans un gestionnaire de mots de passe ou en lieu sûr.",
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js
index 05f903e..de071ee 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/it.js
@@ -66,6 +66,7 @@ export default {
'register.submit': "Crea l'account",
'register.loading': "Creazione dell'account...",
'register.has_account': 'Ha già un account?',
+ 'register.legal_notice': "Creando un account, accetta le condizioni d'uso di questo hub. La legge gli impone di conservare per un anno il registro delle sue connessioni (indirizzo IP, data, azione), anche dopo l'eliminazione dell'account.",
'register.login_link': 'Accedi',
'register.recovery_title': 'Salvi la sua chiave di recupero',
'register.recovery_intro': 'Questa chiave ripristina le sue identità di gruppo se dovesse dimenticare la passphrase. La conservi in un gestore di password o in un luogo sicuro.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js
index bd63b4f..d7261c6 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/ja.js
@@ -66,6 +66,7 @@ export default {
'register.submit': 'アカウントを作成',
'register.loading': 'アカウントを作成しています…',
'register.has_account': 'すでにアカウントをお持ちですか?',
+ 'register.legal_notice': "アカウントを作成すると、この hub の利用規約に同意したことになります。法律により、hub は接続ログ(IP アドレス、日時、操作)を、アカウント削除後も含めて 1 年間保存します。",
'register.login_link': 'ログイン',
'register.recovery_title': 'リカバリーキーを保存してください',
'register.recovery_intro': 'このキーは、パスフレーズを忘れた場合にグループの identity を復元します。パスワードマネージャーや安全な場所に保管してください。',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js
index eb6c6c2..a628fb9 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/nl.js
@@ -66,6 +66,7 @@ export default {
'register.submit': 'Account aanmaken',
'register.loading': 'Account wordt aangemaakt...',
'register.has_account': 'Hebt u al een account?',
+ 'register.legal_notice': "Door een account aan te maken, aanvaardt u de gebruiksvoorwaarden van deze hub. De wet verplicht hem een logboek van uw verbindingen (IP-adres, datum, handeling) een jaar lang te bewaren, ook nadat uw account is verwijderd.",
'register.login_link': 'Aanmelden',
'register.recovery_title': 'Bewaar uw herstelsleutel',
'register.recovery_intro': 'Deze sleutel herstelt uw groepsidentiteiten als u ooit uw wachtwoordzin vergeet. Bewaar hem in een wachtwoordmanager of op een veilige plek.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js
index 1b97dae..9014664 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/pl.js
@@ -69,6 +69,7 @@ export default {
'register.submit': 'Załóż konto',
'register.loading': 'Tworzenie konta...',
'register.has_account': 'Konto już istnieje?',
+ 'register.legal_notice': "Zakładając konto, akceptujesz warunki korzystania z tego huba. Prawo zobowiązuje go do przechowywania przez rok dziennika Twoich połączeń (adres IP, data, czynność), także po usunięciu konta.",
'register.login_link': 'Zaloguj',
'register.recovery_title': 'Zapisz swój klucz odzyskiwania',
'register.recovery_intro': 'Ten klucz przywraca Twoje tożsamości grupowe, jeśli kiedykolwiek zapomnisz hasło-frazę. Przechowuj go w menedżerze haseł lub w bezpiecznym miejscu.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js
index a680cc8..e6972fb 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js
@@ -67,6 +67,7 @@ export default {
'register.submit': 'Criar a conta',
'register.loading': 'Criando a conta...',
'register.has_account': 'Já tem uma conta?',
+ 'register.legal_notice': "Ao criar uma conta, você aceita os termos de uso deste hub. A lei o obriga a manter por um ano o registro das suas conexões (endereço IP, data, ação), mesmo depois que sua conta for excluída.",
'register.login_link': 'Entrar',
'register.recovery_title': 'Guarde sua chave de recuperação',
'register.recovery_intro': 'Esta chave restaura suas identidades de grupo caso você esqueça sua frase secreta. Guarde-a em um gerenciador de senhas ou em local seguro.',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js
index ae16098..96f7f5f 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/zh-CN.js
@@ -66,6 +66,7 @@ export default {
'register.submit': '注册',
'register.loading': '正在创建账户…',
'register.has_account': '已经有账户了?',
+ 'register.legal_notice': "创建账户即表示您接受此 hub 的使用条款。依照法律,它须将您的连接日志(IP 地址、日期、操作)保存一年,即使您的账户已被删除。",
'register.login_link': '登录',
'register.recovery_title': '保存您的恢复密钥',
'register.recovery_intro': '如果您忘记了密码短语,此密钥可恢复您的群组身份。请将其保存在密码管理器或安全的地方。',
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/platform.js b/packages/meshbay-hub/src/meshbay_hub/static/platform.js
index 47e3a72..95c3f3a 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/platform.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/platform.js
@@ -50,6 +50,21 @@ export function hubOrigin() {
return (base ? new URL(base).origin : window.location.origin);
}
+/**
+ * The legal pages of the hub in use — its terms of use and privacy statement,
+ * which are its operator's to write. A browser's own hub, or the configured one
+ * in the app, like `hubBase()`: a link to meshbay.org's would show somebody
+ * signing up elsewhere the commitments of an operator who is not theirs.
+ *
+ * Opened in a new tab wherever it is linked: the application refuses to
+ * navigate away from its interface and hands a new window to the system browser
+ * instead, and in a browser it keeps the session — or a half-filled sign-up
+ * form — on screen.
+ */
+export function legalUrl() {
+ return `${hubBase().replace(/\/$/, '')}/legal/`;
+}
+
/** Native-only capabilities. A browser renders none of what these gate. */
export const capabilities = {
// Install, configure and drive a node running on this machine.
@@ -759,7 +774,7 @@ export async function nativeKeys() {
return Boolean(keys && await keys.available());
}
-export default { isNative, hubBase, capabilities, secrets, nativeSave,
+export default { isNative, hubBase, legalUrl, capabilities, secrets, nativeSave,
apiFetch, device, bridgeMessage, folder, rootPicker, node,
cast, minimizeToTray, setTrayLabels, setUiLocale, keys, nativeKeys };
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/style.css b/packages/meshbay-hub/src/meshbay_hub/static/style.css
index 1b8dd8e..67d52b9 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/style.css
+++ b/packages/meshbay-hub/src/meshbay_hub/static/style.css
@@ -420,6 +420,14 @@ a:hover { text-decoration: underline; }
}
.sidebar-legal:hover { color: var(--accent); }
+.register-legal {
+ margin: 12px 0 0;
+ color: var(--text-dim);
+ font-size: 0.8em;
+ line-height: 1.45;
+}
+.register-legal a { white-space: nowrap; }
+
.sidebar-section { padding: 0 12px; margin-bottom: 24px; }
.sidebar-heading {