# Straw A privacy-focused Android YouTube client. Compose UI, Media3 player, with [SponsorBlock](https://sponsor.ajay.app/) auto-skip and [Return YouTube Dislike](https://returnyoutubedislike.com/) baked in. No login, no Google Play Services, no tracking — Straw talks to public web endpoints only. Straw is a fork of [NewPipe](https://github.com/TeamNewPipe/NewPipe). The extractor is **strawcore**, a Rust port of NewPipe's extraction logic exposed to Kotlin via [UniFFI](https://mozilla.github.io/uniffi-rs/) — there's no InnerTube/JS-deobfuscation code path on the JVM anymore. ## Features - Search, video detail, channel pages, playlists - Inline player + fullscreen + swipe-down minibar + background audio + PiP - Media3 ExoPlayer (DASH / HLS / progressive / merged DASH chunks) - SponsorBlock auto-skip, with per-category toggles - Return YouTube Dislike on the video detail page - RSS-based subscription feed (fast — about a second for 50 subscriptions) - Hide-shorts / hide-paid / hide-age-restricted feed filters - Resume positions, watch history, search history - Local playlists; downloads (video + audio) - Imports NewPipe-format settings (subscriptions + playlists + history) ### Out of scope (on purpose) - Trending / algorithmic feeds — subscriptions only - iOS / desktop targets — Android only for now - Anything that needs Google Play Services or an account ## Install Pre-built APKs are published to an F-Droid repository: ``` https://fdroid.sulkta.com/fdroid/repo ``` Add that repo to the F-Droid client of your choice and install **Straw**. The app also self-updates from the same repo when a newer `versionCode` is published. If you'd rather build it yourself, see **Build** below. ## Build Straw is a standard Gradle project with a Rust component (`strawcore`) compiled for Android via `cargo-ndk` and bound to Kotlin with `uniffi-bindgen`. The Gradle build drives both automatically. ### Prerequisites - JDK 21 - Android SDK with platform `android-36`, build-tools `36.0.0`, and NDK `r27` (`ANDROID_NDK_HOME` must point at it) - A Rust stable toolchain with the four Android targets, plus `cargo-ndk` and `uniffi-bindgen`: ```sh rustup target add aarch64-linux-android armv7-linux-androideabi \ x86_64-linux-android i686-linux-android cargo install cargo-ndk uniffi-bindgen ``` ### Assemble a debug APK ```sh ./gradlew :strawApp:assembleDebug ``` The APK lands in `strawApp/build/outputs/apk/debug/`. ### Reproducible build image `ci/Dockerfile` defines a self-contained image with the exact JDK + Android SDK + NDK + Rust toolchain the build expects, if you'd rather not install all of that on your host: ```sh docker build -t straw-build ci/ docker run --rm -v "$PWD":/src -w /src straw-build ./gradlew :strawApp:assembleDebug ``` ## Project layout ``` strawApp/ The app — Compose UI, Media3 wiring, SponsorBlock + RYD clients rust/ strawcore — the UniFFI wrapper crate around the Rust extractor buildSrc/ Shared Gradle build logic and version constants iosApp/ Empty iOS shell inherited from upstream (not built) ``` The actual extraction engine (`strawcore-core`) lives in a sibling repository, [`strawcore`](https://git.sulkta.com/Sulkta-OSS/strawcore), and is pulled in as a path/Git dependency by `rust/strawcore`. ## Contributing Issues and pull requests are welcome. A few notes: - Keep changes scoped and described; the build runs lint/format checks. - The app is Kotlin + Jetpack Compose; the extractor is Rust. Touch the layer the change belongs in. - By contributing you agree your work is licensed under GPL-3.0-or-later (see **License**). ## License GPL-3.0-or-later, inherited from upstream NewPipe. See [`LICENSE`](LICENSE). ## Upstream Straw tracks [NewPipe](https://github.com/TeamNewPipe/NewPipe); upstream improvements are pulled in periodically. The `app/` and `shared/` modules from NewPipe were removed once Straw became its own app on the strawcore pipeline. ## Disclaimer Not affiliated with YouTube, Google, NewPipe e.V., the SponsorBlock project, or Return YouTube Dislike. All trademarks belong to their respective owners. Straw uses public web endpoints and does not authenticate to any account.