doctor-flutter.js
0 dependencies
import { diagnose } from './doctor-flutter.js';
// or, loaded globally: const { diagnose } = window.RedirectDoctorFlutter;
const result = diagnose({
app: { scheme, host, launchMode, authFlowType, iosSchemesInPlist, androidIntentFilter },
supabase: { projectUrl, siteUrl, allowedRedirectUrls },
provider: { name, authorizedRedirectUris },
code: { redirectTo, usesSkipBrowserRedirect, listensToAuthStateChange },
});
// result
{
"status": "fail" | "warn" | "pass",
"summary": "…",
"expected": { redirectTo, iosPlistScheme, androidIntentFilter, allowListEntry, supabaseCallback },
"problems": [ { severity, code, message, where } ],
"fixes": [ { title, value, where } ],
"checklist": [ "…" ],
"disclaimer": "…"
}
Everything runs client-side.
The form above calls this exact function in your browser. There is
no backend, no API key, and no request that carries your config anywhere.
It checks the deep link your app will actually register — computed once
from scheme + host — against
Info.plist, the AndroidManifest intent-filter, the Supabase redirect allow-list,
and the exact callback your OAuth provider console expects.
// free, open, and demand-gated for what comes next.
// found a case it gets wrong? open a GitHub issue.
// no ads, no tracking beyond anonymous usage counts.