Skip to content

feat: Cloud transcription models and UI enhancements - #349

Open
Vassista wants to merge 25 commits into
stenolabs:mainfrom
Vassista:ui-enhancemen
Open

feat: Cloud transcription models and UI enhancements#349
Vassista wants to merge 25 commits into
stenolabs:mainfrom
Vassista:ui-enhancemen

Conversation

@Vassista

@Vassista Vassista commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

This PR introduces three major enhancements to the app:

1. Cloud Transcription Models

  • Added support for OpenAI-compatible ASR endpoints, allowing users to configure custom API endpoints for transcription.
  • Introduced a unified model picker within the Transcribe settings page, making it seamless to switch between local models (Parakeet, Whisper) and cloud-based models.

2. Settings UI Refactor & Context-Aware Search

  • Unified Sidebar Navigation: Completely refactored the Settings page layout. The settings tabs have been moved from a top-header bar directly into the main sidebar for a modern, fluid layout.
  • Aesthetics: The settings navigation now features polished styling with rounded capsule active states, subtle sliding hover animations, and beautiful Lucide icons for each tab.
  • Centered Layout: Removed redundant headers and cleanly centered the configuration options within the right pane for better readability.
  • Context-Aware Cmd+K: The Command Palette is now context-aware! If you press Cmd+K while viewing Settings, it seamlessly switches to a "Search settings..." mode. It instantly searches through an index of all app configurations (e.g. "Dark Mode", "Microphone", "Export") and navigates you to the exact tab where that setting lives.

3. Notification Toast & UI Refinements

  • Fixed the notification width to 344px to exactly match native macOS notification sizes, ensuring it looks at home on the desktop.
  • Removed early text truncation (max-w-[150px]) that was causing a massive perceived empty gap when the "Join" button wasn't present. The text now natively grows and fills the available space gracefully.
  • Replaced the generic video icon in the "Join & take notes" button with the Steno app icon (scaled to fit nicely without blowing out the button).
  • Added a subtle, passive Steno app icon watermark to the right side of buttonless notifications to perfectly balance the layout and improve branding, adjusting contrast dynamically for perfect visibility in both light and dark mode.
  • Replaced the generic .txt file icon in the "Previous Notes" home list view with dynamic Letter Avatars (e.g. "L" for "Lunch Break"), matching native macOS design patterns.
  • Universal Custom Notifications**: Migrated all native macOS notifications (auto-detect, auto-stop, errors) to the new frameless React UI using a seamless CustomNotification wrapper in main.js.

Summary by cubic

Adds an OpenAI-compatible cloud transcription engine with a secure, configurable endpoint, plus small Settings and notification improvements. You can choose Parakeet, Whisper, or Cloud, configure API URL/key/model, and get a cleaner, context-aware Settings experience.

  • New Features

    • Cloud ASR: openai-asr posts to /audio/transcriptions (verbose_json first, text fallback), appends the path if missing, and chunks large WAVs; works with OpenAI, Groq, or any compatible URL.
    • Secure config: Edit API URL/key/model in Settings; key is encrypted with Electron safeStorage, can be cleared, and also reads STENOAI_OAI_API_KEY. IPC get-openai-asr-config/set-openai-asr-config + preload bridge and React Query hooks. Enabling cloud shows a privacy notice; copy makes it clear audio is sent over the network. --prompt-api-key supported for CLI.
    • Unified picker: Choose Parakeet, Whisper, or “OpenAI-compatible ASR.” Whisper auto-downloads if missing; live transcription remains Parakeet-only. Settings keeps tabs in the main sidebar with icons, a Back to Home action, and “Search settings…” via Cmd+K. Notifications moved to a React toast UI with icons, actions, analytics, and a 344px width.
  • Bug Fixes

    • Cloud ASR hardening: Enforce URL schemes (HTTPS for remote; HTTP allowed for localhost), preserve POST on 307/308 same-origin redirects, block cross-origin redirects, stream multipart bodies safely, never pass API keys via CLI, allow clearing the key in UI, redact set-openai-asr-config in diagnostics, and fix a chunk duration edge case.
    • Notifications: Clicking a pre-meeting toast opens the meeting URL and focuses the app; toasts close reliably and passive dismisses are tracked.

Written for commit 9dfa101. Summary will update on new commits.

Review in cubic

@Vassista
Vassista requested review from Optic00 and ruzin as code owners July 18, 2026 15:01
@Vassista
Vassista marked this pull request as draft July 18, 2026 15:02

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 11 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread simple_recorder.py
Comment thread app/renderer/src/components/Sidebar.tsx Outdated
Comment thread src/transcriber.py Outdated
Comment thread src/transcriber.py Outdated
Comment thread app/renderer/src/routes/settings/TranscriptionTab.tsx Outdated
Comment thread app/renderer/src/components/Sidebar.tsx Outdated
@Vassista
Vassista marked this pull request as ready for review July 18, 2026 16:44

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 12 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src/transcriber.py Outdated
Comment thread simple_recorder.py Outdated
Comment thread app/renderer/src/routes/settings/TranscriptionTab.tsx Outdated
Comment thread src/transcriber.py
Comment thread src/transcriber.py Outdated
Comment thread src/transcriber.py Outdated
…ch download, and remove api-key from CLI args

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 3 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src/transcriber.py
Comment thread simple_recorder.py Outdated
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 1 file (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread src/transcriber.py

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 2 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread app/renderer/src/routes/settings/TranscriptionTab.tsx Outdated
Vassista and others added 4 commits July 18, 2026 22:41
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
- Fix notification width to match macOS native dimensions (344px)
- Remove early text truncation that caused large empty gaps
- Replace generic video icon with AppIcon in Join button
- Add subtle AppIcon to buttonless notifications for visual balance

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 1 file (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread app/renderer/src/components/NotificationToast.tsx Outdated
@Vassista Vassista changed the title feat: Cloud transcription models and Settings UI enhancements feat: Cloud transcription models and UI enhancements Jul 19, 2026
@ruzin

ruzin commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

@Vassista im looking forward to this PR, it has some great features

@Optic00

Optic00 commented Jul 22, 2026

Copy link
Copy Markdown
Collaborator

One more thing came up on a fresh pass over this same head (cb6bb52) - my earlier Request changes still stands, so I'm adding this as a comment rather than a second review.

New blocker: an empty endpoint URL silently falls back to OpenAI while keeping a foreign provider's key. src/transcriber.py:721 does api_url = (getattr(self, "_openai_asr_api_url", "") or "https://api.openai.com/v1"), and set_openai_asr_api_url (src/config.py:1007) stores an empty string when the field is cleared. So a user who configured, say, Groq (Groq base URL + Groq key) and then blanks the URL ends up shipping their audio and their Groq bearer token to api.openai.com. Please fail closed with a clear "endpoint not configured" error instead of defaulting a blank URL to a hardcoded third-party endpoint while a key is set.

@Vassista

Copy link
Copy Markdown
Contributor Author

Hi @Optic00 @ruzin ,

Thanks for taking the time to review this PR and giving the feedback.

I'm currently occupied up with some personal commitments, it may take me a some time to address the issues. Meanwhile, If anyone would like to help work through any of the suggested changes, please feel free to do so. I'd really appreciate it. Otherwise, I'll get back to this as soon as I can.

Thanks for your patience!

@Vassista
Vassista marked this pull request as draft July 22, 2026 17:15
ruzin added a commit that referenced this pull request Jul 23, 2026
Adds context-aware Cmd+K settings search on the current nav-rail design. From @Vassista's #349.
ruzin added a commit that referenced this pull request Jul 23, 2026
Replaces the file glyph with the note's first initial. From @Vassista's #349.
ruzin added a commit that referenced this pull request Jul 23, 2026
Adds an OpenAI-compatible cloud transcription engine with safeStorage-encrypted API key (never in config.json), UI on the current AiTab. From @Vassista's #349.
ruzin added a commit that referenced this pull request Jul 23, 2026
…#402)

Replaces native OS notifications with the in-app frameless toast (API-compatible shadow class; all 8 call sites preserved; cross-platform). Note: notifications no longer appear in the OS Notification Center, have no sound, and auto-dismiss after 15s. From @Vassista's #349.
@ruzin

ruzin commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

@Vassista your work has been merged in separate PRS ty

@ruzin

ruzin commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator

@Vassista cloud ASR couldn't go in the end as we had some issues, but Ben has written an issue update for it, will wait for you to pick up when free.

@Vassista

Copy link
Copy Markdown
Contributor Author

@ruzin @Optic00 working on the issues now, so it can be merged asap. Appreciate the wait.

…on, audio chunking, redirect codes, URL scheme validation, premeeting click handler, and docs)
@Vassista
Vassista marked this pull request as ready for review July 31, 2026 15:00
@Vassista
Vassista requested a review from Optic00 August 4, 2026 04:19

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 13 files

Tip: instead of fixing issues one by one fix them all with cubic

Re-trigger cubic

Comment thread app/main.js Outdated
Comment thread simple_recorder.py
Comment thread app/main.js Outdated
Comment thread app/main.js
Comment thread app/renderer/src/routes/settings/AiTab.tsx
Comment thread src/transcriber.py
Comment thread app/renderer/src/routes/settings/AiTab.tsx Outdated
Comment thread app/renderer/src/lib/ipc.ts
Comment thread src/transcriber.py
Comment thread app/renderer/src/components/Sidebar.tsx Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 7 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

Comment thread src/transcriber.py
Comment thread app/renderer/src/components/Sidebar.tsx Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 2 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Fix all with cubic | Re-trigger cubic

Comment thread src/transcriber.py Outdated
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants