CleanFrame
A personal home screen for Samsung The Frame. A starting point to fork and adapt.
A calming daily practice with astrology, tarot, and reflective journaling. Free 3-day Premium trial.
LifestyleHTML · TypeScriptGitHub @lawrencema000-gifOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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 sectionRead the full 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'.