Demo application for the March 2026 Forward JS presentation on passwordless logins:
- Email OTP to establish account identity
- Passkeys (WebAuthn) to authenticate without shared secrets
Links:
- Live demo: Passwordless Login Demo
- Source code: Passwordless Login Demo on Github
- Presentation: Creating a Passwordless User System
Passwords are a shared-secret liability. Even hashed password databases become breach targets, and users still end up juggling weak passwords or password managers.
This project demonstrates a simpler model:
- User signs up with username + email.
- App verifies ownership via email one-time code.
- User registers a passkey.
- Future logins use passkeys by default (with OTP fallback paths available in the demo).
Passkeys are effectively SSH-style public/private key auth in the browser. Private keys remain on user devices and are scoped to your relying party (rpId).
- TanStack Start + Router
- React + TypeScript
- Tailwind CSS + shadcn/ui
- SimpleWebAuthn (
@simplewebauthn/browserand@simplewebauthn/server) - SQLite + Drizzle ORM
Install sqlite:
# MacOS
brew install sqlite
# Linux
sudo apt-get install sqlite3
# Windows
choco install sqlite
Run app
pnpm install
pnpm db:init
pnpm devThe app runs on http://localhost:3100.
pnpm test
pnpm test:e2eThis repository is intended for learning and live demos.
- Do not deploy unmodified to production.
- Production hardening is intentionally incomplete (for example: rate limiting).
- Email delivery is simplified for demo flow verification.
Ben Houston, Sponsored by Land of Assets