Senior Android Developer, OTT & video streaming specialist. I help video-first platforms ship scalable, stable native mobile and CTV apps: Media3/ExoPlayer, HLS/DASH delivery, multi-DRM (Widevine/PlayReady), server-side and client-side ad insertion (SSAI/CSAI), and QoE analytics.
6+ years, 10+ production apps across Android and Connected TV, 1M+ viewers. On a high-traffic MENA OTT platform I locked stability at >99% crash-free and cut cold-start by ~40%.
Here's the thing though: debugging a streaming issue the conventional way means Charles Proxy + adb logcat + manually fetching the manifest in a browser. All at the same time. On a tethered device. Each round takes 15–30 minutes. I got tired of that, so I started building tools to pull that whole workflow into the app itself, then shipped them to Maven Central and SPM.
Currently freelancing. Open to Android contract and senior full-time roles.
Kotlin Multiplatform debug SDK for Android and iOS. Manifests, per-segment metrics, CDN headers, ABR/track switches, and DRM lifecycle: all on-screen, no Charles Proxy, no tethered device, no production risk. One shared Kotlin core, a thin native adapter and overlay on each platform. On iOS 18+ it reads the AVMetric segment stream for true per-segment timing, at parity with the Media3 side.
// Android
debugImplementation("io.github.oguzhaneksi:streamprobe:<latest>")iOS: add the package via Swift Package Manager, then import StreamProbe.
QoE analytics SDK for Media3. Crash logs tell you something broke. They don't tell you a user sat through an 8-second startup time. Media3Watch tracks startup duration, stall count, and buffer health, in Logcat or on a self-hosted Grafana dashboard (Ktor + PostgreSQL + Docker).
implementation("io.github.oguzhaneksi:media3watch-sdk:1.1.0")
debugImplementation("io.github.oguzhaneksi:media3watch-overlay:1.1.0")TikTokCompose · ⭐ 26
Shorts/Reels-style vertical video feed. Media3 + Jetpack Compose reference architecture for paged video playback.
AndroidTvCompose · ⭐ 7
Self-initiated Android TV app built with Jetpack Compose. R&D side project that shipped to production.
- StreamProbe: decode-capability visibility. Surfacing
Tracks.Group.isTrackSupported()onVariantInfo, so a greyed-out rung can say "present but undecodable by this hardware" instead of looking the same as a config cap. - StreamProbe: live
TrackSelectionParameters. Showing why the selection pool was narrowed (max-size cap vs. max-bitrate cap vs. bandwidth fraction), not just that it was.
- “The video is low quality.” That one sentence may cost teams days. · Jun 2026
- What is Android MediaSession and How to Use It? · Apr 2026
- From Alpha to Almost-Production: Building Media3Watch (Part 2) · Mar 2026
- Building a Local-First Native Video Analytics SDK for Android Media3 · Feb 2026
- Basic Background Playback with Media3 MediaSessionService · Dec 2023
Open to interesting streaming and Android problems. Easiest to reach me on LinkedIn or X.




