Skip to content

feat: macOS GUI .app dual-track bundle — GUI + bestasr-mcp + CLI, signed/notarized/stapled #87

Description

@kiki830621

Problem

bestASR currently ships three surfaces: the CLI, the Claude Code plugin
(~/bin auto-download of the notarized bestasr-mcp, #80), and the MCP
server
. A Claude Desktop .mcpb extension was considered but parked: in
Desktop's chat surface, a long transcription means the human sits waiting in the
chat with no progress — a bad UX for exactly the workload bestASR is for.

A macOS GUI .app is the better human-facing vehicle, and it can be
dual-track: the same signed bundle hosts the GUI (for humans, with a
progress UI) and the bestasr-mcp helper (for agents), from one artifact.

Original text (maintainer, roadmap discussion 2026-07-09):
「中期:做 macOS GUI .app,把 bestASR(GUI) + bestasr-mcp + bestasr(CLI) 打包進一顆 signed+stapled bundle,雙軌上線。這是新產品級投入(SwiftUI、檔案選擇、進度、結果檢視、設定),真要動我會照規矩用 apple-xcode-skills(SwiftUI)來寫,不憑記憶硬幹。」

Type

feature

Expected

A SwiftUI macOS app bundling all executables into one bundle:

bestASR.app/Contents/MacOS/
├── bestASR          # GUI (double-click; file picker, progress, results, settings)
├── bestasr-mcp      # MCP helper — claude mcp add bestasr -- /Applications/bestASR.app/Contents/MacOS/bestasr-mcp
└── bestasr          # CLI

Actual

No GUI. Humans either use the CLI or wait in a blocking MCP chat with no
progress. The only one-artifact install today is the Claude Code plugin, which
is agent-facing.

Impact

  • Reaches humans who want "drag a file → get an SRT" without Claude / terminal.
  • Better TCC story: a real .app bundle identity + Info.plist usage
    descriptions vs. a bare ~/bin binary.
  • Better notarization: a stapled bundle verifies offline.

Constraints / notes:

  • New-product-level investment (SwiftUI, file pickers, progress, results view,
    settings) — not a packaging change. Scope accordingly.
  • MUST use apple-xcode-skills (swiftui-specialist etc.) — Apple's official
    current guidance, not from-memory Swift.
  • Reuses the che-mcps-notary sign/notarize pipeline (already provisioned).
  • The binary stays small; models still download at runtime (~1.5 GB to
    ~/.cache) — same as today.
  • The async MCP job mode (feat: MCP transcribe async job mode — non-blocking transcribe for agents on long audio #86) benefits the bundled bestasr-mcp helper too
    (solves the agent long-wait; the GUI solves the human long-wait).

Related: #86 (MCP async job mode — the agent-side half of the long-wait problem).
Priority: P3 (mid-term).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions