# Project export: FailureCloud

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: UC Berkeley AI Hackathon 2026
- Tagline: Robots fail in rare edge cases, not normal demos. FailureCloud generates 3D robot unit tests with sensor data, labels, rewards, and pass/fail reports - like carrying a cup of water on a slippery floor
- Devpost: https://devpost.com/software/failurecloud
- GitHub: https://github.com/elijahzhao24/FailureCloud
- Video: https://www.youtube.com/embed/uTD1K6r6OEo?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 1 GitHub contributor(s) — elijahzhao24 (15 commits)

## Devpost submission (written by the team)

### Inspiration

Robots and self-driving systems do not usually fail in clean demos. They fail in rare edge cases: slippery floors, dropped objects, occluded humans, reflective surfaces, bad lighting, sensor noise, and unexpected physical interactions. Collecting these failures in the real world is expensive, slow, dangerous, and hard to reproduce. That inspired us to build FailureCloud: unit tests for robots. Software engineers have unit tests. We built FailureCloud to give robotics and physical AI teams unit tests for robots. The problem The future of AI-like robots and self-driving cars requires lots and lots of data. Current datasets are extensive, but they cover common senarios, like driving in a sunny or cold day. They overrepresent positive cases and underrepresent edge cases and failure cases, where things could actually go wrong. Conviction is furthered by Waymo beginning similar research, seen here Robotics teams need to know: Will the robot still work on a slippery floor? Can it avoid an unseen obstacle? Can it carry something fragile without spilling? Can its sensors handle noisy or incomplete data? Can the same failure be reproduced again and again? Today, many of these cases are manually built in simulation or discovered through risky real-world * testing. Even after data is collected, labels, rewards, and success conditions are still painful to define.

### What it does

FailureCloud turns a natural-language robot task into an executable edge-case test. A user describes a task, selects one of five generated failure scenarios, edits its parameters, previews it, runs it in PyBullet, inspects synchronized sensor evidence, and exports the result. Each test includes: Environment, robot, route, and hazards RGB, depth, segmentation, and LiDAR data Object labels and telemetry Reward and success criteria A measurable pass/fail explanation Simulator and dataset exports Users can also upload custom URDF robot packages. Architecture FailureCloud is built around a versioned, simulator-independent scenario contract: Every layer consumes this contract. PyBullet is the current execution adapter, but FailureCloud is designed to export the same scenario to simulators such as Isaac Sim, Gazebo, and CARLA. Data flow and exports PyBullet records RGB, metric depth, segmentation, ray-cast LiDAR, object poses, collisions, cup stability, water retention, and reward telemetry. These results are stored in a canonical bundle containing the scenario, frame manifest, sensor data, labels, calibration, evaluation, and robot assets. Export adapters convert this bundle into: PyBullet replay packages OpenPCDet datasets ROS-style sensor folders Isaac Sim configuration previews Nebius job manifests Because canonical data is separated from export formats, new integrations can be added without rerunning the simulation.

### How we built it

The frontend uses Next.js, React, TypeScript, Three.js, React Three Fiber, SWR, and Playwright. The backend uses FastAPI, Pydantic, PyBullet, NumPy, Pillow, and Claude. Claude generates edge-case ideas, while deterministic templates keep the workflow reliable when external services are unavailable. Best Physical AI Hack by UFB TL;DR: FailureCloud creates unit tests for robots. It fits Physical AI because it directly generates, simulates, evaluates, and exports the data and worlds that train or test robotic systems. Given a natural-language task like “a warehouse robot carries a cup of water,” FailureCloud generates rare edge-case scenarios such as slippery floors, dropped obstacles, noisy sensors, and sudden turns. For each scenario, we generate a runnable simulation, RGB/depth/LiDAR-style sensor data, object labels, reward metrics, and a pass/fail report. The goal is simple: help robotics teams test failures before they happen in the real world. A real robotics team would use this to quickly create repeatable edge-case tests, debug robot failures, evaluate policies, and export reusable test bundles for tools like PyBullet, ROS, Isaac Sim, OpenPCDet, or future physical AI workbenches. Best Use of Claude TL;DR: Claude acts as the scenario compiler for robot unit tests. We use Claude to turn vague human intent into structured physical AI test cases. A user can describe a normal robot task, and Claude expands it into realistic edge cases, simulation parameters, sensor configurations, reward logic, and definitions of success or failure. For example, from “a robot carries a cup,” Claude can infer failure modes like slippery floors, sharp turns, spills, collisions, and sensor noise. It then converts those into an executable scenario with measurable success criteria, such as reaching the goal with at least 70% of the water remaining and no collisions. Claude is essential because it bridges natural language and robotics simulation. It lets non-experts describe what they want to test, while FailureCloud turns that into a runnable physical AI evaluation. Challenges and accomplishments The main challenge was avoiding simulator lock-in. We solved this by separating scenario intent, simulation execution, recorded evidence, and export delivery. We built: A complete seven-step testing workflow A versioned scenario contract Editable reward and success logic Synchronized multimodal sensor recording Automatic labels and failure explanations Validated custom URDF uploads Multiple simulator and dataset export formats

## README (from the GitHub repository)

# FailureCloud

FailureCloud turns natural-language robot failure cases into executable simulation tests with sensor data, labels, rewards, and exportable artifacts.

The hackathon MVP currently supports:

- Prompt-to-scenario compilation using Claude or a deterministic fallback.
- Editable, versioned `scenario.json`.
- Interactive Three.js warehouse preview.
- Deterministic PyBullet execution.
- RGB, metric depth, segmentation, LiDAR, object labels, and telemetry.
- Water-retention, collision, reward, and pass/fail evaluation.
- OpenPCDet, ROS-style, PyBullet, Isaac-config, and Nebius-manifest exports.
- Reactor Helios live cinematic preview with a local SVG fallback.
- Nebius-compatible parameter sweeps with a local execution fallback.

## Local setup

Requirements:

- Node.js 22+
- Python 3.12+
- Docker, optionally

Install:

```bash
cp .env.example .env
make install
```

Start the backend:

```bash
make api
```

Start the frontend in another terminal:

```bash
make web
```

Open [http://localhost:3000](http://localhost:3000).

## Environment

Claude is optional. Without a key, scenario compilation uses a deterministic template.

```env
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=claude-sonnet-4-5
```

Reactor is optional. When configured, the backend exchanges the API key for a short-lived browser token and the frontend connects to Helios over WebRTC.

```env
REACTOR_API_URL=https://api.reactor.inc
REACTOR_API_KEY=
```

Nebius currently requires an authorized service account, the official CLI, and a published worker image:

```env
NEBIUS_PROJECT_ID=
NEBIUS_REGION=eu-north1
NEBIUS_EXECUTION_ENDPOINT=api.nebius.cloud:443
NEBIUS_SERVICE_ACCOUNT_KEY_FILE=
NEBIUS_CLI_PATH=nebius
NEBIUS_PROFILE=failurecloud
NEBIUS_JOB_IMAGE=
```

Never commit `.env` or service-account credential files.

## Verification

```bash
.venv/bin/pytest -q services/api/tests
npm run build
npm --workspace apps/web run test:e2e
```

The browser test executes:

1. Prompt compilation
2. Scenario validation
3. Three.js preview
4. PyBullet simulation
5. Failure report
6. Local parameter sweep and heatmap

## API

Primary endpoints:

- `POST /v1/scenarios/compile`
- `POST /v1/scenarios/validate`
- `POST /v1/runs`
- `GET /v1/runs/{run_id}`
- `GET /v1/runs/{run_id}/events`
- `POST /v1/runs/{run_id}/exports`
- `GET /v1/runs/{run_id}/bundle`
- `POST /v1/previews/reactor`
- `POST /v1/integrations/reactor/token`
- `POST /v1/runs/{run_id}/sweeps/nebius`
- `GET /health/integrations`

Generated data is written to `artifacts/runs/<run_id>/`.

## Sponsor integrations

Reactor is used only for an illustrative cinematic preview. PyBullet remains authoritative for physics, labels, and evaluation.

Nebius is intended to execute the parameter-sweep worker at scale. The worker entry point is:

```bash
python -m app.sweep_worker \
  --scenario /work/input/scenario.json \
  --specification /work/input/sweep.json \
  --output /work/output/results.json
```

Until project IAM and a worker image are configured, the same normalized sweep runs locally.

## Demo

Use the default warehouse prompt. Compile the scenario, inspect the world, run the test, show the water-retention failure, open the cloud-sweep heatmap, select a difficult variant, and download the complete test bundle.


## Detected evidence (automated analysis)

Indexed codebase: 74 recognized source files, 452 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- HTML (language) — detected in the code
- Next.js (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- TypeScript (language) — detected in the code
- Redis (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (92 of 92)

```
.dockerignore
.env.example
.gitignore
apps/web/app/app/layout.tsx
apps/web/app/app/page.tsx
apps/web/app/app/runs/[id]/export/page.tsx
apps/web/app/app/runs/[id]/page.tsx
apps/web/app/app/runs/[id]/results/page.tsx
apps/web/app/app/tests/[id]/edit/page.tsx
apps/web/app/app/tests/[id]/preview/page.tsx
apps/web/app/app/tests/page.tsx
apps/web/app/globals.css
apps/web/app/landing.css
apps/web/app/layout.tsx
apps/web/app/legacy.css
apps/web/app/page.tsx
apps/web/app/tokens.css
apps/web/app/workspace.css
apps/web/components/FailureCloudApp.tsx
apps/web/components/landing/LandingArtifacts.tsx
apps/web/components/landing/LandingBrand.tsx
apps/web/components/landing/LandingCTA.tsx
apps/web/components/landing/LandingExports.tsx
apps/web/components/landing/LandingHero.tsx
apps/web/components/landing/LandingNav.tsx
apps/web/components/landing/LandingPage.tsx
apps/web/components/landing/LandingWorkflow.tsx
apps/web/components/ReactorLivePreview.tsx
apps/web/components/ScenePreview.tsx
apps/web/components/workspace/Brand.tsx
apps/web/components/workspace/ExportDashboard.tsx
apps/web/components/workspace/ReactorCinematicSession.tsx
apps/web/components/workspace/ResultsDashboard.tsx
apps/web/components/workspace/RunExecution.tsx
apps/web/components/workspace/ScenarioEditor.tsx
apps/web/components/workspace/ScenarioPreview.tsx
apps/web/components/workspace/ScenarioSchematic.tsx
apps/web/components/workspace/TestSuggestions.tsx
apps/web/components/workspace/WorkspaceFoundation.tsx
apps/web/components/workspace/WorkspaceShell.tsx
apps/web/design/DESIGN_CONTEXT.md
apps/web/Dockerfile
apps/web/lib/api.ts
apps/web/lib/types.ts
apps/web/lib/workspace-session.ts
apps/web/next-env.d.ts
apps/web/next.config.ts
apps/web/package.json
apps/web/playwright.config.ts
apps/web/tests/demo.spec.ts
apps/web/tsconfig.json
docker-compose.yml
FailureCloudImplementationPlan2.txt
failureCloudImplmentation.txt
Makefile
package.json
README.md
remotion-deck/.gitignore
remotion-deck/index.html
remotion-deck/package.json
remotion-deck/README.md
remotion-deck/src/FailureCloudDeck.tsx
remotion-deck/src/index.ts
remotion-deck/src/main.tsx
remotion-deck/src/presentation.css
remotion-deck/src/Presentation.tsx
remotion-deck/src/Root.tsx
remotion-deck/src/styles.css
remotion-deck/tsconfig.json
schemas/scenario-0.1.0.json
services/api/app/__init__.py
services/api/app/compiler.py
services/api/app/exports.py
services/api/app/main.py
services/api/app/models.py
services/api/app/nebius.py
services/api/app/robot_assets.py
services/api/app/simulator.py
services/api/app/store.py
services/api/app/sweep_worker.py
services/api/app/sweeps.py
services/api/app/test_generator.py
services/api/app/variants.py
services/api/app/vendors.py
services/api/Dockerfile
services/api/requirements.txt
services/api/tests/conftest.py
services/api/tests/test_api.py
services/api/tests/test_compiler.py
services/api/tests/test_pipeline.py
UIflowcontext.txt
UXFlow.txt
```

### Dependencies

- apps/web/package.json: @fontsource-variable/instrument-sans@^5.2.8, @fontsource/barlow-condensed@^5.2.5, @fontsource/ibm-plex-mono@^5.2.5, @playwright/test@^1.52.0, @react-three/drei@^10.0.7, @react-three/fiber@^9.1.2, @reactor-team/js-sdk@^2.12.0, @types/node@^22.15.18, @types/react@^19.1.4, @types/react-dom@^19.1.5, @types/three@^0.176.0, next@^15.3.2, react@^19.1.0, react-dom@^19.1.0, swr@^2.3.3, three@^0.176.0, typescript@^5.8.3
- remotion-deck/package.json: @fontsource-variable/instrument-sans@^5.2.8, @fontsource/ibm-plex-mono@^5.2.5, @remotion/cli@4.0.481, @remotion/player@4.0.481, @types/react@^19.1.4, @vitejs/plugin-react@^4.4.1, react@19.1.0, react-dom@19.1.0, remotion@4.0.481, typescript@^5.8.3, vite@^6.1.0
- services/api/requirements.txt: anthropic@==0.52.0, fastapi@==0.115.12, httpx@==0.28.1, numpy@==2.2.5, pillow@==11.2.1, pybullet@==3.2.7, pydantic@==2.11.4, pytest@==8.3.5, python-multipart@==0.0.20, uvicorn[standard]@==0.34.2

### Recent commits (newest first)

- adjust info on slides
- remotion slides
- clean up
- clean up video [preview
- remove legacy view
- Generate results and export test cases.
- PyBullet Run Creation.
- preview scenario ahead of time, in the form of a gerernal scence, and how the robots sensors would react
- edit and variant endpoints. Create template for reward controls.
- edge case generation
- Redesign ux/ui flow, and frontend design
- add scenario creation
- complete nebuis cli and create profile
- fix nebius integration
- scenario scaffold builder + frontend prototype
- dependcies and scafold
- Upload context

## Key source files (fetched from GitHub, selected and truncated for size)

### apps/web/design/DESIGN_CONTEXT.md

```markdown
# FailureCloud Design Context

Reference for UX/UI decisions. Desktop-first (1280–1600px). Minimal YC / hackathon aesthetic inspired by [Kaaro](https://www.kaaro.ai/), [Nexus](https://nexusapp.tech/), and [OnDeck](https://ondeckai.com/) — not copied.

## Product split

| Surface | Route | Theme |
|---------|-------|-------|
| Marketing | `/` | Dark cinematic landing |
| Application | `/app/*` | Light workspace |
| Legacy | `/legacy` | Old single-page console (temporary) |

## Visual direction

**Tone:** Restrained, futuristic, honest. Black-and-white foundations with one sparse accent. Large typography, generous spacing, thin borders, rounded outlined surfaces. No clutter, no fake social proof.

**Avoid:** Purple gradients, heavy shadows, neon overload, Barlow/industrial console aesthetic, lime-green dominance, uppercase micro-label spam.

## Color tokens

### Landing (dark)

```css
--fc-black:        #050505   /* page background */
--fc-black-soft:   #0c0c0c   /* elevated surfaces */
--fc-white:        #f4f4f2   /* primary text */
--fc-gray-light:   #a3a3a0   /* secondary text */
--fc-gray-mid:     #5c5c58   /* tertiary / labels */
--fc-gray-line:    #222220   /* borders, grid lines */
--fc-gray-line-hi: #333330   /* hover borders */
--fc-mint:         #6ee7b7   /* accent — use sparingly */
--fc-mint-dim:     rgb(110 231 183 / 12%)
--fc-mint-glow:    rgb(110 231 183 / 25%)
```

### Workspace (light)

```css
--fc-bg:           #f7f7f5
--fc-surface:      #ffffff
--fc-surface-soft: #f2f2ef
--fc-ink:          #0a0a09
--fc-copy:         #4a4a47
--fc-muted:        #8a8a86
--fc-border:       #e4e4e0
--fc-border-strong:#cacac4
--fc-accent:       #6ee7b7   /* same mint, used on badges/focus only */
--fc-accent-ink:   #0d3d2a
```

### Semantic (both)

- Success: `#22c55e`
- Warning: `#d97706`
- Error: `#ef4444`

## Typography

| Role | Font | Usage |
|------|------|-------|
| Display & UI | **Instrument Sans Variable** | Headlines, body, buttons, nav |
| Technical | **IBM Plex Mono** | Sensor values, IDs, JSON, step numbers |

**Scale (desktop):**

- Hero display: `clamp(52px, 5.5vw, 76px)` / weight 500 / tracking `-0.04em`
- Section title: `clamp(32px, 3vw, 44px)` / weight 500
- Body: `16–18px` / line-height `1.55`
- Label: `11–12px` / weight 500 / optional `0.04em` tracking
- Mono data: `11–13px`

Do **not** use Barlow Condensed or all-caps label stacks.

## Spacing & shape

- Page max-width: `1200px` (landing), `1180px` (workspace content)
- Section vertical rhythm: `120–160px`
- Card padding: `24–32px`
- Border radius: `12px` (sm), `16px` (md), `20px` (lg), `999px` (pill)
- Border width: `1px` always — never chunky 2px except focus rings

## Motion

- Page load: staggered fade-up (`600ms`, `cubic-bezier(0.16, 1, 0.3, 1)`)
- Ambient: slow grid drift (`40s linear infinite`) — subtle, not distracting
- Hover: border-color shift + `150ms ease`
- No bouncing, no parallax overload

## Shared components

| Component | Landing | Workspace |
|-----------|-----
[truncated — 2132 more characters]
```

### package.json

```
{
  "name": "failurecloud",
  "private": true,
  "workspaces": [
    "apps/web"
  ],
  "scripts": {
    "dev": "npm --workspace apps/web run dev",
    "build": "npm --workspace apps/web run build",
    "lint": "npm --workspace apps/web run lint",
    "test:e2e": "npm --workspace apps/web run test:e2e"
  }
}


```

### docker-compose.yml

```yaml
services:
  api:
    build:
      context: .
      dockerfile: services/api/Dockerfile
    environment:
      ARTIFACT_ROOT: /data/artifacts
      ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
      ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-claude-sonnet-4-5}
      REACTOR_API_URL: ${REACTOR_API_URL:-}
      REACTOR_API_KEY: ${REACTOR_API_KEY:-}
      NEBIUS_PROJECT_ID: ${NEBIUS_PROJECT_ID:-}
      NEBIUS_REGION: ${NEBIUS_REGION:-eu-north1}
      NEBIUS_EXECUTION_ENDPOINT: ${NEBIUS_EXECUTION_ENDPOINT:-api.nebius.cloud:443}
      NEBIUS_SERVICE_ACCOUNT_KEY_FILE: ${NEBIUS_CONTAINER_SERVICE_ACCOUNT_KEY_FILE:-}
      NEBIUS_CLI_PATH: ${NEBIUS_CLI_PATH:-nebius}
      NEBIUS_PROFILE: ${NEBIUS_PROFILE:-failurecloud}
      NEBIUS_JOB_IMAGE: ${NEBIUS_JOB_IMAGE:-}
    ports:
      - "8000:8000"
    volumes:
      - failurecloud-artifacts:/data/artifacts

  web:
    build:
      context: .
      dockerfile: apps/web/Dockerfile
      args:
        NEXT_PUBLIC_API_URL: http://localhost:8000
    environment:
      NEXT_PUBLIC_API_URL: http://localhost:8000
    ports:
      - "3000:3000"
    depends_on:
      - api

volumes:
  failurecloud-artifacts:

```

### remotion-deck/package.json

```
{
  "name": "failurecloud-remotion-deck",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "present": "vite --host 0.0.0.0 --open",
    "build": "vite build",
    "render": "remotion render src/index.ts FailureCloudDeck out/failurecloud-deck.mp4",
    "still": "remotion still src/index.ts FailureCloudDeck out/preview.png --frame=360"
  },
  "dependencies": {
    "@fontsource-variable/instrument-sans": "^5.2.8",
    "@fontsource/ibm-plex-mono": "^5.2.5",
    "@remotion/cli": "4.0.481",
    "@remotion/player": "4.0.481",
    "react": "19.1.0",
    "react-dom": "19.1.0",
    "remotion": "4.0.481"
  },
  "devDependencies": {
    "@types/react": "^19.1.4",
    "@vitejs/plugin-react": "^4.4.1",
    "typescript": "^5.8.3",
    "vite": "^6.1.0"
  }
}

```

### services/api/requirements.txt

```
fastapi==0.115.12
uvicorn[standard]==0.34.2
pydantic==2.11.4
numpy==2.2.5
pillow==11.2.1
pybullet==3.2.7
anthropic==0.52.0
httpx==0.28.1
python-multipart==0.0.20
pytest==8.3.5


```

### apps/web/Dockerfile

```
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json* ./
COPY apps/web/package.json apps/web/package.json
RUN npm install

FROM node:22-alpine AS builder
WORKDIR /app
ARG NEXT_PUBLIC_API_URL=http://localhost:8000
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
COPY --from=deps /app/node_modules ./node_modules
COPY package.json ./
COPY apps/web ./apps/web
WORKDIR /app/apps/web
RUN npm run build

FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/apps/web/.next/standalone ./
COPY --from=builder /app/apps/web/.next/static ./apps/web/.next/static
EXPOSE 3000
CMD ["node", "apps/web/server.js"]


```

### services/api/Dockerfile

```
FROM python:3.12-slim AS wheel-builder

WORKDIR /build
COPY services/api/requirements.txt .
RUN apt-get update \
    && apt-get install --yes --no-install-recommends build-essential \
    && pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt \
    && rm -rf /var/lib/apt/lists/*

FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    ARTIFACT_ROOT=/data/artifacts

WORKDIR /app
COPY services/api/requirements.txt .
COPY --from=wheel-builder /wheels /wheels
RUN pip install --no-cache-dir --no-index --find-links=/wheels -r requirements.txt \
    && rm -rf /wheels
COPY services/api/app ./app
COPY schemas ./schemas
RUN mkdir -p /data/artifacts
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

```

### apps/web/package.json

```
{
  "name": "@failurecloud/web",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "NODE_ENV=development next dev",
    "build": "NODE_ENV=production next build",
    "start": "NODE_ENV=production next start",
    "lint": "next lint",
    "test:e2e": "playwright test"
  },
  "dependencies": {
    "@fontsource-variable/instrument-sans": "^5.2.8",
    "@fontsource/barlow-condensed": "^5.2.5",
    "@fontsource/ibm-plex-mono": "^5.2.5",
    "@react-three/drei": "^10.0.7",
    "@react-three/fiber": "^9.1.2",
    "@reactor-team/js-sdk": "^2.12.0",
    "next": "^15.3.2",
    "react": "^19.1.0",
    "react-dom": "^19.1.0",
    "swr": "^2.3.3",
    "three": "^0.176.0"
  },
  "devDependencies": {
    "@playwright/test": "^1.52.0",
    "@types/node": "^22.15.18",
    "@types/react": "^19.1.4",
    "@types/react-dom": "^19.1.5",
    "@types/three": "^0.176.0",
    "typescript": "^5.8.3"
  }
}

```

### remotion-deck/src/index.ts

```typescript
import {registerRoot} from "remotion";
import {RemotionRoot} from "./Root";

registerRoot(RemotionRoot);

```

### remotion-deck/src/main.tsx

```typescript
import {StrictMode} from "react";
import {createRoot} from "react-dom/client";
import {Presentation} from "./Presentation";
import "./styles.css";
import "./presentation.css";

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <Presentation />
  </StrictMode>,
);

```

[67 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]