Skip to content

Releases: biolend83/tubehaus

v0.7.5

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 23:34

Fixed

  • Under load the WARP relay for the companion (socat) could hit the container's process limit and exit, after which every video failed until a restart. It is now capped, restarted if it exits, and init: true reaps finished helper processes; the public compose allows 512 processes
  • The watch page showed recent videos as posted at midnight UTC (e.g. "17 hours ago" for a video from 2 hours ago): YouTube only gives Invidious the upload date, so the exact time now comes from the channel's RSS feed (#20)

v0.7.4

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 11:53

Changed

  • English is the default language until one is chosen (it used to follow the browser). The first-visit picker preselects English.

v0.7.3

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 11:49

Changed

  • The sign-up / sign-in page asks for the language first on a first visit, like the app does, and has a language selector at the bottom. The choice carries over to the app.

v0.7.2

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 11:44

Fixed

  • deploy/Caddyfile.public: the sign-up / sign-in page is never cached, so a browser picks up an update at once.

v0.7.1

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 11:39

Fixed

  • The sign-up / sign-in page loaded its texts from the wrong path when served at /signup and /login, so it showed an empty form.

v0.7.0 — sign-up wall and Anubis for public instances

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 11:33

🔐 Sign-up wall for public instances

HT_ACCOUNTS=1 asks every visitor to create an account first: a user name and a password, no e-mail or other personal details.

  • Passwords stored as PBKDF2-SHA256 hashes (600,000 rounds, random salt)
  • Sessions are HMAC-signed, HttpOnly, Secure cookies
  • Sign-ups limited per network, log-ins limited per network and per account, a honeypot field for bots, and constant-work log-ins so names can't be probed
  • Sign-up / sign-in page in all 13 languages, sign-out in Settings

🤖 A hardened public setup with Anubis

deploy/docker-compose.public.yml (+ Caddyfile.public, anubis-policy.yaml) is the setup the demo instance runs:

  • Anubis in front: the browser solves a short proof-of-work check before anything loads, which keeps scrapers and bulk bots out
  • The sign-up wall, Invidious accounts and admin off, the companion limited to the player's reads, load limits, CPU/memory/process caps, no access log
docker compose --env-file .env -f deploy/docker-compose.public.yml up -d

👉 Try it: https://try.168-107-27-85.sslip.io

v0.6.1 — try it online, and two docker compose fixes

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 11:17

👉 Try it without installing

https://try.168-107-27-85.sslip.io: a small public instance (up to 15 viewers at a time, 720p). It runs in public mode, so your history stays in your own browser.

Fixed (docker compose)

Found while setting that instance up on a fresh server:

  • WARP never connected. The TubeHaus container now gets NET_ADMIN (it only affects the container's own network namespace). Without it every YouTube request failed
  • The PO-token job never succeeded. invidious-companion now gets NETWORKING_FETCH_RETRY_INITIAL_DEBOUNCE and NETWORKING_FETCH_RETRY_DEBOUNCE_MULTIPLIER

If your install shows WARP proxy ... unreachable or Companion is starting. Please wait until a valid potoken is found in --doctor, this release fixes it:

git pull
docker compose pull
docker compose up -d

v0.6.0 — public instances, and holding up under a crowd

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 10:24

🌐 Public instance mode

People keep asking to try TubeHaus without installing it. Now anyone with a server can open a public instance for strangers by setting TUBEHAUS_PUBLIC=1:

  • Every visitor's library lives in their own browser. Subscriptions, history, resume points and playlists stay in local storage. The server keeps nothing about its visitors, and nobody can see anyone else's data
  • The server only does stateless work: fetching feeds for the channels a browser sends, parsing imports, converting exports, and playing video
  • Off on public instances: send to TV and server downloads (they'd be shared between strangers) and Shorts learning
  • A note in Settings reminds visitors to export a backup now and then

🧱 Holding up under a crowd

  • Viewer cap (TUBEHAUS_MAX_VIEWERS): newcomers beyond it are told "busy, try again in a few minutes"; people already watching are never cut off
  • Quality cap (TUBEHAUS_MAX_HEIGHT, e.g. 1080) to keep bandwidth in check
  • Per-visitor rate limit (TUBEHAUS_RATE_PER_MIN, 120/min by default on public instances)
  • Bounded request slots (HT_MAX_CONNECTIONS, 256): beyond them the server answers "busy" in 0.2 s instead of falling over; idle connections are dropped after 30 s
  • When many people open the same video or the same channel feeds at once, YouTube is asked once and the answer is shared (live streams already were)

Load-tested: 12 people opening the same new video at once → one YouTube request; a capped server admitted exactly its limit; a flooding client got 429 after its quota.

🌍 Translations

  • Bengali, the 13th language, and a native speaker's Hindi review. Thanks @rahul05ranjan (#16, #17)!

Want to run a public instance? See Running a public instance and add yours to the discussion.

Upgrading

git pull
docker compose pull
docker compose up -d

v0.5.0 — calm mode

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 06:12

🌿 Calm mode

One switch in Settings → Playback turns YouTube back into a tool:

  • Home is only new videos from your subscriptions, newest first
  • Shorts, trending, the explore menu and the recommended-videos column disappear everywhere. Shorts links open as regular videos
  • Nothing plays after a video ends (playlists you started still continue)
  • Comments stay folded behind a button until you want them

Search still works, so you watch what you came for and leave. It's a per-device setting, so the kids' tablet can be calm while the TV isn't.

Also new: a Thanks section in the README for everyone who has helped so far.

Upgrading

git pull
docker compose pull
docker compose up -d

v0.4.0 — import from anywhere, export everything

Choose a tag to compare

@biolend83 biolend83 released this 23 Oct 05:57

📦 Your data in and out

Thanks to @JamesMowery for asking for both (#14, #15).

Import from file (Settings → My data, or the subscriptions page). Just pick the file:

  • Google Takeout: the subscriptions CSV, and watch-history.json for your watch history
  • Invidious export, NewPipe, FreeTube, any OPML file
  • TubeHaus backups

Channel names and pictures, and the titles of videos that come as bare IDs, are filled in automatically afterwards. Importing the same file twice doesn't create duplicates.

Export, so your data is never stuck here:

  • TubeHaus backup: everything (subscriptions, history, resume points, playlists, likes, Shorts preferences), re-importable as is
  • Invidious format, a Takeout-style CSV, or OPML for any feed reader

Upgrading

git pull
docker compose pull
docker compose up -d