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 055c9c6d4f
All checks were successful
build-apk / build-and-publish (push) Successful in 7m18s
gitleaks / scan (push) Successful in 43s
vc=85: image caching + SB/RYD clients -> Rust + crash/autoplay fixes
- Thumbnails + channel icons stay cached: pin an explicit 256MB Coil disk
  cache + sized memory cache via SingletonImageLoader.Factory. Coil's
  default disk cap is 2% of the device's free space, so on a storage-tight
  phone the subs feed (most image-heavy screen) thrashed it and
  re-downloaded thumbnails on every visit.
- SponsorBlock + Return-YouTube-Dislike clients moved Kotlin -> Rust
  (strawcore net.rs: fetchSponsorSegments / fetchRydVotes). SponsorBlock
  keeps its privacy-preserving SHA-256 hash-prefix lookup. Kotlin is now a
  thin shim mapping the FFI records onto the SbSegment/RydVotes domain
  types; behavior identical. Migration #2 of "all backend -> Rust".
- Fix crash: extract_channel_id sliced the channel URL by a length derived
  from a lowercased copy of itself; to_lowercase() can change byte length
  on non-ASCII, so a non-ASCII URL tail could panic across the FFI and
  abort the app on a feed refresh. Now matches the prefix case-insensitively
  against the original with length + char-boundary guards.
- Fix autoplay hijack: advancing to the next video resolves over ~500ms; if
  you manually start a different video meanwhile, autoplay would replace
  your choice with the stale next-up. Added a staleness fence.

Verified: cargo check/test/clippy on the wrapper, full Android
compileDebugKotlin green, adversarial FFI pre-push audit passed.
2026-06-21 12:59:04 -07:00
.forgejo/workflows ci: put java on PATH for the apksigner verify step 2026-06-20 13:20:34 -07:00
.github Update dependencies to latest stable releases 2026-04-26 12:14:57 +08: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 vc=85: image caching + SB/RYD clients -> Rust + crash/autoplay fixes 2026-06-21 12:59:04 -07:00
checkstyle Make checkstyle accept javadocs with long links 2024-03-30 15:49:06 +01:00
ci ci: Forgejo build workflow — per-repo straw-build image, gated auto-publish 2026-06-19 20:18:32 -07:00
doc Fix new badge links on Readme being rendered incorrectly 2025-07-19 22:45:32 +05:30
docs/sulkta Sulkta day-2: search → detail → player → SponsorBlock + RYD 2026-05-23 19:22:52 -07:00
fastlane/metadata/android Translated using Weblate (Dutch) 2026-05-23 20:15:02 +00:00
gradle Merge branch 'master' into dev 2026-05-23 20:18:19 +02:00
iosApp Initial support for compose multiplatform 2026-05-19 12:22:31 +08:00
rust vc=85: image caching + SB/RYD clients -> Rust + crash/autoplay fixes 2026-06-21 12:59:04 -07:00
strawApp vc=85: image caching + SB/RYD clients -> Rust + crash/autoplay fixes 2026-06-21 12:59:04 -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 Public-flip audit: scrub audit-ticket prefixes + LAN refs + tighten README 2026-05-27 13:29:53 -07:00
settings.gradle.kts Strip NewPipe: remove legacy :app + unused :desktopApp/:shared modules 2026-06-20 07:19:33 -07:00

Straw

A Sulkta fork of NewPipe. Android YouTube client, Compose UI, Media3 player, with SponsorBlock and Return YouTube Dislike baked in.

The extractor is strawcore, a Rust port of NewPipeExtractor exposed to Kotlin via UniFFI. No InnerTube/JS deobf code path lives on the JVM anymore.

Install

F-Droid repo: https://fdroid.sulkta.com/fdroid/repo

Add the repo in your F-Droid client of choice, then install Straw.

The app also self-updates from the same repo when an APK lands there with a higher versionCode.

What's in

  • Search, video detail, channel pages, playlists
  • Inline player + fullscreen + minibar + background audio + PiP
  • Media3 ExoPlayer (DASH / HLS / progressive / merged DASH chunks)
  • SponsorBlock auto-skip (categories user-toggleable)
  • Return YouTube Dislike on video detail
  • RSS-based subscription feed (fast — ~1s for 50 subs)
  • Hide-shorts / hide-paid / hide-age-restricted feed filters
  • Resume positions + watch history + search history
  • Local playlists, downloads (video + audio)
  • NewPipe-format settings import (subs + playlists + history)

What's out (on purpose)

  • Trending / algorithmic feeds. Subscriptions only.
  • iOS / desktop targets. Android-only for now.
  • Google Play Services anything.

Layout

strawApp/   Sulkta-authored app — Compose UI, Media3 wiring, SB + RYD clients
rust/       strawcore — UniFFI wrapper around the Rust extractor
shared/     KMP scaffold inherited from upstream NewPipe (unused for now)
app/        Upstream NewPipe :app module — kept for reference

Build

./gradlew :strawApp:assembleDebug

Requires the Rust toolchain plus the four Android targets:

rustup target add aarch64-linux-android armv7-linux-androideabi \
                  x86_64-linux-android i686-linux-android
cargo install cargo-ndk uniffi-bindgen

…and ANDROID_NDK_HOME pointing at NDK r27c (or newer). The Gradle build runs cargo ndk + uniffi-bindgen automatically.

License

GPL-3.0-or-later, inherited from upstream NewPipe.

Upstream

This repo tracks https://github.com/TeamNewPipe/NewPipe. Upstream changes get pulled periodically via the upstream remote.

Disclaimer

Not affiliated with YouTube, Google, NewPipe e.V., the SponsorBlock project, or Return YouTube Dislike. Trademarks belong to their owners. Straw uses public web endpoints; nothing here authenticates to any account.