Skip to content

Auth: User invitation flow#111

Merged
Ayush8923 merged 50 commits intomainfrom
feat/invitation-flow
Apr 17, 2026
Merged

Auth: User invitation flow#111
Ayush8923 merged 50 commits intomainfrom
feat/invitation-flow

Conversation

@Ayush8923
Copy link
Copy Markdown
Collaborator

@Ayush8923 Ayush8923 commented Apr 8, 2026

Issue: #112

Summary:

  • Create the one invite page where user will be landed after invitation.
  • Function name updated for common purpose uses.

Summary by CodeRabbit

  • New Features

    • Invite & magic-link verification flows: users can verify tokens from invite/email links with progress UI and automatic redirect on success.
    • Email magic-link sending from the login modal; token-based login supported.
    • New copyable code blocks, tags, and improved icons for easier interaction.
  • UI / UX

    • Improved toast animations and status badges; updated layout/styling across settings and evaluation pages.
    • Sidebar and onboarding UX enhancements for organizations, credentials, and provider management.
  • Security / Routing

    • Stronger route protection and role-aware navigation for protected settings.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 8, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 590edf45-377a-443a-8fb8-3f38601fb491

📥 Commits

Reviewing files that changed from the base of the PR and between 250769d and b8bc2cf.

📒 Files selected for processing (82)
  • CLAUDE.md
  • app/(auth)/invite/page.tsx
  • app/(auth)/verify/page.tsx
  • app/(main)/configurations/page.tsx
  • app/(main)/configurations/prompt-editor/page.tsx
  • app/(main)/evaluations/[id]/page.tsx
  • app/(main)/evaluations/page.tsx
  • app/(main)/settings/credentials/page.tsx
  • app/(main)/settings/onboarding/page.tsx
  • app/api/auth/google/route.ts
  • app/api/auth/invite/route.ts
  • app/api/auth/logout/route.ts
  • app/api/auth/magic-link/route.ts
  • app/api/auth/magic-link/verify/route.ts
  • app/api/credentials/org/[orgId]/[projectId]/provider/[provider]/route.ts
  • app/api/credentials/org/[orgId]/[projectId]/route.ts
  • app/api/users/me/route.ts
  • app/components/CodeBlock.tsx
  • app/components/ConfigCard.tsx
  • app/components/ConfigModal.tsx
  • app/components/CopyableCodeBlock.tsx
  • app/components/DetailedResultsTable.tsx
  • app/components/Field.tsx
  • app/components/InfoTooltip.tsx
  • app/components/PageHeader.tsx
  • app/components/StatusBadge.tsx
  • app/components/Tag.tsx
  • app/components/Toast.tsx
  • app/components/auth/LoginModal.tsx
  • app/components/auth/TokenVerifyPage.tsx
  • app/components/auth/index.ts
  • app/components/evaluations/DetailedResultsTable.tsx
  • app/components/evaluations/EvalDatasetDescription.tsx
  • app/components/evaluations/EvalRunCard.tsx
  • app/components/evaluations/EvaluationsTab.tsx
  • app/components/evaluations/GroupedResultsTable.tsx
  • app/components/evaluations/ScoreDisplay.tsx
  • app/components/icons/common/CopyIcon.tsx
  • app/components/icons/common/ErrorCircleIcon.tsx
  • app/components/icons/common/MailIcon.tsx
  • app/components/icons/common/RefreshIcon.tsx
  • app/components/icons/document/CloseIcon.tsx
  • app/components/icons/index.tsx
  • app/components/icons/prompt-editor/CheckCircleIcon.tsx
  • app/components/index.ts
  • app/components/prompt-editor/Header.tsx
  • app/components/settings/ProviderSidebar.tsx
  • app/components/settings/SettingsSidebar.tsx
  • app/components/settings/credentials/CredentialForm.tsx
  • app/components/settings/credentials/CredentialFormPanel.tsx
  • app/components/settings/credentials/ProviderList.tsx
  • app/components/settings/credentials/index.ts
  • app/components/settings/onboarding/OnboardingCredentials.tsx
  • app/components/settings/onboarding/OrganizationList.tsx
  • app/components/settings/onboarding/UserList.tsx
  • app/components/settings/onboarding/index.ts
  • app/components/speech-to-text/EvaluationsTab.tsx
  • app/components/text-to-speech/EvaluationsTab.tsx
  • app/components/types.ts
  • app/components/user-menu/Branding.tsx
  • app/components/utils.ts
  • app/globals.css
  • app/hooks/useToast.ts
  • app/layout.tsx
  • app/lib/authCookie.ts
  • app/lib/constants.ts
  • app/lib/navConfig.ts
  • app/lib/types/evaluation.ts
  • app/lib/types/onboarding.ts
  • app/lib/types/toast.ts
  • app/lib/utils.ts
  • app/lib/utils/evaluation.ts
  • app/page.tsx
  • instructions/CLAUDE.md
  • instructions/COLOR_SCHEME.md
  • instructions/CONFIG_AB.md
  • instructions/CONFIG_API.md
  • instructions/TESTING_MOCK_DATA.md
  • instructions/VERCEL_DESIGN_SYSTEM.md
  • middleware.ts
  • public/mock-data/evaluation-sample-1.json
  • public/mock-data/evaluation-sample-2.json

📝 Walkthrough

Walkthrough

Added invite and magic-link token verification flows (client pages + API routes) that forward to backend verification, set role cookies, and sign users in via a renamed auth method; also introduced many UI components, evaluation types/utils, credential management UI, theme/animation updates, middleware route protection, and documentation changes.

Changes

Cohort / File(s) Summary
Invite & Verify Pages
app/(auth)/invite/page.tsx, app/(auth)/verify/page.tsx
New client pages that read token from URL, render TokenVerifyPage via Suspense, show spinner fallback, and drive verification UI/redirect flow.
Token Verify Component & Auth Flow
app/components/auth/TokenVerifyPage.tsx, app/components/auth/index.ts, app/components/auth/...
Added TokenVerifyPage component and re-export; component fetches verification API, calls loginWithToken, manages verifying/success/error states and redirect.
API Routes: Auth Proxying
app/api/auth/invite/route.ts, app/api/auth/magic-link/route.ts, app/api/auth/magic-link/verify/route.ts, app/api/auth/google/route.ts, app/api/auth/logout/route.ts, app/api/auth/...
New/updated API route handlers that forward requests to backend via apiClient, propagate Set-Cookie headers, and set/clear role cookie for successful auth responses.
Auth Context & Types
app/lib/context/AuthContext.tsx, app/lib/types/auth.ts
Renamed context method loginWithGoogleloginWithToken and added InviteVerifyResponse type.
Magic Link Send Endpoint
app/api/auth/magic-link/route.ts
New POST endpoint to forward magic-link send requests to backend.
Auth Cookie Helpers
app/lib/authCookie.ts
New ROLE_COOKIE, setRoleCookieFromBody, and clearRoleCookie helpers for role-based cookie management.
Middleware
middleware.ts
New cookie-based route protection using kaapi_role with public/guest/settings rules and matcher configuration.
Evaluation Types & Utils
app/lib/types/evaluation.ts, app/lib/utils/evaluation.ts, app/lib/utils.ts
Moved/added evaluation types and helpers (ScoreObject variants, typeguards, normalization, score formatting). Removed old app/components/types.ts.
Detailed & Grouped Results Tables
app/components/evaluations/DetailedResultsTable.tsx, app/components/evaluations/GroupedResultsTable.tsx
Replaced old detailed-results implementation with new evaluation table components supporting grouped and individual formats.
Credential Management UI
app/components/settings/credentials/*, app/api/credentials/org/.../route.ts, app/api/credentials/org/[orgId]/[projectId]/provider/[provider]/route.ts
Added provider sidebar, credential panels, onboarding credentials component, and new credential API routes (GET/PATCH/DELETE). Removed old ProviderList.
Settings / Onboarding Pages
app/(main)/settings/onboarding/page.tsx, app/(main)/settings/credentials/page.tsx, app/components/settings/onboarding/*
UI changes: tabbed org subnav, component composition (PageHeader, ProviderSidebar), removed router redirects, and refactored organization/user lists.
Login Modal & Auth UI
app/components/auth/LoginModal.tsx, app/components/Field.tsx, app/components/InfoTooltip.tsx
Login modal now supports magic-link flow and uses loginWithToken; form field and tooltip UI tweaks and new className prop on Field.
Toast & Toast Types/hooks
app/components/Toast.tsx, app/lib/types/toast.ts, app/hooks/useToast.ts, app/lib/constants.ts
Refactored toast types into lib, added per-toast config, moved lifecycle into ToastItem, added useToast re-export.
New UI Primitives & Icons
app/components/CodeBlock.tsx, app/components/CopyableCodeBlock.tsx, app/components/Tag.tsx, app/components/icons/*, app/components/index.ts
Added CodeBlock, CopyableCodeBlock, Tag, multiple icons (Copy, Mail, ErrorCircle), and updated component barrel exports.
Toast/Animation & Global Styles
app/globals.css
Added status color theme variables, new keyframes (slideOut, toastProgress, progress), and adjusted animation durations.
Toast/Provider & UI-wide constants
app/lib/constants.ts, app/layout.tsx
Added APP_NAME, TOAST_CONFIG; layout metadata title now uses APP_NAME.
Middleware & Routing
app/page.tsx, app/layout.tsx, middleware.ts
Minor redirect/comment cleanup and routing/matcher additions.
Documentation & Mock Data
CLAUDE.md, removed instructions/*, removed public/mock-data/*
Added CLAUDE.md; removed several instruction docs and mock evaluation JSON files.
Misc UI refinements
multiple components (ConfigModal, ConfigCard, EvalRunCard, PageHeader, StatusBadge, etc.)
Styling refactors: switch from inline color styles to Tailwind utility classes, small layout and accessibility tweaks across many components.
Large deletions / moves
app/components/DetailedResultsTable.tsx (removed), app/components/types.ts (removed)
Significant removals: old DetailedResultsTable and shared component types replaced by new evaluation type/util modules and new components.

Sequence Diagram

sequenceDiagram
    participant User as User/Browser
    participant InvitePage as Invite Page
    participant API as Next.js API Route
    participant Backend as Backend Service
    participant AuthCtx as Auth Context

    User->>InvitePage: Open /invite?token=xxx
    InvitePage->>API: GET /api/auth/invite?token=xxx
    API->>Backend: POST /api/v1/auth/invite/verify (token)
    Backend-->>API: { success, data: { access_token, user } }
    API-->>InvitePage: JSON response + Set-Cookie headers
    InvitePage->>AuthCtx: loginWithToken(access_token, user)
    AuthCtx-->>AuthCtx: update auth state
    InvitePage->>InvitePage: show success + progress
    InvitePage->>User: redirect to /evaluations
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

enhancement

Suggested reviewers

  • Prajna1999
  • vprashrex

Poem

🐰 A token tucked in morning dew,
Verified with a hop and view,
Cookies set and login done,
Progress races—away we run,
Evaluations wait—off we flew! 🌱

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed The title 'Auth: User invitation flow' clearly and concisely summarizes the main change—adding a user invitation flow within the authentication system, which aligns with the core changeset of implementing an invite verification page and related auth updates.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/invitation-flow

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@Ayush8923 Ayush8923 self-assigned this Apr 8, 2026
Base automatically changed from feat/google-integration to feat/admin-flow April 9, 2026 11:05
Base automatically changed from feat/admin-flow to main April 10, 2026 05:08
@Ayush8923 Ayush8923 linked an issue Apr 10, 2026 that may be closed by this pull request
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
app/globals.css (1)

165-172: Remove or wire the unused progress keyframes.

The invite progress bar currently animates via inline width updates (app/(auth)/invite/page.tsx, Line 166-168), so this keyframes block is unused right now.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/globals.css` around lines 165 - 172, The `@keyframes` progress block in
globals.css is unused; either delete it or wire it up from the invite UI: remove
the `@keyframes` progress declaration if you prefer inline width updates, or
update the invite progress element in app/(auth)/invite/page.tsx to use the
keyframes by applying an animation (e.g., animation-name: progress plus
duration/timing) or a CSS class that references it so the keyframes actually
drive the progress bar instead of inline width styles.
app/(auth)/invite/page.tsx (1)

33-65: Prefer AbortController over a local cancel flag for the verification request.

React's documentation recommends either approach for effect cleanup, but AbortController is the preferred pattern because it actually cancels the in-flight request, avoiding unnecessary network work. The current local cancelled flag prevents stale state updates but leaves the request running.

♻️ Suggested refactor
-    let cancelled = false;
+    const controller = new AbortController();

     (async () => {
       try {
         const res = await fetch(
           `/api/auth/invite?token=${encodeURIComponent(token)}`,
-          { credentials: "include" },
+          { credentials: "include", signal: controller.signal },
         );

         const data: InviteVerifyResponse = await res.json();

-        if (cancelled) return;
-
         if (!res.ok || !data.success || !data.data) {
           setStatus("error");
           setError(data.error || "Invitation link is invalid or has expired.");
           return;
         }

         loginWithToken(data.data.access_token, data.data.user);
         setStatus("success");
-      } catch {
-        if (!cancelled) {
-          setStatus("error");
-          setError("Failed to verify invitation. Please try again.");
-        }
+      } catch (err) {
+        if (controller.signal.aborted) return;
+        setStatus("error");
+        setError("Failed to verify invitation. Please try again.");
       }
     })();

     return () => {
-      cancelled = true;
+      controller.abort();
     };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/`(auth)/invite/page.tsx around lines 33 - 65, Replace the local cancelled
flag with an AbortController: create a controller in the effect, pass
controller.signal into the fetch call that requests
`/api/auth/invite?token=${encodeURIComponent(token)}`, and call
controller.abort() in the cleanup function; in the catch block ignore/return on
an aborted request (check for an AbortError or error.name === "AbortError") so
you don't setStatus("error")/setError after abort, and only call
loginWithToken(...) and setStatus("success") when the fetch resolves
successfully and is not aborted.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/api/auth/invite/route.ts`:
- Around line 21-28: The response returned from NextResponse.json (const res)
must include explicit no-cache headers to prevent caching of sensitive auth data
and forwarded cookies; after building res and before returning it (near
NextResponse.json, headers.getSetCookie, and res.headers.append usage), set
Cache-Control to "no-store, no-cache, must-revalidate, max-age=0" and add
complementary headers such as "Pragma: no-cache" and "Expires: 0" on res.headers
(using res.headers.set or equivalent) so the invite verification response is
non-cacheable.

---

Nitpick comments:
In `@app/`(auth)/invite/page.tsx:
- Around line 33-65: Replace the local cancelled flag with an AbortController:
create a controller in the effect, pass controller.signal into the fetch call
that requests `/api/auth/invite?token=${encodeURIComponent(token)}`, and call
controller.abort() in the cleanup function; in the catch block ignore/return on
an aborted request (check for an AbortError or error.name === "AbortError") so
you don't setStatus("error")/setError after abort, and only call
loginWithToken(...) and setStatus("success") when the fetch resolves
successfully and is not aborted.

In `@app/globals.css`:
- Around line 165-172: The `@keyframes` progress block in globals.css is unused;
either delete it or wire it up from the invite UI: remove the `@keyframes`
progress declaration if you prefer inline width updates, or update the invite
progress element in app/(auth)/invite/page.tsx to use the keyframes by applying
an animation (e.g., animation-name: progress plus duration/timing) or a CSS
class that references it so the keyframes actually drive the progress bar
instead of inline width styles.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0e715f56-ff8e-4bdf-aee3-a9eff7bf5ace

📥 Commits

Reviewing files that changed from the base of the PR and between bc65a03 and 250769d.

📒 Files selected for processing (6)
  • app/(auth)/invite/page.tsx
  • app/api/auth/invite/route.ts
  • app/components/auth/LoginModal.tsx
  • app/globals.css
  • app/lib/context/AuthContext.tsx
  • app/lib/types/auth.ts

Comment on lines +21 to +28
const res = NextResponse.json(data, { status });

const setCookies = headers.getSetCookie?.() ?? [];
for (const cookie of setCookies) {
res.headers.append("Set-Cookie", cookie);
}

return res;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify whether auth route handlers set explicit no-store cache headers.
fd -p 'route.ts' app/api/auth | while read -r f; do
  echo "== $f =="
  rg -n "Cache-Control|Pragma|NextResponse\\.json|Set-Cookie" "$f"
done

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 740


🏁 Script executed:

cat -n app/api/auth/invite/route.ts

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 1247


🏁 Script executed:

# Check if there's middleware that might handle cache headers globally
find . -name "middleware.ts" -o -name "middleware.js" | head -5

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 58


🏁 Script executed:

# Search for any global cache-control patterns in the codebase
rg -l "Cache-Control|no-store" --type ts --type tsx | head -10

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 103


🏁 Script executed:

# Check other API routes to see if any set headers via NextResponse.json options
rg -n "NextResponse\.json.*headers" --type ts

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 58


🏁 Script executed:

# Look for NextResponse patterns with options to understand the API
rg -B1 -A3 "NextResponse\.json.*\{" app/api --type ts | head -50

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 2853


🏁 Script executed:

# Check if there's a Next.js config or any cache-related setup
cat next.config.js 2>/dev/null || cat next.config.ts 2>/dev/null || echo "No next.config found"

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 317


🏁 Script executed:

# Check the google and logout routes to see their full pattern
cat -n app/api/auth/google/route.ts

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 1419


🏁 Script executed:

# Search for any response.headers patterns to understand how headers are actually set
rg "response\.headers|res\.headers" app/api -A2 -B2 --type ts | head -80

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 1253


🏁 Script executed:

# Check if NextResponse constructor accepts headers option by looking for similar patterns
rg "NextResponse\.(json|text|redirect)" --type ts -A5 | grep -E "NextResponse|headers" | head -40

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 3002


🏁 Script executed:

# Look for NextResponse type definitions or usage with headers
rg "NextResponse" node_modules --type ts -A5 2>/dev/null | head -100

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 58


🏁 Script executed:

# Check if there's a tsconfig that might have type definitions
cat tsconfig.json 2>/dev/null | head -30

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 690


🏁 Script executed:

# Search for any example in the codebase where response object headers are set before construction
rg "headers\s*=" app/api --type ts -B3 -A3 | head -80

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 58


🏁 Script executed:

# Look at Next.js version to understand NextResponse API
cat package.json | grep -A5 -B5 "next"

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 972


🏁 Script executed:

# Check Next.js 16 documentation or search for ResponseInit usage
rg "ResponseInit|init\?" app/api --type ts -B2 -A2 | head -60

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 58


🏁 Script executed:

# Look for any headers being set in constructor anywhere in the codebase
rg "new NextResponse\|NextResponse\.(json|text)" --type ts -A8 | grep -E "NextResponse|headers" | head -50

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 58


🏁 Script executed:

# Verify the actual Next.js API: check if response headers can be set in constructor
python3 << 'EOF'
import json

# Next.js NextResponse API for version 16.0.7 analysis
# Based on Next.js documentation, ResponseInit includes:
# { status?: number; statusText?: string; headers?: HeadersInit }

# This means headers can be passed in the options object
# The proposed patch should work syntactically

print("NextResponse.json() signature in Next.js 16.0.7:")
print("- Accepts: (body, init?: ResponseInit)")
print("- ResponseInit includes: { status, headers, statusText }")
print("\nProposed patch syntax appears valid.")
print("\nThe concern raised in review is legitimate:")
print("- GET endpoint returns sensitive auth data")
print("- Returns Set-Cookie headers")
print("- Should be explicitly non-cacheable")
EOF

Repository: ProjectTech4DevAI/kaapi-frontend

Length of output: 412


Add explicit no-cache headers to invite verification response.

This GET endpoint returns sensitive auth data and forwards session cookies. Responses should be marked non-cacheable to prevent browsers or proxies from caching the auth token/cookies.

🔧 Proposed patch
-    const res = NextResponse.json(data, { status });
+    const res = NextResponse.json(data, {
+      status,
+      headers: {
+        "Cache-Control": "no-store, private, max-age=0",
+        Pragma: "no-cache",
+      },
+    });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const res = NextResponse.json(data, { status });
const setCookies = headers.getSetCookie?.() ?? [];
for (const cookie of setCookies) {
res.headers.append("Set-Cookie", cookie);
}
return res;
const res = NextResponse.json(data, {
status,
headers: {
"Cache-Control": "no-store, private, max-age=0",
Pragma: "no-cache",
},
});
const setCookies = headers.getSetCookie?.() ?? [];
for (const cookie of setCookies) {
res.headers.append("Set-Cookie", cookie);
}
return res;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/api/auth/invite/route.ts` around lines 21 - 28, The response returned
from NextResponse.json (const res) must include explicit no-cache headers to
prevent caching of sensitive auth data and forwarded cookies; after building res
and before returning it (near NextResponse.json, headers.getSetCookie, and
res.headers.append usage), set Cache-Control to "no-store, no-cache,
must-revalidate, max-age=0" and add complementary headers such as "Pragma:
no-cache" and "Expires: 0" on res.headers (using res.headers.set or equivalent)
so the invite verification response is non-cacheable.

@Ayush8923 Ayush8923 changed the title Feat: User invitation flow Auth: User invitation flow Apr 13, 2026
@Ayush8923 Ayush8923 merged commit b8ca65b into main Apr 17, 2026
1 of 2 checks passed
@Ayush8923 Ayush8923 deleted the feat/invitation-flow branch April 17, 2026 17:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Authentication: Magic link login flow

2 participants