Private email client and Convex backend.
The repository contains the SwiftUI and Mac Catalyst prototype and an Expo mock Inbox for iPhone and iPad, plus a native React Native Mac mock Inbox. The approved replacement targets a power-user Apple launch with Gmail, IMAP/SMTP and Microsoft mail. Android and Windows remain later slices. Google and Apple Product Sign-In replace Apple-only login.
Start with the documentation index for requirements, setup and validation. The review agent reads the architecture index under the implementation and review workflow. Follow Expo setup for mobile coding conventions and commands. Full platform qualification remains required before release; the reviewer tracks its evidence through the architecture index.
apps/mobile: Expo Apple and Google onboarding and selected mock Inbox in the root workspace.apps/macos: AppKit React Native macOS Apple and Google onboarding and mock Inbox windows.packages/mail-core: framework-independent mock mailbox and theme tokens.apps/unwired-mail: SwiftUI client for iPhone, iPad, and Mac Catalyst.packages/contracts: shared API contracts and fixtures.packages/convex: Convex backend.packages/mail-test-harness: current local mail test tooling.
One root workspace and lockfile use a shared catalog and named mobile and macos catalogs under
Expo workspace setup.
Use mise, Node 24, and the exact pnpm version in package.json, currently 11.5.2.
The mise-managed Ruby is required for Mac Podfile verification and tooling tests.
Expo builds need the Xcode toolchain and simulator runtime documented in
Expo setup.
mise trust .mise.toml
mise install
mise exec -- pnpm installFor the replacement app, follow Expo installation and launch. For Mac, follow native Mac setup.
For Graft code navigation, install the CLI once and initialize the local graph from the repository root:
npm install --global @nanonets/graft
graft init --agents agents --no-global --no-mcpThis adds Graft instructions to AGENTS.md and builds the ignored graft/ cache.
.worktreeinclude includes the cache when creating worktrees. Run graft build
to regenerate it when needed.
.mcp.json registers Figma's remote MCP server for Claude Code. Approve the
project server when Claude Code prompts, then run /mcp, select figma, and
authenticate with your Figma account.
Turborepo runs the app and backend tasks from the repository root:
| Command | Runs |
|---|---|
mise exec -- pnpm ios |
Builds and launches the iOS development client with Metro |
mise exec -- pnpm dev:ios |
Metro for an installed iOS development client |
mise exec -- pnpm macos |
Metro while it builds and opens the Debug Mac app |
mise exec -- pnpm dev:macos |
Metro for an existing Debug Mac app |
mise exec -- pnpm native:build:macos |
The Release Mac app; pass Debug or Testing instead |
mise exec -- pnpm dev:convex |
Convex development against the root .env.local |
mise exec -- pnpm build |
Both production JavaScript bundles |
mise exec -- pnpm verify:bundle |
Both bundles, then their bundle and autolinking checks |
mise exec -- pnpm native:generate |
Both generated native projects |
mise exec -- pnpm test:native:ios <app> |
The iOS native runner for a built .app |
mise exec -- pnpm test:native:macos <app> |
The Mac native runner for a built .app |
Arguments after the script name reach the package command, for example
mise exec -- pnpm ios --device. The iOS and Mac Metro servers both use port 8081, so run one
at a time. Development servers use Turborepo's terminal UI and need an interactive
terminal; non-interactive shells run the package scripts directly.
If .env.local does not exist, copy .env.example to it before starting Convex.
Follow the Swift prototype setup for app environment settings, signing, provider configuration, and current behavior. Keep credentials and developer-specific deployment values out of source control.
mise exec -- pnpm lint
mise exec -- pnpm lint:boundaries
mise exec -- pnpm format
mise exec -- pnpm turbo run check-types
mise exec -- pnpm test
mise exec -- pnpm test:tooling
mise exec -- node scripts/check-changesets.mjs
mise exec -- node --test scripts/check-changesets.test.mjs scripts/release.test.mjs scripts/auto-merge.test.mjs
mise exec -- pnpm exec fallow audit --gate new-only --changed-since origin/main --format json --quietpnpm lint and pnpm format run Oxlint and Oxfmt once from the root over the
whole repository; the app configurations apply to their own files. pnpm lint:fix
and pnpm format:fix apply fixes. Turborepo caches them as the root lint and
format tasks; add --filter=// when filtering turbo run to packages.
Run pnpm format:fix after pnpm changeset to format generated frontmatter before CI.
Use the testing policy to select meaningful checks and the native validation guide for resource ownership during native checks. The mail test environment documents the existing harness; the replacement's isolated Mock Mail Sessions keep deterministic mocked journeys distinct from real integration evidence.
CI covers both replacement hosts, shared core/contracts, and the retained Convex backend. Legacy Swift build, performance, Core Mail Loop and provider-qualification jobs are disabled by maintainer decision; their test sources and local commands remain available.
- Documentation index and historical status
- Agent guide
- Implementation and review workflow
- Product terminology
- GitHub issue workflow
- Automated reviews and PR babysitting
Record runtime or exported API changes with mise exec -- pnpm changeset.
Prepare package versions with mise exec -- pnpm version-packages. Package
publishing is not wired because the current workspace packages are private.