01The problem
The wallet was where aelf's growth plan leaked. Portkey is aelf's AA wallet, and the strategy depended on Web2 users self-custodying, but every one of them hit a seed phrase in the first minute and left. The brief wasn't to design a wallet. It was to make self-custody feel like a normal sign-up, without dropping its security or alienating crypto-native users.
02The thinking
Account abstraction gave me social recovery, a primitive most wallets lack. So I inverted the usual priority. Instead of teaching people to guard a key they'll lose, I designed around the moment they fear most, losing access, and made guardian recovery the centerpiece. Email login and plain-language signing followed from there.
03Key decisions & tradeoffs
Web2 login as the front door
Email & social by defaultnotSeed-phrase-first onboarding
ImpactSign-up completion: ~35% → ~70%
Guardians as a designed surface
A guided recovery flownotRecovery buried in settings
Plain-language transactions
Human-readable summariesnotRaw hex and jargon
One system, every surface
Shared primitivesnotBespoke UI per platform
04Driving the call
Leading with Web2 login meant betting against crypto convention, which wasn't the default instinct on the team. I made the case that crypto-native users weren't the growth audience, so the wallet should optimise for the people who bounce, not the people already comfortable. I also owned the design system that kept mobile, the extension, and the partner SDK on one set of primitives, so a user who meets Portkey inside a partner dApp lands in the same flow everywhere.
05Outcomes
- Shipped on iOS, Android & Chrome
- Embeddable partner SDK
- Recovery reframed as a guided flow
- One cross-surface design system
06Reflection
Recovery is where mainstream trust is won, so next time I'd push guardian education even earlier, before the user has anything to lose, so the safety net is felt from the first screen. The hardest ongoing tension was keeping three surfaces consistent as each shipped on its own timeline; a shared component library helped, but I'd lock those primitives down sooner.