AMOR
Talk to an AI companion that actually listens — tap once and have a hands-free conversation, no push-to-talk.

- Platform
- iOS + Android (React Native, Expo)
- Role
- Full-stack mobile developer, solo
- Type
- Client project, delivered in milestones
- Timeline
- Apr – Jul 2026 (~3.5 months)
- Status
- Feature-complete · prepared for store submission
AMOR is a mobile AI companion app for iOS and Android. The idea is simple: instead of typing at a chatbot, you can call it — tap once and have a natural, hands-free conversation, the way you would talk to a friend on the phone.
I built the product end to end: the React Native front end, the Supabase backend and database schema, the server-side voice pipeline, the authentication and guest system, and the Stripe payment and wallet layer.
The hard part of a voice app is not the AI — it is making the conversation feel natural. Most voice apps make you hold a button while you speak. AMOR does not. A custom Voice Activity Detection system continuously reads the microphone level and works out on its own when you have started speaking and when you have finished. It waits out short pauses, rejects background noise, and ends the recording precisely when you stop, so the loop is completely hands-free: you speak, it detects silence, it thinks, it replies, it listens again.
Users can try the app instantly as a guest with small daily limits, then create an account — at which point all their guest conversations and call history are migrated into the new account by a single database function, so nothing is lost. Registered users get a wallet: chat messages cost a cent each, voice calls bill at $1.00/hour charged per second actually used, topped up with real Stripe payments.
Key features
Conversation
- Text chat and hands-free voice calling with the same AI companion
- Seamless switching between chat mode and call mode mid-conversation
- A guided "first call" onboarding script that introduces the companion and learns the user’s name
- Full call history with replayable transcripts
Voice engine
- Custom Voice Activity Detection — no push-to-talk; speech start and end are detected from live audio metering
- Tunable dB threshold, silence duration and minimum-speech guards
- Server-side pipeline: Whisper speech-to-text, GPT-4o-mini, OpenAI TTS
- Audio playback with a per-companion voice
AI personalities
- Seven distinct companions — Luna, Aria, Alex, Marcus, Sienna, Theo and Iris
- Each with its own system prompt, personality profile, TTS voice and avatar
- An accent colour per companion that re-themes the UI
- Per-companion memory: each builds its own long-term context about the user
Accounts & data
- Guest mode with device-based sessions — usable in seconds, no signup wall
- Email and password auth via Supabase, with real-time password-strength validation
- Forgot-password and reset flows over an amor:// deep link
- Automatic guest to registered-user data migration, and Row Level Security on every table
Payments
- Stripe wallet with $4.99 / $9.99 / $19.99 top-up packages
- Per-second billing for voice calls, per-message billing for chat
- Server-verified, idempotent crediting — the Stripe secret key never leaves the backend
- Pricing driven from a pricing_config table, so rates change without an app update
Polish
- Splash, onboarding carousel, auth gate and main app flow
- Three-tab layout (Chat · Calls · Account) with badges and active states
- Offline-tolerant local persistence via AsyncStorage
- Branded transactional emails, plus Privacy Policy, Terms and Help screens
The hard parts
The problems that shaped the architecture, and how each one was solved.
Making voice feel like a real call, not a walkie-talkie
Fixed-duration recording either cut people off mid-sentence or left awkward dead air. The VAD service samples the microphone’s metering level every 100 ms, requires roughly half a second of sustained speech before it counts as "the user is talking", then ends the turn after 1.5 s of silence. The result is a fully hands-free conversation loop with thresholds that can be tuned for noisy environments.
Running a paid AI pipeline from an app that cannot hold secrets
Every AI and payment call moved into Supabase Edge Functions. The client sends audio and gets audio back; the OpenAI and Stripe keys exist only as server secrets. This also made pricing changes and model swaps possible without shipping a new app build.
Letting people try the app without losing their history
Guests get a device-scoped session and small daily limits. The moment they sign up, a single migrate_guest_to_user() database function re-parents every conversation, message and call record to the new user ID — designed to be safe to run more than once.
Billing accurately for something measured in seconds
Wallet balance and every deduction live in Postgres behind SECURITY DEFINER RPCs, so the client can never write its own balance. Calls bill per second at an hourly rate read from a config table, and top-ups are credited only after the PaymentIntent is re-fetched from Stripe and verified for status, amount and owner — keyed by payment ID, so replays are harmless.
Built with
Mobile
Native modules
Backend
AI
Payments & delivery
Inside the app
Tap any screenshot to open it full size.

Ready to bring your
idea to life?
Let's discuss your project and build something exceptional together. Get in touch via Fiverr, WhatsApp, or send me a message.