iOS App
Install via TestFlight, sign in with WorkOS, attach to a session, and drive it from the terminal - plus Live Activities.
The attach protocol the app speaks is the same OSS wire protocol the web client and the PTY session host use, documented at donmai.dev/docs/sessions/attach-client. This page covers the app itself.
The Rensei iOS app lets you watch and drive an interactive session from your phone or iPad: a real terminal, live, with the same presence and driver model as the web client.
Install
The app is currently distributed through TestFlight as an internal beta (bundle ID ai.rensei.app). Ask your Rensei contact for a TestFlight invite. A public App Store listing is not yet available.
iOS billing is intentionally absent from the app - there is no in-app plan/purchase surface anywhere. Managing your plan happens on the web (see Quotas & Plans); the app only reads your org's existing entitlements.
Sign in
The app signs you in against the same WorkOS identity your organization already uses - there is no separate iOS-only account system.
On first launch, tap sign in. The app opens a secure in-app browser session (ASWebAuthenticationSession) to your organization's WorkOS login page.
Complete your organization's normal sign-in (password, SSO, whatever your org has configured).
The app receives a user access token the same way the rensei CLI does when you run rensei auth add --user - iOS is a first-class holder of the same kind of user credential the CLI uses, not a separate token type.
Tokens are stored in the iOS Keychain, protected so they're only accessible after the device has been unlocked at least once since restart, and never leave the device except to authenticate API calls. Access tokens are short-lived (a few minutes, set by your organization's WorkOS configuration); the app re-mints one automatically when it expires rather than asking you to sign in again.
Attaching to a session
Open a project's interactive sessions from the app's session list, or follow a deep link (ai.rensei.app://interactive-sessions/...) shared from the web app. The terminal renders with GhosttyKit (the same Ghostty terminal engine used by the Ghostty desktop app), Metal-rendered, with a SwiftTerm fallback path available behind the scenes if needed.
Once attached, you get the same presence and driver model as web: everyone attached watches live, and whoever holds the pen can type. Taking the pen on iOS works the same as taking it on web - grab it, drive, no approval round-trip.
Terminal interaction
- The terminal renders at a fixed 80x24 floor and letterboxes to fit your screen, so output from the host stays legible instead of being squeezed to fit an arbitrary device width. Rotating the device or resizing a split-view pane redraws after a short debounce rather than on every intermediate frame.
- iPad supports split-view alongside other apps. Multiple windows of the app itself, and pointer/trackpad-driven scrollback, are not supported yet.
- The app keeps you connected across brief network hiccups (see reconnect behavior) - a short Wi-Fi drop or a hop from Wi-Fi to cellular reconnects automatically rather than dropping you.
- Backgrounding the app - switching to another app, locking your phone - detaches from the session after a short grace period rather than holding a connection open indefinitely in the background; the session itself keeps running on the server, and reopening the app catches you back up.
Notifications
The app registers for push notifications (APNs) the first time it actually needs to - not automatically on first launch - so you see the system permission prompt in context. Once granted, it registers a device token and the app's notification settings screen shows the same preference categories as the web preference center, live - not a separate hardcoded list.
Tapping a notification deep-links you into the relevant session or screen.
Actionable notifications (approve/reject a gate, for example) currently deep-link into the app to complete the action rather than deciding it directly from the lock screen or notification banner - there's no notification extension that can act without opening the app.
Live Activities
When you have interactive sessions running, the app can show a Live Activity (and Dynamic Island, on supported devices) - a single aggregated activity showing how many sessions are currently running, rather than one activity per session. This is deliberate: Apple limits how many times an app can push-start a Live Activity in a given window, and a single aggregate avoids exhausting that budget on an org with several sessions running at once. The activity refreshes periodically and ends automatically once every session it was tracking has ended.
Live Activity and Dynamic Island rendering can only be exercised on a physical device - the behavior described above is built and unit-tested, but has not yet been exercised end-to-end on-device at the time of this page. Treat this specific capability as newer/less proven than the rest of the app.
Related Pages
- Interactive Sessions - the session model this app attaches to
- Notification Preferences - the channel and category matrix this app's settings screen renders
- Quotas & Plans - what your plan allows; managed on the web, not in the app