Bulwark Mobile · sign-in redesign

Three fields nobody knows the answer to

The current sign-in screen opens with a Server URL field. Most people don't know their JMAP endpoint, and the two paths that don't require knowing it — the webmail handoff and the QR code — sit below a divider, greyed out until the URL is filled in anyway. This proposes an entry screen that leads with the easy paths and asks for a server only when we genuinely can't work it out.

src/screens/LoginScreen.tsx expo · react-native light + dark, both shown

What changes


To reach the inbox
3 fields typed1 field, or none with a code
Server URL
Asked first, alwaysLooked up from the address
Password in the app
Default pathFallback only
QR sign-in
Ghost button, disabledFirst option offered

Today

Everything at once, in the least helpful order. The webmail handoff is the safer route — it never puts a password into the app — but it's disabled until you've supplied the server, so it can't rescue anyone who's stuck.


Bulwark Mail

Secure. Private. Yours.

Server URL
https://mail.example.com
Email or Username
you@example.com
Password
Enter your password
Sign In
or continue with
Sign in via webmail
Bulwark Mobile v1.4.0
Privacy Policy
Current build One screen, six controls

The two disabled controls at the bottom are the ones that would have helped. Nothing tells you where to find a server URL, and nothing happens if you don't have one.

Proposed flow

One question per screen, cheapest question first. The screens below are the happy path, left to right.


Bulwark Mail

Secure. Private. Yours.

Scan a sign-in code Already signed in on the web? Fastest way in.
Use my email address We'll find your mail server
Bulwark Mobile v1.4.0
Privacy Policy
Step 1 Pick a way in

Two live options instead of six mixed ones. Each tile says what it costs you before you tap it. Manual setup stays reachable in one tap — it just isn't the greeting.

What's your email address?

That's usually all we need — we'll look up the mail server for you.

ada@example.com

Works with Bulwark, Stalwart, and any JMAP mail server.

Continue
Step 2 One field, keyboard already up

Autofocus with the email keyboard, autocorrect off. The button stays enabled and validates on tap, so nobody is left staring at a dead grey button wondering which field is wrong.

Found your mail server

Next you'll sign in on your provider's own page.

mail.example.com JMAP · secure connection
Your password is typed on your provider's page, never into this app. Bulwark stores a token it can revoke.
Continue
Step 3 Confirm before the browser opens

A browser jump with no warning feels like a bug. Naming the server first — and saying why the password isn't asked for here — turns the detour into a security feature.

Bulwark Mail

mail.example.com Done
Sign in to Bulwark
Email
ada@example.com
Password
••••••••••
Sign in
or
Continue with passkey
Step 4 The provider's page, in a sheet

This is the existing runWebmailHandoff flow, unchanged. It already supports whatever the server offers — password, OAuth, passkeys, SSO — which the in-app form never will.

AL

Welcome back, Ada

ada@example.com

Mailboxes
Recent mail
Contacts and calendars
Step 5 Land on progress, not a spinner

The first sync is the slowest moment in the app. Naming what's arriving makes the wait legible, and the inbox opens as soon as mailboxes land — the rest fills in behind it.

When it doesn't go smoothly

Self-hosted servers, typo'd passwords, and second accounts are the normal case for this audience, not the exception. These four screens carry most of the redesign's weight.


Sign-in code

Open Bulwark on your computer

Settings → Devices → Add phone shows a code. Point the camera at it.

Path A The scanner tells you where the code is

A scanner with no instructions is a dead end for anyone who hasn't seen the webmail's Devices page. Redeeming a paired code skips the browser entirely — see redeemPairingCode.

Where does your mail live?

We couldn't find a server for example.org. If you self-host, the address is the one you use for webmail.

Server address
mail.example.org

Same address you type in the browser. We'll add https://.

Continue
Not sure? Scan a sign-in code from the webmail instead — it carries the address with it.
Path B Ask for the server people know

Not the JMAP session URL — the webmail address they type every day. The scheme is added for them, and a trailing slash or full /jmap path is accepted and trimmed.

Sign in to mail.example.org

This server doesn't support the browser sign-in, so we'll ask here.

Email or username
ada@example.org
Password
••••••••
That password didn't work. If your account has two-factor sign-in, you'll need an app password from the webmail.
Sign in
Path C Errors that name the likely cause

The store's raw error string is replaced with mapped copy per failure: wrong credentials, unreachable host, bad certificate, 2FA-needs-an-app-password. Each says what to do next.

Add another account

You're signed in to these already.

AL Ada Lovelaceada@example.com
AL Worka.lovelace@analytical.co
add
Another account on example.com Server already known
A different provider
Add mode Reuse what we already know

isAddMode currently shows the same blank three-field form. Most second accounts live on the same server as the first, so offer that first and skip discovery entirely.

Notes for the build


Mockup · repos/react-native/mockups/login.html · static HTML, no interaction wired up