No description
  • TypeScript 98.3%
  • JavaScript 1.7%
Find a file
2026-08-05 12:45:50 +02:00
.claude Initial commit 2026-08-03 06:51:06 +02:00
app raw 2026-08-05 12:45:50 +02:00
assets feat(nav): replace the native tab bar with a hand-drawn one 2026-08-03 21:33:50 +02:00
components raw 2026-08-05 12:45:50 +02:00
constants raw 2026-08-05 12:45:50 +02:00
docs/superpowers docs: fix TDD ordering in plan task 1 (test before eslint config) 2026-08-03 19:10:31 +02:00
hooks fix 2026-08-04 19:05:20 +02:00
locales raw 2026-08-05 12:45:50 +02:00
plugins fix 2026-08-04 19:05:20 +02:00
services raw 2026-08-05 12:45:50 +02:00
stores raw 2026-08-05 12:45:50 +02:00
ui raw 2026-08-05 12:45:50 +02:00
utils fix 2026-08-04 19:05:20 +02:00
.gitignore Initial commit 2026-08-03 06:51:06 +02:00
.prettierrc.json chore: restructure to root layout, add lint boundaries and jest setup 2026-08-03 19:25:09 +02:00
AGENTS.md Initial commit 2026-08-03 06:51:06 +02:00
app.json raw 2026-08-05 12:45:50 +02:00
CLAUDE.md Initial commit 2026-08-03 06:51:06 +02:00
eas.json raw 2026-08-05 12:45:50 +02:00
eslint.config.mjs fix 2026-08-04 19:05:20 +02:00
LICENSE Initial commit 2026-08-03 06:51:06 +02:00
package-lock.json raw 2026-08-05 12:45:50 +02:00
package.json raw 2026-08-05 12:45:50 +02:00
README.md fix 2026-08-04 19:05:20 +02:00
tsconfig.json feat(api): add HTTP transport with per-verb retry, ETag and timeout 2026-08-03 19:39:20 +02:00

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 test is declared in package.json but the Jest setup file and preset are not in the repo yet, so it does not run.

License

MIT — see LICENSE.