From dd2ee4b77e95d647afe14e6fbf7320bb4c3fd240 Mon Sep 17 00:00:00 2001
From: martbost
Date: Wed, 9 Sep 2026 05:32:30 -0500
Subject: [PATCH] One way in: email sign-in only; wallet-only sessions finish
setup by email
- Remove the "sign in with just your wallet" door from the sign-in card.
- A wallet-only session (no account) is walked to the email card with a
finish-setup note; verifying the code links that wallet to the account
and retires the wallet-only session, so member #, purchases and payouts
stay attached and username/profile work.
Co-Authored-By: Claude Fable 5.1
---
public/assets/my.js | 16 +++++-----------
public/my.html | 6 +++---
server.js | 13 ++++++++++++-
3 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/public/assets/my.js b/public/assets/my.js
index d1b850e..123ef64 100644
--- a/public/assets/my.js
+++ b/public/assets/my.js
@@ -467,9 +467,13 @@
async function render() {
const me = await IAP.refreshNavWallet();
- const signedIn = me && me.signedIn;
+ // one way in: email. A wallet-only session (no account) is sent back to the
+ // email card with a finish-setup note; verifying the code links that wallet.
+ const walletOnly = !!(me && me.signedIn && !me.email);
+ const signedIn = me && me.signedIn && !walletOnly;
$('authArea').hidden = !!signedIn;
$('memberArea').hidden = !signedIn;
+ if ($('mcFinish')) $('mcFinish').hidden = !walletOnly;
if (!signedIn) return;
if ($('adminLink')) $('adminLink').hidden = !me.isAdmin; // admin portal link, only for ADMIN_EMAIL
setPane(location.hash.slice(1) || 'overview');
@@ -1403,16 +1407,6 @@
if (!(await showGauntlet())) await showLoginAd(); // welcome tour outranks the login ad
await render();
}));
- $('walletSigninLink').addEventListener('click', async e => {
- e.preventDefault();
- try {
- IAP.status('Check your wallet for the free sign-in signature…');
- await IAPWallet.signIn();
- IAP.status('Signed in with your wallet.', 'ok');
- if (!(await showGauntlet())) await showLoginAd(); // welcome tour outranks the login ad
- await render();
- } catch (err) { IAP.status((err && err.message) || String(err), 'bad'); }
- });
$('linkBtn').addEventListener('click', busy($('linkBtn'), async () => {
IAP.status('Check your wallet for the free link signature…');
await IAPWallet.signIn(); // server binds the wallet to the signed-in email account
diff --git a/public/my.html b/public/my.html
index 5c27005..34ebe2d 100644
--- a/public/my.html
+++ b/public/my.html
@@ -27,6 +27,8 @@
+
Your wallet is signed in, but it has no account yet.
+ Add your email to finish setting up. Your wallet, member number and purchases stay attached.
Sign in or join free
Type your email and we send a 6-digit code. No password to invent,
no password to forget. New emails get a free account automatically.