Mobile capture flow

The Clay mobile app starts with one focused workflow: capture enough signal to draft a useful opportunity fit brief without asking the user to expose raw private reflections. This is the product contract for apps/mobile/app/index.tsx.
This page documents the first implemented slice. See User experience flows for the broader first-run journey, opportunity review, intro, and debrief stories.

On this page

Scope

Platform

iOS-only Expo app. apps/mobile/app.json keeps platforms constrained to ["ios"].

Framework

Expo SDK 57 with Expo Router through expo-router/entry; route files live under apps/mobile/app/.

Native controls

@expo/ui owns standard native inputs: text input, picker, slider, switch, and save button.

Clay surfaces

React Native owns safe areas, keyboard-aware scrolling, custom cards, selected states, and Clay-specific layout.

Captured signals

1

Intention

The user writes one concrete outcome. The current screen caps the text input at 180 characters to keep the first signal concise.
2

Opportunity lane

The native picker classifies the next opportunity as Collaborator, Project, Community, or Role.
3

Readiness

The native slider captures a 1-5 readiness value and translates it into Exploring, Open to the right fit, or Ready to act.
4

Personality signal

The custom cards capture the preferred working mode: Deep work, High context, or Fast feedback.
5

Consent boundary

The switch defaults to translated fit signals only. Clay should not share raw private context unless a later flow asks for explicit permission.

States

StateTriggerRequired behavior
EmptyNo intention textDisable save and explain that one concrete outcome is needed.
DraftableIntention text existsEnable save and tell the user the signal is ready.
SavedSave button pressedChange the button label to Intention saved and unlock the next-action copy.
Edited after saveText changes after saveReturn to draftable so stale fit briefs are not implied.

Expo UI boundary

Use Expo UI when the control maps cleanly to a native iOS input or action. Keep React Native for outer layout, navigation, scrolling, keyboard handling, and custom Clay cards.
Current Expo UI usage:
  • Host matchContents wraps the native form panel.
  • TextInput captures the intention.
  • Picker selects the opportunity lane.
  • Slider captures readiness.
  • Switch captures the consent boundary.
  • Button saves the first intention.
Avoid moving every screen element into Expo UI. Clay-specific cards need custom selected and pressed feedback, so they remain React Native Pressable surfaces until a native component clearly improves the interaction.

Design implementation

The mobile capture route uses the Clay DESIGN.md system directly:
  • apps/mobile/lib/clay-design.ts owns the mobile token layer: cream paper, white panels, almost-black text, acid-lime momentum, electric-purple personality, tomato-orange action, clay-pink support, warm-taupe material cues, dark-plum private panels, 8px product radii, and the 4px spacing scale.
  • apps/mobile/components/native-capture-form.tsx is the Expo UI island. It wraps the native form controls in a Host seeded with acid lime so the first screen keeps one dominant action accent.
  • apps/mobile/components/personality-signal-cards.tsx stays React Native because selected, pressed, and personality-signal feedback are Clay-specific interaction states.
  • apps/mobile/components/next-action-panel.tsx uses dark plum for the private handoff and keeps the consent state explicit with text, not color alone.
  • apps/mobile/components/clay-profile-group.tsx provides a lightweight handmade profile group for the first capture slice. It is decorative, equal-profile, palette-flexible, and must not encode readiness, privacy, mood, or hierarchy.

Haptic feedback

Clay mobile uses Pulsar haptics for meaningful capture-state changes, not passive page chrome or every text keystroke.
InteractionHaptic eventIntent
Save first intentionintentionSavedConfirm the first concrete signal was submitted.
Change opportunity laneopportunityLaneChangedAcknowledge the selected opportunity category changed.
Move readiness stepreadinessChangedMark each discrete readiness value change.
Toggle consent boundaryplayConsentBoundaryHaptic(...)Distinguish translated-only sharing from a loosened boundary.
Select personality signalpersonalitySignalSelectedConfirm the custom Clay card selection changed.
The haptic vocabulary lives in apps/mobile/lib/clay-haptics.ts so route files use product-level events instead of raw preset names. Underneath, the helper maps those events to Pulsar presets (Propel, Ping, Snap, Latch, plus the system selection pattern) and preloads them on app start so the first haptic never warms up cold.

Next action contract

After save, the screen should move from capture to action:
Draft a fit brief for one {opportunity lane}.
The fit brief should use the intention, readiness, and selected personality signal. It must preserve the consent boundary by sharing translated fit signals and constraints, not raw reflections.

Build order

  1. Keep the first capture flow narrow and reliable.
  2. Add focused loading and error states before connecting recommendations or mutations.
  3. Extract reusable card/form components only after a second Clay screen needs the same interaction.
  4. Verify Pulsar haptics on an iOS simulator or device path after native prebuild.
  5. Connect backend-generated fit briefs only after the API contract exists in apps/specs/backend/api.

Companion experience

The proactive voice model that the captured signals feed into.

Curious pet memory

Where captured signals become durable, editable personal knowledges.

User experience flows

Flow 1 — Capture an intention — the broader story this screen implements.

Consent

Why the consent boundary switch defaults to translated fit signals only.