Shiru plays the anime files you already own, and nothing else
A personal anime library manager for watching and tracking your collection in real time. Lightweight, powerful, and paws-itively fast. No waiting required!
At a glance
- What is it?
- Shiru is a GPL-3.0 anime library manager for Windows, Linux, macOS, Android and Android TV that plays local files directly with no transcoding, tracks dub and sub release schedules separately, and links your library to AniList and MyAnimeList. The extensions system is the part to look at closely, since it is where a personal media server plugs in.
- Who is it for?
- Shiru suits people with a folder of anime files who want a fast local player with real list tracking, per-series subtitle memory, dub awareness and profiles that work offline, and who are comfortable granting an extension access to a personal media server.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 10 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Direct file playback, with the legal boundary stated up front
Shiru is a personal anime library manager built around speed, control and a viewing experience, with full mobile support. The technical claim in the project description is that your files play directly for near-instant playback, with full native video performance, no transcoding and no compression.
That single design decision shapes everything else. A transcoding media server converts your files into a stream it can serve, which costs CPU, adds delay and produces a copy of your content at a different bitrate. A player that hands the file to the platform decoder skips all of that. The cost is that the app has less to be clever with, and it needs a real video pipeline on each platform.
The scope boundary is stated in an important callout at the top of the README. This application does not host, distribute or provide media content. It is intended solely as a personal media library manager for organising, tracking and playing content that you legally own, and users are responsible for ensuring that all media content used with the application has been legally obtained and that its use complies with applicable copyright law.
That framing makes the extension system coherent as well, since the documented use of extensions is reaching content you already have, such as your own personal media server, rather than borrowing someone else's catalogue.
Electron on the desktop, Capacitor on Android, Svelte in the client
The repository layout explains the shape of the application. There is an electron directory, a capacitor directory for the Android and Android TV builds, a client directory for the interface, a common directory for shared code, an extensions directory, and patches for modifying dependencies.
The build tooling is a pnpm workspace, with pnpm 10.34.1 pinned as the package manager through the packageManager field, and pnpm-workspace.yaml and pnpm-lock.yaml at the root. The root package.json is marked private and points its main entry at build/main.js, which is the Electron main process after the client bundle is built.
The client is a Svelte application, with svelte-check and eslint-plugin-svelte in the development dependencies and a jsconfig.json driving the type checking. The webpack toolchain is present for the bundling step, along with html-webpack-plugin, webpack-dev-server and copy-webpack-plugin, and there is an .npmrc file for npm client settings.
The patched dependencies are worth a look if you plan to fork the project, because they show which upstream packages needed local changes: @capacitor/local-notifications, @capacitor/android, lucide-svelte at version 0.455.0, rfdc and svelte-keybinds all carry patches, and cordova-plugin-apkupdater is patched as well. The Android updater, the local notifications and the keybinding library were all adapted rather than used as published.
Dub and sub schedules are tracked separately, which is the unusual part
The dub tracking is the feature that distinguishes Shiru from a generic file browser, and the project describes it as one of the most thorough dub tracking systems available. Each series independently tracks its sub and dub release schedules, and per-episode audio labels show exactly what is available and when.
The Prefer Dubs setting is the concrete mechanism. It hides a series from continue watching if your progress already matches the latest aired dub, so you do not accidentally restart an episode you have already seen in English. A Dubbed Audio filter goes further, filtering the search page to dubbed series only and switching the airing schedule to show dub air times instead of sub air times for series currently airing in dub.
Release feeds cover dub, sub and hentai, sorted by newest release so a drop is not missed, and notifications are scheduled separately for dub and sub, including delayed, indefinitely delayed and batch release announcements. Cards, episode lists and the banner carry audio labels showing Dub, Sub or Dual Audio status.
Two details make this credible rather than decorative. A delayed release is a real category in anime distribution, and a notification system that fires at the wrong time teaches people to ignore notifications. Handling indefinite delays separately means the app does not fire stale alerts for episodes that never aired on schedule.
Extensions are the extension point for your own media server
Out of the box, Shiru plays files you already have locally. Extensions add further content fetching for legally owned media, and the example given is accessing your own personal media server remotely.
The extension features are specific: automatic series and episode detection from file names, support for custom RSS feeds and resolution preferences, adjustable network speeds, and dynamic extension loading, with results appearing as the extension produces them.
Automatic detection from file names is the feature that decides whether the extension model is usable at all. A personal media server rarely has clean metadata, so if the app had to be told what each file is, nobody would bother. Inferring the series and episode from the file name is what lets an existing, messy library become a browsable list without a manual tagging pass.
Resolution preferences and adjustable network speeds point the same way. An extension that streams over a home network or a remote one has to respect the connection you are on, and the app exposing that as a setting rather than hiding it behind a quality preset is a sign the extension author was expected to know what they were doing.
The repository keeps extensions in their own top-level directory, separate from the client and the platform shells, which is what makes them loadable at runtime.
Subtitles are first class, with six external formats and per-series memory
Subtitle support covers softcoded and external subtitles, with the external formats listed as VTT, SSA, ASS, SUB and TXT. On top of the format list there is per-series subtitle memory, CJK glyph fallback and in-player track cycling.
Per-series memory is the practical part. A subtitle track is not a global setting in a library of hundreds of series, because fansub groups differ in style and a show may need one group for episode one and another for a later cour. Remembering the choice per series removes a repeated annoyance that most players make you handle every single episode.
CJK glyph fallback solves a rendering problem rather than a parsing problem. Subtitle formats routinely reference glyphs that are not in the font the player picked, and the fallback makes Japanese and Chinese text render rather than showing boxes. Combined with the subtitle formats themselves, it means an Asian-language library with ASS styling is a supported case rather than a special case.
Track cycling in the player completes the set, so switching between dub and sub tracks does not require leaving the video.
The rest of the playback layer follows the same pattern of practical detail: fully customisable keybindings through a drag-and-drop keybind editor with extensive defaults for playback, subtitles and navigation, and offline support covering the library, watch history and previously loaded media, with local file playback and media resolving working without an internet connection.
Profiles, list integration and the mobile build
Multiple profiles give each person separate libraries, settings and watch lists, with optional cross-profile sync as you watch. In a household where two people watch different things on the same machine, that is the difference between a shared library and a private one, and the sync option means a profile does not have to stay strictly isolated.
The list integration is the other half of the app's appeal. AniList and MyAnimeList are both supported, which covers managing your lists, auto-tracking progress, rating and scoring, and exploring related series without leaving the app. The list editor is built in, episodes are marked complete automatically after watching, and trailers and previews play inside the app.
Discovery is unusually broad for a local player: filter by name, genres, tags, season, year, format and status, image search to identify a series by picture, and a home page you build yourself from custom genres, tags and search queries. Two built-in sections, Sequels You Missed and Stories You Missed, catch up on related entries.
The Android build is treated as a first-class client, with support for both orientations, immersive full-screen, external player integration and progress tracking. Android TV is supported from 7.0 as well, with the caveat that remote navigation is a work in progress and a mouse, keyboard or touch is recommended.
Checking a change means running lint, typecheck and svelte-check
The repository does not publish its own build instructions in the visible documentation, and the download path for users is the project's site at shiru.app, which carries the download page for Windows, macOS, Linux and Android.
For contributors, the scripts in the root package.json are the entry point, and they are worth reading because they tell you what the project considers a passing check:
"scripts": {
"lint": "eslint . --no-warn-ignored --concurrency off",
"typecheck": "tsc --noEmit --project jsconfig.json",
"check:svelte": "svelte-check --no-tsconfig --threshold error --diagnostic-sources svelte,css",
"check": "run-s lint typecheck check:svelte"
},The composite check runs the three steps in order through npm-run-all2, so lint, then a TypeScript check against the jsconfig project, then the Svelte check at the error threshold with diagnostics limited to Svelte and CSS sources. The concurrency flag on the lint step and the --no-warn-ignored flag suggest that ignored paths are still linted deliberately rather than by accident.
Licensing is GPL-3.0-or-later, which is the copyleft terms most permissive projects use so that distributors can offer their own terms while keeping the source available. The releases move at a good pace, with 6.8.1-beta.8 in late September, 6.9.0 in early October and 6.9.1 on 2026-10-13, the same day as the last push to the repository.
Editorial conclusion
Shiru suits people with a folder of anime files who want a fast local player with real list tracking, per-series subtitle memory, dub awareness and profiles that work offline, and who are comfortable granting an extension access to a personal media server. It is the wrong tool if you expect it to source content, because the project states plainly that it does not host, distribute or provide media, and it is the wrong tool on Android TV if you rely on a remote control, since remote navigation is described as a work in progress. Verify first that your files play without transcoding on your hardware, that the AniList or MyAnimeList integration matches how you keep your lists, and that the extension you enable points at a server you control.
Frequently asked questions
Does Shiru provide or download anime?
No. The project states that the application does not host, distribute or provide media content, and is intended as a personal library manager for content you legally own. Out of the box it plays files you already have locally.
Which platforms does Shiru run on?
Windows, Linux, macOS on both Apple Silicon and Intel, Android 7.0 and later, and Android TV 7.0 and later. Remote navigation on Android TV is described as a work in progress, so a mouse, keyboard or touch is recommended.
How does the Prefer Dubs setting work in Shiru?
Each series tracks its sub and dub release schedules independently. Prefer Dubs hides a series from continue watching when your progress already matches the latest aired dub, and a Dubbed Audio filter restricts search results to dubbed series and switches airing times to dub times.
What subtitle formats does Shiru support?
Softcoded and external subtitles, with external formats listed as VTT, SSA, ASS, SUB and TXT. There is per-series subtitle memory, CJK glyph fallback and in-player track cycling.
Can Shiru reach my own media server?
That is the documented purpose of extensions, which optionally bring in your own content sources such as a personal media server. Extensions also handle automatic series and episode detection from file names, custom RSS feeds, resolution preferences and adjustable network speeds.
What licence is Shiru released under?
GPL-3.0-or-later, as declared in the package.json licence field and in the repository LICENSE file.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/rockinchaos-shiru)Was this useful?