<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: I_See_You</title>
    <description>The latest articles on DEV Community by I_See_You (@i_see_you).</description>
    <link>https://dev.to/i_see_you</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3925867%2Fc0febf92-a536-4335-89c9-626bb8f45caa.jpg</url>
      <title>DEV Community: I_See_You</title>
      <link>https://dev.to/i_see_you</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/i_see_you"/>
    <language>en</language>
    <item>
      <title>I built a Chrome extension so you never have to hunt for the Google Meet mute button again</title>
      <dc:creator>I_See_You</dc:creator>
      <pubDate>Sun, 04 Oct 2026 15:12:22 +0000</pubDate>
      <link>https://dev.to/i_see_you/i-built-a-chrome-extension-so-you-never-have-to-hunt-for-the-google-meet-mute-button-again-47ci</link>
      <guid>https://dev.to/i_see_you/i-built-a-chrome-extension-so-you-never-have-to-hunt-for-the-google-meet-mute-button-again-47ci</guid>
      <description>&lt;p&gt;You're in a Google Meet call. You've stepped away from the Meet tab to check a doc, answer a Slack message or look up the number someone just asked for.&lt;/p&gt;

&lt;p&gt;Then the dog starts barking. Or a delivery driver rings the bell. Or someone says &lt;em&gt;"sorry, could you repeat that?"&lt;/em&gt; and you realize you're the one they're waiting on.&lt;/p&gt;

&lt;p&gt;So you start the scramble. Ctrl+Tab, Ctrl+Tab, Ctrl+Tab through twenty-something tabs, looking for the Meet window while everyone in the call hears everything.&lt;/p&gt;

&lt;p&gt;I did that scramble every day, sometimes several times in one meeting. Eventually I stopped trying to get faster at it and built a tool so I didn't have to do it at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's called &lt;a href="https://chromewebstore.google.com/detail/jogneopkjiibhdappecehdkghdkpeaep?utm_source=devto&amp;amp;utm_medium=launch-post" rel="noopener noreferrer"&gt;MeetMute&lt;/a&gt;, and it lets you mute Google Meet from any tab.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp2d4aab689ays256hw9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgp2d4aab689ays256hw9.gif" alt=" " width="719" height="405"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem is bigger than one button
&lt;/h2&gt;

&lt;p&gt;Google Meet's controls are good, as long as you're looking at the Meet tab. But most of us aren't, for most of the call. We're taking notes, pulling up a dashboard, reviewing a pull request, or quietly clearing an inbox during a status meeting we didn't need to attend.&lt;/p&gt;

&lt;p&gt;That causes two kinds of awkward moments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The hot mic.&lt;/strong&gt; You think you're muted, you aren't, and the whole team hears your side conversation, keyboard or coffee machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The silent speaker.&lt;/strong&gt; You're asked a question, start answering, and find out ten seconds later that you were talking to nobody.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both come down to one fact: &lt;strong&gt;your mic's state is hidden in a tab you're not looking at.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MeetMute brings that state to wherever you are, and lets you change it from there.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MeetMute does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎙️ A floating mic button on every tab
&lt;/h3&gt;

&lt;p&gt;During a call, a small button appears in the corner of whatever tab you're on: Google Docs, GitHub, Gmail, anything. Red means muted, green means live. Click it to toggle. You can drag it to any edge of the screen, and it remembers where you put it.&lt;/p&gt;

&lt;p&gt;Hover over it to reveal more: &lt;strong&gt;camera on/off&lt;/strong&gt;, &lt;strong&gt;jump back to the call&lt;/strong&gt;, and an optional &lt;strong&gt;leave call&lt;/strong&gt; button.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⌨️ One keyboard shortcut, from anywhere
&lt;/h3&gt;

&lt;p&gt;Press &lt;strong&gt;Ctrl+Space&lt;/strong&gt; on Windows, Linux and ChromeOS, or &lt;strong&gt;⌥M&lt;/strong&gt; on Mac, to mute or unmute without touching the mouse or leaving the tab you're in. You can change the shortcut to any key combination you like.&lt;/p&gt;

&lt;h3&gt;
  
  
  📻 Push-to-talk
&lt;/h3&gt;

&lt;p&gt;For noisy rooms or people who prefer to stay muted by default: turn on push-to-talk, then &lt;strong&gt;hold&lt;/strong&gt; the button or shortcut to speak and release it to mute again, like a walkie-talkie.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚪 Join every meeting muted
&lt;/h3&gt;

&lt;p&gt;Turn on &lt;strong&gt;auto-mute&lt;/strong&gt; and/or &lt;strong&gt;auto camera-off&lt;/strong&gt;, and every meeting starts the way you want. If you unmute yourself in the waiting room, MeetMute respects that and doesn't mute you again.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 Hot-mic alerts
&lt;/h3&gt;

&lt;p&gt;Left unmuted in a call after switching to another tab? After a delay you choose, MeetMute sends a desktop notification with a one-click &lt;strong&gt;Mute&lt;/strong&gt; button, and the floating button pulses to get your attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧭 A control panel in your toolbar
&lt;/h3&gt;

&lt;p&gt;Click the MeetMute icon during a call for a compact control panel: mic, camera, &lt;strong&gt;stop screen sharing&lt;/strong&gt;, go to the call, and leave. The icon's color shows your mic state at a glance, even if you've turned the floating button off.&lt;/p&gt;

&lt;h3&gt;
  
  
  🙈 Out of the way when you want it to be
&lt;/h3&gt;

&lt;p&gt;Not everyone wants a button on screen all the time, so you choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always&lt;/strong&gt; show it during calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only while unmuted&lt;/strong&gt;, so it appears only when your mic is live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off&lt;/strong&gt;, and use the shortcut and toolbar icon instead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also hide it on specific sites, or just for the current call. Every hide comes with an &lt;strong&gt;Undo&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remote and hybrid workers&lt;/strong&gt; who keep a meeting running in the background while they actually work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt; who share a screen, then need to mute from inside their editor or terminal tab&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teachers and students&lt;/strong&gt; juggling slides, a class chat and a Meet call at the same time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managers&lt;/strong&gt; who go from one meeting to the next and never want to be the hot mic again&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone in a noisy home&lt;/strong&gt;: kids, pets, construction next door&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How it works (for the curious)
&lt;/h2&gt;

&lt;p&gt;Since this is dev.to, here's a quick look at how it's built.&lt;/p&gt;

&lt;p&gt;MeetMute is a &lt;strong&gt;Manifest V3&lt;/strong&gt; Chrome extension written in &lt;strong&gt;TypeScript&lt;/strong&gt; with &lt;strong&gt;&lt;a href="https://wxt.dev/" rel="noopener noreferrer"&gt;WXT&lt;/a&gt;&lt;/strong&gt;, a framework I'd recommend to anyone building extensions. It handles manifest generation, hot reload and cross-browser builds, so I could focus on the product.&lt;/p&gt;

&lt;p&gt;There are three main parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;background (service worker)  → the hub: tracks calls, mute state, shortcuts
Meet content script          → reads and controls the mic/camera on meet.google.com
Floating-button script       → draws the floating button on your other tabs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few design decisions shaped it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Meet API, so it reads the page.&lt;/strong&gt; Google Meet doesn't offer a public API for mic state, so MeetMute reads the state from Meet's own mic and camera buttons and clicks those same buttons to toggle them. Every change goes through Meet's normal controls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadow DOM isolation.&lt;/strong&gt; The floating button lives in a shadow root, so no website's CSS can break it, and it can't break any website's layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional permissions.&lt;/strong&gt; MeetMute only needs access to &lt;code&gt;meet.google.com&lt;/code&gt; to work. Access to other sites, needed for the floating button there, is &lt;em&gt;optional&lt;/em&gt; and requested when you turn that feature on. Without it, the shortcut and toolbar panel still work everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple calls.&lt;/strong&gt; If you have more than one Meet call open, MeetMute follows the one you're focused on and warns you that several are open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building an extension that controls &lt;em&gt;another company's&lt;/em&gt; web app taught me a lot about timing, keyboard shortcuts on different operating systems, and Manifest V3 service workers. I'll save those stories for a follow-up post. Tell me in the comments if you'd like it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get started in 30 seconds
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://chromewebstore.google.com/detail/jogneopkjiibhdappecehdkghdkpeaep?utm_source=devto&amp;amp;utm_medium=launch-post" rel="noopener noreferrer"&gt;Add MeetMute to Chrome&lt;/a&gt;&lt;/strong&gt;. It's free and needs no account.&lt;/li&gt;
&lt;li&gt;Join any Google Meet call.&lt;/li&gt;
&lt;li&gt;Switch to another tab and press &lt;strong&gt;Ctrl+Space&lt;/strong&gt; (or &lt;strong&gt;⌥M&lt;/strong&gt; on Mac).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the whole setup. Auto-mute, push-to-talk and the rest are one click away in the toolbar icon whenever you want them.&lt;/p&gt;

&lt;p&gt;MeetMute is available in &lt;strong&gt;20 languages&lt;/strong&gt; and works on Windows, macOS, Linux and ChromeOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  I'd love your feedback
&lt;/h2&gt;

&lt;p&gt;MeetMute is a solo project, and almost every recent improvement came directly from user feedback. The visibility options, the Mac shortcut and the toolbar control panel all exist because someone told me what wasn't working for them.&lt;/p&gt;

&lt;p&gt;So I'd really like to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What's your most embarrassing "I thought I was muted" moment?&lt;/strong&gt; 😅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which feature would make this a must-have for you?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leave a comment below. And if MeetMute saves you from a hot mic, a quick &lt;a href="https://chromewebstore.google.com/detail/jogneopkjiibhdappecehdkghdkpeaep/reviews?utm_source=devto&amp;amp;utm_medium=launch-post" rel="noopener noreferrer"&gt;review on the Chrome Web Store&lt;/a&gt; helps other people find it.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and happy (muted) meetings! 🎧&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>extensions</category>
    </item>
    <item>
      <title>I built a Chrome extension to mute Google Meet from any tab — here's what I learned</title>
      <dc:creator>I_See_You</dc:creator>
      <pubDate>Sat, 23 May 2026 07:04:39 +0000</pubDate>
      <link>https://dev.to/i_see_you/i-built-a-chrome-extension-to-mute-google-meet-from-any-tab-heres-what-i-learned-340h</link>
      <guid>https://dev.to/i_see_you/i-built-a-chrome-extension-to-mute-google-meet-from-any-tab-heres-what-i-learned-340h</guid>
      <description>&lt;p&gt;Every remote worker knows this ritual: you're deep in a doc, the dog starts barking, and you frantically Ctrl+Tab through 30 tabs to find the Meet window and hit mute. By the time you get there, your entire team has heard everything.&lt;/p&gt;

&lt;p&gt;I got tired of it, so I built &lt;a href="https://chromewebstore.google.com/detail/meetmute-mute-control-for/jogneopkjiibhdappecehdkghdkpeaep" rel="noopener noreferrer"&gt;MeetMute&lt;/a&gt; — a Chrome extension that puts a floating mute button on every tab during a Google Meet call. Click it from anywhere, or press Ctrl+Space, and you're muted. No tab switching.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Floating button on every tab&lt;/strong&gt; — A small circle sits in the corner. Red = muted, green = live. Drag it to any screen edge; it remembers where you put it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcut (Ctrl+Space)&lt;/strong&gt; — Mute mid-sentence in a doc without lifting your hands off the keyboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push-to-talk&lt;/strong&gt; — Hold the button or shortcut to unmute, release to auto-mute. Walkie-talkie style for noisy environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toolbar icon&lt;/strong&gt; — Green, red, or gray so you know your mic state at a glance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site exclusions&lt;/strong&gt; — Right-click the float to hide it on specific sites.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;p&gt;I used &lt;a href="https://wxt.dev/" rel="noopener noreferrer"&gt;WXT&lt;/a&gt; (a framework for building web extensions) with TypeScript and Chrome Manifest V3. Here's the architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;background.ts (service worker)  — central hub, manages state
meet.content.ts                 — injected into Meet tabs, detects call/mute state
float.content.ts                — injected into all tabs, renders the floating button
popup/                          — toolbar popup UI
options/                        — settings page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WXT made the developer experience significantly better than raw MV3. Hot reloading, auto-generated manifest, TypeScript support out of the box — it let me focus on the actual extension logic instead of fighting with build tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interesting problems I solved
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Detecting mute state without an API
&lt;/h3&gt;

&lt;p&gt;Google Meet doesn't expose a public API for microphone state. The content script on the Meet tab watches the DOM — specifically the mute button's &lt;code&gt;data-is-muted&lt;/code&gt; attribute and aria labels. It's fragile (Google can change it anytime), but it works reliably and I haven't had to patch it since launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Floating button on every tab with Shadow DOM
&lt;/h3&gt;

&lt;p&gt;The float button is injected as a custom element (&lt;code&gt;&amp;lt;meetmute-float&amp;gt;&lt;/code&gt;) using Shadow DOM so it's completely CSS-isolated from the host page. No matter what styles a website uses, the button looks the same. I inline the CSS at build time to avoid FOUC.&lt;/p&gt;

&lt;h3&gt;
  
  
  Service worker keep-alive
&lt;/h3&gt;

&lt;p&gt;MV3 service workers get killed after 30 seconds of inactivity. During an active call, I use &lt;code&gt;chrome.alarms&lt;/code&gt; to keep it alive so mute state updates don't get dropped. When the call ends, the alarm stops and the worker is free to sleep.&lt;/p&gt;

&lt;h3&gt;
  
  
  Push-to-talk with pointer events
&lt;/h3&gt;

&lt;p&gt;PTT uses &lt;code&gt;pointerdown&lt;/code&gt;/&lt;code&gt;pointerup&lt;/code&gt; on the float button and &lt;code&gt;keydown&lt;/code&gt;/&lt;code&gt;keyup&lt;/code&gt; via &lt;code&gt;chrome.commands&lt;/code&gt; for the keyboard shortcut. The tricky part was handling the intent delay — a quick click when PTT is enabled should still toggle (not start a PTT session), so there's a short delay before entering "hold" mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling extension reloads gracefully
&lt;/h3&gt;

&lt;p&gt;When the extension updates or reloads, old content scripts become orphaned but their DOM elements stick around. On injection, the float script removes any stale &lt;code&gt;&amp;lt;meetmute-float&amp;gt;&lt;/code&gt; elements before creating a new one — otherwise you'd get duplicate buttons stacking up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things I'd do differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with &lt;code&gt;optional_host_permissions&lt;/code&gt; from day one.&lt;/strong&gt; I initially declared &lt;code&gt;*://*/*&lt;/code&gt; as a required host permission, which triggered Chrome Web Store's "Broad Host Permissions" review. Switching to optional permissions with a runtime prompt was better UX anyway — users grant access when they first see the float prompt, and it's less scary than a wall of permissions at install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test the DOM selectors against Meet's UI updates.&lt;/strong&gt; This is the biggest maintenance risk. Google Meet's DOM changes without warning. I'd set up a periodic smoke test if I were doing this again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;No data leaves your browser. No analytics, no tracking, no accounts, no external servers. Your preferences (button position, settings) are stored in &lt;code&gt;chrome.storage.local&lt;/code&gt; and that's it. The source code is open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chrome Web Store:&lt;/strong&gt; &lt;a href="https://chromewebstore.google.com/detail/meetmute-mute-control-for/jogneopkjiibhdappecehdkghdkpeaep" rel="noopener noreferrer"&gt;MeetMute - Mute Control for Google Meet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work remotely and use Google Meet, give it a shot. It's one of those tools where the value is hard to explain until you're mid-call reaching for the mute button and it's just... already there.&lt;/p&gt;

&lt;p&gt;Feedback welcome — I'm still actively developing it. Happy to answer questions about WXT, MV3 development, or anything else in the comments.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15y0g3wb5e67uzrixkbr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15y0g3wb5e67uzrixkbr.jpg" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>extensions</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built a Chrome Extension to Track How Long You Actually Spend on Each Tab</title>
      <dc:creator>I_See_You</dc:creator>
      <pubDate>Sat, 23 May 2026 06:47:18 +0000</pubDate>
      <link>https://dev.to/i_see_you/i-built-a-chrome-extension-to-track-how-long-you-actually-spend-on-each-tab-24jb</link>
      <guid>https://dev.to/i_see_you/i-built-a-chrome-extension-to-track-how-long-you-actually-spend-on-each-tab-24jb</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You open a tab to "quickly check" something. Forty minutes later you're still there.&lt;/p&gt;

&lt;p&gt;Browser history tells you &lt;em&gt;what&lt;/em&gt; you visited. It never tells you &lt;em&gt;how long&lt;/em&gt; you stayed. I kept losing track of time across research sessions, YouTube rabbit holes, and work dashboards — so I built something to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Tab Timer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tab Timer&lt;/strong&gt; is a Chrome extension that tracks time spent on any website and shows it live via a small floating widget directly on the page — no need to click anything, it's just always there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/tab-timer-website-time-tr/jecijahceghcehppgdadndecenoajpkc?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;Install on Chrome Web Store&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Floating On-Page Widget
&lt;/h3&gt;

&lt;p&gt;A draggable timer widget lives right on the page. Choose from 4 sizes (Extra Compact to Large). You can customize which buttons show — pause, reset, and lock — or hide them entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Focus Mode
&lt;/h3&gt;

&lt;p&gt;When enabled, only the &lt;strong&gt;currently active tab's timer runs&lt;/strong&gt;. Switch tabs, and the previous one pauses automatically. This gives you an honest measure of time actually spent looking at something, not just time it sat open.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lock Timers
&lt;/h3&gt;

&lt;p&gt;Refreshing a page normally resets a timer. Lock a tab's timer and it survives reloads. New timers start locked by default — so a page refresh doesn't wipe your session time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-Site Control
&lt;/h3&gt;

&lt;p&gt;Enable Tab Timer only on sites you want to track, or flip on "enable all sites" to track everything. You stay in control of what gets monitored.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;Tab Timer records your time locally and gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily time breakdowns per site&lt;/li&gt;
&lt;li&gt;Top sites by time spent&lt;/li&gt;
&lt;li&gt;Trends over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Insert analytics screenshot here)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All data is stored in Chrome's local storage. &lt;strong&gt;Nothing is ever sent to any server.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manifest V3&lt;/strong&gt; — built on the latest Chrome extension platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Worker&lt;/strong&gt; for background timer tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome Storage API&lt;/strong&gt; for persisting timers and analytics locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Scripts&lt;/strong&gt; for injecting the floating widget into pages&lt;/li&gt;
&lt;li&gt;No frameworks, no build tools — plain JS, HTML, and CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trickiest part was handling the Focus Mode logic: pausing timers across all tabs when the active tab changes, while making sure timers survive tab reloads and browser restarts without drifting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;No accounts. No servers. No tracking of your data by me.&lt;/p&gt;

&lt;p&gt;Everything Tab Timer records stays in your browser's local storage and never leaves your device.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Time limits and alerts (e.g. notify after 30 min on a site)&lt;/li&gt;
&lt;li&gt;Weekly email/export reports&lt;/li&gt;
&lt;li&gt;Dark mode widget theme&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/tab-timer-website-time-tr/jecijahceghcehppgdadndecenoajpkc?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;Install Tab Timer from the Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love feedback, bug reports, or feature ideas — drop them in the comments below!&lt;/p&gt;

</description>
      <category>extensions</category>
      <category>productivity</category>
      <category>management</category>
    </item>
    <item>
      <title>I Built a Chrome Extension to Track How Long You Actually Spend on Each Tab</title>
      <dc:creator>I_See_You</dc:creator>
      <pubDate>Mon, 11 May 2026 21:17:49 +0000</pubDate>
      <link>https://dev.to/i_see_you/i-built-a-chrome-extension-to-track-how-long-you-actually-spend-on-each-tab-2d1k</link>
      <guid>https://dev.to/i_see_you/i-built-a-chrome-extension-to-track-how-long-you-actually-spend-on-each-tab-2d1k</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You open a tab to "quickly check" something. Forty minutes later you're still there.&lt;/p&gt;

&lt;p&gt;Browser history tells you &lt;em&gt;what&lt;/em&gt; you visited. It never tells you &lt;em&gt;how long&lt;/em&gt; you stayed. I kept losing track of time across research sessions, YouTube rabbit holes, and work dashboards — so I built something to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Tab Timer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tab Timer&lt;/strong&gt; is a Chrome extension that tracks time spent on any website and shows it live via a small floating widget directly on the page — no need to click anything, it's just always there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/tab-timer-website-time-tr/jecijahceghcehppgdadndecenoajpkc?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;Install on Chrome Web Store&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Floating On-Page Widget
&lt;/h3&gt;

&lt;p&gt;A draggable timer widget lives right on the page. Choose from 4 sizes (Extra Compact to Large). You can customize which buttons show — pause, reset, and lock — or hide them entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Focus Mode
&lt;/h3&gt;

&lt;p&gt;When enabled, only the &lt;strong&gt;currently active tab's timer runs&lt;/strong&gt;. Switch tabs, and the previous one pauses automatically. This gives you an honest measure of time actually spent looking at something, not just time it sat open.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lock Timers
&lt;/h3&gt;

&lt;p&gt;Refreshing a page normally resets a timer. Lock a tab's timer and it survives reloads. New timers start locked by default — so a page refresh doesn't wipe your session time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-Site Control
&lt;/h3&gt;

&lt;p&gt;Enable Tab Timer only on sites you want to track, or flip on "enable all sites" to track everything. You stay in control of what gets monitored.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;Tab Timer records your time locally and gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily time breakdowns per site&lt;/li&gt;
&lt;li&gt;Top sites by time spent&lt;/li&gt;
&lt;li&gt;Trends over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Insert analytics screenshot here)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All data is stored in Chrome's local storage. &lt;strong&gt;Nothing is ever sent to any server.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manifest V3&lt;/strong&gt; — built on the latest Chrome extension platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Worker&lt;/strong&gt; for background timer tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome Storage API&lt;/strong&gt; for persisting timers and analytics locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Scripts&lt;/strong&gt; for injecting the floating widget into pages&lt;/li&gt;
&lt;li&gt;No frameworks, no build tools — plain JS, HTML, and CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trickiest part was handling the Focus Mode logic: pausing timers across all tabs when the active tab changes, while making sure timers survive tab reloads and browser restarts without drifting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;No accounts. No servers. No tracking of your data by me.&lt;/p&gt;

&lt;p&gt;Everything Tab Timer records stays in your browser's local storage and never leaves your device.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Time limits and alerts (e.g. notify after 30 min on a site)&lt;/li&gt;
&lt;li&gt;Weekly email/export reports&lt;/li&gt;
&lt;li&gt;Dark mode widget theme&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/tab-timer-website-time-tr/jecijahceghcehppgdadndecenoajpkc?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;Install Tab Timer from the Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love feedback, bug reports, or feature ideas — drop them in the comments below!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>extensions</category>
    </item>
    <item>
      <title>I Built a Chrome Extension to Track How Long You Actually Spend on Each Tab</title>
      <dc:creator>I_See_You</dc:creator>
      <pubDate>Mon, 11 May 2026 21:17:49 +0000</pubDate>
      <link>https://dev.to/i_see_you/i-built-a-chrome-extension-to-track-how-long-you-actually-spend-on-each-tab-4k7k</link>
      <guid>https://dev.to/i_see_you/i-built-a-chrome-extension-to-track-how-long-you-actually-spend-on-each-tab-4k7k</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You open a tab to "quickly check" something. Forty minutes later you're still there.&lt;/p&gt;

&lt;p&gt;Browser history tells you &lt;em&gt;what&lt;/em&gt; you visited. It never tells you &lt;em&gt;how long&lt;/em&gt; you stayed. I kept losing track of time across research sessions, YouTube rabbit holes, and work dashboards — so I built something to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Tab Timer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tab Timer&lt;/strong&gt; is a Chrome extension that tracks time spent on any website and shows it live via a small floating widget directly on the page — no need to click anything, it's just always there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/tab-timer-website-time-tr/jecijahceghcehppgdadndecenoajpkc?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;Install on Chrome Web Store&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Floating On-Page Widget
&lt;/h3&gt;

&lt;p&gt;A draggable timer widget lives right on the page. Choose from 4 sizes (Extra Compact to Large). You can customize which buttons show — pause, reset, and lock — or hide them entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Focus Mode
&lt;/h3&gt;

&lt;p&gt;When enabled, only the &lt;strong&gt;currently active tab's timer runs&lt;/strong&gt;. Switch tabs, and the previous one pauses automatically. This gives you an honest measure of time actually spent looking at something, not just time it sat open.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lock Timers
&lt;/h3&gt;

&lt;p&gt;Refreshing a page normally resets a timer. Lock a tab's timer and it survives reloads. New timers start locked by default — so a page refresh doesn't wipe your session time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-Site Control
&lt;/h3&gt;

&lt;p&gt;Enable Tab Timer only on sites you want to track, or flip on "enable all sites" to track everything. You stay in control of what gets monitored.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;Tab Timer records your time locally and gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily time breakdowns per site&lt;/li&gt;
&lt;li&gt;Top sites by time spent&lt;/li&gt;
&lt;li&gt;Trends over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Insert analytics screenshot here)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All data is stored in Chrome's local storage. &lt;strong&gt;Nothing is ever sent to any server.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manifest V3&lt;/strong&gt; — built on the latest Chrome extension platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Worker&lt;/strong&gt; for background timer tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome Storage API&lt;/strong&gt; for persisting timers and analytics locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Scripts&lt;/strong&gt; for injecting the floating widget into pages&lt;/li&gt;
&lt;li&gt;No frameworks, no build tools — plain JS, HTML, and CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trickiest part was handling the Focus Mode logic: pausing timers across all tabs when the active tab changes, while making sure timers survive tab reloads and browser restarts without drifting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;No accounts. No servers. No tracking of your data by me.&lt;/p&gt;

&lt;p&gt;Everything Tab Timer records stays in your browser's local storage and never leaves your device.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Time limits and alerts (e.g. notify after 30 min on a site)&lt;/li&gt;
&lt;li&gt;Weekly email/export reports&lt;/li&gt;
&lt;li&gt;Dark mode widget theme&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/tab-timer-website-time-tr/jecijahceghcehppgdadndecenoajpkc?authuser=0&amp;amp;hl=en" rel="noopener noreferrer"&gt;Install Tab Timer from the Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love feedback, bug reports, or feature ideas — drop them in the comments below!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>extensions</category>
    </item>
  </channel>
</rss>
