6bec0e068ad3b00a73abac231e8d1033b8c34c8c
ani-cli web
Local web UI for a system-wide ani-cli install.
Current version: 0.48.3
What it does
- Search anime in
subordub, with poster-style results shown below the selection panel and the first English alternate title when available - Queue downloads with folder, quality, media type, season, and episode controls
- Optionally retry failed
ani-clidownloads withanipy-cli - Track shows in a watchlist with
Watching,Planned,Finished, andDroppedcategories - Expose a small JSON summary endpoint for Homepage dashboard widgets
- Refresh watchlist episode counts manually or on a schedule
- Auto-download missing episodes for
Watchingentries after later refreshes, with a per-showSource nameoverride forani-clisearch - Move fully completed libraries into Jellyfin TV or movie folders with tracked background handoff jobs that also appear in the Queue page
- Send optional Discord webhook notifications
- Serve a checked-in
favicon.pngas the site favicon
Pages
/: Search and queue downloads, with poster-card search results below the selection box and alternate English titles under the main name when available/queue: Monitor downloads and Jellyfin handoff jobs, inspect logs, retry failed downloads, avoid duplicate re-queues for the same failed download, clear failed jobs, and remove finished jobs/watchlist: Track shows, refresh them, download all available episodes, and manage auto-download settings such asSource name, libraryName, season, and episode offset/config: Save defaults, toggleanipy-clifallback retries, schedule refreshes, configure Jellyfin and Discord, monitor Jellyfin handoff progress, and view runtime info and the changelog
Quick start
Requirements:
ani-cliinstalled and available inPATH- Optional:
anipy-cliinstalled and available inPATHif you want automatic fallback retries outside Docker - Common runtime tools used by
ani-cli, especiallycurl,ffmpeg,fzf,grep,openssl,sed,aria2c,botan, andyt-dlp
Run locally:
./ani-cli-web
Open:
http://127.0.0.1:8421/
Useful flags and env:
./ani-cli-web --debugANI_CLI_WEB_HOST=0.0.0.0ANI_CLI_WEB_PORT=8421ANI_CLI_BIN=/path/to/ani-cliANIPY_CLI_BIN=/path/to/anipy-cli
Docker
Build:
docker build -t ani-cli-web .
Build a specific ani-cli-web branch:
docker build \
--build-arg ANI_CLI_WEB_BRANCH=anipy_backup \
-t ani-cli-web .
Run:
docker run --rm \
-p 8421:8421 \
-e USER_UID="$(id -u)" \
-e USER_GID="$(id -g)" \
-v "$(pwd)/downloads:/downloads" \
-v "$(pwd)/.ani-cli-web:/app/.ani-cli-web" \
ani-cli-web
Compose:
USER_UID="$(id -u)" USER_GID="$(id -g)" docker compose up --build -d
Docker notes:
- The container serves on
0.0.0.0:8421 - Downloads are written under
/downloads - App state is stored under
/app/.ani-cli-web USER_UIDandUSER_GIDhelp keep mounted files owned by your host userUPDATE_ON_START=truerunsani-cli --updatebefore startupANI_CLI_WEB_BRANCHlets the image clone a specificani-cli-webbranch at build timebotanis installed inside the container for providers or scripts that need Botan cryptography toolinganipy-cliis installed systemwide inside the container, so fallback retries are available without extra container setup
Key behavior
Watchlist
- Adding a show tracks it without downloading immediately
- Later manual refreshes or scheduled refreshes can queue missing episodes
Download allqueues every currently available episode for the chosen mode- Successful downloads sync back into the watchlist
- TV entries move to
Finishedwhen the selected downloaded mode reaches the expected episode count - Movie entries can be treated as complete after download and routed to movie storage
Auto-download
- Runs only for entries in
Watching - Uses the per-show language, quality,
Source namesearch override, season, library name, and optional episode offset settings - Can queue backlog episodes that were already available before the show was first tracked
Download fallback
- Optional and configured from
/config - When enabled, a failed
ani-cliqueue job retries once withanipy-cli - Fallback retries keep the queued episode numbers when the downloaded
anipy-clifilenames are renumbered from1 - Docker images install
anipy-cliautomatically; non-Docker installs should provide it inPATHthemselves
Queue retries
- Adding a download that exactly matches an existing failed queue job reuses that failed entry and sets it back to
pending - This avoids stacking multiple failed rows for the same episode when you queue the same job again
Jellyfin handoff
- Optional and configured from
/config - TV libraries move only after the show is finished and download-complete
- Movie libraries move after download completion
- Manual
Run nowscans the watchlist in a background job and shows live progress for processed entries, moved files, and the current destination path - Recent Jellyfin handoff jobs survive page reloads and show their latest status after app restarts
Homepage widget API
For Homepage's Custom API widget, use:
http://127.0.0.1:8421/api/watchlist/homepage
Example response:
{
"watchlist": 12,
"planned": 4,
"finished": 31,
"dropped": 2,
"total": 49
}
This endpoint is intentionally small so Homepage can map the returned values directly into its widget fields.
Runtime info
The Config page runtime panel shows:
ani-cli-webversion loaded fromVERSION- Installed
ani-cliversion - Installed
anipy-cliversion and dependency status - A
Changelogbutton that opens a scrollable viewer backed byCHANGELOG.md
Remote access
By default the app only serves loopback clients.
To allow LAN or remote access:
ANI_CLI_WEB_ALLOW_REMOTE=1
ANI_CLI_WEB_AUTH_USERNAME=admin
ANI_CLI_WEB_AUTH_PASSWORD=choose-a-long-random-password
Optional remote path restriction:
ANI_CLI_WEB_REMOTE_PATH_ROOTS=/downloads:/srv/jellyfin-tv:/srv/jellyfin-movies
State and storage
Project state is stored in:
ani-cli-web/.ani-cli-web/
Main contents:
config.jsonremote-sessions.jsonstate.sqlite3thumbnails/
Downloaded files are organized like this:
ANI_CLI_DOWNLOAD_DIR/tv/Show Name/Season 01/Show Name - S01E01.mp4
ANI_CLI_DOWNLOAD_DIR/movie/Movie Name/Movie Name.mp4
Configuration
Most users only need these environment variables:
ANI_CLI_BINANIPY_CLI_BINANI_CLI_WEB_HOSTANI_CLI_WEB_PORTANI_CLI_WEB_ALLOW_REMOTEANI_CLI_WEB_AUTH_USERNAMEANI_CLI_WEB_AUTH_PASSWORDANI_CLI_WEB_REMOTE_PATH_ROOTSANI_CLI_WEB_DEBUGANI_CLI_WEB_STATE_ROOT
Container-specific variables:
UPDATE_ON_STARTUSER_UIDUSER_GID
Everything else can usually be configured from /config.
Testing
Run the regression suite with:
python3 -m unittest test_app.py
Languages
Python
99.4%
Dockerfile
0.4%
Shell
0.2%