Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
**A private voice channel for your team, during your Teams meetings.**

[![Available in the Chrome Web Store](https://img.shields.io/badge/Chrome%20Web%20Store-Available-4f6bed.svg)](https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod)
[![Manifest V3](https://img.shields.io/badge/Chrome-Manifest%20V3-4f6bed.svg)](https://developer.chrome.com/docs/extensions/develop/migrate)
[![Available on Firefox Add-ons](https://img.shields.io/badge/Firefox%20Add--ons-Available-ff7139.svg)](https://addons.mozilla.org/firefox/addon/offmic/)
[![Manifest V3](https://img.shields.io/badge/Manifest-V3-4f6bed.svg)](https://developer.chrome.com/docs/extensions/develop/migrate)
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
![Version](https://img.shields.io/badge/version-0.1.0-green.svg)

**[Install OffMic from the Chrome Web Store](https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod)**
**[Install for Chrome](https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod)**  ·  **[Install for Firefox](https://addons.mozilla.org/firefox/addon/offmic/)**

</div>

Expand Down Expand Up @@ -61,15 +62,17 @@ Voice travels over **peer-to-peer WebRTC**, in a mesh. It never goes through a s

## Install

### Chrome
OffMic is published on both stores.

OffMic is published on the Chrome Web Store:
### Chrome

**[chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod](https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod)**

### Firefox

Firefox 115 or newer. The build is not on addons.mozilla.org yet, so grab `offmic-firefox.zip` from the [latest release](https://github.com/Bysimeit/OffMic/releases), unzip it, then open `about:debugging` → **This Firefox** → **Load Temporary Add-on** and pick the `manifest.json` inside. Being a temporary add-on, it goes away when you restart Firefox.
Firefox 115 or newer.

**[addons.mozilla.org/firefox/addon/offmic](https://addons.mozilla.org/firefox/addon/offmic/)**

### On Chrome, one permission step

Expand Down Expand Up @@ -98,13 +101,13 @@ Each teammate in the list also carries its own mic toggle and volume slider, so

## Installation, if you want to host your own relay server

None of this is needed to use OffMic. The Chrome Web Store build already points at a hosted relay, so installing it and joining a room is all it takes. Follow the steps below only if you would rather run the signaling for your team yourself.
None of this is needed to use OffMic. The store builds already point at a hosted relay, so installing one and joining a room is all it takes. Follow the steps below only if you would rather run the signaling for your team yourself.

Note that pointing at your own relay does not require a clone either: the address is editable straight from the popup, in the store build as much as in a local one.

### Requirements

Node.js 18 or newer, and Chrome.
Node.js 18 or newer, and Chrome or Firefox.

### 1. Clone

Expand All @@ -123,11 +126,11 @@ const OFFMIC_CONFIG = {
};
```

That value is only the **default** shown on a fresh Chrome profile. The address is editable in the popup at any time, and what you type there is remembered, so trying another relay never requires touching a file.
That value is only the **default** shown on a fresh browser profile. The address is editable in the popup at any time, and what you type there is remembered, so trying another relay never requires touching a file.

### 2. Load the extension from source

Skip this if you already installed a packaged build, it works the same against your own relay.
Skip this if you already installed a store build, it works the same against your own relay.

`extension/` holds one source tree and two manifests: `manifest.json` for Chrome, `manifest.firefox.json` for Firefox. The build script copies the tree into `dist/`, one folder per browser, with the right manifest in place:

Expand All @@ -148,9 +151,10 @@ On Chrome you can also load `extension/` directly, since its `manifest.json` is

1. Open `about:debugging` → **This Firefox**
2. **Load Temporary Add-on**, then pick `dist/firefox/manifest.json`
3. Open the popup and click the microphone permission link

The last step matters on both: the audio runs in a context with no UI, so it cannot show a permission prompt. You have to grant access once from the dedicated page, otherwise capture fails with `NotAllowedError`.
Being a temporary add-on, it goes away when you restart Firefox.

The last Chrome step matters: the audio runs there in a context with no UI, so it cannot show a permission prompt. You have to grant access once from the dedicated page, otherwise capture fails with `NotAllowedError`. Firefox captures inside the Teams tab and has nothing to grant.

### 3. Run the signaling server

Expand Down
33 changes: 24 additions & 9 deletions server/src/landing.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>OffMic, a private voice channel for your team during Teams meetings</title>
<meta name="description" content="A Chrome extension that gives your team a private peer-to-peer voice channel during a Teams meeting, driven by one thing only: your Teams microphone state." />
<meta name="description" content="A Chrome and Firefox extension that gives your team a private peer-to-peer voice channel during a Teams meeting, driven by one thing only: your Teams microphone state." />
<meta name="author" content="Simon" />
<meta name="robots" content="index, follow" />
<meta name="theme-color" content="#4f6bed" />
Expand All @@ -26,12 +26,21 @@
"@type": "SoftwareApplication",
"name": "OffMic",
"applicationCategory": "CommunicationApplication",
"operatingSystem": "Chrome",
"description": "A Chrome extension that gives your team a private peer-to-peer voice channel during a Teams meeting, driven by your Teams microphone state.",
"operatingSystem": "Chrome, Firefox",
"description": "A Chrome and Firefox extension that gives your team a private peer-to-peer voice channel during a Teams meeting, driven by your Teams microphone state.",
"url": "https://offmic.xeron.be/",
"downloadUrl": "https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod",
"installUrl": "https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod",
"sameAs": "https://github.com/Bysimeit/OffMic",
"downloadUrl": [
"https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod",
"https://addons.mozilla.org/firefox/addon/offmic/"
],
"installUrl": [
"https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod",
"https://addons.mozilla.org/firefox/addon/offmic/"
],
"sameAs": [
"https://github.com/Bysimeit/OffMic",
"https://addons.mozilla.org/firefox/addon/offmic/"
],
"license": "https://www.gnu.org/licenses/agpl-3.0.html",
"author": { "@type": "Person", "name": "Simon", "url": "https://github.com/Bysimeit" },
"offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" }
Expand Down Expand Up @@ -186,6 +195,7 @@
.dl-btn .dl-sub { font-size: 0.72rem; font-weight: 500; opacity: 0.82; }
.dl-btn .dl-main { font-size: 1.1rem; font-weight: 700; letter-spacing: -0.01em; }
.dl-primary { background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: #fff; box-shadow: 0 14px 30px -14px rgba(79, 107, 237, 0.95); }
.dl-firefox { background: linear-gradient(135deg, #ff9500, #e4551f); color: #fff; box-shadow: 0 14px 30px -14px rgba(228, 85, 31, 0.95); }
.dl-ghost { background: color-mix(in srgb, var(--surface) 80%, transparent); color: var(--text); border: 1px solid var(--line); }
.cta-note { margin: 20px auto 0; max-width: 52ch; font-size: 0.82rem; color: var(--muted); }

Expand Down Expand Up @@ -392,12 +402,16 @@ <h1>Mute yourself in Teams.<br /><span class="grad">Your team hears you.</span><
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 0C8.21 0 4.831 1.757 2.632 4.501l3.953 6.848A5.454 5.454 0 0 1 12 6.545h10.691A12 12 0 0 0 12 0ZM1.931 5.47A11.943 11.943 0 0 0 0 12c0 6.012 4.42 10.991 10.189 11.864l3.953-6.847a5.45 5.45 0 0 1-6.865-2.29Zm13.342 2.166a5.446 5.446 0 0 1 1.45 7.09l.002.001h-.002l-5.344 9.257c.206.01.413.016.621.016 6.627 0 12-5.373 12-12 0-1.54-.29-3.011-.818-4.364ZM12 16.364a4.364 4.364 0 1 1 0-8.728 4.364 4.364 0 0 1 0 8.728Z"/></svg>
<span class="dl-text"><span class="dl-sub">Available in the</span><span class="dl-main">Chrome Web Store</span></span>
</a>
<a class="dl-btn dl-firefox" href="https://addons.mozilla.org/firefox/addon/offmic/" target="_blank" rel="noopener noreferrer">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8.824 7.287c.008 0 .004 0 0 0zm-2.8-1.4c.006 0 .003 0 0 0zm16.754 2.161c-.505-1.215-1.53-2.528-2.333-2.943.654 1.283 1.033 2.57 1.177 3.53l.002.02c-1.314-3.278-3.544-4.6-5.366-7.477-.091-.147-.184-.292-.273-.446a3.545 3.545 0 01-.13-.24 2.118 2.118 0 01-.172-.46.03.03 0 00-.027-.03.038.038 0 00-.021 0l-.006.001a.037.037 0 00-.01.005L15.624 0c-2.585 1.515-3.657 4.168-3.932 5.856a6.197 6.197 0 00-2.305.587.297.297 0 00-.147.37c.057.162.24.24.396.17a5.622 5.622 0 012.008-.523l.067-.005a5.847 5.847 0 011.957.222l.095.03a5.816 5.816 0 01.616.228c.08.036.16.073.238.112l.107.055a5.835 5.835 0 01.368.211 5.953 5.953 0 012.034 2.104c-.62-.437-1.733-.868-2.803-.681 4.183 2.09 3.06 9.292-2.737 9.02a5.164 5.164 0 01-1.513-.292 4.42 4.42 0 01-.538-.232c-1.42-.735-2.593-2.121-2.74-3.806 0 0 .537-2 3.845-2 .357 0 1.38-.998 1.398-1.287-.005-.095-2.029-.9-2.817-1.677-.422-.416-.622-.616-.8-.767a3.47 3.47 0 00-.301-.227 5.388 5.388 0 01-.032-2.842c-1.195.544-2.124 1.403-2.8 2.163h-.006c-.46-.584-.428-2.51-.402-2.913-.006-.025-.343.176-.389.206-.406.29-.787.616-1.136.974-.397.403-.76.839-1.085 1.303a9.816 9.816 0 00-1.562 3.52c-.003.013-.11.487-.19 1.073-.013.09-.026.181-.037.272a7.8 7.8 0 00-.069.667l-.002.034-.023.387-.001.06C.386 18.795 5.593 24 12.016 24c5.752 0 10.527-4.176 11.463-9.661.02-.149.035-.298.052-.448.232-1.994-.025-4.09-.753-5.844z"/></svg>
<span class="dl-text"><span class="dl-sub">Available on</span><span class="dl-main">Firefox Add-ons</span></span>
</a>
<a class="dl-btn dl-ghost" href="https://github.com/Bysimeit/OffMic" target="_blank" rel="noopener noreferrer">
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .5a12 12 0 0 0-3.79 23.4c.6.1.82-.26.82-.58v-2.2c-3.34.72-4.04-1.6-4.04-1.6-.55-1.4-1.34-1.77-1.34-1.77-1.09-.75.08-.73.08-.73 1.2.08 1.84 1.24 1.84 1.24 1.07 1.84 2.8 1.3 3.49 1 .1-.78.42-1.3.76-1.6-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.13-.3-.54-1.52.11-3.18 0 0 1.01-.32 3.3 1.23a11.5 11.5 0 0 1 6.01 0c2.29-1.55 3.3-1.23 3.3-1.23.65 1.66.24 2.88.12 3.18.77.84 1.23 1.91 1.23 3.22 0 4.61-2.8 5.63-5.48 5.92.43.37.82 1.1.82 2.22v3.29c0 .32.21.7.83.58A12 12 0 0 0 12 .5Z"/></svg>
<span class="dl-text"><span class="dl-sub">Get it on</span><span class="dl-main">GitHub</span></span>
</a>
</div>
<p class="cta-note">Free and open source, AGPL-3.0. Chrome, Manifest V3, one click from the Chrome Web Store. The extension already points at a hosted relay, so there is nothing to deploy to get started.</p>
<p class="cta-note">Free and open source, AGPL-3.0. Chrome and Firefox, Manifest V3, one click from either store. The extension already points at a hosted relay, so there is nothing to deploy to get started.</p>
</div>

<section class="wrap">
Expand Down Expand Up @@ -441,7 +455,7 @@ <h3>Detect</h3>
<div class="card">
<div class="num">2</div>
<h3>Capture</h3>
<p>An offscreen document opens your microphone alongside Teams, without ever taking it away from the meeting.</p>
<p>OffMic opens your microphone alongside Teams, without ever taking it away from the meeting. Chrome hosts the capture in an offscreen document, Firefox inside your Teams tab.</p>
</div>
<div class="card">
<div class="num">3</div>
Expand Down Expand Up @@ -500,7 +514,7 @@ <h2>Before you install</h2>
<li><strong>Headphones are mandatory.</strong> If your team's voice comes out of your speakers while your Teams mic is live, the client will hear it. No software can fix that.</li>
<li><strong>Teams web only.</strong> A browser extension has no reach into the Teams desktop client.</li>
<li><strong>Detection depends on the Teams DOM.</strong> Microsoft can change its UI and break it.</li>
<li><strong>Chrome for now.</strong> The offscreen document is Chrome specific. A Firefox port is planned.</li>
<li><strong>Chrome and Firefox.</strong> Chrome runs the voice channel in an offscreen document, Firefox inside your Teams tab, so on Firefox closing that tab ends the channel.</li>
<li><strong>Up to 5 or 6 people.</strong> Beyond that, a peer-to-peer mesh costs too much upstream bandwidth.</li>
</ul>
<p class="built">No account, no sign-up, no usage tracking. The signaling server is a dependency-light Node service, and it is the one serving this page.</p>
Expand All @@ -520,6 +534,7 @@ <h2>Before you install</h2>
</div>
<div class="foot-links">
<a class="pill pill-link" href="https://chromewebstore.google.com/detail/onacjipehnjfchieiakjlofndidcnkod" target="_blank" rel="noopener noreferrer">Chrome Web Store</a>
<a class="pill pill-link" href="https://addons.mozilla.org/firefox/addon/offmic/" target="_blank" rel="noopener noreferrer">Firefox Add-ons</a>
<a class="pill pill-link" href="/privacy">Privacy</a>
<a class="pill pill-link" href="https://github.com/Bysimeit/OffMic" target="_blank" rel="noopener noreferrer">GitHub</a>
<a class="pill pill-link" href="https://github.com/Bysimeit/OffMic/blob/main/LICENSE" target="_blank" rel="noopener noreferrer">AGPL-3.0</a>
Expand Down
Loading