Skip to content

Add Omni extension#26966

Open
ahkohd wants to merge 1 commit intoraycast:mainfrom
ahkohd:omni-extension
Open

Add Omni extension#26966
ahkohd wants to merge 1 commit intoraycast:mainfrom
ahkohd:omni-extension

Conversation

@ahkohd
Copy link
Copy Markdown

@ahkohd ahkohd commented Apr 6, 2026

Extension

Omni — Voice-to-text transcription powered by Omni.

Commands

Command Mode Description
Toggle Transcription no-view Start/stop dictation. Inserts text at cursor when stopped.
Transcribe & Copy no-view Start/stop dictation. Copies to clipboard when stopped.
Select Input Device view Browse and switch audio input devices.
Omni Status view View daemon state, recording, server, and model info.
Omni Doctor view Run health checks on the setup.

Setup

  1. npm install -g @ahkohd/omni
  2. Install the Raycast extension.
  3. Done — the extension auto-detects the binary and auto-starts the daemon.

Checklist

  • npm run build passes
  • author set to Raycast username
  • license is MIT
  • 512x512 PNG icon
  • package-lock.json included
  • platforms set to macOS
  • README included

@raycastbot raycastbot added the new extension Label for PRs with new extensions label Apr 6, 2026
@raycastbot
Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 10-15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 6, 2026

Greptile Summary

This PR adds the Omni extension, providing voice-to-text transcription commands (toggle, copy, device selection, status, and doctor) powered by the @ahkohd/omni npm binary. The implementation is clean overall, but two required publishing artifacts are missing:

  • Missing CHANGELOG.md — required for every new extension PR.
  • Missing metadata/ folder — required for extensions with view-type commands (input-devices, status, doctor).

Confidence Score: 4/5

Not ready to merge — two required publishing artifacts (CHANGELOG.md and metadata screenshots) are missing.

Two P1 findings must be resolved before merge: missing CHANGELOG.md (required by repository policy) and missing metadata/ screenshots folder (required for view-type commands). The core logic is correct and the remaining findings are P2 style issues.

extensions/omni/package.json (missing CHANGELOG and metadata), extensions/omni/.eslintrc.cjs (outdated ESLint config format), extensions/omni/src/lib/omni.ts (manual Preferences interface)

Important Files Changed

Filename Overview
extensions/omni/package.json Well-structured manifest with correct categories and preferences, but missing required CHANGELOG.md and metadata/ screenshots folder
extensions/omni/src/lib/omni.ts Core omni binary resolution and CLI wrapper logic is solid; manually defines a Preferences interface that duplicates the auto-generated type in raycast-env.d.ts
extensions/omni/.eslintrc.cjs Uses outdated ESLint <9 extends pattern instead of the required ESLint v9 defineConfig flat config format
extensions/omni/src/toggle-transcription.tsx Clean no-view command that checks recording state and toggles transcription with the configured stop mode
extensions/omni/src/transcribe-copy.tsx Clean no-view command that always stops with copy mode; straightforward implementation
extensions/omni/src/input-devices.tsx View command listing and selecting audio input devices using useCachedPromise; clean structure
extensions/omni/src/status.tsx View command displaying daemon, recording, input device, server, and model status via Promise.allSettled; well-implemented
extensions/omni/src/doctor.tsx View command running omni health checks and displaying passing/failing results in sections; clean implementation
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/omni/package.json
Line: 1

Comment:
**Missing CHANGELOG.md**

Every new extension PR must include a `CHANGELOG.md`. Please create one with an initial entry using the `{PR_MERGE_DATE}` placeholder:

```markdown
## [Initial Release] - {PR_MERGE_DATE}
- Initial release of Omni extension
```

**Rule Used:** What: Ensure that CHANGELOG.md is created or updat... ([source](https://app.greptile.com/review/custom-context?memory=97cd51bc-963b-43f5-acc3-9ba85fe7bb2d))

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/omni/package.json
Line: 26-45

Comment:
**Missing `metadata/` folder with screenshots**

The extension includes three `view`-mode commands (`input-devices`, `status`, `doctor`), which requires a `metadata/` folder containing Raycast-styled screenshots before the extension can be published. Please add at least one screenshot per view command following the [Raycast store guidelines](https://developers.raycast.com/basics/prepare-an-extension-for-store#screenshots).

**Rule Used:** What: Extensions with view-type commands must incl... ([source](https://app.greptile.com/review/custom-context?memory=87059ac1-c601-487f-9f1c-bce8a3cb6209))

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/omni/src/lib/omni.ts
Line: 31-34

Comment:
**Manual `Preferences` interface shadows auto-generated type**

`raycast-env.d.ts` already declares the global `Preferences` type derived from the extension manifest. This local `interface Preferences` is a redundant, potentially out-of-sync duplicate that shadows the generated type. Remove it and use `getPreferenceValues<Preferences>()` against the globally declared type.

```suggestion
```

**Rule Used:** What: Don't manually define `Preferences` for `get... ([source](https://app.greptile.com/review/custom-context?memory=d93fc9fb-a45d-4479-a6a4-b1b4af98ebc8))

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/omni/.eslintrc.cjs
Line: 1-3

Comment:
**Outdated ESLint config format**

This uses the legacy ESLint <9 `extends` pattern. Raycast extensions should use ESLint v9 flat config with `defineConfig` from `eslint/config`:

```suggestion
const { defineConfig } = require("eslint/config");
const raycastConfig = require("@raycast/eslint-config");

module.exports = defineConfig([...raycastConfig]);
```

**Rule Used:** What: In ESLint v9+, `defineConfig` is exported fr... ([source](https://app.greptile.com/review/custom-context?memory=ded2e079-95d0-44a7-80b5-83bbe04916f5))

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "Add Omni extension" | Re-trigger Greptile

Comment thread extensions/omni/package.json
Comment thread extensions/omni/package.json
Comment thread extensions/omni/src/lib/omni.ts Outdated
Comment thread extensions/omni/.eslintrc.cjs Outdated
@ahkohd ahkohd force-pushed the omni-extension branch 2 times, most recently from ba54e70 to 10682ad Compare April 6, 2026 06:20
@raycastbot
Copy link
Copy Markdown
Collaborator

This pull request has been automatically marked as stale because it did not have any recent activity.

It will be closed if no further activity occurs in the next 7 days to keep our backlog clean 😊

@raycastbot raycastbot added the status: stalled Stalled due inactivity label Apr 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions status: stalled Stalled due inactivity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants