Sulkta fork of NewPipe — KMP/Compose Android YouTube client with built-in SponsorBlock + Return YouTube Dislike. Day-1 build, GPL-3.0-or-later per upstream.
Find a file
Cobb 4d3ddf502f
All checks were successful
build-apk / build-and-publish (push) Successful in 8m2s
diag: expand dogfood logging — lighter scrub + always-log failures + wrapper catch-all
Pairs with strawcore's new extractor instrumentation to make "Send logs to Kayos"
actually diagnosable. Today's bot-wall outage produced a log dump that was 90%
framework noise, one mangled strawcore line, and zero failure signal.

- LogDump: split the scrubber into a FULL profile (share-sheet export + on-screen
  error strings — unchanged, still over-redacts) and a lighter DOGFOOD profile
  (the logs.sulkta.com ingest path, our own infra) that KEEPS bare YouTube ids
  (video/channel/playlist/youtu.be — the triage signal) while still scrubbing
  every real credential: signed googlevideo URLs, bearer/cookie/token headers,
  sig/pot/n/cpn params, URL queries, emails, high-entropy tokens (visitorData),
  and IPs. LogShipper uses the dogfood profile.
- Fixed the IPv6-compressed regex that mangled Rust module paths
  (`strawcore::stream` -> `strawcor<ip>stream`) and, as a bonus, a latent
  false-negative where `::1` was never scrubbed.
- Always-log extraction + playback failures (strawLogI) so a user-visible failure
  always lands in the ring.
- Wrapper (rust/strawcore): one catch-all WARN in run_extract that traces EVERY
  extraction failure system-wide, and raise android_logger Info->Debug so the
  extractor's DEBUG tier is live in the dogfood build.
- Added a JVM unit test for the scrubber (not yet wired into CI — the repo has no
  test source set; follow-up).
2026-08-06 08:17:15 -07:00
.forgejo/workflows ci: publish to fdroid on workflow_dispatch too, not just push 2026-07-29 21:52:51 -07:00
.github ci: remove dead inherited .github/workflows (pwn-request + cruft) 2026-07-04 20:25:56 -07:00
.idea add NP icon for Android Studio's NewUI 2024-07-02 09:31:34 +02:00
assets Improve image placeholders 2022-07-14 14:14:32 +02:00
buildSrc ci: auto-derive versionCode from commit count (never reuse a code) 2026-07-29 07:23:23 -07:00
checkstyle Make checkstyle accept javadocs with long links 2024-03-30 15:49:06 +01:00
ci docs: public README + reproducible build image 2026-06-28 12:25:49 -07:00
doc Fix new badge links on Readme being rendered incorrectly 2025-07-19 22:45:32 +05:30
fastlane/metadata/android Translated using Weblate (Dutch) 2026-05-23 20:15:02 +00:00
gradle Update compose to v1.11.4 2026-07-05 06:56:10 +00:00
iosApp Initial support for compose multiplatform 2026-05-19 12:22:31 +08:00
rust diag: expand dogfood logging — lighter scrub + always-log failures + wrapper catch-all 2026-08-06 08:17:15 -07:00
strawApp diag: expand dogfood logging — lighter scrub + always-log failures + wrapper catch-all 2026-08-06 08:17:15 -07:00
.editorconfig ktlint: Drop non-required backing-property-naming supression 2026-01-24 00:32:03 +08:00
.gitignore v0.1.0-U (vc=8): Phase U-1 + U-2 — Rust core + rustypipe search 2026-05-24 08:36:50 -07:00
.gitleaks.toml ci: broaden gitleaks allowlist — catch all variable-name patterns. Refs #300 2026-05-28 12:19:24 -07:00
build.gradle.kts Initial support for compose multiplatform 2026-05-19 12:22:31 +08:00
gradle.properties Upgrade AGP to 9.2.0 2026-05-16 12:25:24 +08:00
gradlew Update Gradle and wrapper to 9.5.1 2026-05-16 12:34:57 +08:00
gradlew.bat Update Gradle and wrapper to 9.5.1 2026-05-16 12:34:57 +08:00
LICENSE Update license to latest version of https://www.gnu.org/licenses/gpl-3.0.txt 2022-03-19 17:39:06 +01:00
README.md docs: public README + reproducible build image 2026-06-28 12:25:49 -07:00
settings.gradle.kts Strip NewPipe: remove legacy :app + unused :desktopApp/:shared modules 2026-06-20 07:19:33 -07:00

Straw

A privacy-focused Android YouTube client. Compose UI, Media3 player, with SponsorBlock auto-skip and Return YouTube Dislike baked in. No login, no Google Play Services, no tracking — Straw talks to public web endpoints only.

Straw is a fork of NewPipe. The extractor is strawcore, a Rust port of NewPipe's extraction logic exposed to Kotlin via UniFFI — 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:
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

./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:
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, 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.

Upstream

Straw tracks 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.