Tradz Card Scanner — Expo 55 Full Stack

Domain target: https://tradz.nationnine.com

Security: do not put Tradz vendor API key inside React Native, npm package, GitHub, or public files. Keep it only in backend .env.

1. Upload to Dewaweb subdomain root

Upload all files from UPLOAD_TO_TRADZ_SUBDOMAIN_ROOT/ directly into the document root of tradz.nationnine.com.

tradz.nationnine.com/
├─ index.html
├─ app/
├─ npm/
├─ api/
├─ docs/
├─ private_tradz/
├─ scanner-package/
└─ backend-fastapi/

2. Test website

https://tradz.nationnine.com/
https://tradz.nationnine.com/api/health
https://tradz.nationnine.com/npm/

3. Configure npm install in Tradz Mobile

Inside your Expo app folder, create .npmrc:

@tradz:registry=https://tradz.nationnine.com/npm/
//tradz.nationnine.com/npm/:_authToken=${TRADZ_NPM_TOKEN}
always-auth=true

Set token from private_tradz/npm/INSTALL_TOKEN.txt:

export TRADZ_NPM_TOKEN="PASTE_TOKEN_HERE"
npm install @tradz/card-scanner@^1.2.2

4. React Native usage

import { TradzCardScannerView } from '@tradz/card-scanner';

export default function ScanScreen() {
  return (
    <TradzCardScannerView
      apiBaseUrl="https://tradz.nationnine.com/api"
      authTokenProvider={async () => 'USER_BACKEND_TOKEN'}
      onResult={(result) => console.log(result)}
    />
  );
}

5. Expo Router patch

Copy the example from:

scanner-package/examples/expo-router/app/(tabs)/scan.tsx

to your app:

app/(tabs)/scan.tsx

6. Backend AI mode

Shared hosting cannot run long-lived Python AI workers reliably. The included PHP /api gateway returns demo scan data by default. For production:

1. Deploy backend-fastapi/ to VPS / Railway / Render / Cloud Run
2. Set TRADZ_API_KEY in backend .env
3. Sync and build index
4. Edit private_tradz/api/config.php:
   'upstream_url' => 'https://your-fastapi-backend.com',
   'demo_mode' => false,

7. Troubleshooting

npm 404 registry.npmjs.org: your .npmrc is missing or not read.

401/403: TRADZ_NPM_TOKEN is missing/wrong.

API demo only: configure private_tradz/api/config.php upstream.

Camera permission denied: user blocked camera permission on device.