All projects
Mobile app

AMOR

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

AMOR — screenshot
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
// overview

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.

Scale
7
AI companion personalities
20+
Tables under RLS
2
Edge functions
~40
TypeScript source files
8
Milestones delivered
100 ms
VAD sampling interval
// what it does

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
// engineering

The hard parts

The problems that shaped the architecture, and how each one was solved.

01

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.

02

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.

03

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.

04

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.

// stack

Built with

Mobile

React Native 0.81React 19Expo SDK 54 (New Architecture)TypeScriptReact NavigationReanimated

Native modules

Expo AV (recording + playback)Expo SpeechExpo BlurExpo Linear GradientExpo LinkingAsyncStorage

Backend

Supabase PostgreSQLSupabase AuthRow Level SecurityEdge Functions (Deno)SECURITY DEFINER RPCs

AI

OpenAI Whisper (speech to text)GPT-4o-mini (conversation)OpenAI TTS (10 voices)

Payments & delivery

Stripe PaymentIntents@stripe/stripe-react-nativeGoogle PayEAS BuildExpo Dev Client
// screens

Inside the app

Tap any screenshot to open it full size.

Companion selection, a live voice call, and the text conversation — the same companion across both modes.
Seven AI personalities, each with its own voice, character and accent colour.
A hands-free call in progress. "Listening…" means the VAD is waiting for you to finish speaking — no button to hold.
Text conversation, with remaining messages and call time shown live in the header.
Each companion re-themes the call screen with its own avatar and accent colour.
Guest mode removes the signup wall — and guest history is migrated intact if the user later registers.
The onboarding carousel introduces the companion before any account is required.
Voice and chat are presented as one product, not two modes.
Account settings, upgrade path and the legal screens required for store review.
Available for hire

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.

> haseeb_

Full Stack Developer specializing in MERN, React Native, Supabase & Firebase. Turning ideas into production-ready applications.

Quick Links

Connect

© 2026 Haseeb Ansari. All rights reserved.

Built with React + TypeScript