Voice dictation and recording for GNOME. Speak into any text field: press Super+Space, say what you mean, and the words are typed where your cursor already is - browsers, editors, chat boxes, terminals. Or press Super+Alt+Space to record everything your computer plays and your microphone hears, a call or anything else, and get its audio and its transcript side by side in your Documents folder. The transcription is typed as keystrokes rather than pasted, so your clipboard stays yours and applications that ignore a paste still get the text. While you speak, a panel in your desktop's own style shows what is being heard and where it will land; look anywhere else and it collapses to an indicator in the top bar while the dictation carries on. With no text field focused, the words go to the clipboard rather than nowhere. A recording lives in the top bar alone, carries on while the screen is locked, and is transcribed when you stop it. Wayland only, and it transcribes with an API key of your own: Grok, Mistral Voxtral, or any transcription model OpenRouter serves. No companion daemon and no background listening - the microphone opens when you start and is released the moment you stop.
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
EGO-A-005 manual_review
extensions should not access the clipboard directly
Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.
lib/shell/clipboard.js:5
St.Clipboard.get_default()
EGO-L-003 warning
signals connected by extension should be disconnected in disable()
Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.
lib/shell/audio.js:366
this.#busId = this.#bus.connect('message', (_bus, message) => this.#onMessage(message, handlers))
EGO-M-008 warning
extensions using unlock-dialog must document it in disable() comments
Extensions using `unlock-dialog` should document the reason in `disable()` comments.
extension.js:40
disable() {
if (this.#sessionModeId) {
Main.sessionMode.disconnect(this.#sessionModeId);
this.#sessionModeId = 0;
}
for (const id of this.#settingsChangedIds)
this.#settings?.disconnect(id);
this.#settingsChangedIds = [];
| Version | Status |
|---|---|
| 2.0.0 (21) | Unreviewed |
| 1.7.1 (20) | Rejected |
| 1.7.0 (19) | Rejected |
| 1.6.2 (18) | Rejected |
| 1.6.1 (17) | Rejected |
| 1.6.0 (16) | Rejected |
| 1.5.0 (15) | Rejected |
| 1.4.0 (14) | Rejected |
| 1.3.3 (13) | Rejected |
| 1.3.2 (12) | Rejected |
| 1.3.1 (11) | Rejected |
| 1.3.0 (10) | Rejected |
| 1.2.2 (9) | Rejected |
| 1.2.1 (8) | Rejected |
| 1.2.0 (7) | Rejected |
| 1.1.0 (6) | Rejected |
| 1.0.4 (5) | Rejected |
| 1.0.3 (4) | Rejected |
| 1.0.2 (3) | Rejected |
| 1.0.1 (2) | Rejected |
| 1.0.0 (1) | Rejected |