No description
  • Rust 68.8%
  • Kotlin 29%
  • CSS 1%
  • Shell 0.9%
  • Dockerfile 0.3%
Find a file
salix 940c489ade
All checks were successful
Adwaita Flatpak / build (push) Successful in 6m24s
Android nightly APK / build (push) Successful in 19m39s
Skip sync instead of queueing behind WebDAV archive transfers
- Make sync_now take the shared WebDAV gate with try_lock and return CoreError::SyncBusy when an archive transfer holds it, rather than waiting for the whole upload pass.
- Treat SyncBusy as a skipped run, not a failure, in the GTK and Android sync paths: no error shown, no retry backoff armed, and the in-flight state cleared.
- Add a core test that a busy gate yields SyncBusy, and an Android SyncCoordinator test that a busy engine is reported as NotDue without a recorded message.
2026-10-16 12:04:42 +02:00
.forgejo Restore public container images, pinned by digest 2026-10-14 12:59:17 +02:00
adwaita Skip sync instead of queueing behind WebDAV archive transfers 2026-10-16 12:04:42 +02:00
android Skip sync instead of queueing behind WebDAV archive transfers 2026-10-16 12:04:42 +02:00
assets/readme Give the README download buttons and screenshots 2026-09-03 14:15:44 +02:00
core Skip sync instead of queueing behind WebDAV archive transfers 2026-10-16 12:04:42 +02:00
.dockerignore Initial commit 2026-07-18 20:18:53 +02:00
.gitignore Merge android-library into main 2026-08-19 13:30:53 +02:00
README.md Remove the adult-content consent setting and always include adult search 2026-10-04 22:32:40 +02:00

Threado

Read Reddit without an account, and without leaving one behind.

Download • Android • GNOME • Matrix


Community

Chat in #threado:salix.host on Matrix

Discussion happens in #threado:salix.host, which works from any Matrix client. If you do not have an account yet, you can create one on salix.host, my public homeserver: federated, encrypted by default, and no email address required.


Download Threado

Android

Add Threado to Obtainium Download the latest Android APK

Obtainium is the recommended option because it installs updates directly from Threado releases. The APK button opens the latest release for a manual download. Threado needs Android 7.0 or newer and is not available through Google Play.

F-Droid clients can add the Salix repository at https://salix.host/fdroid/repo/ instead. It provides Threado (app.threado) and the separately installable Threado Nightly (app.threado.nightly).

Linux

Add the Salix Flatpak repository

Open the Flatpak repository button with GNOME Software or Discover, then install Threado from the new Salix source. The repository is signed and provides updates for the stable app as well as the separately installable nightly build. These packages currently support x86_64 only. If your software center does not handle the button, use:

flatpak remote-add --if-not-exists salix https://salix.host/flatpak/salix.flatpakrepo
flatpak install salix app.threado.Threado

Screenshots


Description

Threado is a set of native apps for reading public Reddit content without an account. You subscribe to the communities and profiles you care about, and Threado keeps the feed, the saved posts, and the reading history on your own devices.

There is an Android app and a GNOME desktop app. They look and feel like the platform they run on, and they share one Rust core so they behave the same way underneath.

Features

  • Account-free by construction. Reads go through an anonymous OAuth token Reddit issues to an application rather than a person. No sign-in, no credentials, no Reddit cookies sent, no user state created.
  • Tor without the setup. Route everything through the app's embedded Arti client or your own system Tor, and point the reader at Reddit's clearnet hosts or its official onion service. The two are independent settings, and embedded Tor fails closed rather than falling back to clearnet.
  • Circuits that do not look alike. Each Tor lane mints its own token over its own circuit with its own device id, and background media traffic gets a market-share-weighted browser fingerprint covering TLS, HTTP/2, headers, and user agent. No two live circuits share one.
  • A feed you can shape. Subscribed communities, followed profiles, and custom feeds mix into one home feed, with at most one profile post admitted per four community posts so quiet profiles cannot pad it with stale submissions.
  • A library that stays yours. Saved posts with ordered collections, tags, and notes, plus read history, all in a local SQLite database. Portable JSON backups export, and import as a preview-and-merge that never overwrites newer local records.
  • Offline reading packs. Download the newest posts and comments from Home, a custom feed, a community, or a profile before a commute. Choose a post count, optional media, and a storage limit for each pack. Read and delete packs from the Offline reading packs menu.
  • Spaces for different uses. Each space keeps its own follows, custom feeds, library and reading history. Switching takes fresh Tor circuits and API identities so the spaces are not linked. One sync target covers every space, and spaces created or renamed on one device appear on the others.
  • Sync with no service in the middle. Optional cross-device sync goes through your own WebDAV server. The password and a target-bound encryption key live in the platform's secret store, and each device chooses which library categories it publishes and accepts.
  • Media that plays inline. Images, galleries, Reddit DASH video, direct HTTPS video, animated images, and supported Redgifs links all play in the feed and the reader, and every byte arrives over the network route you selected.

Projects

Project Best for Built with How to get it
Android Phones, tablets, foldables Kotlin, Compose, Media3 APK on the releases page or via Obtainium
GNOME Linux desktops Rust, GTK 4, libadwaita, GStreamer Flatpak from the signed Salix repository
Core Everything shared Rust, SQLite, Arti, UniFFI Used by the apps above

This is one Git repository holding independent Cargo and Gradle projects. Each project README covers install, build, and what is actually implemented today.

Contributions

I'm not currently accepting contributions, but issues are welcome for bug reports, feature ideas, and other feedback.

Releases

Pushing a semantic-version tag such as v1.1.0 runs .forgejo/workflows/release.yml, which builds and verifies a signed Android release APK plus the stable app.threado.Threado Flatpak, publishes the Flatpak to the signed Salix repository and the APK to the Salix F-Droid repository, then publishes both files and their SHA-256 checksums as a Forgejo release.

Between releases, pushes that touch the relevant platform or core sources build downloadable nightly artifacts. Android nightly APK uploads threado-nightly-<commit>.apk and publishes it to the F-Droid repository as app.threado.nightly, and Adwaita Flatpak publishes the separately installable app.threado.Threado.Devel nightly Flatpak. Both workflows can also be started manually and expect the container-capable Forgejo runner with the unraid-docker label. Toolchains are installed inside each job container; the runner does not need to expose its Docker daemon.

Disclaimer and license status

Threado is a personal project, built for daily use and experimentation. Threado, its source code, and all downloadable builds are provided as is, without warranties of any kind, express or implied. You use them entirely at your own risk. To the fullest extent permitted by applicable law, the author will not be liable for any claim, loss, damage, data loss, service interruption, or other consequence resulting from the use, misuse, or inability to use Threado.

No support commitments, compatibility guarantees, or release schedule are provided. You are responsible for complying with applicable laws and third-party terms when using Threado. The project is not affiliated with Reddit or Redgifs.

The code is source available for reading and reference. It is not open source licensed, so unless a license is added later, no permission is granted to reuse, redistribute, or relicense it.