Migrate from .NET MAUI to Expo + Convex

Complete rewrite of Scry using TypeScript stack:

- Expo/React Native with Expo Router (file-based routing)
- Convex backend (serverless functions + real-time database)
- Adaptive camera system (expo-camera in Expo Go, Vision Camera in production)
- React Native Skia + fast-opencv for image processing
- GDPR-compliant auth setup with Zitadel OIDC (pending configuration)

Key features:
- Card recognition pipeline ported to TypeScript
- Perceptual hashing (192-bit color pHash)
- CLAHE preprocessing for lighting normalization
- Local SQLite cache with Convex sync
- Collection management with offline support

Removes all .NET/MAUI code (src/, test/, tools/).

💘 Generated with Crush

Assisted-by: Claude Opus 4.5 via Crush <crush@charm.land>
This commit is contained in:
Chris Kruining 2026-02-09 16:16:34 +01:00
parent 56499d5af9
commit 83ab4df537
No known key found for this signature in database
GPG key ID: EB894A3560CCCAD2
138 changed files with 19136 additions and 7681 deletions

View file

@ -3,45 +3,17 @@
set shell := ["C:/Program Files/Git/usr/bin/bash.exe", "-c"]
set unstable := true
mod emu '.just/emu.just'
# Android SDK paths
android_sdk := replace(env('LOCALAPPDATA'), '\', '/') / "Android/Sdk"
adb := android_sdk / "platform-tools/adb.exe"
emulator := android_sdk / "emulator/emulator.exe"
camera_virtual := "-camera-back virtualscene -virtualscene-poster wall=\"" + (justfile_directory() / "TestImages/reference_alpha/serra_angel.jpg") + "\""
camera_webcam := "-camera-back webcam0 -camera-front webcam0"
[private]
@default:
just --list
# Start emulator in background
emu camera="virtual":
{{ emulator }} -avd Pixel_6 {{ if camera == "virtual" { camera_virtual } else { camera_webcam } }} -no-snapshot-load -gpu host
# Kill the running emulator
emu-kill:
{{ adb }} emu kill
# Wait for emulator to fully boot (timeout after 2 minutes)
[script]
emu-wait:
# Wait for Android emulator to boot with timeout
TIMEOUT=120
echo "Waiting for emulator to boot..."
for ((i=TIMEOUT; i>0; i--)); do
if [ "$({{ adb }} shell getprop sys.boot_completed 2>/dev/null)" = "1" ]; then
echo "Emulator ready"
exit 0
fi
sleep 1
done
echo "Emulator failed to boot within 2 minutes"
exit 1
# Build a project
build project="src/Scry.App" target="net10.0-android":
@echo "Building {{ project }}..."
@ -79,6 +51,30 @@ gen-db: (build "tools/DbGenerator" "net10.0")
dotnet run --project tools/DbGenerator --no-build -- src/Scry.App/Resources/Raw/card_hashes.db
@echo "Completed generating the database"
# Full workflow: start emulator, wait, run with hot reload
# Start Expo dev server with Convex (hot reload)
dev:
dotnet watch --project src/Scry.App -f net10.0-android
bun run dev
# Start just the Expo dev server
start:
bun run dev:expo
# Start just Convex dev server
convex-dev:
bun run dev:convex
# Run Expo app on Android emulator
android:
bun run android
# Install Expo app dependencies
expo-install:
bun install
# Run hash migration to Convex
expo-migrate:
bun run migrate
# TypeScript check for Expo app
expo-typecheck:
bun run typecheck