
Security News
Feross on the 10 Minutes or Less Podcast: Nobody Reads the Code
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.
TanStack Player — A developer-first, universal Video Player SDK built on Video.js with headless hooks, plugin architecture, and React-first DX
30tools.com — All Your Tools. One Platform. 194+ free, privacy-first online tools for Image, PDF, Video, Developer, SEO & more. Fast, beautiful, and no uploads required.
A developer-first, universal Video Player SDK built on Video.js
Headless hooks · Plugin architecture · React-first DX · Streaming ready
Documentation · npm · Examples · Contributing
Building video experiences is hard — buffering, streaming formats, browser quirks, accessibility, and state management all add complexity. TanStack Player abstracts all of this behind a clean, modern SDK:
| Feature | Description |
|---|---|
| 🎬 Headless Core | Framework-agnostic engine with play/pause/seek/volume/speed |
| 🪝 React Hooks | useTanStackPlayer(), useProgress(), useBookmarks() |
| 🔌 Plugin System | Lifecycle-aware plugins with event bus access |
| 📡 Streaming | HLS, DASH, adaptive bitrate via Video.js |
| ⚡ Tiny | ~21KB total SDK (ESM, gzipped much smaller) |
| 🎯 TypeScript | Full typed API with JSDoc |
npm install tanstack video.js
Note:
video.jsis a peer dependency. Load it via CDN or bundle it.
import { TanStackPlayer } from 'tanstack'
export default function App() {
return (
<TanStackPlayer
src="https://example.com/video.mp4"
controls
autoPlay={false}
/>
)
}
Build completely custom UI with headless hooks:
import { useTanStackPlayer, useProgress } from 'tanstack'
function Controls() {
const { play, pause, isPlaying, seek, setVolume } = useTanStackPlayer()
const { progress, buffered, currentTime, duration } = useProgress()
return (
<div>
<button onClick={() => isPlaying ? pause() : play()}>
{isPlaying ? '⏸' : '▶'}
</button>
<div>Progress: {progress.toFixed(1)}%</div>
</div>
)
}
Extend player capabilities with plugins:
import { TanStackPlayer, createBookmarkPlugin } from 'tanstack'
const bookmarks = createBookmarkPlugin()
function App() {
return (
<TanStackPlayer
src="/video.mp4"
plugins={[bookmarks]}
>
<BookmarkControls />
</TanStackPlayer>
)
}
import { useBookmarks } from 'tanstack'
function BookmarkControls() {
const { bookmarks, addBookmark, seekToBookmark } = useBookmarks()
return (
<div>
<button onClick={() => addBookmark('Important moment')}>
🔖 Bookmark
</button>
{bookmarks.map(bm => (
<button key={bm.id} onClick={() => seekToBookmark(bm.id)}>
{bm.label} ({bm.time}s)
</button>
))}
</div>
)
}
| Package | Size | Description |
|---|---|---|
tanstack | — | All-in-one package (re-exports everything) |
@tanstack-player/core | 8.7KB | Headless event bus, state store, controller, plugin runtime |
@tanstack-player/adapter-videojs | 4.6KB | Video.js engine adapter |
@tanstack-player/react | 6.2KB | React component + hooks |
@tanstack-player/plugin-bookmark | 1.6KB | Bookmark plugin |
TanStack Player
├─ Core (headless)
│ ├── EventBus — typed event emitter
│ ├── StateStore — reactive state management
│ ├── PlayerController — unified playback API
│ └── PluginRuntime — plugin lifecycle manager
│
├─ Adapters
│ └── VideoJsAdapter — Video.js ↔ Core bridge
│
├─ React
│ ├── <TanStackPlayer /> — component
│ ├── useTanStackPlayer — control hook
│ ├── useProgress — progress hook
│ └── useBookmarks — bookmark plugin hook
│
└─ Plugins
└── BookmarkPlugin — timestamp bookmarks
Pass native Video.js configuration through:
<TanStackPlayer
src="/video.mp4"
videojsOptions={{
fluid: true,
preload: 'auto',
playbackRates: [0.5, 1, 1.5, 2],
}}
/>
Unified event system across all adapters:
<TanStackPlayer
src="/video.mp4"
onReady={() => console.log('Ready!')}
onPlay={() => console.log('Playing')}
onPause={() => console.log('Paused')}
onEnded={() => console.log('Ended')}
onTimeUpdate={(time, duration) => console.log(`${time}/${duration}`)}
onError={(err) => console.error(err)}
/>
git clone https://github.com/sh20raj/tanstack
cd tanstack
npm install
npm run build
npm run dev
See CONTRIBUTING.md for detailed guidelines.
Looking for developer utilities to use alongside TanStack Player? Check out 30tools.com — a suite of 194+ free, privacy-first online tools for developers:
All tools run directly in your browser for maximum privacy. No uploads, no tracking.
👉 30tools.com — One platform, every tool you need.
MIT — Made with ❤️ by @sh20raj
⭐ Star on GitHub — it helps a lot!
FAQs
TanStack Player — A developer-first, universal Video Player SDK built on Video.js with headless hooks, plugin architecture, and React-first DX
The npm package tanstack receives a total of 4,658 weekly downloads. As such, tanstack popularity was classified as popular.
We found that tanstack demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.

Research
/Security News
Campaign of 108 extensions harvests identities, steals sessions, and adds backdoors to browsers, all tied to the same C2 infrastructure.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.