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)