Fennec
Fennec
Section titled “Fennec”Responsibility
Section titled “Responsibility”Fennec is a React UI app with app-local scripts and service-local setup notes.
Runtime
Section titled “Runtime”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.
Video Demographics Analysis
Section titled “Video Demographics Analysis”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
frameTimesalign 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 persistedclassScores, 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.
Primary Source Paths
Section titled “Primary Source Paths”- apps/fennec/src/
- apps/fennec/public/
Contracts And Generated References
Section titled “Contracts And Generated References”Fennec uses app-local package contracts and scripts.
Related Flows
Section titled “Related Flows”Related Standards
Section titled “Related Standards”Related Decisions
Section titled “Related Decisions”Fennec decisions live under docs/src/content/docs/decisions/ when durable.
Operations
Section titled “Operations”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.
Local Commands
Section titled “Local Commands”From the repository root, prepare a clean checkout:
pnpm --dir packages/foxy-ds install --frozen-lockfilepnpm --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.