Short-form audio,
visual-first feed
Creators record original 15-second clips. Listeners browse a scrollable card feed — each card shows a waveform preview they tap to play. React, follow, tip, share. Think SoundCloud meets TikTok, built around a specific, hilarious content niche.
✓ App name: RipFeed. Domain: ripfeed.io. "Rip" covers ripping audio, ripping farts, and ripping through a feed — passes App Store review and AdMob brand safety without friction.
Tech stack
| Layer | Choice | Reason |
|---|---|---|
| Mobile | React Native (Expo) free | Single codebase for iOS + Android |
| Backend / DB | Supabase free tier | Auth, Postgres, Realtime, Edge Functions — generous free tier |
| File storage | Cloudflare R2 ~$0/egress | Zero egress fees — the critical cost saver for audio streaming |
| Audio processing | FFmpeg on Fly.io pay/use | Transcode to AAC + generate waveform PNG on upload |
| Web player | Cloudflare Pages free | Public /clip/[id] player — no app needed. Powers the viral sharing loop. |
| Ads | Google AdMob free SDK | Native feed ads, interstitials, rewarded video — React Native SDK |
| Subscriptions | RevenueCat free tier | Creator Pro + coin packs, handles App Store / Play Store billing |
| Push | Expo Push free | Reactions, follows, new clips — switch to OneSignal at scale |
Web player + shareable links
How it works
Every clip gets a permanent public URL: [domain].com/clip/{clipId}. This is the engine of organic growth — a fart clip is one of the most naturally shareable things on the internet, but only if the recipient can hear it without installing the app first.
[domain].com/clip/{clipId} and calls Share.share(). One line of code.clip/[id].tsx in the app. No browser, no friction.Web player stack
Minimal Next.js site deployed to Cloudflare Pages. Reads clip metadata from Supabase's public API (anon key, no auth). Streams audio directly from R2 CDN. No new backend infrastructure.
<audio> element pointing at the R2 CDN URL. No library needed.Open Graph tags (per clip)
<!-- These power link previews in every messaging app --> <meta property="og:title" content="@username on RipFeed" /> <meta property="og:description" content="Clip title + tags" /> <meta property="og:image" content="https://cdn.[domain].com/waveforms/{clipId}.png" /> <meta property="og:audio" content="https://cdn.[domain].com/clips/{clipId}.aac" /> <meta property="twitter:card" content="player" />
The waveform PNG generated by FFmpeg doubles as the OG image — visually distinctive, immediately communicates "audio clip," no extra work.
App Store strategy
Copyright + DMCA
Users will attempt to upload fart sounds from movies, TV, and YouTube. A DMCA takedown process is legally required before launch. More importantly, "original recordings only" as a community value keeps the social dynamics interesting — you want performers, not a clip repository. Enforce this in community guidelines from day one.
Upload flow + feed design
Upload flow
audio_url + waveform_url to the clips table.FFmpeg command
# Single pass — two outputs — transparent waveform background ffmpeg -i input \ -c:a aac -b:a 128k -t 15 output.aac \ -filter_complex "aformat=channel_layouts=mono,compand,showwavespic=s=300x64:colors=#7F77DD|0x00000000" \ -frames:v 1 waveform.png # Filter chain: # aformat=channel_layouts=mono — collapse stereo → unified waveform shape # compand — dynamic range compression, every clip looks interesting # showwavespic=s=300x64 — render static waveform image # colors=#7F77DD|0x00000000 — purple bars, transparent background
Feed design
Implemented as a FlatList. Each item is a clip card with: avatar, username, timestamp, clip title/tags, waveform PNG, play button, play/reaction counts. Ad cards are injected every 8–10 organic cards, styled to match but labeled "Sponsored."
monetization
User tiers
Enforced via usePro() hook — every ad component checks isPro before rendering. If true, skip entirely — no placeholder rendered.
Key rules — never break these
usePro() before rendering any ad component. If isPro === true, skip entirely — don't render a placeholder.-t 15 is non-negotiable. Never trust the client duration. Pro users get 30s via a separate FFmpeg flag.0x00000000 second color in the FFmpeg filter is mandatory. Required for correct rendering on light and dark card backgrounds.admob.ts. Never show an interstitial if one has already been shown this session.profiles.coin_balance and decrement server-side in a Supabase Edge Function.MVP roadmap (revised)
Estimated costs
R2's zero egress fees are the primary reason costs stay this low at audio streaming scale. AWS S3 would add ~$0.09/GB in egress alone.