rekby50 downloadsAnnotate local videos in your vault with human-readable timestamp links, frame screenshots, and playback control.
An offline-only Obsidian plugin for taking notes on videos that already live inside your vault. Inspired by media-extended, minus every online feature — no YouTube, no streaming, no network calls.
[[lecture.mp4#t=736|12:16]] at the current playback position.

Demo footage: Caminandes 3: Llamigos © Blender Foundation — archive.org/details/CaminandesLlamigos, licensed under CC-BY 3.0.
rekby/obsidian-video-notes.BRAT will keep the plugin updated from GitHub releases automatically.
main.js, manifest.json, styles.css from the latest release.<your-vault>/.obsidian/plugins/video-notes/.Not available yet — pending acceptance of the submission PR to the official plugin list.
All features are exposed as commands. Open the command palette (⌘P / Ctrl+P) and search for "Local video".
| Command | What it does |
|---|---|
| Open local video | Fuzzy file picker across .mp4/.webm/.mkv/.mov/.m4v files in your vault. |
| Toggle play/pause | Play or pause the active player. |
| Resume playback | Start playing (no-op if already playing). |
| Pause | Pause the active player. |
| Seek backward / Seek forward | Move the playback position by seek step seconds. |
| Insert timestamp at current position | Insert [[video#t=N|MM:SS]]. Pause behaviour follows the Pause on insert setting. |
| Insert timestamp and pause | Same as above, but always pauses regardless of the setting. |
| Insert timestamp (keep playing) | Same, but always keeps the player running. |
| Take screenshot at current position | Save a PNG frame to attachments + insert image and timestamp link. Pause behaviour follows the setting. |
| Take screenshot and pause | Same, but always pauses. |
| Take screenshot (keep playing) | Same, but always keeps the player running. |
Bind any of these to a hotkey via Settings → Hotkeys. Typical workflow: bind Insert timestamp and pause to one hotkey (for "stop and write a thought") and Resume playback to another (to continue when you're done typing).
| Setting | Default | Description |
|---|---|---|
| Timestamp offset (seconds) | 3 |
Subtract this many seconds from the current position when inserting a timestamp or screenshot. |
| Seek step (seconds) | 5 |
Step used by Seek backward / Seek forward. |
| Pause on insert | true |
Pause the player after inserting a timestamp or screenshot. |
| Seek on insert | true |
Also jump the player to the inserted (offset-adjusted) moment. |
| Player location | right |
Where a new player opens when you click a timestamp link and none is open yet: right sidebar or bottom split of the current tab. If the player is already open, it is reused and simply switches to the right video + time. |
Timestamps and screenshots are always inserted into the last markdown tab you had focused, not the video panel itself. You can click buttons inside the player freely without losing the target note.
npm install
npm run dev # esbuild watch
npm run build # production build
npm test # jest
npm run lint
npm run demo:screenshots
This fetches the demo footage (Caminandes 3, CC-BY 3.0) into the demo vault if missing, boots a real Obsidian via wdio-obsidian-service, loads the plugin against the vault in obsidian-tests/demo-vault/, drives the player through an e2e scenario for each UI language, and writes fresh PNGs into docs/screenshots/en/ and docs/screenshots/ru/.
patch or minor. The workflow:-pre-release suffix on the very first run, otherwise bumps the chosen part;manifest.json and versions.json via version-bump.mjs;main.js, manifest.json, styles.css attached.AGPL-3.0-or-later © rekby. See LICENSE for the full text.