DEV Community

Wasey Jamal
Wasey Jamal

Posted on

I built a streaming app with 7,000+ downloads at ₹0/month — here's the exact architecture

I'm Wasey, a solo developer from Varanasi, India. I built DramaHub —
a fully live OTT streaming app on Google Play Store. 7,000+ downloads,
1,000+ daily active users, sub-1% crash rate, ₹0/month infrastructure.

Here's the exact architecture that makes it possible.

The Problem

I had zero budget for servers. A typical OTT backend needs:

  • A backend server (₹3,000–15,000/month)
  • A database (₹1,500+/month)
  • A CDN (₹500+/month)

I had ₹0. So I had to think differently.

GitHub as the Database

All drama content, episode metadata, and app config live as JSON files
in a public GitHub repository. Free. Unlimited. Versioned automatically.

Every drama looks like this in JSON:

{
"id": "drama_001",
"title": "Drama Title",
"thumbnail": "https://cdn.jsdelivr.net/...",
"episodes": [
{
"ep": 1,
"title": "Episode 1",
"source": "youtube_id_here"
}
]
}

The app fetches this JSON on launch, caches it locally, and serves
content instantly on subsequent opens.

Cloudflare Workers as the CDN Proxy

Hitting GitHub raw URLs directly has rate limits. So I built a
Cloudflare Worker that sits in front of GitHub:

  • Caches all JSON responses at the edge globally
  • Handles unlimited traffic
  • Auto-invalidates when content version changes
  • Cost: ₹0

Architecture: Flutter app → Cloudflare Worker → GitHub raw JSON

The Dual Player System

DramaHub runs two video players:

Primary — YouTube WebView player
Most content is sourced from YouTube. The app uses a WebView-based
player with custom controls and a URL whitelist for security.

Secondary — Custom video player with Cloudflare R2
For self-hosted content, I use a custom player backed by
Cloudflare R2 storage.

Both players are switchable instantly from the admin panel via
remote JSON config. No APK update needed — ever.

The Admin Panel

This is the most important part of the architecture.

The admin panel is a Flutter Web app that communicates directly
with the GitHub REST API using Base64 encoding and SHA-based
conflict detection. From the admin panel I can:

  • Add/edit/delete dramas and episodes
  • Toggle ads per screen with cooldown timers
  • Switch between YouTube and custom player instantly
  • Change CDN URLs without any release
  • Force update all users
  • Control app config globally

Everything is remote. Everything is instant. No app store review cycle.

The Crash That Taught Me Everything

One day the app went completely down. Every user got a crash on launch.

The reason: my Cloudflare Worker wasn't caching properly. Every request
was hitting GitHub directly and I burned through the API rate limit
in minutes.

I fixed the Worker caching. Then I built a full backup system:

  • Direct GitHub raw URL as fallback
  • Backup Worker as secondary fallback
  • Switchable from admin panel in under 60 seconds

No APK release needed. I built that entire system in one night.

Firebase Integration

Even with zero backend cost, I use Firebase for:

  • Anonymous Auth
  • FCM push notifications with deep links
  • Crashlytics for real-time crash monitoring
  • Analytics with 7 custom tracked events
  • Atomic view counter increments via Firestore REST API

Results After 18 Months

📦 7,000+ downloads
👥 1,000+ daily active users

💥 Sub-1% crash rate
💰 ₹0/month infrastructure cost
📱 Live on Google Play Store

Key Lesson

Build your admin panel first. Remote config is not a feature —
it's survival. The ability to change anything without a new release
has saved me dozens of times.

GitHub as a database works at production scale if you architect
the caching layer correctly.


GitHub: github.com/waseyjamal/dramahub
Play Store: https://play.google.com/store/apps/details?id=com.dramahub.drama_hub
Twitter: @waseybuilds

Happy to answer any questions about the architecture.

Top comments (0)