by Quang Nguyen
Keep audio playing when its embed scrolls out of view, and pick up where you left off when you return.
Persistent Player
Persistent Player keeps an audio embed playing when you scroll it out of view. Play an audio file in a note, then keep reading, editing, or scrolling: the sound continues from a compact player pinned to the top of the view, and the position is remembered per note.
No network requests, no telemetry. Everything runs locally inside the vault.
Usage
Play any embedded audio file as you normally would. Instead of the inline embed, Persistent Player takes over playback with a now-playing bar at the top of the view:
- Play or pause the active note's audio.
- Skip back or forward 5 seconds for quick re-listening.
- Drag the progress track to seek anywhere in the file.
- Click the speed label to cycle through 0.5x, 0.75x, 1x, 1.25x, 1.5x, and 2x.
- Close to stop playback and release the note's audio.
Scrolling the embed out of view does not interrupt playback. The player remembers each note's position, so returning to a note picks up where you left off.
Video embeds are left untouched and play natively.
Commands
The following commands are available from the command palette. Bind your own hotkeys in Settings -> Hotkeys:
- Play or pause
- Skip back 5 seconds
- Skip forward 5 seconds
- Skip back 15 seconds
- Skip forward 15 seconds
Build
npm install
npm run build
The build runs TypeScript and Obsidian's official ESLint rules before producing main.js.
Copy manifest.json, main.js, and styles.css into <vault>/.obsidian/plugins/persistent-player/, then enable Persistent Player in Obsidian.
Development
The source uses the official Obsidian API and keeps obsidian external during the esbuild bundle. Run npm install, then npm run dev to rebuild on change. npm run check runs the linter, the type checker, and a production build.
License
MIT
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.