# Leumas iOS — @leumas/ios

Leumas iOS — a Capacitor shell over leumas-web. One codebase → web + iOS. Members get their own Leumas Studio in their pocket.


**Mobile Leumas, focused on social.**
A Capacitor shell over leumas-web's **social-only bundle**. No product-local logic, ever.

`appId: tech.leumas.app` · Architecture: [APPLIANCES.md](../../APPLIANCES.md) §5

---

## Core functionality

1. **Leumas Social on mobile** — feed, reels, watch, stories, messenger, friends, groups, chatrooms,
   discover, marketplace, random chat, sing, profiles, notifications.
2. **Account** — login/signup, profile, membership status.
3. **Push & native shell** — notifications, share sheet, camera/photo picker for posts, deep links.
4. **Central data, always** — every byte comes from `api.leumas.tech`. No local database, nothing to
   reconcile, no offline write path.

## What it must never do

| Never | Because |
|---|---|
| Contain product logic | it renders leumas-web. Any native capability another product could reuse becomes a `shared/packages/*` module |
| Ship the full hub bundle | it currently does (`webDir: "../leumas-web/dist"`). W1 fixes this |
| Keep a local database | social is one central graph. An offline social network isn't one |
| Re-implement social UI | `@leumas/features/surfaces/social` — identical to web |

## How it composes

```
products/leumas-web ──build social entry──-> dist/social/ ──Capacitor webDir──-> iOS app
                                                     │
                                              api.leumas.tech
```

Auth is free: the `.leumas.tech` cookie plus `@leumas/api-client`'s `credentials:'include'` and Bearer
fallback already work. Nothing to build.

## File tree

```
products/leumas-ios/
├── package.json [done] @capacitor/{core,ios}; scripts: build:web · add · sync · open · dev
├── capacitor.config.json [partial] webDir → ../leumas-web/dist (must become dist/social)
├── README.md [done]
├── ios/ [todo] generated by `cap add ios` — not checked in yet
└── src/                        ✗ DOES NOT EXIST AND MUST NOT
```

Three files today. That is correct and should stay close to it.

## Roadmap

### [todo] I1 · Point at the social bundle (roadmap B4)

- Status: todo — Wait on leumas-web **W1** (the `social.html` entry)
- Status: todo — `capacitor.config.json` → `webDir: "../leumas-web/dist/social"`
- Status: todo — `pnpm add` → generate the `ios/` native project, commit it
- Status: todo — Verify the bundle has no `three`, no cinematic, no media globe

### [todo] I2 · Native capabilities

- Status: todo — Push notifications wired to the social `notifications` table
- Status: todo — Camera / photo picker for posts — via a `shared/packages/*` module, **not** app-local code
- Status: todo — Deep links: `leumas://social/post/:id` and universal links from `leumas.tech`
- Status: todo — Share sheet

### [todo] I3 · Release management (roadmap D3)

- Status: todo — Control plane keeps an **iOS release record**: version, build, App Store state
- Status: todo — **Minimum-supported-version gate** enforced by the API — ~20 lines, and the real lever
- Status: todo — Decide OTA: Capacitor bundles `webDir` at build time; live updates need
      `@capacitor/live-updates` or a remote `server.url`. Apple permits JS-only updates that don't
      change core functionality. **A deliberate choice, not a freebie**

### [todo] I4 · Store presence

- Status: todo — App Store Connect listing, screenshots, privacy nutrition labels
- Status: todo — Age rating — social + random chat needs care
- Status: todo — Moderation & reporting flows visible in-app (App Review requires them for UGC)

## Run

```bash
pnpm --filter @leumas/ios sync
pnpm --filter @leumas/ios open
```

`sync` builds leumas-web first, then `cap sync ios`. Requires macOS + Xcode for `open`.


---
Source: products/leumas-ios/README.md
Canonical: https://docs.leumas.tech/p/products/ios
