Open-source project
intro-skipper/intro-skipper avatar
intro-skipper/intro-skipper

Intro Skipper for Jellyfin: audio-fingerprint intro detection without a cloud service

Automatically detect and skip intro/credit sequences in Jellyfin

2,793 stars165 forksC#GPL-3.0

At a glance

What is it?
Intro Skipper is a Jellyfin plugin that analyses episode audio with Chromaprint to find intro and credit sequences and skip them. It suits self-hosters on Jellyfin 12.0.0 or newer who can keep a recent jellyfin-ffmpeg build in place.
Who is it for?
Adopt Intro Skipper if you run Jellyfin 12.0.0 or newer, already have jellyfin-ffmpeg 7.1.3-1 or newer, and are willing to let scheduled audio analysis run over your library. Do not adopt it if you are staying on an older Jellyfin release, or if you cannot rebuild ffmpeg with chromaprint support on a macOS native install.
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 7 days ago.
What is it written in?
Mainly C#, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 24, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Intro Skipper actually removes from an episode

Jellyfin plays a television episode from the first frame. If the show has a sixty-second title sequence at the front and a credit roll at the back, the viewer either scrubs manually or sits through both. Intro Skipper exists to remove that manual step. The README describes the project as analysing "the audio of television episodes to detect and skip over intros", and the repository topics list it as a Jellyfin media segment provider and plugin.

The audience is narrow and specific: people running their own Jellyfin server with a television library, who want skip behaviour comparable to a commercial streaming app. It is not a general media tool, it does not touch films, and it does not fetch segment data from any external service. Everything it knows is derived from the files on your own disk, which the disclaimer states explicitly: fingerprints, silence detection and black frame detection data are "derived entirely from your own local media files".

That local-only design is the reason the plugin is interesting. There is no shared segment database to query and no account to create. The cost is that detection quality depends on your hardware, your ffmpeg build and the audio characteristics of each show.

Chromaprint fingerprints, silence and black frames

The mechanism visible in the README and repository layout is audio analysis rather than metadata lookup. The project depends on Jellyfin's fork of ffmpeg, and the README names three detection families the plugin can use: audio fingerprints via Chromaprint, silence detection, and black frame detection. Chromaprint is bundled as part of jellyfin-ffmpeg rather than shipped by the plugin.

The practical consequence is that detection is a compute job, not a database read. Jellyfin exposes scheduled tasks, and the README's troubleshooting section lists "Scheduled tasks fail instantly" as a known failure mode, which tells you the analysis runs as a scheduled task rather than inline during playback. The plugin also carries the jellyfin-mediasegment-provider topic, meaning it registers detected intro and credit ranges with Jellyfin's media segment system so the client can offer a skip action.

One version boundary matters. The README states that as of Jellyfin 10.10, Intro Skipper does not modify the UI. Older write-ups about the plugin injecting a skip button describe behaviour that no longer applies; the segment provider path replaced it. If you are following a guide from that era, the instructions will not match what you see.

Installing the plugin and running a first detection

Installation goes through Jellyfin's plugin repository mechanism. Add the manifest URL below as a plugin repository in your Jellyfin dashboard, then look for Intro Skipper in the catalog.

bash
https://intro-skipper.org/manifest.json

The README is explicit that this URL does not behave like a normal file. It returns a manifest based on the Jellyfin version used to access it, so opening it in a browser shows nothing useful because no Jellyfin version is supplied. If the plugin does not appear after adding the repository, the README advises checking that you are on the latest Jellyfin version and reloading the plugin page without cache, using CTRL + F5 on Windows or Linux, or SHIFT + CMD + R on macOS.

Before any of that, confirm the server meets the stated requirements. You need Jellyfin 12.0.0 or newer, and jellyfin-ffmpeg version 7.1.3-1 or newer. The container images jellyfin/jellyfin 12.z and linuxserver/jellyfin 12.z ship it preinstalled, as does the jellyfin-ffmpeg7 package on Debian-based native installs. The README does not give a command for checking the installed ffmpeg version; on a native install, confirm the version before opening a troubleshooting thread.

After installation, the plugin registers scheduled tasks. Triggering a detection task from the Jellyfin scheduled tasks page is the first real use: pick a single show rather than your whole library, let the task finish, then start an episode and check whether a skip action appears. The README points to a wiki page on Jellyfin skip options for configuring what the client does with a detected segment.

There is one optional dependency. Some web UI features, such as adjusting the skip-button timeout, require the File Transformation plugin. Without it, the README says Intro Skipper still works, but those enhancements are not applied. If you want them, add the File Transformation repository and install it from the catalog.

bash
https://www.iamparadox.dev/jellyfin/plugins/manifest.json

Where detection fails or the plugin is the wrong tool

The disclaimer is unusually direct about the failure surface. It states the plugin is provided as-is without warranty and that the authors accept no liability for "data loss, missed detections, false positives, or any other damages". Missed intros and false positives are therefore acknowledged outcomes, not edge cases to be argued away. Audio fingerprinting works best when a show uses a consistent intro track; shows that vary the intro per episode, cold-open into different music, or use heavy dialogue over the title card give the matcher less to work with.

The platform constraint is the sharper limitation. macOS native installs are not covered by a package. The README directs those users to build ffmpeg with chromaprint support using a wiki guide, which means a macOS server operator has to maintain a custom ffmpeg build. Gentoo users need the xarblu-overlay enabled and media-video/jellyfin-ffmpeg installed. If you are unwilling to manage an ffmpeg build, a macOS native install is the wrong environment for this plugin.

The version requirement is a second filter. Jellyfin 12.0.0 or newer is mandatory, and the release list shows the current line is 12.0.x. Anyone still on an older Jellyfin release cannot use the current builds. Finally, the plugin is scoped to television episodes. If your library is mostly films, there is nothing here for you to configure.

The data-sharing question is worth reading in full rather than skimming. The disclaimer warns that sharing or redistributing generated fingerprint and detection data beyond local personal use may conflict with the licences or terms governing the underlying media, and that users are solely responsible for checking. That is a real constraint on any idea of pooling detection results between servers.

Compared with metadata-driven skip approaches

The obvious alternative is to use externally sourced intro timestamps, the pattern where a client looks up a community-maintained segment database and applies whatever markers exist for that episode. The difference in approach is fundamental. An external database gives you instant results with no analysis cost, but only for titles someone has already contributed, and it introduces a network dependency and a trust question about who wrote the timestamps.

Intro Skipper inverts both properties. Detection costs CPU time on your server and depends on your ffmpeg build, but it works on any episode you own, including obscure or personal recordings that no public database would cover. Nothing leaves your machine, which the disclaimer reinforces by stating that all generated data is derived from local files and that the authors claim no ownership over it.

If your library is mainstream and well covered elsewhere, the external-timestamp route is less work. If your library is not, or you object to reporting what you watch to a third party, local fingerprinting is the only option that covers everything. The trade is CPU time and a stricter dependency chain for coverage you control.

Licence, forks and the cost of keeping up

Intro Skipper is licensed under GPL-3.0. If you run it as a plugin on your own Jellyfin server, the licence is not something you interact with day to day. It matters if you intend to redistribute a modified build or bundle it into a product, because GPL-3.0 carries source-disclosure obligations for derivative works. This is a description of the licence, not legal advice; read the LICENSE file in the repository if redistribution is on your roadmap.

The disclaimer also states the project is not affiliated with, endorsed by, or officially connected to the Jellyfin project or any media rights holder, and that Chromaprint is included as part of jellyfin-ffmpeg under its own licences. Treat it as a third-party plugin, not a Jellyfin component.

The repository layout shows a docs directory, a tests project and a web directory alongside the main IntroSkipper project, and the default branch is 12.0, matching the current release line. The last push to the repository was on 2026-09-24, and the most recent release listed is 12.0/prerelease (v12.0.4.35) from 2026-09-22, with stable tags v12.0.4.0 and v12.0.3.0 earlier in September. That cadence means upgrades arrive as Jellyfin plugin updates through the manifest you added. The upgrade cost is mostly the ffmpeg floor: if a future release raises the required jellyfin-ffmpeg version, native installs have to follow, and macOS users have to rebuild. The README does not document a rollback procedure for a bad plugin update, so plan on keeping the previous version available if you upgrade a production server.

Editorial conclusion

Adopt Intro Skipper if you run Jellyfin 12.0.0 or newer, already have jellyfin-ffmpeg 7.1.3-1 or newer, and are willing to let scheduled audio analysis run over your library. Do not adopt it if you are staying on an older Jellyfin release, or if you cannot rebuild ffmpeg with chromaprint support on a macOS native install. Before adding the manifest, confirm your server version and your ffmpeg build, because the manifest URL returns nothing when it is opened outside a Jellyfin client.

Frequently asked questions

How does Intro Skipper work in Jellyfin?

It analyses episode audio to detect intro and credit sequences, using Chromaprint audio fingerprints along with silence detection and black frame detection. Detected ranges are registered with Jellyfin's media segment system so the client can skip them.

Why is the Intro Skipper plugin not showing up in my Jellyfin server?

The README advises checking that you are using the latest Jellyfin version and reloading the plugin page without cache, using CTRL + F5 on Windows or Linux or SHIFT + CMD + R on macOS. Note that the manifest URL returns nothing when opened in a browser, because no Jellyfin version is supplied.

How do I install the Intro Skipper plugin in Jellyfin?

Add https://intro-skipper.org/manifest.json as a plugin repository in Jellyfin, then install Intro Skipper from the catalog. You need Jellyfin 12.0.0 or newer and jellyfin-ffmpeg 7.1.3-1 or newer.

How do I set up Intro Skipper in Jellyfin?

After installing from the catalog, trigger a detection task from the Jellyfin scheduled tasks page, then check an episode for a skip action. Skip behaviour is configured through Jellyfin's skip options, which the README links to in the wiki.

How do I add Intro Skipper to Jellyfin?

Add the manifest URL https://intro-skipper.org/manifest.json as a plugin repository in the Jellyfin dashboard, then install Intro Skipper from the catalog. The URL only returns a manifest when accessed from a Jellyfin client with a version.

Official sources

  1. intro-skipper/intro-skipper on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
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.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/intro-skipper-intro-skipper.svg)](https://hysenlabs.com/projects/intro-skipper-intro-skipper)