尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A mystical tarot and astrology app built with React, TypeScript, Capacitor, and Supabase.
The app includes a comprehensive diagnostics system for debugging authentication and other issues, especially useful for OAuth troubleshooting.
In Development Mode:
• Go to Settings > Support > Developer Diagnostics
• The diagnostics option is always visible in dev builds
In Production Mode:
• Go to Settings
• Tap the version number at the bottom (e.g., "Arcana v1.0.0") 5 times
• "Developer Diagnostics" will appear in the Support section查看完整 README ↗A mystical tarot and astrology app built with React, TypeScript, Capacitor, and Supabase.
The app includes a comprehensive diagnostics system for debugging authentication and other issues, especially useful for OAuth troubleshooting.
In Development Mode:
In Production Mode:
From Error Toasts:
From Crash Screens:
localStorage under key arcana-diagnostics-logs@capacitor/preferences under the same keyEach log entry includes:
correlationId: Groups related auth operations (e.g., oauth-1706789012345-abc123)step: The operation name (e.g., auth.google.initiate, auth.callback.exchangeCode)level: info, warn, or errormessage: Human-readable descriptiontimestamp: Unix timestamp in millisecondselapsed: Duration in ms (for span-based logs)data: Additional context (sanitized)platform: web, android, or iosWhen OAuth fails, the diagnostics panel shows:
exchangeCodeForSession result?) or hash (#)The report is sanitized:
j***[email protected])[REDACTED:Nchars]| Code | Meaning | Likely Cause |
|---|---|---|
INVALID_GRANT | Authorization code expired | OAuth flow took too long; try again |
FLOW_STATE_NOT_FOUND | PKCE state missing | App reloaded during OAuth; storage issue |
PKCE_VERIFIER_MISSING | Code verifier not found | Storage not persisting on native |
ACCESS_DENIED | User cancelled | User closed consent screen |
UNAUTHORIZED_CLIENT | App not authorized | OAuth client ID misconfigured |
Dev mode shows additional details like full stack traces:
import.meta.env.DEV to true in your buildProduction deploys are fully automated. No more netlify deploy --prod by hand.
main -> .github/workflows/deploy.yml runs: CI (typecheck + lint + test + build) -> Netlify prod deploy of dist/ -> supabase db push --linked -> supabase functions deploy for each function folder changed in the last commit. Deploy URL and list of deployed functions are written to the GitHub Actions step summary..github/workflows/preview.yml runs CI + ships a Netlify deploy preview and comments the unique URL on the PR.android job in ci.yml on main.Add these at https://github.com/lawrencema000-gif/TAROT/settings/secrets/actions:
| Secret | Source |
|---|---|
NETLIFY_AUTH_TOKEN | https://app.netlify.com/user/applications#personal-access-tokens |
NETLIFY_SITE_ID | ff59834d-82e1-44a8-8ae5-0aef6d1621e1 |
SUPABASE_ACCESS_TOKEN | https://supabase.com/dashboard/account/tokens |
SUPABASE_DB_PASSWORD | DB password for project ulzlthhkqjuohzjangcq |
SUPABASE_PROJECT_ID | ulzlthhkqjuohzjangcq |
VITE_SUPABASE_URL | Same value as in local .env |
VITE_SUPABASE_ANON_KEY | Same value as in local .env |
Every build emits /version.json with the git SHA, build time, and package version. It's served with Cache-Control: no-store.
curl https://tarotlife.app/version.json
npm run deploy:check # compare live SHA vs local HEAD
npm run deploy:check -- <preview-url>
One click, no CLI:
For DB migrations, roll back by pushing a forward-fix migration — do not supabase db reset against prod.
# Install dependencies
npm install
# Start dev server
npm run dev
# Build for production
npm run build
# Android development
npm run android:build
npm run android:run
Every page load auto-reports the five standard Core Web Vitals (LCP, CLS,
INP, FCP, TTFB) to GA4 as web_vital custom events. Each event carries
the build SHA (VITE_BUILD_SHA) so regressions surface per-deploy.
src/utils/webVitals.ts, called from src/main.tsx after
initAnalytics() so the gtag queue is primed first.navigator.connection.effectiveType = 2g/3g),
reporting is deferred through requestIdleCallback with a 1-second
timeout to avoid stealing CPU from render.analytics.ts.View the data: GA4 → Reports → Engagement → Events → filter on
web_vital. Pivot by the release param to compare builds.
Custom timings: emit any additional timing (e.g. sign-in duration,
horoscope fetch time) via reportCustomVital(name, value) from
src/utils/webVitals.ts. It lands in the same web_vital stream with
rating = 'custom'.