尚未偵測到更新。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'.