Everything you need to install, use, and troubleshoot the YouTube History Sidebar extension.
npm install && npm run build to produce the dist/ folder.chrome://extensionsdist/ folder.After running npm run build, click the reload icon (↺) on the extension card in chrome://extensions to apply the latest changes.
Make sure the extension is enabled in chrome://extensions and that you loaded the dist/ folder (not the project root). After loading, refresh your YouTube tab — do a hard reload with Ctrl + Shift + R if a normal refresh doesn't help. If the left nav panel hasn't loaded yet, the sidebar waits for it via MutationObserver and will inject automatically.
The extension saves entries when a /watch?v= URL is detected. Make sure you are visiting a full video page (not a YouTube Short or homepage). The extension also needs the page to finish loading to scrape metadata — if you navigate very quickly, a scrape may be skipped. Try reopening the video tab.
The extension deduplicates by video ID — re-watching a video moves it to the top rather than adding a new row. If you see duplicates, it may indicate a version mismatch between the loaded extension and your built files. Rebuild (npm run build) and reload the extension from chrome://extensions.
The 500-entry cap (FIFO eviction) is currently hardcoded in src/types.ts as the MAX_ENTRIES constant. If you are running from source, you can change this value, rebuild, and reload the extension. A UI setting for this is planned for a future release.
YouTube occasionally changes its DOM structure, which can affect the sidebar injection or the metadata scraper. Check the GitHub Issues page to see if it's a known problem. If not, please open a new issue with your Chrome version and a description of what's broken.
The extension is built for Chrome (Manifest V3) and uses chrome.* APIs. Firefox has partial MV3 support, but it is not officially tested or supported at this time.
No. History is stored in chrome.storage.local, which is local to each Chrome profile and does not sync across devices. This is intentional for privacy. Cross-device sync is not planned.
You can remove individual entries using the ✕ button next to each item. To clear everything at once, go to chrome://extensions → click Details on the extension → Extension options or open Chrome DevTools on YouTube, and run chrome.storage.local.clear() in the console with the extension's service worker selected. Alternatively, uninstalling and reinstalling the extension will wipe all stored data.
The extension is intentionally lightweight — no framework, vanilla DOM only, and all storage calls are async. It uses a MutationObserver to wait for YouTube's nav panel before injecting, so it does not block page load. Performance impact should be negligible.
dist/ folder in chrome://extensions, not the project root.npm run build using the ↺ icon.[YTHS].chrome://extensions → Details → Service worker → Inspect.This extension was designed with privacy as a first principle. Here's exactly what it does and doesn't do:
All data lives in chrome.storage.local on your machine only.
Zero external API calls. The extension never phones home.
Works entirely without a Google or YouTube login.
No analytics, telemetry, or usage data collected.
Removing the extension deletes all stored history automatically.
Only storage permission + YouTube host access.
Found something broken or have an idea for an improvement? Open an issue on GitHub — it's the fastest way to get a response.