docs: rename yt-offline → Catacomb across README, ROADMAP, guides, packaging

Prose + commands updated to the new name: brand reads "Catacomb", while
binary/path/package references are the lowercase `catacomb` (commands, deb/rpm
names, ~/.local/share/catacomb, catacomb.db, catacomb.desktop). Codeberg repo
URLs left pointing at the existing repo. Also folds in the pending doc edits
from earlier in the session.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Luna 2026-06-19 03:34:18 -07:00
parent 404362bfb0
commit 3f611849af
72 changed files with 1513 additions and 293 deletions

View file

@ -1,4 +1,4 @@
# Packaging yt-offline
# Packaging Catacomb
This document covers building distributable packages. The one-liner:
@ -23,7 +23,7 @@ on demand. Runtime deps declared: `yt-dlp`, `ffmpeg`, `mpv`, `xdg-utils`,
```sh
scripts/package.sh deb
sudo apt install ./dist/yt-offline_*_amd64.deb
sudo apt install ./dist/catacomb_*_amd64.deb
```
### .rpm (Fedora / RHEL / openSUSE)
@ -34,7 +34,7 @@ already-built (and release-profile-stripped) binary.
```sh
scripts/package.sh rpm
sudo dnf install ./dist/yt-offline-*.x86_64.rpm
sudo dnf install ./dist/catacomb-*.x86_64.rpm
```
Note: `ffmpeg` on Fedora lives in [RPM Fusion](https://rpmfusion.org/);
@ -50,8 +50,8 @@ would balloon the image and tangle the licensing.
```sh
scripts/package.sh appimage
chmod +x dist/yt-offline-*-x86_64.AppImage
./dist/yt-offline-*-x86_64.AppImage
chmod +x dist/catacomb-*-x86_64.AppImage
./dist/catacomb-*-x86_64.AppImage
```
## Arch Linux
@ -82,11 +82,11 @@ sudo apt install mingw-w64 zip # or your distro's equivalent
scripts/package.sh win
```
This produces `dist/yt-offline-<ver>-x86_64-windows.zip` containing
`yt-offline.exe`, `LICENSE.txt`, and a `README.txt` listing the runtime
This produces `dist/catacomb-<ver>-x86_64-windows.zip` containing
`catacomb.exe`, `LICENSE.txt`, and a `README.txt` listing the runtime
PATH deps (yt-dlp / ffmpeg / mpv). Release builds link as a GUI-subsystem
app (no console window); the binary reattaches to the launching terminal
at runtime (`attach_windows_console` in `main.rs`) so `yt-offline.exe
at runtime (`attach_windows_console` in `main.rs`) so `catacomb.exe
--web 8080` from PowerShell prints its logs, while a double-click stays
windowless.
@ -110,12 +110,12 @@ rustup target add aarch64-apple-darwin # or x86_64-apple-darwin
MAC_ARCH=arm64 scripts/package.sh mac # arm64 (default) | x86_64
```
This cross-compiles, assembles an unsigned `yt-offline.app`
This cross-compiles, assembles an unsigned `catacomb.app`
(`Info.plist` + the Mach-O binary; an `.icns` icon too if `png2icns` is
available), and zips it to `dist/yt-offline-<ver>-<arch>-macos.zip`. The
available), and zips it to `dist/catacomb-<ver>-<arch>-macos.zip`. The
`.app` is **not codesigned or notarized**, so on the target Mac it must be
opened the first time via right-click → Open, or cleared with `xattr -dr
com.apple.quarantine yt-offline.app`. Runtime deps (yt-dlp / ffmpeg / mpv)
com.apple.quarantine catacomb.app`. Runtime deps (yt-dlp / ffmpeg / mpv)
are expected on PATH as on the other platforms.
A `.dmg` and codesigning/notarization (and a `tray-icon`-based macOS tray)

View file

@ -1,5 +1,5 @@
[book]
title = "yt-offline"
title = "Catacomb"
description = "Self-hosted archive for YouTube, TikTok, Twitch and more. Setup, usage, anti-bot, troubleshooting, and architecture."
authors = ["InannaBeloved"]
language = "en"
@ -8,5 +8,5 @@ src = "src"
[output.html]
default-theme = "navy"
preferred-dark-theme = "navy"
git-repository-url = "https://codeberg.org/anassaeneroi/yt-offline"
edit-url-template = "https://codeberg.org/anassaeneroi/yt-offline/_edit/main/docs/{path}"
git-repository-url = "https://codeberg.org/anassaeneroi/catacomb"
edit-url-template = "https://codeberg.org/anassaeneroi/catacomb/_edit/main/docs/{path}"

View file

@ -2,7 +2,7 @@
[Introduction](./introduction.md)
# Using yt-offline
# Using catacomb
- [Installation](./installation.md)
- [First run & configuration](./first-run.md)

View file

@ -1,7 +1,7 @@
# Staying ahead of YouTube's bot detection
YouTube increasingly fingerprints and rate-limits automated clients.
yt-offline ships a layered defense; understanding the layers makes the
catacomb ships a layered defense; understanding the layers makes the
difference between "everything downloads" and "constant captchas."
In rough order of impact:
@ -10,13 +10,13 @@ In rough order of impact:
This is the single biggest factor. **Anonymous requests get captcha-
walled the hardest.** Provide a `cookies.txt` exported from a browser
where you are **signed in to YouTube**, or point yt-offline at the
where you are **signed in to YouTube**, or point catacomb at the
browser profile directly.
A *valid* logged-in jar contains the auth cookies `SID`, `SAPISID`,
`__Secure-1PSID`, `__Secure-3PSID`, `LOGIN_INFO`, etc. A jar with only
`VISITOR_INFO1_LIVE`, `PREF`, `YSC` is **anonymous** — it's not signed in
and actually makes detection *worse* than no cookies. yt-offline's
and actually makes detection *worse* than no cookies. catacomb's
Settings → Cookies panel warns you when your jar is anonymous or expired.
Two ways to supply cookies:
@ -37,7 +37,7 @@ Two ways to supply cookies:
subdirectory itself). The advantage: cookies are read fresh from the
live session each download, so they never go stale.
> Cookies are session credentials — yt-offline never commits or transmits
> Cookies are session credentials — catacomb never commits or transmits
> `cookies.txt` unprompted, and redacts the cookie path out of any log
> line shown in the UI.
@ -45,7 +45,7 @@ Two ways to supply cookies:
yt-dlp's `--impersonate` makes requests carry a real browser's TLS
fingerprint (via `curl_cffi`), so the connection doesn't *look* like a
script. The bundled install sets this up automatically and yt-offline
script. The bundled install sets this up automatically and catacomb
picks an impersonation target per platform.
If impersonation silently does nothing, it's almost always a
@ -58,7 +58,7 @@ is present). See
## 3. POT tokens (Proof-of-Origin)
YouTube increasingly binds a per-video **Proof-of-Origin token** to
playback; without one, format URLs come back empty. yt-offline can run
playback; without one, format URLs come back empty. catacomb can run
[bgutil-pot](https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs), a
loopback HTTP server that mints these tokens, and point yt-dlp at it.
@ -68,14 +68,14 @@ yt-dlp; the matching plugin installs into its venv) and click **Install**.
> **Version-skew footgun:** the yt-dlp plugin must come from the *same
> release* as the bgutil-pot server binary — **not** the PyPI package,
> which versions independently and silently produces no tokens on a
> mismatch. yt-offline's installer handles this by unpacking the
> mismatch. catacomb's installer handles this by unpacking the
> version-matched plugin zip from the server's release.
## 4. Player-client selection
YouTube cracks down on different internal "player clients" over time —
the `web` client is currently the most captcha-prone, while `tv` and
`mweb` are the least. yt-offline no longer forces `web`; it lets yt-dlp
`mweb` are the least. catacomb no longer forces `web`; it lets yt-dlp
pick good defaults. If a specific channel keeps hitting captchas, set a
client override (global or per-channel):
@ -85,7 +85,7 @@ tv,mweb
## 5. Throttling
A burst of ~30 rapid requests is a classic trip-wire. yt-offline inserts
A burst of ~30 rapid requests is a classic trip-wire. catacomb inserts
a small jittered pause between videos (a fixed cadence looks robotic; a
random one looks human) and, after any rate-limit hit, triples the
sleeps for the rest of the batch before recovering.

View file

@ -80,7 +80,7 @@ fallback.
## Anti-bot subsystems
`ytdlp_bin.rs` manages the optional self-contained venv at
`~/.local/share/yt-offline/` (nightly `yt-dlp[default]` + `curl_cffi` +
`~/.local/share/catacomb/` (nightly `yt-dlp[default]` + `curl_cffi` +
bundled `deno`). `pot_provider.rs` runs `bgutil-pot` for Proof-of-Origin
tokens — its yt-dlp plugin must come from the same release as the server
binary. `error_class.rs` pattern-matches yt-dlp stderr into actionable
@ -95,7 +95,7 @@ wall is RateLimited, not NotFound).
and drives the HTTP API with curl — genuine end-to-end coverage of the
axum + SQLite + config stack.
`cargo test` runs both. (A `.forgejo/workflows/test.yml` CI definition
`cargo test --release` runs both. (A `.forgejo/workflows/test.yml` CI definition
exists, but Codeberg runs Woodpecker rather than Forgejo Actions, so it
doesn't execute there without a self-hosted runner — run the suite
locally.)
@ -103,8 +103,9 @@ locally.)
## Platform support
Tray (`ksni`) and file dialogs (`rfd` xdg-portal) are Linux-only / no-GTK
by design — that's why packaging avoids a GTK dependency. Windows/macOS
aren't first-class yet: the tray needs a per-OS backend before a clean
cross-build. The rest (eframe/wgpu, axum, rusqlite-bundled) already
compiles cross-platform, and `ytdlp_bin` already has `cfg!(windows)`
branches.
by design — that's why packaging avoids a GTK dependency. Those Linux-only
pieces are target-gated: Windows builds use native file dialogs and a no-op
tray stub, and the repo now ships a cross-compiled Windows zip. macOS has a
local osxcross packaging path, but still needs on-hardware validation,
codesigning/notarization, and a real tray backend before it is a normal
release artifact.

View file

@ -3,7 +3,7 @@
## Starting a download
Paste any supported URL into the download bar (desktop) or the ⬇
Downloads modal (web). yt-offline classifies the URL by platform, routes
Downloads modal (web). catacomb classifies the URL by platform, routes
it to the right folder, and starts yt-dlp. A channel/playlist URL pulls
the whole thing; a single-video URL pulls just that one.

View file

@ -2,7 +2,7 @@
## The config file
yt-offline reads `config.toml` **from its working directory** (the
catacomb reads `config.toml` **from its working directory** (the
directory you launch it from), not a fixed path. The same goes for
`cookies.txt`. Everything in `config.toml` is also editable in Settings;
edits there are written back to the file.
@ -61,7 +61,7 @@ Everything nests under the one `backup.directory`:
music/ ← audio-only "Music mode" downloads, by artist
archive.txt ← yt-dlp's global download archive
cookies.txt ← optional, if you set one
yt-offline.db ← watched/positions/flags/folders/notes/cache + password hash
catacomb.db ← plain SQLite app state (watched/positions/flags/notes, password hash, sessions, caches)
```
Each creator folder gets a hidden `.source-url` sidecar so re-checks
@ -72,8 +72,8 @@ always know the exact URL to refresh from.
In **Settings → yt-dlp binary** you choose:
- **System** — uses whatever `yt-dlp` is on your `PATH`.
- **Bundled** — click **Install** and yt-offline builds a self-contained
venv at `~/.local/share/yt-offline/`: nightly `yt-dlp[default]` +
- **Bundled** — click **Install** and catacomb builds a self-contained
venv at `~/.local/share/catacomb/`: nightly `yt-dlp[default]` +
`curl_cffi` (TLS impersonation) + a bundled `deno` (player-JS). The
same button updates it later.
@ -83,8 +83,8 @@ also required for the [POT token provider](./anti-bot.md#3-pot-tokens-proof-of-o
## The two front-ends
- `yt-offline` — desktop GUI (eframe/egui).
- `yt-offline --web [PORT]` — headless web server. Bind to `127.0.0.1`
- `catacomb` — desktop GUI (eframe/egui).
- `catacomb --web [PORT]` — headless web server. Bind to `127.0.0.1`
(default) for localhost-only, a Tailscale address for your tailnet, or
`0.0.0.0` for the LAN. **Set a password** (Settings) before exposing it
beyond localhost — the UI and all `/api` routes are then gated behind an

View file

@ -1,6 +1,6 @@
# Installation
yt-offline is a single Rust binary. You can install a prebuilt package,
Catacomb is a single Rust binary. You can install a prebuilt package,
build from source, or grab the AppImage.
## Runtime dependencies
@ -8,7 +8,7 @@ build from source, or grab the AppImage.
Whichever way you install, these are invoked as subprocesses at runtime:
- **yt-dlp** — the download engine. You can use the system one *or* let
yt-offline manage a bundled copy (see [First run](./first-run.md)).
catacomb manage a bundled copy (see [First run](./first-run.md)).
- **ffmpeg** — muxing, format conversion, on-the-fly transcode for the
web player.
- **mpv** — the default desktop player (any player taking a file path
@ -21,14 +21,14 @@ Releases attach `.deb`, `.rpm`, and `.AppImage` artifacts.
```sh
# Debian / Ubuntu / Mint
sudo apt install ./yt-offline_*_amd64.deb
sudo apt install ./catacomb_*_amd64.deb
# Fedora / RHEL / openSUSE (ffmpeg via RPM Fusion)
sudo dnf install ./yt-offline-*.x86_64.rpm
sudo dnf install ./catacomb-*.x86_64.rpm
# Any Linux — AppImage
chmod +x yt-offline-*-x86_64.AppImage
./yt-offline-*-x86_64.AppImage
chmod +x catacomb-*-x86_64.AppImage
./catacomb-*-x86_64.AppImage
```
## Arch / CachyOS / Manjaro
@ -55,11 +55,11 @@ sudo apt install build-essential pkg-config curl git python3-venv \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
git clone https://codeberg.org/anassaeneroi/yt-offline
cd yt-offline
git clone https://codeberg.org/anassaeneroi/catacomb
cd catacomb
cargo build --release
./target/release/yt-offline # desktop GUI
./target/release/yt-offline --web 8080 # headless web server
./target/release/catacomb # desktop GUI
./target/release/catacomb --web 8080 # headless web server
```
`python3-venv` is only needed for the bundled-yt-dlp install path; skip
@ -67,7 +67,13 @@ it if you'll always use system yt-dlp.
## Windows / macOS
Not first-class yet. The Linux-only system tray (`ksni`) and file dialog
(`rfd` xdg-portal) need per-OS backends before a clean cross-build; the
rest of the stack already compiles. See the
[architecture notes](./architecture.md#platform-support).
Windows is available as a release zip when built through
`scripts/package.sh win` or tag-release CI. It includes `catacomb.exe`,
the license, and a short runtime-dependency README; install `yt-dlp`,
`ffmpeg`, and `mpv` / `mpv.net` on PATH.
macOS has a local osxcross packaging path (`scripts/package.sh mac`) that
assembles an unsigned `.app` zip when you provide an Apple SDK locally.
It is not built in public CI because the SDK cannot be redistributed, and
codesigning/notarization remain follow-ups. See
[packaging](./packaging.md) and the [architecture notes](./architecture.md#platform-support).

View file

@ -1,4 +1,4 @@
# yt-offline
# Catacomb
A self-hosted media archive for YouTube and friends. Paste any URL, it
routes the download to the right folder by source, tracks what you've
@ -24,7 +24,7 @@ single binary that is **both** a desktop app and a headless web server.
## Why it exists
Tartube is the mature open-source yt-dlp GUI and the benchmark in this
space. yt-offline matches its feature set while adding things Tartube
space. catacomb matches its feature set while adding things Tartube
doesn't have: a real web UI reachable from any device, a single-binary
distribution with a bundled toolchain, a modern security model
(password-gated UI, Argon2, rate-limited login), a built-in anti-bot

View file

@ -3,17 +3,20 @@
Build distributable Linux packages with one script:
```sh
scripts/package.sh all # .deb + .rpm + .AppImage → dist/
scripts/package.sh all # Linux packages + Windows zip when toolchains exist
scripts/package.sh deb # just the .deb
scripts/package.sh rpm
scripts/package.sh appimage
scripts/package.sh win # Windows .zip via mingw-w64
scripts/package.sh mac # unsigned macOS .app .zip via local osxcross SDK
```
It builds the release binary once and reuses it for every format,
installing `cargo-deb` / `cargo-generate-rpm` on demand and downloading
`appimagetool` to `dist/tools/` on first AppImage build. Per-format
failures are isolated and summarized at the end. Output (gitignored)
lands in `dist/`.
`appimagetool` to `dist/tools/` on first AppImage build. Windows is included
when the mingw target/toolchain is present; macOS is local-only because
osxcross needs an Apple SDK. Per-format failures are isolated and summarized
at the end. Output (gitignored) lands in `dist/`.
## Formats
@ -37,5 +40,5 @@ Actions — so they don't run there without a self-hosted runner. Until
then, build packages locally with `scripts/package.sh` and publish docs
with `scripts/publish-docs.sh`.
The repo's [`docs/PACKAGING.md`](https://codeberg.org/anassaeneroi/yt-offline/src/branch/main/docs/PACKAGING.md)
The repo's [`docs/PACKAGING.md`](https://codeberg.org/anassaeneroi/catacomb/src/branch/main/docs/PACKAGING.md)
has the per-distro install commands and the Windows/macOS status in full.

View file

@ -1,6 +1,6 @@
# Troubleshooting
yt-offline classifies failed downloads into one of nine classes and shows
catacomb classifies failed downloads into one of nine classes and shows
a one-line suggested fix next to the failed job. This page expands on the
most common ones, plus a few non-download issues.
@ -15,7 +15,7 @@ wall. In order of effectiveness:
2. **Switch to bundled (nightly) yt-dlp** if you're on system stable.
3. **Enable the POT token provider.**
4. **Try a player-client override** of `tv,mweb` for that channel.
5. If it's a one-off, just wait — yt-offline auto-retries transient
5. If it's a one-off, just wait — catacomb auto-retries transient
rate-limits after a cooldown.
## Impersonate targets show "(unavailable)"
@ -40,7 +40,7 @@ major versions are mismatched"* warning.
**Cause:** the yt-dlp plugin came from PyPI (Brainicism's package, which
versions independently) instead of the jim60105 Rust server's release.
**Fix:** re-run the POT **Install/Update** button — yt-offline installs
**Fix:** re-run the POT **Install/Update** button — catacomb installs
the version-matched plugin zip from the same release as the server
binary. Don't `pip install bgutil-ytdlp-pot-provider` yourself.
@ -68,14 +68,14 @@ see [Anti-bot](./anti-bot.md).
## Downloads stall forever
A job sits running with no progress. yt-offline's **hang watchdog**
A job sits running with no progress. catacomb's **hang watchdog**
auto-kills any job silent for 5 minutes and re-queues it, so this should
self-heal. If it recurs on a specific URL, it's usually a server-side
issue with that source; check the job log in the Downloads panel.
## Disk fills up / downloads fail with ENOSPC
yt-offline runs a **disk-full preflight** and refuses to start a download
catacomb runs a **disk-full preflight** and refuses to start a download
when the target filesystem has less than ~500 MB free, surfacing it as a
clear "disk full" failure rather than a half-written file. Free space and
retry.
@ -103,13 +103,13 @@ broken Vulkan stack, the OS can create the window while wgpu never
presents a frame. Try the OpenGL renderer:
```bash
YT_OFFLINE_RENDERER=glow yt-offline
YT_OFFLINE_RENDERER=glow catacomb
```
or:
```bash
yt-offline --renderer glow
catacomb --renderer glow
```
If that works, update/reinstall your Vulkan driver later and switch back
@ -129,6 +129,6 @@ UI until restarted.
- **The job log** — every download/transcode job keeps its full yt-dlp /
ffmpeg output in the Downloads panel (expand the job).
- **`yt-offline.crash.log`** — next to your `yt-offline.db`. A panic in
- **`catacomb.crash.log`** — next to your `catacomb.db`. A panic in
any thread (UI, web worker, download) is appended here with a
timestamp, so it survives a GUI launched without a terminal.

View file

@ -2,7 +2,7 @@
A structured analysis of [Tartube v2.5.231](https://github.com/axcore/tartube)
(2026-05-24), our project's primary feature benchmark. Written to give
yt-offline a concrete target to work toward — every section ends with a
catacomb a concrete target to work toward — every section ends with a
"What we can do" note about whether to adopt, adapt, or skip.
Tartube codebase: ~146,000 lines of Python 3 across 19 modules under
@ -452,7 +452,7 @@ The 791 boolean flags in `mainapp.py` cover all of these plus their
**What we can do:** A handful of these tabs map to features we
literally don't have (FFmpeg presets, comments, profiles, scheduling
calendar). They're roadmap items, not config surface. The actual
*configuration surface* of yt-offline is currently:
*configuration surface* of Catacomb is currently:
- backup dir, max concurrent, bundled-or-system yt-dlp
- player command, browser (for `--cookies-from-browser`)
@ -568,7 +568,7 @@ For the record (to keep momentum honest):
## 12. Specification for "Tartube parity" milestone
Working definition: a yt-offline release is "at Tartube parity" when
Working definition: a catacomb release is "at Tartube parity" when
the following are all true.
- [x] **Per-target download options** with cascade resolution and a