Intro card
@playerstack/plugin-intro-card Pre-roll splash: badge, title, subtitle, CTA and a big play button.
Open-source embeddable video player
Embed YouTube, Vimeo, MP4 or HLS on any page — then brand it, add CTAs, capture leads and track every play. Every feature is a plugin. Framework-free, MIT, under 50 KB.
Or download the MIT bundle and self-host itShow, don't tell
The player below is a real, running <player-stack> embedded on this page — not a video of one. As you scroll, each plugin switches on and the config updates live.
Point src at a YouTube, Vimeo, MP4 or HLS link. Playerstack detects the type and mounts the matching engine underneath — no per-source code.
<player-stacksrc="…/demo.mp4"></player-stack> Show a custom poster and load the video only on click — better LCP, and zero third-party cookies until the visitor opts in.
data-config='{"brandedThumb": {"enabled": true,"clickToLoad": true}}' A single accent color themes the whole player — play button, progress bar, controls. Here it switches from the default to a brand violet.
data-config='{"brandedThumb": { … },"controls": {"accent": "#8b5cf6"}}' When the video ends, overlay a UTM-tagged button with a replay option. The end of the watch becomes the start of a click.
data-config='{"controls": { … },"ctaEnd": {"enabled": true,"title": "Want the full course?","button": { "label": "Get it now" }}}' Pause playback and ask for an email before the video plays. Open mode emits an event; production mode POSTs to your endpoint with proof-of-work.
data-config='{"controls": { … },"emailGate": {"enabled": true,"at": "before","title": "Drop your email to watch"}}' One element, one config object, five plugins shown live. Mix any of the 17 below — or write your own.
One src attribute
Playerstack wraps the Mux media ecosystem, so each source exposes a real <video>-style API. Autoplay policy, native events and DOM attributes work the same everywhere.
17 plugins, all MIT
The standalone bundle pre-registers everything. Need lean? The codebase is split into scoped @playerstack/* packages, so you can bundle just the plugins you touch.
@playerstack/plugin-intro-card Pre-roll splash: badge, title, subtitle, CTA and a big play button.
@playerstack/plugin-branded-thumb Custom poster + click-to-load for better LCP and GDPR.
@playerstack/plugin-cta-end Overlay a UTM-tagged button when the video ends, with replay.
@playerstack/plugin-action-bar A dismissible mid-video banner with its own call to action.
@playerstack/plugin-email-gate Pause and require an email before playback continues.
@playerstack/plugin-yt-subscribe A subscribe bar below the player linking to a channel.
@playerstack/plugin-autopreview Muted autoplay in view, paused out — respects reduced-motion.
@playerstack/plugin-chapters A clickable chapter list that syncs with playback.
@playerstack/plugin-saved-position Resume from where the visitor left off.
@playerstack/plugin-focus-mode Auto-pause when the tab loses focus.
@playerstack/plugin-sources Auto-detect YouTube, Vimeo, MP4, HLS, WebM and DASH from one URL.
@playerstack/plugin-controls-policy Accent theme plus a whitelist for which controls show.
@playerstack/plugin-sticky Pin to a corner when scrolled past during playback.
@playerstack/plugin-watermark A corner-pinned logo or text overlay, optional click-through.
@playerstack/plugin-custom-css Inject scoped CSS — the escape hatch for anything else.
@playerstack/plugin-analytics Forward events to a beacon endpoint or GA4 via gtag.
@playerstack/plugin-sellf-adapter Load player config from a remote product endpoint.
Why Playerstack
Developer-focused players nail playback, but branding, CTAs and lead capture are left for you to build. You ship plumbing instead of features.
The players that do have a marketing layer live inside a single platform you must adopt wholesale — one CMS, one stack, one way.
A modern Web Component you drop on any page: the marketing layer of the first kind, the openness of the second. MIT, framework-free, yours to extend.
Works where you do
Because it's a standard Web Component, there's nothing to wrap. Copy-paste examples ship for every common stack.
<script src="https://playerstack.techskills.academy/playerstack.min.js" defer></script>
<player-stack
src="https://youtu.be/dQw4w9WgXcQ"
data-config='{"controls":{"accent":"#008aff"},
"ctaEnd":{"enabled":true,
"button":{"label":"Buy now","url":"https://example.com"}}}'>
</player-stack> Questions
Yes. The core and all 17 plugins are MIT-licensed. Use it in client work, products and SaaS without a license fee.
It's a standard custom element, so it works with plain HTML and with React, Vue, Svelte, Astro, Next.js or anything that renders HTML. Examples ship for each.
The branded-thumbnail plugin loads the video only on click, so no third-party cookies are set until the visitor opts in. That also improves your LCP.
The standalone bundle stays under 50 KB gzipped with every source type and plugin. Need less? The scoped @playerstack/* packages let you bundle only what you use.
Each plugin gets an init(ctx) with an event bus, the media element, the container and the resolved config. Write your own in a few lines with the same contract.
Ship it
Drop the script tag, add a <player-stack>, and configure it with one attribute. Everything else is a plugin.