Skip to main content

anime-sh

Watch anime from your terminal.
Type a title — it finds a source, picks a mirror that works, and plays it in mpv.
Providers, mirrors and resolvers are internal details you never have to think about.

PyPI Python CI Providers License: MIT

anime-sh running in Windows Terminal: Continue Watching with progress bars, Airing This Season, and a context panel showing the highlighted show's cover art, genres, progress and next episode
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser      # if you don't have Scoop
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
scoop bucket add extras
scoop bucket add anime-sh https://github.com/Anime123450/scoop-anime-sh
scoop install anime-sh

From nothing. No Python, no setup — mpv is installed with it.


📖 Contents

⚡ Install · 🎬 What you get · 🎨 Themes · 🖼️ Cover art · ⌨️ Keys · 🚀 First run · 🔗 AniList · 📋 Commands · 🧠 How it behaves · 🩺 Troubleshooting · 🛠️ Develop


▶️ A minute with it

anime-sh in use: the home screen with Continue Watching, typing a search, a show's episodes as a grid, and the same episodes as a list

Home · search-as-you-type · a show's episodes, in two of the three layouts

Every frame there is the real application, rendered and captured from the app itself — the same code you install, not a mockup of it.


⚡ Install

Windows — one command

Nothing to set up first. Each of these installs mpv alongside it, which is what actually plays the video.

channel status
🥄 Scoop live
🍫 Chocolatey live
📦 WinGet in review
🐍 PyPI (uv tool install) live

🥄 Scoop — live:

# Only if you don't have Scoop yet — these two lines are Scoop's own quickstart.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

# mpv lives in Scoop's `extras` bucket, and a fresh Scoop only has `main`.
scoop bucket add extras
scoop bucket add anime-sh https://github.com/Anime123450/scoop-anime-sh
scoop install anime-sh

Run these in a normal PowerShell, not an administrator one — Scoop installs per-user and refuses to run elevated.

The first line is what stops Windows refusing the second with a message about running scripts being disabled. It applies to your account only, and RemoteSigned still requires anything downloaded to be signed — it is the setting Microsoft ships on Windows Server. Answer Y when it asks.

📦 WinGet — in review; winget already ships with Windows 10 and 11:

winget install AnimeshSharma.anime-sh

anime not recognised straight after a winget install? It worked — winget changed your PATH and this terminal still has the old copy. Open a new one. Scoop needs no restart.

🍫 Chocolatey — live:

choco install anime-sh

mpv comes with it. For downloads, add ffmpeg: choco install ffmpeg.

Any OS — with Python

uv is a single standalone binary that brings its own Python, so this works on a machine with no Python at all.

# Windows
winget install astral-sh.uv ; winget install shinchiro.mpv
# macOS
brew install uv mpv
# Linux
curl -LsSf https://astral.sh/uv/install.sh | sh && sudo apt install mpv

uv tool install "anime-sh[tui]"
anime doctor
Other ways in — a single file, no terminal, or from source

Just the executable. Every release carries anime-sh-<version>-windows-x64.exe — about 21 MB, with Python and every library inside it. Download and run; there is no install step. You still need mpv on your PATH.

No terminal at all. Download this repo as a ZIP, unzip, and double-click run-anime.bat. It installs whatever is missing and starts the app.

Already have Python? pipx install "anime-sh[tui]" works — though pipx is itself a Python package, so it cannot be the first thing you install on a clean machine.

From source:

git clone https://github.com/Anime123450/anime-sh.git && cd anime-sh
uv sync --extra tui
uv run anime

What you need alongside it

Why Required?
🎥 mpv plays the video yes — installed for you by scoop/winget/choco
✂️ ffmpeg saves downloads only for anime download
🐍 Python 3.11+ runs the app only for the PyPI and source installs

Not sure? Run anime doctor — it checks every one of these and prints the exact command to install whatever is missing, for the package manager you actually have. anime doctor --streams goes further and actually plays something through each provider, so you get a straight answer to "is it broken, or is it me?" from your own connection.


🎬 What you get

🔎 Forgiving search atack on titan, dont toy with me — it finds them anyway
🎥 Plays in mpv driven over JSON IPC, with your own mpv config respected
⏭️ Skips intros and outros and rolls straight into the next episode
📚 Remembers everything resume position, history, favourites — in a local database
🔄 AniList two-way sync finish an episode here, your phone knows
🧩 Multiple providers fanned out with circuit breakers; one site dying is not an outage
🖼️ Cover art in the terminal unicode block sextants — no special terminal required
🎨 Nine themes previewed live as you arrow through them
🧱 Layouts that fit you episodes as a grid, a list or compact; two home densities
⬇️ Downloads ffmpeg-backed, resumable, and played back offline automatically
🎒 Stocks up before you ask prefetch saves the next episode of everything you're watching
📊 Your year, wrapped streaks, top shows, busiest day — and an SVG card to share
🔌 Plugin providers a provider is an entry point; adding one needs no fork

🎨 Themes

Press t. Moving the cursor applies each theme to the whole app immediately, so you choose by looking at anime-sh rather than at a list of names — Enter keeps it, Esc puts back the one you arrived with.

Three are anime-sh's own:

Theme Palette
midnight the default — deep blue-black and teal, with a warm amber focus marker
ember warm and dark, with a cool accent
paper the light one, for daylight

Background · surface · panel · primary · accent — the three background tiers are where the screen gets its depth, and the accent is only ever "the keyboard is here".

Plus tokyo-night, nord, gruvbox, dracula, catppuccin-mocha and solarized-light.

anime themes                 # list them, marking the one in use
anime themes --set ember     # or set it without opening the app

🖼️ Cover art, in a terminal

The context panel: a show's cover art above its title, format, genres, progress bar, next episode countdown, synopsis, and the action Enter will take

The panel on the right follows your cursor. Posters render as unicode block sextants — 2×3 pixels per character cell — so they work in any truecolor terminal with nothing installed. Where a real graphics protocol is available (Sixel, kitty, iTerm2) it uses that instead and comes out sharper, as above.

Underneath: what the show is, how far into the episode you are, when the next one airs, a few lines of synopsis, and exactly what Enter will do.


⌨️ Keys

Key Does
🕹️ ↑ ↓ / j k move within a list
⤒ g / G first / last row
↹ Tab / Shift+Tab next / previous section
▶️ Enter open a show, or play the highlighted episode
🔎 / search
↩️ Esc clear the search, or go back
📺 l your AniList list
🎨 t theme picker
🧩 p providers — which sources are searched
🧱 v view — home density, or episode layout on a show
⏭️ n next season (on a show)
❓ ? every key, any time
🚪 q quit

🚀 First run

anime            # the TUI: Continue Watching, Airing This Season, Trending

The right-hand panel follows your cursor — poster, what the show is, how far into the episode you are, when the next one airs, and what Enter will do. Below it, everything you are waiting on, grouped by day.

Prefer one-shot commands? anime "Frieren" searches, picks the best match and plays episode 1. anime play "Frieren" -e 18 --dub -q 1080p is fully explicit.

Turn on shell tab-completion once: anime --install-completion.


🔗 Linking AniList (optional)

Everything works without an account. Linking one adds two-way sync: finish an episode here and your phone knows, and anime sync pull brings in what you have been watching elsewhere.

anime-sh ships no API credentials, and there is no shared app to sign in through. You create your own client, which takes about a minute and means the token belongs to you:

  1. Go to AniList → Settings → Developer and create a new client.
  2. Name: anything (anime-sh is fine). Redirect URL: https://anilist.co/api/v2/oauth/pin
  3. Link it:
anime auth login --client-id <YOUR_ID> --secret <YOUR_SECRET>

Your token is written to your own config directory with 0600 permissions, is never sent anywhere but AniList, and anime auth logout deletes it. Nothing about your account is stored in this project.


📋 Command reference

Every command — watch, discover, library, downloads, housekeeping
# ▶️  Watch
anime                        # launch the TUI
anime "Frieren"              # search + best match + play episode 1
anime play "Frieren" -e 18   # a specific episode (add --dub, -q 1080p)
anime continue               # episodes you started but didn't finish
anime resume                 # jump back into the most recent one
anime next "Mob Psycho 100"  # find + play the next season
anime sources "Frieren"      # every provider entry that matches, before playing

# 🔭  Discover
anime search "frieren"       # AniList search (instant; no providers touched)
anime search --genre action --year 2024 --sort score
anime trending
anime seasonal               # this season (or: --season fall --year 2025)
anime calendar --days 7      # what airs next, and when
anime random                 # picked from what's trending
anime recommend "Frieren"    # shows for people who liked it
anime related "Attack on Titan"  # prequels, sequels, side stories, movies

# 📚  Library & tracking
anime mark "Frieren" -e 12    # mark eps 1–12 watched; sets AniList progress to 12
anime mark "Frieren" -e 12 --single   # just that episode, locally, no AniList
anime unmark "Frieren"        # clear local progress for a show
anime history                 # what you've watched
anime favorite add "Frieren"  # ★  (also: favorite ls / rm)
anime stats                   # episodes, hours, top genres & providers
anime wrapped                 # your year: streaks, top shows, busiest day
anime wrapped --year 2026 -o card.svg   # ...as a shareable card
anime rate "Frieren" 9        # set a score;  anime status "X" completed

# 🔗  AniList
anime auth login              # link AniList (one-time); status / logout
anime sync pull | push        # import your list / send yours up
anime list --status watching  # your AniList list

# ⬇️  Downloads
anime download "Frieren" -e 1-12  # save a range (ffmpeg); resumes, skips done
anime download "Frieren" -e 1,3,5 # or a list;  also: anime downloads
anime prefetch                    # stock the next episode of everything you're watching
anime prefetch -n 3 --dry-run     # three each; show what it would fetch, fetch nothing
anime play "Frieren" -e 1          # plays your download if you have it
anime play "Frieren" -e 1 --stream # ignore the local copy, fetch it anyway

# 🎨  Appearance
anime themes                  # list themes, marking the current one
anime themes --set ember      # change it without opening the TUI

# 🧹  Housekeeping
anime doctor                  # player, ffmpeg, config, database, plugins
anime doctor --streams        # can I actually watch right now? (hits the sites)
anime --version
anime config get              # dump settings;  config get playback.quality
anime config set playback.quality 1080p
anime config path | validate
anime providers ls            # installed providers, and which are switched off
anime providers disable anizone   # stop using one without uninstalling it
anime cache info              # how much is cached, how much of it is stale
anime cache prune             # drop only expired entries — always safe
anime cache clear             # wipe it entirely (asks first; -y to skip)

Add --json to search, trending, play, continue, history, themes and favorite ls for machine-readable output (play --json resolves the stream without launching a player).


🧠 How it behaves

Forgiving search. You don't have to spell titles the way AniList stores them. When its strict search comes up empty, anime-sh retries with apostrophes restored and the query's distinctive words, then fuzzy-ranks what comes back against what you typed.

Multiple providers, merged. anime-sh fans out across providers (currently anikoto, HiAnime and AniZone) and falls through to whichever one actually has your show, so a title missing from one source still plays from another with no action from you. Press p to see them and switch any of them off.

Streaming providers break and get Cloudflare-gated constantly — that is the normal operating state, not a bug. The Providers badge above is a nightly probe of the real sites; it going red means a site blocked us, not that the build broke. When a provider is unreachable anime-sh degrades cleanly, and metadata and your library keep working.

Offline-friendly. Your library lives in its own anime.db, separate from a disposable cache.db of AniList responses. Recently-seen pages still render with no network, and nothing you own lives in the cache — cache prune drops what expired, cache clear empties it and hands the disk space back.


🩺 Troubleshooting

Symptom What's happening
🤔 anime not recognised right after installing The install worked; your shell has a stale PATH. Open a new terminal (winget), or run uv tool update-shell (uv).
🎥 doctor says mpv not found Nothing plays without it. doctor prints the exact command for your package manager — or scoop install mpv / winget install shinchiro.mpv / choco install mpvio.
🚧 A show won't play — "trying next…" on every source Run anime doctor --streams: it says which providers work from your connection. Providers get Cloudflare-gated or geo-blocked constantly; search and your library are unaffected.
🐍 pipx / pip "not recognised" The wrong starting point on a clean machine — both are Python packages. Use scoop/winget, or the uv block above.
🛡️ Windows: blocked by Smart App Control Invoke it as a module: python -m anime_sh <command>.
📱 Nothing in Continue Watching from your phone Link AniList (anime auth login), then anime sync pull.

Updating and removing:

scoop update anime-sh          # or: uv tool upgrade anime-sh
scoop uninstall anime-sh       # or: uv tool uninstall anime-sh

Your library and settings live outside the install (anime config path), so upgrading never touches them.


🛠️ Develop

git clone https://github.com/Anime123450/anime-sh.git && cd anime-sh
uv sync --extra dev --extra tui
uv run python -m pytest -q   # unit + contract suite (no network)
uv run lint-imports          # architecture contracts (must stay green)

ANIME_SH_LIVE=1 runs the gated live-provider tests.

Architecture. anime-sh is layered cli/tui → app → domain, with infra, providers and resolvers as swappable adapters behind ports. Dependencies point downward only, and that is enforced in CI. Identity comes from AniList — every show is keyed by its AniList id — so adding a provider means attaching a source to a known identity, not fuzzy-matching titles.

📄 Architecture · Writing a plugin · Engineering standards · Contributing · Packaging

The engineering standards are worth reading even if you never contribute — each rule names the bug that caused it.


anime-sh is a client, not a content library. It bundles no media, mirrors nothing, and bypasses no DRM. Providers read public pages and are expected to break; a broken provider is a degraded experience, not an outage. Provider plugins are separable from the core, so the project survives any single one.

mpv and ffmpeg are declared as dependencies, never redistributed — both are GPL-licensed, and shipping their binaries inside an MIT release would carry obligations that depending on them does not.


Metadata

Release files for anime-sh 0.2.83

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for anime-sh 0.2.83
File Size Uploaded
anime_sh-0.2.83.tar.gz 192.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for anime-sh 0.2.83
File Interpreter ABI Platform
anime_sh-0.2.83-py3-none-any.whl Python 3 none any Details

Total release size: 434.5 kB

Release files / anime_sh-0.2.83.tar.gz

Download URL anime_sh-0.2.83.tar.gz
Size 192.6 kB
Tags Source
SHA-256 checksum
How to use checksums
1afe3257b838f71c30d6dcac18afc60b0ca0b902cecd011a0b9323a190bef601
BLAKE2b-256 checksum
How to use checksums
140144d94c09048d89dd7efc7d6649bc703e6658568b9a222a6768c2be1a3b37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release files / anime_sh-0.2.83-py3-none-any.whl

Download URL anime_sh-0.2.83-py3-none-any.whl
Size 241.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
238c0e9235e21ca660b09e786888b97e399e14361fdb96078ed3a9fd7206e6fe
BLAKE2b-256 checksum
How to use checksums
20326854b694a96e43b48074435c0ca72899ba1f89671f97731f53b24833df47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.84

2 release files

This release

0.2.83 This release

2 release files

0.2.82

2 release files

0.2.81

2 release files

0.2.68

2 release files

0.2.67

2 release files

0.2.66

2 release files

0.2.65

2 release files

0.2.64

2 release files

0.2.63

2 release files

0.2.61

2 release files

0.2.60

2 release files

0.2.59

2 release files

0.2.58

2 release files

0.2.57

2 release files

0.2.56

2 release files

0.2.55

2 release files

0.2.54

2 release files

0.2.53

2 release files

0.2.52

2 release files

0.2.51

2 release files

0.2.50

2 release files

0.2.49

2 release files

0.2.48

2 release files

0.2.47

2 release files

0.2.46

2 release files

0.2.45

2 release files

0.2.44

2 release files

0.2.43

2 release files

0.2.34

2 release files

0.2.33

2 release files

0.2.32

2 release files

0.2.31

2 release files

0.2.30

2 release files

0.2.29

2 release files

0.2.28

2 release files

0.2.27

2 release files

0.2.26

2 release files

0.2.25

2 release files

0.2.24

2 release files

0.2.23

2 release files

0.2.22

2 release files

0.2.21

2 release files

0.2.20

2 release files

0.2.19

2 release files

0.2.18

2 release files

0.2.17

2 release files

0.2.16

2 release files

0.2.15

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.12

2 release files

0.2.11

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page