Meet PIP is a hybrid application that enhances the Google Meet Picture-in-Picture experience by calculating the active speaker and rendering them in a native macOS window. This project combines a Chrome Extension with a native Swift application.
src/: Source code for the Chrome Extension (Content Script, Background Script).meet-pip/: Source code for the native macOS application (Swift/SwiftUI).native-setup/: Scripts and configuration for setting up the Native Messaging Host.
- Node.js (v18+ recommended)
- Xcode (latest version) & Xcode Command Line Tools
- Google Chrome
We use a Makefile to streamline the build and setup process.
Install Node dependencies and build both the extension and the native app:
make install
make buildThis will:
- Build the Chrome Extension into
dist/. - Build the Native App into
meet-pip/DerivedData/.
- Open Chrome and navigate to
chrome://extensions/. - Enable "Developer mode" (top right).
- Click "Load unpacked" and select the
distdirectory in this project. - copy the ID of the newly loaded extension (e.g.,
gpdhpobcgfffikfchpgdffmbbkllgmfm).
- Copy the example configuration file:
cp .env.example .env
- Open
.envand paste your Extension ID:EXTENSION_ID=your_copied_id_here
- Run the setup script:
make setup
This script will register the native messaging host with Chrome, pointing it to your local build of the native app.
- Open a Google Meet session.
- You should see a "Start Native PIP" button.
- Clicking it should launch the native MeetPIP window.
- Toggle PIP: The button tracks state. Click "Start Native PIP" to open, and "Stop Native PIP" to close/disconnect.
- Mute Support:
- Toggle mute directly from the Native PIP window using the "Mute/Unmute" button.
- Keyboard Shortcut:
Cmd+Shift+M(when Native PIP window is focused).
- Customization Settings:
- Access Settings: Press
Cmd+,or select MeetPIP → Settings... from the menu bar. - Layout Orientation: Choose between horizontal (left-to-right) or vertical (top-to-bottom) speaker arrangement.
- Profile Picture Size: Adjust avatar size from 28px to 128px (default: 48px).
- Settings persist across app launches automatically.
- Access Settings: Press
- Compact UI: The native window is optimized for minimal footprint while keeping speaker visibility.
Background functionality limitation: The extension does not work when the Google Meet tab is in the background (i.e., when you switch to another tab or Picture-in-Picture mode).
Workaround: Open the Google Meet call in a new window instead of a tab. This allows you to keep the Meet session running in the foreground while you work in other tabs or windows, maintaining the Native PIP functionality.
To open Google Meet in a new window:
- Click the three-dot menu in the top-right corner of the Google Meet tab.
- Select "Move tab to new window" or simply drag the tab out of the browser window.
- You can now switch to other tabs/windows while the Native PIP continues to work.
make build-extension: Rebuild just the extension.make build-app: Rebuild just the native app.- Custom Signing:
make build-app TEAM_ID=YOUR_TEAM_IDto sign with a specific identity.
- Custom Signing:
npm run dev: Start the Vite dev server for UI components.
"Native PiP blocked" not appearing?
Reload the extension in chrome://extensions and refresh the Google Meet page.
"Translation context invalidated"?
The extension supports hot-reloading. Just reload the extension in chrome://extensions and the "Start Native PIP" button should refresh automatically.
"Binary not found"?
Run make build-app to ensure the native application is compiled.
ISC