feat: add Business tier and redesign pricing grid with per-card billi…#417
Merged
gabrielste1n merged 7 commits intomainfrom Mar 12, 2026
Merged
feat: add Business tier and redesign pricing grid with per-card billi…#417gabrielste1n merged 7 commits intomainfrom
gabrielste1n merged 7 commits intomainfrom
Conversation
…ng toggles
Replace 3-tier pricing layout (Free/Pro/Enterprise) with 4-tier grid
(Free/Pro/Business/Enterprise). Each paid card has its own annual/monthly
toggle defaulting to annual. Business card is featured with "Most Popular"
badge and strongest visual treatment.
- Add Business tier translations across all 10 locale files
- Replace global billing toggle with per-card toggles on Pro and Business
- Route checkout CTAs through IPC (respects env-based API URLs)
- Update cloudCheckout to accept { plan, tier } options object
- Show dynamic Pro/Business badge in UsageDisplay and plan labels
- Enterprise CTA now links to /contact-sales
Three critical bugs caused detection to stop working after the first notification on all platforms: 1. hasPrompted never reset after "Start Recording" — audio detector permanently locked, no further detections until app restart 2. dismissedProcesses never cleared on process termination — dismissed apps never re-detected even after quit and relaunch 3. 30-second auto-dismiss orphaned detection state — engine never notified, leaving hasPrompted and activeDetections permanently stuck Also tuned timing for sub-3-second popup response: - Sustained audio threshold: 15s → 2s - Dismiss cooldown: 30min → 5min - Polling fallback: 15s → 6s - Notification display: blind 300ms delay → event-based Added initial scan for already-running meeting apps on macOS startup.
Wire up programmatic plan switching via Stripe API instead of billing portal. Show proration preview in an invoice-style confirmation dialog before committing. Handle credits (negative prorations) with distinct labeling and green highlight. Guard trial users from switchPlan flow, routing them through checkout instead.
The notification window was created and detection worked, but the popup was invisible because showInactive() fired before React had mounted in Vite dev mode (ESM modules load asynchronously after did-finish-load). Renderer now signals readiness via IPC (meeting-notification-ready) when the component has data and is about to animate in. Main process only calls showInactive() on that signal, with a 3s fallback for safety.
…ycle guards, quiet empty-buffer errors - Buffer up to 3s of PCM audio during WebSocket CONNECTING state, flush on OPEN (no dropped frames) - Add isConnecting flag to prevent double connect() and guard session config send - Handle disconnect() during CONNECTING state gracefully (wait for open, then close) - Downgrade input_audio_buffer_commit_empty from ERROR to DEBUG (normal server VAD race)
When users complete checkout from the app, the success page redirects back via openwhispr://upgrade-success deep link. The app handles this on macOS (open-url) and Windows/Linux (second-instance), dispatches an upgrade-success event to the renderer, and useUsage retries with backoff until the webhook has updated the subscription status.
The built-in action now intelligently handles both plain notes (cleanup) and meeting transcripts (structured meeting notes with action items). Removes the separate "Generate notes" button that blocked custom actions after recording.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…ng toggles
Replace 3-tier pricing layout (Free/Pro/Enterprise) with 4-tier grid (Free/Pro/Business/Enterprise). Each paid card has its own annual/monthly toggle defaulting to annual. Business card is featured with "Most Popular" badge and strongest visual treatment.