AI call analysis: feedback on interviews, syncs and presentations (all surfaces) - #115
Merged
Merged
Conversation
Hosts switch on AI call analysis before a screen share or voice call on
pairux.com, the desktop app or the mobile app; "Record the call" turns on
with it. After the call they get a private feedback report.
- Session settings carry `analysis` ({ enabled, kind, keepRecording }),
set at creation only; Pro/Team gate in POST /api/sessions and the
scheduled-meeting start route.
- Capture: web and desktop upload the call's mixed audio (host + everyone)
in 15s chunks plus a screen still every 20s; mobile records the host mic
with expo-av in 5-minute segments. Chunks are grouped by recorder run so
reloads and segments join cleanly.
- Job: pg_cron -> /api/analyses/run claims one analysis, joins the audio
(ffmpeg, now in the web image), transcribes with OpenAI
gpt-4o-transcribe-diarize (whisper-1 fallback), measures talk share, pace,
fillers, questions and interruptions, and has claude-opus-5 write a
structured report (interview / team sync / presentation / general).
Recording kept or deleted per the host's choice; host emailed.
- Consent: every participant sees a recording notice on web, desktop and
mobile for the whole call.
- Reports at /analyses and /analyses/[id]; dashboard link; desktop links out.
- Visible: home section, /features entry and /features/call-analysis,
pricing (Pro/Team), AI note taker use case now available, sitemap, llms.txt.
- Root @types/react pinned to 19 so adding expo-av cannot re-hoist React 18
types into the web app.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
ThreatCrush Security Scan47 finding(s) HIGH/CRITICAL: 4 | MEDIUM: 27 | LOW: 16
Snippets are redacted; ThreatCrush never prints matched credential material. |
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.
AI call analysis for PairUX: feedback on interviews, team syncs and presentations. The host decides before starting a screen share or voice call, on every surface, and turning it on turns "Record the call" on too.
Surfaces
/host(kind + record toggle)/session/[id]and/view/[id]Pipeline
Chunks go to the private
call-analysisbucket. pg_cron calls/api/analyses/runevery minute, which:gpt-4o-transcribe-diarize(falls back towhisper-1);claude-opus-5write a structured report (refusal fallbackdefaultenabled);Reports live at
/analyses. The feature is gated to Pro/Team.Ops needed at merge
20260924140000_call_analysis.sql(bucket, table,claim_call_analysis).call-analysisposting tohttps://pairux.com/api/analyses/runwith the reminders secret.OPENAI_API_KEYandANTHROPIC_API_KEYare already set on Railway.Tests
Typecheck and lint are clean on all three.
Not exercised end to end: a real call through ffmpeg, OpenAI and Claude. That can't run on this box (no Electron, and I didn't want to spend API credit on a synthetic call). The first real analyzed call is the live test.
🤖 Generated with Claude Code