A Chrome extension (Manifest V3) that replaces the default chrome://history page with a dark-mode, analytics-driven React dashboard. Press Ctrl+H (or open the History menu) and get charts, trend buckets, top-domain rollups, and a virtualized timeline instead of the stock flat list.
The extension registers itself as the override for chrome://history, so the built-in history page is replaced entirely by a single-page React app rendered inside the browser UI. It pulls directly from Chrome’s own history store via the chrome.history API — no data leaves the browser, nothing is synced anywhere.
You get four ways to look at the same data:
Search is client-side, case-insensitive, debounced, and matches against URL + title.
The layout and interaction model are inspired by Vivaldi’s history dashboard — a browser that treats history as something worth analyzing, not just scrolling through. Key Vivaldi-isms carried over:
The visual design is a dark-first custom theme built on shadcn/ui + Tailwind v4 tokens, not a direct Vivaldi clone.
The sidebar renders three visualizations. All of them re-scope to whatever view is active (day / week / month / last 30 days).
Count of visits bucketed by time:
Tall bars = heavy browsing windows. Useful for spotting “I doom-scrolled from 10pm to 1am” patterns.
Breaks every visit in the current scope into how you got there, using Chrome’s transition metadata from chrome.history.getVisits():
The center of the donut shows the total visit count for the scope. The ratio between Typed and Link is usually the most telling number — a day of pure “Link” visits means you didn’t drive where you went.
Hostnames ranked by visit count within the current scope, with a trailing count of how many other distinct domains you visited. Favicons are rendered via Chrome’s built-in _favicon service so there’s no network fetch.
Each day cell in the calendar grid colors itself by visit count:
The gradient lets you scan a month and see which days were heads-down vs. which were research sprints.
@tailwindcss/vite, using @theme tokens (no config file).src/components/ui/ — generated, don’t hand-edit.ChromeProvider context — hooks own data fetching, components stay pure, and tests can swap in a fake Chrome.Permissions requested: history, favicon. No host permissions, no network access.