Skip to content

v0.3.0

Latest

Choose a tag to compare

@chamals3n4 chamals3n4 released this 11 Jul 05:23

Features

  • 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.