You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Per-user Google Meet integration - interviewers can connect their own Google account from Settings → Integrations (OAuth 2.0). Tokens are encrypted at rest (AES-256-GCM) and refreshed automatically.
Auto-generated Meet links - event templates and the scheduler support auto-generating a Google Meet link when the candidate confirms a time slot; the link is created on the interviewer's own calendar with the candidate invited.
Interviewer assignment - interviews now have an assigned interviewer (user select in the scheduler), used as the Meet/calendar event owner.
Double-booking prevention - already-allocated slots are flagged in the scheduler, shown as "Unavailable" to candidates, and enforced server-side (race-safe claim with 409 on conflict).
Redesigned scheduler dialog - template-driven flow with progressive disclosure, existing template slots prefilled, allocated-slot warnings, and the app's date-time picker.
Redesigned candidate-facing pages - time-slot selection, offer letter, and confirmation/error states rebuilt in the careers-page design language (light + dark mode).
Redesigned interview emails - invite, slot, confirmation, and new cancellation email with a consistent dark-header card design and timezone-aware times.
Interview cleanup on delete - deleting an interview now cancels the provider Meet event, removes the calendar event, and emails the candidate a cancellation notice.
Fixes
Event template save silently failed (payload builder argument mismatch).
Candidate confirmation email never sent (dead duplicate route shadowed the real public handler).
Realtime updates: candidates list, interview status, offers, and stage moves now update live via a single dashboard-wide socket connection (previously required a page reload).
Stage-move no-op guard: moving a candidate to the stage they're already in no longer re-triggers automations.
Calendar event creation failed silently when inviting attendees via service account (no Domain-Wide Delegation) - attendees are now listed in the event description unless GOOGLE_CALENDAR_ALLOW_ATTENDEES=true.
"Mark as Hired" no longer stays active after hiring; draft offers appear on the profile without a reload.
/health endpoint response typo.
Upgrade notes
New env vars (backend/.env):
GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET, GOOGLE_OAUTH_REDIRECT_URI — from Google Cloud Console (Google Auth Platform). Redirect URI must be <backend-url>/oauth/google/callback and HTTPS in production.
ENCRYPTION_KEY - 32-byte base64 key for token encryption. Generate a fresh one per environment: openssl rand -base64 32.
GOOGLE_CALENDAR_ALLOW_ATTENDEES (optional) - set true only if the service account has Domain-Wide Delegation.
Migrations - two new migrations (interviewer_id/meeting_provider + provider_meeting_id on interviews, new integration_connections table). Applied automatically by the deploy workflow; run pnpm drizzle-kit migrate manually elsewhere.
Google Cloud setup - enable the Calendar API, configure the OAuth consent screen with the calendar.events scope, and add test users while the app is in Testing mode.