diff --git a/kez-chat/web/src/routes/Identity.svelte b/kez-chat/web/src/routes/Identity.svelte
index 03269ae..0444bbf 100644
--- a/kez-chat/web/src/routes/Identity.svelte
+++ b/kez-chat/web/src/routes/Identity.svelte
@@ -21,12 +21,25 @@
const failed = $derived(claims.filter((c) => c.last_verify?.status === "fail"));
const pending = $derived(claims.filter((c) => !c.last_verify));
+ // Verified badge requires at least this many independently-verified
+ // proofs. Kept in sync with VERIFY_MIN_PROOFS in Messages.svelte so the
+ // badge means the same thing on the profile and in chat.
+ const VERIFY_MIN_PROOFS = 2;
+ const isVerified = $derived(verified.length >= VERIFY_MIN_PROOFS);
+
onMount(async () => {
if (!session.unlocked) {
push("/unlock");
return;
}
claims = await listClaims();
+ // Publish our verified proof subjects to the server profile so peers
+ // can discover + independently verify them (drives our badge in their
+ // chat). Previously this only happened on a manual "reverify all", so
+ // verified users were invisible to peers until they clicked it.
+ if (claims.some((c) => c.last_verify?.status === "ok")) {
+ void publishVerifiedSubjects();
+ }
try {
registryRecord = await lookup(session.unlocked.handle);
} catch (e) {
@@ -109,7 +122,7 @@