Skip to content

Understanding Passwordless Authentication

HomeStar uses passwordless magic link authentication instead of traditional passwords for favorites sync and account access.

A magic link is a single-use URL sent to your email that logs you in when clicked. No password to remember, no typing required.

Here’s how it works:

  1. You enter your email address
  2. We send you a unique link via email
  3. You click the link
  4. You’re instantly authenticated

That’s it. No password creation, no “forgot password” flow, no security questions.

No Passwords to Forget

Nothing to remember, nothing to write down, nothing to lose.

More Secure

Magic links expire in 15 minutes and work only once—can’t be reused or stolen.

Faster Access

Click the link and you’re in—no typing passwords on mobile keyboards.

Cross-Device Ready

Check email on your phone, click the link, instantly synced.

Traditional passwords have significant security issues:

  • Weak passwords — Users choose “password123” or reuse passwords
  • Phishing targets — Fake login pages steal passwords
  • Database breaches — Leaked password hashes can be cracked
  • Password reset flows — Often the weakest link in security

Magic links eliminate these vulnerabilities:

FeatureSecurity Benefit
Time-limitedLinks expire in 15 minutes, minimizing exposure window
Single-useOnce clicked, the link is invalidated—can’t be reused
Email verificationProves you control the email address
No stored secretsNo password hashes to leak in a database breach
Unique tokensEach link is cryptographically unique

Traditional authentication flow:

  1. Choose a password (minimum 8 characters, uppercase, lowercase, number, symbol)
  2. Retype password to confirm
  3. Inevitably forget password
  4. Click “Forgot password”
  5. Wait for reset email
  6. Create new password
  7. Forget new password
  8. Repeat

Magic link flow:

  1. Enter email
  2. Click link
  3. Done

Typing complex passwords on mobile keyboards is painful. Magic links eliminate this entirely—just tap the link in your email app.

Traditional flow: “Did I use my work email or personal email? Which password did I use?”

Magic link flow: “I’ll just use this email and click the link.”

When you request a magic link:

  1. Server generates a cryptographically secure random token
  2. Token is stored with your email and expiration timestamp
  3. Link is constructed: https://yoursite.com/auth/verify?token=abc123...
  4. Email is sent with the link

When you click the link:

  1. Server extracts the token from the URL
  2. Checks if token exists and hasn’t expired (15 minutes)
  3. Verifies token hasn’t been used before
  4. Issues a JWT session token for your browser
  5. Invalidates the magic link token
  6. Redirects you to the favorites page

After authentication:

  • JWT stored in localStorage — Authenticates future API requests
  • Session expires after 30 days — Security balance with convenience
  • Sign out available — Clears JWT and disconnects sync

We use your email only for authentication and favorites sync. Specifically:

  • ✅ Sending magic links
  • ✅ Syncing favorites across devices
  • ✅ Identifying your session
  • ❌ Marketing emails (unless you opt in separately)
  • ❌ Selling or sharing your email
  • ❌ Tracking your email activity

Our magic link emails don’t include tracking pixels or read receipts. We don’t know if you opened the email—only if you clicked the link.

We store only what’s necessary:

DataPurposeRetention
Email addressIdentify your accountUntil you delete account
Magic link tokenOne-time authentication15 minutes then deleted
JWT tokenSession authentication30 days or until sign out
Favorites listSync across devicesUntil you delete favorites

To prevent abuse, magic links are rate-limited:

  • 3 requests per 15 minutes per email address
  • 10 requests per hour per IP address

If you exceed this, you’ll see a message: “Too many requests. Please wait 15 minutes.”

This prevents:

  • Spam attacks on email addresses
  • Brute force token guessing
  • API abuse
AspectPasswordsMagic Links
SecurityWeak if reused or simpleStrong cryptographic tokens
User frictionHigh (create, remember, reset)Low (just click link)
Mobile UXPoor (typing complex passwords)Excellent (tap link)
Breach riskHigh (password hashes leaked)Low (no stored secrets)
Phishing riskHigh (fake login pages)Low (link contains auth)
AspectOAuthMagic Links
PrivacyShares data with third partyNo third party involved
DependencyRequires external accountJust need email
ComplexityMultiple redirectsSingle email click
Trust”Why does this need my Google?""Just my email? Cool.”
AspectSMS CodesMagic Links
ReliabilitySMS can be delayedEmail is more reliable
CostSMS costs moneyEmail is free
AccessibilityRequires phone numberWorks with any email
SecuritySIM swapping attacksEmail account compromise only
  1. Use a reliable email — Gmail, Outlook, etc. with good uptime
  2. Check spam folder — Magic links sometimes get filtered
  3. Click quickly — Links expire in 15 minutes
  4. Don’t share links — They authenticate as you
  5. Sign out on shared devices — Clears session token
  1. Monitor email delivery — Ensure magic links arrive promptly
  2. Whitelist sender — Work with email providers to avoid spam filters
  3. Clear email copy — Make it obvious what the link does
  4. Brand emails — Use your logo and colors for trust
  5. Respect privacy — Don’t use auth emails for marketing

For developers integrating magic link auth:

// Request magic link
async function requestMagicLink(email) {
const response = await fetch('/auth/magic-link', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email })
});
return response.json();
}
// Verify magic link token
async function verifyToken(token) {
const response = await fetch(`/auth/verify?token=${token}`);
const data = await response.json();
if (data.jwt) {
localStorage.setItem('idx_auth_token', data.jwt);
localStorage.setItem('idx_auth_email', data.email);
}
return data;
}
// Check auth state
function isAuthenticated() {
const token = localStorage.getItem('idx_auth_token');
if (!token) return false;
// Decode JWT and check expiration
const payload = JSON.parse(atob(token.split('.')[1]));
return payload.exp > Date.now() / 1000;
}

We’re exploring additional passwordless options:

  • WebAuthn/passkeys — Biometric authentication (fingerprint, Face ID)
  • Social OAuth — Optional Google/Facebook login
  • Remember this device — Extended sessions on trusted devices

These will be optional additions—magic links will always be the primary method.