diff --git a/messages/de.json b/messages/de.json
index 15c2e8336..bb63290f5 100644
--- a/messages/de.json
+++ b/messages/de.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "Jemanden einladen",
"description": "Vor der Zustimmung wird nichts geteilt.",
+ "needsAccount": "Die Person braucht ein eigenes HealthLog-Konto auf dieser Instanz und findet die Einladung dort unter Einstellungen → Geteilter Zugriff.",
"identifierLabel": "Benutzername oder E-Mail",
"identifierPlaceholder": "Der Name, mit dem sie sich anmeldet",
"identifierHint": "Die Person braucht ein Konto auf dieser Instanz. An eine E-Mail-Adresse ohne Registrierung lässt sich keine Einladung schicken.",
diff --git a/messages/en.json b/messages/en.json
index 4fa5a0ba7..2ecd85fdf 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "Invite someone",
"description": "Nothing is shared until they accept.",
+ "needsAccount": "The person needs their own HealthLog account on this instance and will find the invitation under Settings → Shared access.",
"identifierLabel": "Username or e-mail",
"identifierPlaceholder": "The name they sign in with",
"identifierHint": "They need an account on this instance. Invitations cannot be sent to an e-mail address that has not registered.",
diff --git a/messages/es.json b/messages/es.json
index 964f472bf..527610e38 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "Invitar a alguien",
"description": "No se comparte nada hasta que acepte.",
+ "needsAccount": "La persona necesita su propia cuenta de HealthLog en esta instancia y encontrará la invitación en Ajustes → Acceso compartido.",
"identifierLabel": "Usuario o correo electrónico",
"identifierPlaceholder": "El nombre con el que inicia sesión",
"identifierHint": "Necesita una cuenta en esta instancia. No se pueden enviar invitaciones a una dirección que no se haya registrado.",
diff --git a/messages/fr.json b/messages/fr.json
index d1c5e8387..b8c3b73d3 100644
--- a/messages/fr.json
+++ b/messages/fr.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "Inviter quelqu'un",
"description": "Rien n'est partagé avant son acceptation.",
+ "needsAccount": "La personne a besoin de son propre compte HealthLog sur cette instance et trouvera l'invitation dans Paramètres → Accès partagé.",
"identifierLabel": "Nom d'utilisateur ou e-mail",
"identifierPlaceholder": "Le nom avec lequel elle se connecte",
"identifierHint": "Cette personne a besoin d'un compte sur cette instance. Une invitation ne peut pas être envoyée à une adresse non inscrite.",
diff --git a/messages/it.json b/messages/it.json
index c77cff0bc..a1ceb9da9 100644
--- a/messages/it.json
+++ b/messages/it.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "Invita qualcuno",
"description": "Nulla viene condiviso finché non accetta.",
+ "needsAccount": "La persona ha bisogno di un proprio account HealthLog su questa istanza e troverà l'invito in Impostazioni → Accesso condiviso.",
"identifierLabel": "Nome utente o e-mail",
"identifierPlaceholder": "Il nome con cui accede",
"identifierHint": "Serve un account su questa istanza. Non è possibile inviare inviti a un indirizzo non registrato.",
diff --git a/messages/ko.json b/messages/ko.json
index 33e6e738a..7772b8576 100644
--- a/messages/ko.json
+++ b/messages/ko.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "다른 사람 초대",
"description": "상대가 수락하기 전에는 아무것도 공유되지 않아요.",
+ "needsAccount": "상대방에게는 이 인스턴스의 HealthLog 계정이 필요하며, 초대는 설정 → 공유 접근에서 확인할 수 있습니다.",
"identifierLabel": "사용자 이름 또는 이메일",
"identifierPlaceholder": "로그인에 쓰는 이름",
"identifierHint": "이 인스턴스에 계정이 있어야 해요. 가입하지 않은 이메일 주소로는 초대를 보낼 수 없어요.",
diff --git a/messages/pl.json b/messages/pl.json
index d4ee7da18..cff8897c2 100644
--- a/messages/pl.json
+++ b/messages/pl.json
@@ -10327,6 +10327,7 @@
"invite": {
"title": "Zaproś kogoś",
"description": "Nic nie jest udostępniane, dopóki ta osoba nie zaakceptuje.",
+ "needsAccount": "Ta osoba potrzebuje własnego konta HealthLog na tej instancji i znajdzie zaproszenie w Ustawienia → Udostępniony dostęp.",
"identifierLabel": "Nazwa użytkownika lub e-mail",
"identifierPlaceholder": "Nazwa, którą się loguje",
"identifierHint": "Ta osoba potrzebuje konta na tej instancji. Nie można wysłać zaproszenia na niezarejestrowany adres.",
diff --git a/src/components/settings/access/__tests__/grant-invite-needs-account.test.tsx b/src/components/settings/access/__tests__/grant-invite-needs-account.test.tsx
new file mode 100644
index 000000000..142bfe887
--- /dev/null
+++ b/src/components/settings/access/__tests__/grant-invite-needs-account.test.tsx
@@ -0,0 +1,51 @@
+/**
+ * The grant card says where the invitation will turn up.
+ *
+ * A sharing invitation carries no link and nothing is e-mailed: it is
+ * addressed to a username or e-mail of an account that already exists here,
+ * and the person accepts it from inside their own session (`POST
+ * /api/account/grants/[id]/accept`). The card said the first half — the input
+ * hint already names the account requirement — and left the second half
+ * unsaid, so an inviter who then goes looking for a link to send has nothing
+ * to find and no reason to stop looking.
+ *
+ * SSR-only, per project convention.
+ */
+import { describe, expect, it, vi } from "vitest";
+import { renderToStaticMarkup } from "react-dom/server";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+
+import { I18nProvider } from "@/lib/i18n/context";
+
+vi.mock("@/hooks/use-auth", () => ({
+ useAuth: () => ({
+ user: { id: "u1", username: "owner", modules: {} },
+ isAuthenticated: true,
+ isLoading: false,
+ }),
+}));
+
+import { GrantInviteCard } from "../grant-invite-card";
+import en from "../../../../../messages/en.json";
+
+function render(): string {
+ return renderToStaticMarkup(
+