Skip to content

Fennec

Fennec is a React UI app with app-local scripts and service-local setup notes.

Fennec runs as a frontend package under apps/fennec. It links to @foxy/ds, whose exported files are generated in packages/foxy-ds/dist. Install the design system first; its prepare script builds those exports. CI follows the same order.

Both Fennec Dockerfiles use the repository root as their build context. A separate stage builds the design system, then replaces the app’s relative package link with the built package. Their dedicated ignore files exclude local dependencies, build outputs and environment files from the context.

In Moderation Review, a VIDEO result’s detail modal shows the demographics summary and thresholds. Choose Video Demographics Analysis under Demographics Age for face and track evidence; video results do not show a flat per-face decision table in the detail modal. The button appears only when the result has demographics metadata. IMAGE results keep their per-face table.

The dialog explains Brain’s stored moderation evidence and configuration:

  • A status-aware summary shows Passes or Blocks for complete verdicts, Incomplete — blocked for incomplete checks, and Disabled or missing-data labels where appropriate.
  • The configuration used, broken frames, and chains (tracks) show each track’s verdict rule, medians and underage run. Faces are labelled START, CURRENT, END or SINGLE, with explanations of why chains started and ended and link metrics for centre jump, size ratio, age change and missed frames.
  • A video player overlays the stored sample at the current playback time. Persisted frameTimes align every sample, including frames with no faces, with playback and snapshots; missing times or older rows fall back to face or broken-frame timestamps, then the frame index. Frame tiles show per-face data; the Hive data toggle exposes all persisted classScores, boxes and face JSON. Frame tiles and chain crops are paged in groups of 24 frames and load snapshots as they become visible.

The dialog uses the result’s persisted metadata.demographics and video URL. It re-simulates Brain’s tracking from stored faces and settings without calling Hive again. If reconstructed grouping disagrees with persisted track IDs, it warns and displays the persisted grouping and verdicts. Older rows with missing tracking or non-person settings use labelled defaults; missing thresholds and full class scores remain visibly unavailable. See Demographics Configuration for the settings reference.

  • apps/fennec/src/
  • apps/fennec/public/

Fennec uses app-local package contracts and scripts.

Fennec decisions live under docs/src/content/docs/decisions/ when durable.

Before deploying this build configuration, change the Fennec Railway service’s Root Directory to the repository root in each target environment and retain the custom config path /apps/fennec/railway.json. Root Directory is an external service setting and is not changed by railway.json; this is a predeployment gate, not an automatically applied migration. See Railway deployment notes.

From the repository root, prepare a clean checkout:

Terminal window
pnpm --dir packages/foxy-ds install --frozen-lockfile
pnpm --dir apps/fennec install --frozen-lockfile
  • cd apps/fennec && pnpm dev
  • cd apps/fennec && pnpm lint
  • cd apps/fennec && pnpm tsc
  • cd apps/fennec && pnpm build
  • docker build -f apps/fennec/Dockerfile .

Compose keeps the development server and source bind mounts. Its default Dockerfile is apps/fennec/Dockerfile.local; set FENNEC_DOCKERFILE=Dockerfile to select the production image while retaining the repository-root context.