From 40c92ad08da4a5173232c54649113591eb5931c3 Mon Sep 17 00:00:00 2001 From: rays Date: Mon, 28 Sep 2026 13:57:02 +0000 Subject: [PATCH] Rename iPodderX to iPX (#56) The app, the repository (rays/ipx), the image, the compose service and container, and the data folders on Tower take the new name. What stays: the 2004 iPodderX and ipodderx-core, which are history; the Postgres database and login, and ipodderx.sdf1.net with its Access and Authentik apps, which would each need moving outside this repo; and the first-start password, as ipx is shorter than the eight characters a password needs. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 39 ++++++++++++++++++++------------------- CLAUDE.md | 28 ++++++++++++++-------------- README.md | 4 ++-- docker-compose.yml | 14 +++++++------- docs/sso.md | 14 +++++++------- web/admin.html | 4 ++-- web/index.html | 4 ++-- web/login.html | 4 ++-- 8 files changed, 56 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1d7545..0076ef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- iPodderX is now called iPX, on every page and in the tab. The repository is rays/ipx. - On a phone, iPodderX looks like an iOS app: filled round buttons and capsules instead of outlined boxes, no rules between the bars and the page, the feed's name as a large title, a segmented control for the tabs, taller rows with 17px text, and dialogs as sheets from the @@ -609,22 +610,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Torrent enclosures through librqbit, seeding to a ratio or a time, with a stall timeout. - `ipx import` and `ipx export` for OPML, and systemd units in `contrib/`. -[unreleased]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.8.4...main -[0.8.4]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.8.3...v0.8.4 -[0.8.3]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.8.2...v0.8.3 -[0.8.2]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.8.1...v0.8.2 -[0.8.1]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.8.0...v0.8.1 -[0.8.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.7.0...v0.8.0 -[0.7.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.6.1...v0.7.0 -[0.6.1]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.6.0...v0.6.1 -[0.6.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.5.5...v0.6.0 -[0.5.5]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.5.4...v0.5.5 -[0.5.4]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.5.3...v0.5.4 -[0.5.3]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.5.2...v0.5.3 -[0.5.2]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.5.1...v0.5.2 -[0.5.1]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.5.0...v0.5.1 -[0.5.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.4.0...v0.5.0 -[0.4.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.3.0...v0.4.0 -[0.3.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.2.0...v0.3.0 -[0.2.0]: https://git.sdf1.net/rays/ipodderx-rs/compare/v0.1.0...v0.2.0 -[0.1.0]: https://git.sdf1.net/rays/ipodderx-rs/releases/tag/v0.1.0 +[unreleased]: https://git.sdf1.net/rays/ipx/compare/v0.8.4...main +[0.8.4]: https://git.sdf1.net/rays/ipx/compare/v0.8.3...v0.8.4 +[0.8.3]: https://git.sdf1.net/rays/ipx/compare/v0.8.2...v0.8.3 +[0.8.2]: https://git.sdf1.net/rays/ipx/compare/v0.8.1...v0.8.2 +[0.8.1]: https://git.sdf1.net/rays/ipx/compare/v0.8.0...v0.8.1 +[0.8.0]: https://git.sdf1.net/rays/ipx/compare/v0.7.0...v0.8.0 +[0.7.0]: https://git.sdf1.net/rays/ipx/compare/v0.6.1...v0.7.0 +[0.6.1]: https://git.sdf1.net/rays/ipx/compare/v0.6.0...v0.6.1 +[0.6.0]: https://git.sdf1.net/rays/ipx/compare/v0.5.5...v0.6.0 +[0.5.5]: https://git.sdf1.net/rays/ipx/compare/v0.5.4...v0.5.5 +[0.5.4]: https://git.sdf1.net/rays/ipx/compare/v0.5.3...v0.5.4 +[0.5.3]: https://git.sdf1.net/rays/ipx/compare/v0.5.2...v0.5.3 +[0.5.2]: https://git.sdf1.net/rays/ipx/compare/v0.5.1...v0.5.2 +[0.5.1]: https://git.sdf1.net/rays/ipx/compare/v0.5.0...v0.5.1 +[0.5.0]: https://git.sdf1.net/rays/ipx/compare/v0.4.0...v0.5.0 +[0.4.0]: https://git.sdf1.net/rays/ipx/compare/v0.3.0...v0.4.0 +[0.3.0]: https://git.sdf1.net/rays/ipx/compare/v0.2.0...v0.3.0 +[0.2.0]: https://git.sdf1.net/rays/ipx/compare/v0.1.0...v0.2.0 +[0.1.0]: https://git.sdf1.net/rays/ipx/releases/tag/v0.1.0 diff --git a/CLAUDE.md b/CLAUDE.md index 885bf08..129a424 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,4 +1,4 @@ -# Working on ipodderx-rs +# Working on ipx Notes for whoever picks this up next. Read [docs/architecture.md](docs/architecture.md) for how the thing is built; this file is about working on it without repeating mistakes that have already been @@ -6,22 +6,22 @@ made here. ## Where things are -Production is the `iPodderX` container on Tower (192.168.1.130), the `ipodderx` service of the +Production is the `iPX` container on Tower (192.168.1.130), the `ipx` service of the Arcane project `content`: `/mnt/fast/arcane/projects/content/compose.yaml`. That file is what runs; `docker-compose.yml` in this repo is a copy, and editing it changes nothing in production. | | Host | In the container | |---|---|---| -| Image | `192.168.1.130:5000/ipodderx:latest` | | -| Config | `/mnt/fast/appdata/ipodderx/config.toml`: bind address, token, trusted proxies, torrent, paths. The feeds and server settings are in the database | `/config/config.toml` | -| Database | Postgres 18, database `ipodderx`, login `ipodderx`, on the `postgres` container of the Arcane project `databases` (`192.168.1.130:5433`). The URL is in `ipodderx.env` beside the compose file (`/mnt/fast/arcane/projects/content/ipodderx.env`, mode 600), passed to the container as `IPX_DATABASE_URL`. A relative `env_file`: Arcane runs compose in its own container, where `/mnt/fast/appdata` does not exist | | -| Old database | `/mnt/user/ipodderx/state.db`, SQLite, used until the move to Postgres on 2026-09-18 and kept for rollback | `/data/state.db` | -| Downloads | `/mnt/user/ipodderx/downloads` | `/downloads` | +| Image | `192.168.1.130:5000/ipx:latest` | | +| Config | `/mnt/fast/appdata/ipx/config.toml`: bind address, token, trusted proxies, torrent, paths. The feeds and server settings are in the database | `/config/config.toml` | +| Database | Postgres 18, database `ipodderx`, login `ipodderx`, on the `postgres` container of the Arcane project `databases` (`192.168.1.130:5433`). The URL is in `ipx.env` beside the compose file (`/mnt/fast/arcane/projects/content/ipx.env`, mode 600), passed to the container as `IPX_DATABASE_URL`. A relative `env_file`: Arcane runs compose in its own container, where `/mnt/fast/appdata` does not exist | | +| Old database | `/mnt/user/ipx/state.db`, SQLite, used until the move to Postgres on 2026-09-18 and kept for rollback | `/data/state.db` | +| Downloads | `/mnt/user/ipx/downloads` | `/downloads` | | Web UI | `192.168.1.130:8099`, also `ipodderx.sdf1.net` via a Cloudflare tunnel | `0.0.0.0:8099` | | Sign-in via the tunnel | Cloudflare Access app `ipodderx`, with Authentik as its identity provider; see [docs/sso.md](docs/sso.md) | trusts `Cf-Access-Authenticated-User-Email` from `192.168.16.1`, the `content_default` gateway, and only with a valid `Cf-Access-Jwt-Assertion` (`access_team`, `access_aud`) | -Work to do lives in the Gitea issues at https://git.sdf1.net/rays/ipodderx-rs/issues, not in a -`TODO.md`. `/src/tea` is logged in: `/src/tea issues list --login git.sdf1.net --repo rays/ipodderx-rs`. +Work to do lives in the Gitea issues at https://git.sdf1.net/rays/ipx/issues, not in a +`TODO.md`. `/src/tea` is logged in: `/src/tea issues list --login git.sdf1.net --repo rays/ipx`. **Every problem found gets an issue, before it is fixed.** A bug, a gap or a security hole turned up along the way (reading logs, a review, a test that fails for another reason) is filed as soon @@ -30,7 +30,7 @@ when. Name the issue in the commit that fixes it (`(#40)` in the subject). Once `main` and pushed, comment on the issue with what changed and the commit, then close it: ```sh -R="--login git.sdf1.net --repo rays/ipodderx-rs" +R="--login git.sdf1.net --repo rays/ipx" t() { timeout 30 /src/tea "$@" < /dev/null; } t issues create $R -t "Web token printed in the startup log" -L bug -d "What is wrong, where, how it was found." t comment $R 40 "Fixed in 3625cf4: the startup line says where the token is kept, not what it is. Deployed in 0.8.3." @@ -46,10 +46,10 @@ for later stays open, and that is how it gets picked up again. Deploying a change is: build and push the image, then pull it and recreate the container. ```sh -docker buildx build --tag 192.168.1.130:5000/ipodderx:latest . --push -docker compose -f /mnt/fast/arcane/projects/content/compose.yaml pull ipodderx -docker compose -f /mnt/fast/arcane/projects/content/compose.yaml up -d ipodderx -docker logs --tail 20 iPodderX +docker buildx build --tag 192.168.1.130:5000/ipx:latest . --push +docker compose -f /mnt/fast/arcane/projects/content/compose.yaml pull ipx +docker compose -f /mnt/fast/arcane/projects/content/compose.yaml up -d ipx +docker logs --tail 20 iPX ``` **Name the service.** A bare `up -d` recreates every container in `content`, beets and immich diff --git a/README.md b/README.md index 8d2fe7c..7fc3a43 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ipodderx-rs +# ipx A self-hosted podcatcher for a household. It checks your feeds, downloads the episodes, and serves a web UI modelled on the 2004 Mac app **iPodderX**, for any number of people sharing one copy of @@ -30,7 +30,7 @@ behind iPodderX (2004-2008, Ray Slakinski & August Trometer). With Docker: ```sh -docker build -t ipodderx . +docker build -t ipx . docker compose up -d ``` diff --git a/docker-compose.yml b/docker-compose.yml index aee2264..d46e88a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: - ipodderx: - image: 192.168.1.130:5000/ipodderx:latest - container_name: iPodderX + ipx: + image: 192.168.1.130:5000/ipx:latest + container_name: iPX restart: unless-stopped environment: PUID: "99" @@ -10,15 +10,15 @@ services: IPX_LOG: "ipx=info" # IPX_DATABASE_URL=postgres://... to use Postgres; without it, /data/state.db (SQLite). env_file: - - ipodderx.env # relative: Arcane resolves it inside its own container + - ipx.env # relative: Arcane resolves it inside its own container ports: - "8099:8099" # web UI - "6881:6881/tcp" # BitTorrent peers - "6881:6881/udp" # DHT volumes: - - /mnt/fast/appdata/ipodderx:/config # config.toml, and the web token - - /mnt/user/ipodderx/:/data # state.db - - /mnt/user/ipodderx/downloads:/downloads + - /mnt/fast/appdata/ipx:/config # config.toml, and the web token + - /mnt/user/ipx/:/data # state.db + - /mnt/user/ipx/downloads:/downloads healthcheck: test: ["CMD", "ipx", "status"] interval: 30s diff --git a/docs/sso.md b/docs/sso.md index 516ead1..1cb79e8 100644 --- a/docs/sso.md +++ b/docs/sso.md @@ -31,7 +31,7 @@ request it forwards through the tunnel, and ipx signs that person in. | Access application | Zero Trust → Access → Applications → `ipodderx` | Domain `ipodderx.sdf1.net`; identity providers: Authentik only, with instant auth; session 730h; policy *Require Login* allows a list of email addresses | | Tunnel route | Zero Trust → Networks → Tunnels → `rays-unraid` → Public hostnames | `ipodderx.sdf1.net` → HTTP `192.168.1.130:8099` | | DNS | `sdf1.net` | `ipodderx` CNAME to the tunnel, proxied | -| ipx | `/mnt/fast/appdata/ipodderx/config.toml`, `[web]` | below | +| ipx | `/mnt/fast/appdata/ipx/config.toml`, `[web]` | below | ```toml [web] @@ -51,7 +51,7 @@ on since 2026-09-19. Both can be read without the dashboard: a request to the si out is sent to `https:///cdn-cgi/access/login/ipodderx.sdf1.net?kid=&...`. Restart ipx after editing it: `docker compose -f /mnt/fast/arcane/projects/content/compose.yaml -restart ipodderx`. +restart ipx`. ### What was missing @@ -93,7 +93,7 @@ ordinary user with no feeds. An account made before the proxy can be given the n send: ```sh -docker exec iPodderX ipx user rename +docker exec iPX ipx user rename ``` ### Signing out @@ -109,10 +109,10 @@ feeds. ### The tile in Authentik's library -Authentik's library lists Authentik's own applications, and ipodderx signs in through the one -called `Cloudflare Access`, so ipodderx needs a bookmark of its own to show up there. It is +Authentik's library lists Authentik's own applications, and ipx signs in through the one +called `Cloudflare Access`, so ipx needs a bookmark of its own to show up there. It is Applications → Applications → `ipodderx`: no provider, launch URL `https://ipodderx.sdf1.net`, and -the iPodderX icon. Like Outline's, it has no policy bindings, so everyone in Authentik sees the +the ipx logo. Like Outline's, it has no policy bindings, so everyone in Authentik sees the tile. Who actually gets in is still up to the Access policy. ### Check it @@ -222,7 +222,7 @@ echo -n 'newsecret' | ipx user passwd sam # change a password ipx user rm sam # remove the account ``` -In the container, put `docker exec iPodderX` in front, and `docker exec -i iPodderX` for the ones +In the container, put `docker exec iPX` in front, and `docker exec -i iPX` for the ones that read a password. Set `auto_create_users = false` once everyone who should have an account has one. After that the diff --git a/web/admin.html b/web/admin.html index 2128f77..3a6b970 100644 --- a/web/admin.html +++ b/web/admin.html @@ -4,7 +4,7 @@ -iPodderX admin +iPX admin @@ -12,7 +12,7 @@
- +

Admin

diff --git a/web/index.html b/web/index.html index f66276a..8a3c7e9 100644 --- a/web/index.html +++ b/web/index.html @@ -4,7 +4,7 @@ -iPodderX +iPX @@ -34,7 +34,7 @@