Inspiration

I kept recording lectures, meetings and interviews on my phone and then never listening to them again. An hour of audio is hard to go back to. An hour of text you can skim, search and quote. I wanted a transcriber that felt at home on iOS, handled long recordings and video files, worked in the languages people actually speak, and didn't make you sit on a progress screen.

What it does

Textik turns anything you record or import into a clean, timestamped transcript.

  • Record in the app, and keep recording with the phone locked or while you're in another app
  • Import voice memos, podcasts, recorded calls, screen recordings and lecture videos up to 2 hours long
  • 15 transcription languages, detected automatically or picked for a single recording
  • Tap a paragraph and the audio jumps to that moment
  • Translate a transcript into another language. The timestamps carry over, so tapping still plays the original audio
  • Search your whole library, then copy the text or share it as a .txt file
  • Close the app whenever you like. Transcription runs in the cloud and the result is waiting in your library
  • The interface is available in 17 languages and follows the phone's language

How I built it

  • App: Expo SDK 57 / React Native 0.86 with Expo Router, Reanimated and Zustand
  • Backend: Supabase for auth (Sign in with Apple, Google and email), Postgres with row-level security, Storage, and Edge Functions
  • Transcription: AssemblyAI. An edge function starts the job and a webhook writes the finished transcript back, so the phone never has to keep a connection open
  • Translation: Claude, called from an edge function, translating paragraph by paragraph so the timestamps stay intact
  • Monetization: RevenueCat with react-native-purchases and react-native-purchases-ui. The free plan includes 30 transcription minutes and 2 translations a month. Pro is sold as a subscription, and a RevenueCat webhook syncs entitlements to Supabase so usage limits are enforced on the server
  • Native code: a local Expo module in Swift that pulls out a video's audio track and re-encodes it before upload
  • Ops: EAS Build for TestFlight, Sentry, PostHog, and fastlane for App Store metadata in 22 locales

It went from the first commit to the App Store in about a month, over roughly 100 commits. The current release is v1.0.2.

Challenges

Fitting a 2-hour video into a 50 MB upload. Supabase limits a single stored object to 50 MB, and a phone shoots 1080p at 60–130 MB per minute. I wrote a native Swift module that extracts only the audio track and picks a bitrate based on the file's length, from 64 kbps down to about 47 kbps for two hours. That keeps the file just under the limit, because an encoder only hits its target bitrate on average. Two hours of speech ends up around 43 MB.

RevenueCat identity. Configuring the SDK before the user was known created anonymous app user IDs, and those purchases were hard to connect to accounts later. Now RevenueCat is configured only after a Supabase user ID exists, so every purchase belongs to a real account from the start. The server treats RevenueCat webhooks as the source of truth for what a user is entitled to.

Honest paywall copy. The paywall used to promise a free trial to people who had already used theirs. It now checks trial eligibility and hides the trial wording from anyone who can't get it.

Localizing everything. The app has 17 UI languages, including plural rules for Russian, Ukrainian and Polish, plus native permission prompts and App Store listings in 22 locales. Every translation file is type-checked against the English source, so a missing key fails the build.

What I learned

  • Leave the long, slow work to the server and let webhooks report back. It made the "close the app and it's still transcribing" experience possible.
  • Setting up RevenueCat properly (identity, entitlements, webhooks) matters more than how the paywall looks.
  • Small iOS details are worth the time: background recording, native Photos picking, and sheets sized to their content.

What's next

Speaker labels, export to more formats, and summaries of long recordings.

Built With

Share this project:

Updates

Submission history