Skip to content

feat: add Business tier and redesign pricing grid with per-card billi…#417

Merged
gabrielste1n merged 7 commits intomainfrom
feature/business-tier-pricing-redesign
Mar 12, 2026
Merged

feat: add Business tier and redesign pricing grid with per-card billi…#417
gabrielste1n merged 7 commits intomainfrom
feature/business-tier-pricing-redesign

Conversation

@gabrielste1n
Copy link
Collaborator

…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

…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.
@gabrielste1n gabrielste1n merged commit 5b09015 into main Mar 12, 2026
4 checks passed
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.

1 participant