READYTOHUNT

Crypto Hunters — daily development report & build screenshots

Game API online Build target Android debug Last update 2 Sep 2026
Tuesday, 2 September 2026 Shipped

Login unblocked end to end, transactional email implemented

Put a real Android build on a physical device and drove the whole onboarding flow against the live API. That surfaced a bug which made login impossible for every user, now fixed and verified. On the backend, audited the legacy environment against the new one and replaced the email stub with a working SendGrid sender.

Mobile app crypto-hunters-mobile-app

  • Compiled and installed the Android debug build on a physical device (TECNO KF6k, Android 11) through ./preview-app.sh, with Metro fast refresh attached.
  • Fixed the auth gate that blocked every login. The game backend keys users by id, but the root navigator gates the app on userdata._id. Login succeeded server-side and then silently dropped the user back on the sign-in screen. Added the id → _id bridge to useLogin and useSignUp, matching what useLoginWithToken already did.
  • Sign-up now establishes a real session. It only wrote to the React Query cache and never dispatched to Redux, so a brand-new account stayed logged out and the follow-up navigate("Dashboard") failed with “not handled by any navigator”. It now reuses applyAuthSession, the same bootstrap login uses.
  • Verified on device: [RootNavigator] isLoggedIn: true, dashboard reached, wallet and referral code generated for the new account.
  • Chat still fails after login. Client-side only — the backend chat token is fine (see below). The saga chains .then() off getSubscribedConversations() and dies with “Cannot read property 'then' of undefined”. Next up.

Game backend crypto-hunters-game-backend

  • Twilio needed no change. Audited against the legacy backend. All four TWILIO_* variables are already present on the server and POST /api/user/generateChatToken returns 200 in production for a live user. The chat problem is entirely in the app.
  • Implemented transactional email through SendGrid. email.helper.ts was a placeholder that only printed the verification code to the console. It now sends through the SendGrid v3 REST API over axios — deliberately not the SDK, because the deploy script builds on the server without reinstalling node_modules, so adding a runtime dependency would have broken the deploy. Falls back to logging when credentials are absent, so local development still works.
  • Ported MAIL_SENDGRID_KEY and MAIL_SENDGRID_FROM from the legacy backend into the new config and the server environment. Sender address is crh.game@crypto-hunters.io.
  • Password reset continues to go through Supabase Auth (resetPasswordForEmail) and was left alone — the new SendGrid path covers the custom verification-code email instead.
  • Built, deployed and restarted under PM2; login smoke test returns 200 with no errors in the process log.
  • Twitter OAuth could not be carried over. The new backend expects TWITTER_CLIENT_ID and TWITTER_CLIENT_SECRET, but the legacy environment only held a scraped browser session cookie, which is not an OAuth app credential and would not work. Real credentials from the Twitter developer portal are needed.

Infrastructure

  • Stood up this page — Cloudflare Pages project readytohunt, deployed from readytohunt-dev-page/ with a one-command publish script.
  • The test handset has no working internet of its own. Its Wi-Fi associates and takes a DHCP lease but never routes out, and the SIM has no data, so every API call failed as a network error. Worked around it by routing the phone's traffic through the development machine over USB. Worth fixing properly before wider device testing.

Test account shared

Email
raphaeltest01@minitok.live
Password
HunterRaph2026
Nickname
raphaelhunter

Disposable account created on 2 Sep 2026 for testing the live build — no progress, no balance. Treat it as public: anyone with this page can sign in as it. Never reuse this password anywhere else, and rotate or delete the account once device testing is finished.

Status at end of day

AreaStateDetail
RegistrationWorkingAccount created through the app against the live API.
LoginFixed todayReaches the authenticated dashboard.
Game APIOnlinePM2, port 3002 behind nginx.
Chat tokenWorkingBackend returns 200.
Chat channelsBrokenClient-side saga error after login.
EmailImplementedSendGrid sender live; not yet wired to a route.
Twitter OAuthBlockedNeeds real OAuth app credentials.

Screenshots — launch to authenticated session

Crypto Hunters splash screen with gold logo
01 · SplashCold start, native splash activity.
Welcome screen with Start to Hunt button
02 · WelcomeEntry point, “Start to hunt”.
Permission required dialog for location services
03 · PermissionLocation services gate on first run.
Access system sign in screen
04 · Access systemSign-in form with social options.
Empty register identity form
05 · RegisterEmpty identity form.
Register form filled in with terms accepted
06 · FilledDetails entered, terms accepted.
Register button showing loading spinner
07 · SubmittingCreate-hunter request in flight.
Register screen after account creation
08 · CreatedAccount created server-side.
Sign in screen ready for credentials
09 · Sign inReturning to the access screen.
Sign in form with credentials entered
10 · CredentialsIdentity and cipher entered.
Sign in button showing loading spinner
11 · AuthenticatingSession initialising.
Authenticated dashboard with progress and quick actions
12 · DashboardAuthenticated home with quick actions.

Next

  • Fix the Twilio conversation loading in the app so chat works after login.
  • Wire the SendGrid sender to an endpoint, or drop the unused verification-code path if Supabase covers it.
  • Obtain Twitter OAuth app credentials so account linking can be enabled.
  • Give the test handset real network access instead of the USB workaround.