- TypeScript 98.3%
- JavaScript 1.7%
| .claude | ||
| app | ||
| assets | ||
| components | ||
| constants | ||
| docs/superpowers | ||
| hooks | ||
| locales | ||
| plugins | ||
| services | ||
| stores | ||
| ui | ||
| utils | ||
| .gitignore | ||
| .prettierrc.json | ||
| AGENTS.md | ||
| app.json | ||
| CLAUDE.md | ||
| eas.json | ||
| eslint.config.mjs | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
Alice for Android and iOS
Email aliases in your pocket
Beta software. This app is a client for Alice, the self-hosted email alias manager. You need your own Alice instance — there is no hosted service.
Features
- Generate an alias in two taps, with the format you prefer
- Tagged with the service it was created for, so a leak points at whoever received it
- Share a page to Alice — the address bar of your browser becomes the service name
- Paste-aware — copy a site's URL and the list offers to create an alias for it
- Long-press the icon to jump straight to the creation sheet
- Manage your aliases — search, filter, disable, delete, in bulk if you want
- See what each one receives — messages, spam, sender domains, and the ones that were not expected
- Locked behind Face ID or your fingerprint, after a delay you choose
- Pair with your Alice account, no key to copy by hand
- French and English, following the system language
Install
No store listing yet. Build it yourself.
npm install
npm run android # or: npm run ios
Both build a development client and install it on the connected device or emulator — Expo Go will not do, the app uses native modules it does not ship.
Connecting
Enter your instance URL, and Alice shows a code. Approve it in a browser already signed in to your instance, and the device gets its own client key — the same kind of credential the extension or a script would use.
The key appears in Alice under Clients, named after the device, and lives in the iOS keychain or the Android keystore. Revoking it there cuts this phone off; Settings → Disconnect this device does the same from here.
Pairing uses the device authorization grant
with the client id aliceconnect, which your instance must allow.
Permissions
| Permission | Why |
|---|---|
| network | talks to your instance and nothing else |
| Face ID / biometrics | optional, unlocks the app if you turn the lock on |
| keychain / keystore | stores the client key |
| clipboard | read on foreground, to offer an alias for a URL you copied |
| share target (Android) | the Share → Alice entry, which prefills the service |
No telemetry, no analytics, no server but yours.
Development
npm start # Metro, against an installed development build
npm run lint
npm run typecheck
app/ routes: (onboarding), (tabs), (modals)
components/ screen-level pieces: banners, rows, filters, biometric gate
ui/ @alice/ui — the design system, no app logic
services/
alice/ API client, HTTP, sync
auth/ device flow, session, secure store
errors/ typed errors and their messages
stores/ zustand, persisted in MMKV
hooks/
constants/ theme, services
locales/ fr, en
plugins/ config plugin for the Android share intent
services/ is plain TypeScript and the only place that calls fetch. Screens
read stores and never touch the API directly. Mutations are optimistic and roll
back on failure.
Navigation is file-based (expo-router) with typed routes. The tabs, the switch, the headers and the action menus are drawn by hand rather than taken from the platform, so both systems look the same.
npm testis declared inpackage.jsonbut the Jest setup file and preset are not in the repo yet, so it does not run.
License
MIT — see LICENSE.