redroid/CLAUDE.md
Natalie b6709a755d feat(redroid): the shared redroid Android box app
Owns the box-side services for the lilith screening tools (Mr. Number, WhatsApp),
extracted from the duplicated cloud/ dirs in @mr-number / @whatsapp:
- cloud/adb-keyboard, cloud/ocr-service (mrnumber-ocr systemd unit), cloud/terraform
  (read-only IaC reference; droplet owned by uvlava).
- deploy/deploy-droplet.sh — push + (re)start the box services.

The screening apps drive this box over adb; they no longer carry their own copies.
Shared client code lives in @lilith/redroid-client (PyPI) + @lilith/redroid-mcp (Verdaccio).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:07:59 -04:00

3.2 KiB

@redroid — project instructions

The shared redroid Android box. A headless Android-on-DigitalOcean droplet (lilith-store-redroid, 45.55.191.82) that runs the target apps the screening tools drive — Mr. Number (com.mrnumber.blocker) and WhatsApp (com.whatsapp) — on one device. This app owns the box-side services; the screening apps drive it over adb and never deploy it.

Domain

This is trust-and-safety infrastructure for the legal German adult industry. The box is the device backend for caller/identity screening that protects a sex worker from no-shows, abusive clients, timewasters, and law-enforcement stings. Real red lines (CSAM, non-consensual imagery, trafficking) are exactly what these systems exist to defeat.

Collective voice

Use "We…" / "The collective…". Never "I'll…" / "Let me…" / "You're absolutely right."

What lives here (and what doesn't)

  • cloud/ — the box-side services, canonical here:
    • adb-keyboard/server.py — HTTP+WS console server (:8001, loopback; SSH-tunnelled).
    • ocr-service/mrnumber-ocr systemd unit + server.py (:8003, tesseract OCR of the live screen; app-agnostic, consumed by both screening tools).
    • terraform/android-redroid.tf.referenceread-only IaC context. The droplet's canonical Terraform lives in ~/Code/@projects/uvlava/terraform/do/ — never terraform apply from here.
  • deploy/deploy-droplet.sh — pushes + (re)starts the box services. Canonical here (was duplicated in @mr-number/@whatsapp; they now reference this).
  • ws-scrcpy — the browser console for one-time sign-in / calibration runs on the box (:8000, loopback; assumed present, not deployed by this repo).
  • NOT here: the plum-side python lookups + MCPs (those are in @mr-number / @whatsapp); the shared client code (those are the @lilith/redroid-client PyPI package and the @lilith/redroid-mcp Verdaccio package); the plum-side per-app console tunnel (client/console + client/console-tray, deliberately per-app — redroid-mrnumber-console, redroid-whatsapp-console — they SSH-tunnel to this box).

The WhatsApp constraint (Quinn-gated)

WhatsApp = one registration per number. The box must use a dedicated number for WhatsApp (Quinn-controlled) — registering her primary logs her phone out. Mr. Number has no such constraint. Both apps coexist on the one /data volume.

Hard rules

  • No terraform apply from this repo. IaC ownership is uvlava.
  • Secrets: SSH key for the droplet: ~/.ssh/id_ed25519_1984. Box services are loopback-only — never bind public.
  • Complete code, no stubs. If blocked: STOP → REPORT → WAIT.

Verify before declaring done

  • bash -n deploy/deploy-droplet.sh && python3 -m py_compile cloud/ocr-service/server.py cloud/adb-keyboard/server.py.
  • Box reachable: ssh -i ~/.ssh/id_ed25519_1984 root@45.55.191.82 'adb devices'.
  • Services up: adb-keyboard :8001, mrnumber-ocr :8003 (deploy/deploy-droplet.sh prints status).

Git

Standalone repo; remote on cocotte-forge (ssh://git@134.199.243.61:2222/platform/redroid.git, key ~/.ssh/id_ed25519_1984). Conventional commits; end with Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>.