Dev.to AI 🤖 Ai 👁 0 📖 4 min read

I kept getting lost in internship meetings, so I built an open-source AI overlay in Electron

During meetings with my internship team I kept getting lost. Someone would mention jargon I didn't know, or ask about a slide I hadn't prepared for, and by the time I'd looked it up in another tab, the conversation had m

I kept getting lost in internship meetings, so I built an open-source AI overlay in Electron

During meetings with my internship team I kept getting lost. Someone would mention jargon I didn't know, or ask about a slide I hadn't prepared for, and by the time I'd looked it up in another tab, the conversation had moved on.

So I built MeetMind: a small floating window for Windows that sits on top of your meetings. Hit a hotkey and it screenshots your screen and asks your AI ("what does this chart mean?"). It can also transcribe the meeting on your PC with Whisper, and keep meeting notes you can summarize or ask about later.

It's free and MIT licensed: https://github.com/smsolutionsva-byte/MeetMind

MeetMind demo

Here are a few things I learned building it with Electron, React and TypeScript.

1. Keeping an overlay out of screen shares

If you present your screen, you don't want your private notes showing up for everyone. Windows 10 (2004+) and 11 have an API for exactly this, SetWindowDisplayAffinity with WDA_EXCLUDEFROMCAPTURE, and Electron wraps it in one line:

export function makeStealthy(win: BrowserWindow): void {
  win.setContentProtection(true)               // leave this window out of screen captures
  win.setAlwaysOnTop(true, 'screen-saver')     // stay above full-screen meeting apps
  win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true })
  win.setSkipTaskbar(true)
}

Two things that bit me:

  • Every window needs it. My "Meeting notes" window and even popup windows (like a sign-in popup) are separate windows, so each one has to call setContentProtection(true) too.
  • Verify it, don't trust your eyes. The window always looks normal on your screen. I checked it with GetWindowDisplayAffinity from a small PowerShell script: 0x11 means excluded from capture. And I still recommend testing once with a real screen share, since not every capture method respects it.

2. AI websites as tabs, without an API key

I wanted people to use the ChatGPT / Claude / Gemini account they already have. Each provider is a WebContentsView inside the overlay, in a persistent session partition, so logins survive restarts:

const view = new WebContentsView({
  webPreferences: { partition: 'persist:meetmind' }
})
view.webContents.loadURL('https://chatgpt.com/')

When you hit the hotkey, MeetMind takes a screenshot, pastes it with your prompt into the active tab, and the site answers like normal. For people who'd rather use an API key, there's also an API mode that streams answers straight into the window.

3. Google blocks sign-in inside embedded browsers

This was the most confusing bug report I got: "I clicked Continue with Google and it says this browser may not be secure".

Google deliberately blocks OAuth inside apps that embed a browser. You could fake a Chrome user agent to get around it, but that's exactly what the block is there to stop, so I didn't. Instead, MeetMind catches the navigation before it happens and shows a friendly guide (use email login, or an API key):

export function isGoogleSignIn(url: string): boolean {
  const u = new URL(url)
  // Google sites do quiet "passive" login checks on load. Don't block those.
  if (u.hostname !== 'accounts.google.com' || u.searchParams.has('passive')) return false
  return /^\/(o\/oauth2|signin|v3\/signin|ServiceLogin|AccountChooser|InteractiveLogin)/i.test(u.pathname)
}

const guard = (e) => {
  if (e.isMainFrame && isGoogleSignIn(e.url)) {
    e.preventDefault()
    showGoogleNotice()
  }
}
webContents.on('will-navigate', guard)
webContents.on('will-redirect', guard) // ChatGPT redirects through its own page first

Gotchas:

  • You need both will-navigate and will-redirect. ChatGPT's Google button goes to its own forwarding page, which then redirects to Google.
  • Blocking that redirect left a blank page behind. I fixed it by going back in history if the page is empty.
  • Popups need it too: setWindowOpenHandler denies Google sign-in popups.

4. Don't steal focus from the meeting

If the overlay grabs keyboard focus while you're typing in the meeting chat, that's annoying. In API mode, answers appear with win.showInactive() instead of win.show(), so focus stays where it was.

(Web mode can't avoid it: pasting into a website needs focus.)

5. Local transcription with Whisper

Meeting audio is captured with Windows loopback, resampled to 16 kHz, and transcribed in a worker thread with Transformers.js. No audio leaves your PC for this. A simple voice detector cuts the audio at pauses, and common Whisper hallucinations on silence ("Thank you.") get filtered out.

Transcripts are saved per meeting on your PC, which powers the newest feature: a Meeting notes window with summaries (key points, decisions, action items) and questions across past meetings like "what did we decide about the deadline?".

What's next

What I'm most excited about is team context: someone mentions "PR 209" and you can ask who wrote it and what it fixed, without digging through tabs.

It's Windows only for now and the installer isn't code-signed yet, so Windows may warn you. If you try it, I'd love feedback, and stars help a lot :)

GitHub: https://github.com/smsolutionsva-byte/MeetMind

📰 Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.