# Project export: Co:Lab

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: TreeHacks 2026
- Tagline: AI-Accelerated Scientific Discovery — design, execute, and iterate on experiments with agents
- Devpost: https://devpost.com/software/co-laboratory
- GitHub: https://github.com/KevinWu098/co-lab
- Video: https://www.youtube.com/embed/mH1d_JmfvdI?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 2 GitHub contributor(s) — Andrew Wang (45 commits), Kevin Wu (24 commits)

## Devpost submission (written by the team)

### Inspiration

Agentic intelligence is rewriting the rules of knowledge work. By dissolving intelligence bottlenecks in fields like software and finance, AI agents are decoupling general productivity from human availability. Inspired by this propagation of intelligence across digital industries, we identified the physical sciences (e.g. Biology, Chemistry) as a next frontier for agentic integration. Researchers today are stalled by rote, manual tasks: running physical experiments, parsing fragmented data, or pipetting. In many cases, these low-leverage procedural tasks can consume over 40% of a researcher’s time, slowing discovery. We envision a solution which bridges the gap between LLMs and lab hardware, closing the loop between experiment design, execution, and iteration and unlocking scientists to focus on high-leverage research direction and novel work.

### What it does

Co:Lab is an AI integrated laboratory that accelerates experimental design, execution, and iteration. Our platform enables researchers to focus more on high-level research direction and novel investigations, rather than rote labor. Our system has three core features: Researcher-in-the-loop: We believe that effective agentic systems know when to request human confirmation, especially in high-impact, technical environments. Rather than being a black box, Co:Lab’s interface enables researchers to confirm experiment design and observe experiment progress, with the ability to jump in if needed. Real-time observability: Experiments should be highly visible, both to the agent and the researcher. Our integrated system has a variety of cameras, sensors, and measurement devices which collect data that we pass to the user interface. This enables researchers and agents to get on-demand visibility into experiment state. Further, we believe in a future where researchers will commonly run concurrent experiments, making effective observability even more critical. Ability to iterate: Being able to perform one experiment isn’t enough. Scientific discovery and confidence is built by iterative experiments — refining hypotheses, adjusting parameters, validating results — which uncover new information or confirm prior assumptions. Co:Lab’s agentic loop enables it to analyze prior experiments and incorporate external research to propose subsequent experiments. This enables it to make well-informed, high-confidence decisions about what to test next. Altogether, Co:Lab bridges existing LLM capability with non-agentic lab benches to create an adaptive, agentic laboratory — one that thinks, runs, and improves experiments alongside researchers.

### How we built it

Our project implements a comprehensive system architecture that combines our hardware, user interface, and agentic harness. We created a system diagram to demonstrate the information flow between each component. Hardware: Our autonomous laboratory is built using standard laboratory instruments: Servos Raspberry Pi 3D printed components Pulse width modulator Frontend: Our frontend uses React, Next.js, Typescript, Tailwind and Shadcn for a performant, modern application. Backend: Our backend API layer is written in Python, facilitating realtime communication between our frontend, hardware, and agents using websockets.

### Challenges we ran into

Transforming standard laboratory instruments into an autonomous lab Integrating hardware, frontend, and backend together as a two-person team Fine tuning agentic loops

### Accomplishments we're proud of

Working with microcontrollers and electronics to build a custom autonomous lab Demonstrating how AI can accelerate iteration loops

### What we learned

Real-time integration of hardware into frontend interfaces How to design for an experiment, both in terms of experiment design and in terms of architecting the laboratory itself

### What's next

Expand and modularize lab setup to support more systems and use cases Further optimize and fine-tune agent harnesses (e.g. better web search) for lab work

## README (from the GitHub repository)

# co-lab

AI-Accelerated Scientific Discovery — design, execute, and iterate on experiments with agents


## Detected evidence (automated analysis)

Indexed codebase: 142 recognized source files, 1416 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- JavaScript (language) — detected in the code
- Next.js (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- Vercel AI SDK (technology) — detected in the code
- Vercel (technology) — claimed on Devpost, not found in the code
- AI coding agent: Cursor — evidence: config files committed to the repository; commit authorship or trailers

## Codebase structure (from repository index)

### Files (120 of 168)

```
.gitignore
.husky/commit-msg
.husky/pre-commit
.npmrc
.nvmrc
apps/test_hardware/.gitignore
apps/test_hardware/app/dashboard/components/MessageLogPanel.tsx
apps/test_hardware/app/dashboard/components/StatusHeader.tsx
apps/test_hardware/app/dashboard/components/TelemetryPanel.tsx
apps/test_hardware/app/dashboard/components/ThermalPanel.tsx
apps/test_hardware/app/dashboard/components/WebcamPanel.tsx
apps/test_hardware/app/dashboard/constants.ts
apps/test_hardware/app/dashboard/types.ts
apps/test_hardware/app/dashboard/utils.ts
apps/test_hardware/app/globals.css
apps/test_hardware/app/layout.tsx
apps/test_hardware/app/page.tsx
apps/test_hardware/eslint.config.mjs
apps/test_hardware/next.config.ts
apps/test_hardware/package.json
apps/test_hardware/postcss.config.mjs
apps/test_hardware/tsconfig.json
apps/website/.agents/skills/frontend-design/LICENSE.txt
apps/website/.agents/skills/frontend-design/SKILL.md
apps/website/.cursor/hooks.json
apps/website/.cursor/skills/frontend-design
apps/website/.gitignore
apps/website/.vscode/settings.json
apps/website/biome.jsonc
apps/website/components.json
apps/website/lefthook.yml
apps/website/next.config.ts
apps/website/package.json
apps/website/pnpm-workspace.yaml
apps/website/postcss.config.mjs
apps/website/README.md
apps/website/src/app/(main)/dashboard/experiment/[slug]/iterate/page.tsx
apps/website/src/app/(main)/dashboard/experiment/[slug]/page.tsx
apps/website/src/app/(main)/dashboard/layout.tsx
apps/website/src/app/(main)/dashboard/page.tsx
apps/website/src/app/api/chat/route.ts
apps/website/src/app/api/procedure/iterate/route.ts
apps/website/src/app/api/procedure/route.ts
apps/website/src/app/api/procedure/suggest/route.ts
apps/website/src/app/globals.css
apps/website/src/app/layout.tsx
apps/website/src/app/page.tsx
apps/website/src/components/ai-elements/conversation.tsx
apps/website/src/components/ai-elements/message.tsx
apps/website/src/components/ai-elements/prompt-input.tsx
apps/website/src/components/app-sidebar.tsx
apps/website/src/components/co-lab/dashboard/background.tsx
apps/website/src/components/co-lab/dashboard/camera-panel.tsx
apps/website/src/components/co-lab/dashboard/chat.tsx
apps/website/src/components/co-lab/dashboard/content-grid.tsx
apps/website/src/components/co-lab/dashboard/content-panels.tsx
apps/website/src/components/co-lab/dashboard/data-card.tsx
apps/website/src/components/co-lab/dashboard/equipment-status.tsx
apps/website/src/components/co-lab/dashboard/graph-panel.tsx
apps/website/src/components/co-lab/dashboard/iteration-switcher.tsx
apps/website/src/components/co-lab/dashboard/new-experiment-setup.tsx
apps/website/src/components/co-lab/dashboard/procedure-diff.tsx
apps/website/src/components/co-lab/dashboard/procedure-editor.tsx
apps/website/src/components/co-lab/dashboard/procedure-step-list.tsx
apps/website/src/components/co-lab/fold-reveal.tsx
apps/website/src/components/co-lab/image-lightbox.tsx
apps/website/src/components/co-lab/pulse.tsx
apps/website/src/components/dashboard/content-toggle.tsx
apps/website/src/components/dashboard/content-visibility.tsx
apps/website/src/components/dashboard/content-wrapper.tsx
apps/website/src/components/dashboard/experiments-provider.tsx
apps/website/src/components/dashboard/sidebar-opacity.tsx
apps/website/src/components/dashboard/sidebar/data.ts
apps/website/src/components/dashboard/sidebar/experiment-group.tsx
apps/website/src/components/dashboard/sidebar/experiment-item.tsx
apps/website/src/components/dashboard/sidebar/iteration-item.tsx
apps/website/src/components/dashboard/sidebar/iteration-list.tsx
apps/website/src/components/dashboard/sidebar/types.ts
apps/website/src/components/ui/accordion.tsx
apps/website/src/components/ui/alert-dialog.tsx
apps/website/src/components/ui/alert.tsx
apps/website/src/components/ui/aspect-ratio.tsx
apps/website/src/components/ui/avatar.tsx
apps/website/src/components/ui/badge.tsx
apps/website/src/components/ui/breadcrumb.tsx
apps/website/src/components/ui/button-group.tsx
apps/website/src/components/ui/button.tsx
apps/website/src/components/ui/calendar.tsx
apps/website/src/components/ui/card.tsx
apps/website/src/components/ui/carousel.tsx
apps/website/src/components/ui/chart.tsx
apps/website/src/components/ui/checkbox.tsx
apps/website/src/components/ui/collapsible.tsx
apps/website/src/components/ui/combobox.tsx
apps/website/src/components/ui/command.tsx
apps/website/src/components/ui/context-menu.tsx
apps/website/src/components/ui/dialog.tsx
apps/website/src/components/ui/direction.tsx
apps/website/src/components/ui/drawer.tsx
apps/website/src/components/ui/dropdown-menu.tsx
apps/website/src/components/ui/empty.tsx
apps/website/src/components/ui/field.tsx
apps/website/src/components/ui/form.tsx
apps/website/src/components/ui/hover-card.tsx
apps/website/src/components/ui/input-group.tsx
apps/website/src/components/ui/input-otp.tsx
apps/website/src/components/ui/input.tsx
apps/website/src/components/ui/item.tsx
apps/website/src/components/ui/kbd.tsx
apps/website/src/components/ui/label.tsx
apps/website/src/components/ui/menubar.tsx
apps/website/src/components/ui/native-select.tsx
apps/website/src/components/ui/navigation-menu.tsx
apps/website/src/components/ui/pagination.tsx
apps/website/src/components/ui/popover.tsx
apps/website/src/components/ui/progress.tsx
apps/website/src/components/ui/radio-group.tsx
apps/website/src/components/ui/resizable.tsx
apps/website/src/components/ui/scroll-area.tsx
apps/website/src/components/ui/select.tsx
[48 more files omitted for size]
```

### Dependencies

- apps/test_hardware/package.json: @tailwindcss/postcss@^4.1.18, @types/node@^25.1.0, @types/react@^19.2.10, @types/react-dom@^19.2.3, eslint@^9.39.2, eslint-config-next@16.1.6, next@16.1.6, react@19.2.4, react-dom@19.2.4, tailwindcss@^4.1.18, typescript@^5.9.3
- apps/website/package.json: @ai-sdk/anthropic@^3.0.44, @ai-sdk/gateway@^3.0.46, @ai-sdk/react@^3.0.88, @base-ui/react@^1.2.0, @biomejs/biome@2.3.15, @hookform/resolvers@^5.2.2, @paper-design/shaders-react@^0.0.71, @streamdown/cjk@^1.0.2, @streamdown/code@^1.0.2, @streamdown/math@^1.0.2, @streamdown/mermaid@^1.0.2, @tailwindcss/postcss@^4, @types/node@^20, @types/react@^19, @types/react-dom@^19, ai@^6.0.86, babel-plugin-react-compiler@1.0.0, class-variance-authority@^0.7.1, clsx@^2.1.1, cmdk@^1.1.1, date-fns@^4.1.0, embla-carousel-react@^8.6.0, framer-motion@^12.34.0, input-otp@^1.4.2, lefthook@^2.1.1, lint-staged@^16.2.7, lucide-react@^0.564.0, motion@^12.34.0, nanoid@^5.1.6, next@16.1.6, next-themes@^0.4.6, nuqs@^2.8.8, radix-ui@^1.4.3, react@19.2.3, react-day-picker@^9.13.2, react-dom@19.2.3, react-hook-form@^7.71.1, react-resizable-panels@^4.6.3, recharts@2.15.4, shadcn@^3.8.4, sonner@^2.0.7, streamdown@^2.2.0, tailwind-merge@^3.4.0, tailwindcss@^4, tw-animate-css@^1.4.0, typescript@^5, ultracite@7.2.0, unpdf@1.4.0, use-stick-to-bottom@^1.1.3, vaul@^1.1.2, zod@^4.3.6
- hardware/requirements.txt: adafruit-blinka, adafruit-circuitpython-mlx90640, adafruit-circuitpython-motor, adafruit-circuitpython-pca9685, aiohttp, anthropic, hidapi, lgpio, opencv-python-headless, pillow, python-dotenv, websockets, xarm
- package.json: @commitlint/cli@20.3.1, @commitlint/config-conventional@20.3.1, @packages/eslint-config@workspace:*, @packages/prettier-config@workspace:*, @packages/typescript-config@workspace:*, @types/node@25.1.0, eslint@9.39.2, husky@9.1.7, lint-staged@16.2.7, prettier@3.8.1, typescript@5.9.3
- packages/eslint-config/package.json: @eslint/eslintrc@3.3.3, @next/eslint-plugin-next@16.1.6, @typescript-eslint/eslint-plugin@8.54.0, @typescript-eslint/parser@8.54.0, eslint-config-next@16.1.6, eslint-plugin-import@2.32.0, eslint-plugin-mdx@3.6.2, eslint-plugin-only-warn@1.1.0, eslint-plugin-prettier@5.5.5, eslint-plugin-react@7.37.5, eslint-plugin-react-hooks@7.0.1, eslint-plugin-simple-import-sort@12.1.1, eslint-plugin-unused-imports@4.3.0
- packages/prettier-config/package.json: prettier-plugin-embed@0.5.1, prettier-plugin-packagejson@3.0.0, prettier-plugin-sh@0.18.0, prettier-plugin-sql@0.19.2, prettier-plugin-tailwindcss@0.7.2

### Recent commits (newest first)

- chore: README
- feat: url
- feat: images
- fix: fix
- fix: fix
- feat: devpost link
- fix: fix
- fix: fix
- feat: dev dev dev
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data
- feat: data

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

### apps/website/.agents/skills/frontend-design/SKILL.md

```markdown
---
name: frontend-design
description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.
license: Complete terms in LICENSE.txt
---

This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.

The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.

## Design Thinking

Before coding, understand the context and commit to a BOLD aesthetic direction:
- **Purpose**: What problem does this interface solve? Who uses it?
- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
- **Constraints**: Technical requirements (framework, performance, accessibility).
- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?

**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.

Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
- Production-grade and functional
- Visually striking and memorable
- Cohesive with a clear aesthetic point-of-view
- Meticulously refined in every detail

## Frontend Aesthetics Guidelines

Focus on:
- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled de
[truncated — 1440 more characters]
```

### package.json

```
{
  "scripts": {
    "format": "pnpm -r format --log-level error",
    "lint": "pnpm -r lint",
    "lint-staged": "pnpm -r --workspace-concurrency=1 exec lint-staged",
    "prepare": "husky",
    "tscheck": "pnpm -r --parallel tscheck"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "lint-staged": {
    "!(pnpm-lock.yaml|apps/website/**)": [
      "prettier --write --ignore-unknown"
    ]
  },
  "prettier": "@packages/prettier-config",
  "devDependencies": {
    "@commitlint/cli": "20.3.1",
    "@commitlint/config-conventional": "20.3.1",
    "@packages/eslint-config": "workspace:*",
    "@packages/prettier-config": "workspace:*",
    "@packages/typescript-config": "workspace:*",
    "@types/node": "25.1.0",
    "eslint": "9.39.2",
    "husky": "9.1.7",
    "lint-staged": "16.2.7",
    "prettier": "3.8.1",
    "typescript": "5.9.3"
  },
  "packageManager": "pnpm@10.28.2",
  "engines": {
    "node": "24.13.0",
    "pnpm": "10.28.2"
  }
}

```

### hardware/requirements.txt

```
websockets
xarm
hidapi
adafruit-blinka
adafruit-circuitpython-motor
adafruit-circuitpython-pca9685
adafruit-circuitpython-mlx90640
lgpio
aiohttp
pillow
opencv-python-headless
anthropic
python-dotenv
```

### packages/typescript-config/package.json

```
{
  "name": "@packages/typescript-config",
  "private": true,
  "scripts": {
    "format": "prettier --write ."
  },
  "lint-staged": {
    "*": [
      "prettier --write"
    ]
  },
  "prettier": "@packages/prettier-config"
}

```

### packages/prettier-config/package.json

```
{
  "name": "@packages/prettier-config",
  "private": true,
  "type": "module",
  "exports": {
    ".": "./prettier.config.js"
  },
  "scripts": {
    "format": "prettier --write .",
    "lint": "eslint --fix --max-warnings=0"
  },
  "lint-staged": {
    "*": [
      "prettier --write"
    ],
    "*.js": [
      "eslint --fix --max-warnings=0"
    ]
  },
  "dependencies": {
    "prettier-plugin-embed": "0.5.1",
    "prettier-plugin-packagejson": "3.0.0",
    "prettier-plugin-sh": "0.18.0",
    "prettier-plugin-sql": "0.19.2",
    "prettier-plugin-tailwindcss": "0.7.2"
  }
}

```

### apps/test_hardware/package.json

```
{
  "name": "website",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "build": "next build",
    "dev": "next dev",
    "lint": "eslint",
    "start": "next start"
  },
  "prettier": "@packages/prettier-config",
  "dependencies": {
    "next": "16.1.6",
    "react": "19.2.4",
    "react-dom": "19.2.4"
  },
  "devDependencies": {
    "@tailwindcss/postcss": "^4.1.18",
    "@types/node": "^25.1.0",
    "@types/react": "^19.2.10",
    "@types/react-dom": "^19.2.3",
    "eslint": "^9.39.2",
    "eslint-config-next": "16.1.6",
    "tailwindcss": "^4.1.18",
    "typescript": "^5.9.3"
  }
}

```

### packages/eslint-config/package.json

```
{
  "name": "@packages/eslint-config",
  "private": true,
  "type": "module",
  "exports": {
    ".": "./eslint.config.js",
    "./next": "./eslint.config.next.js",
    "./react": "./eslint.config.react.js"
  },
  "scripts": {
    "format": "prettier --write .",
    "lint": "eslint --fix --max-warnings=0"
  },
  "lint-staged": {
    "*": [
      "prettier --write"
    ],
    "*.js": [
      "eslint --fix --max-warnings=0"
    ]
  },
  "prettier": "@packages/prettier-config",
  "devDependencies": {
    "@eslint/eslintrc": "3.3.3",
    "@next/eslint-plugin-next": "16.1.6",
    "@typescript-eslint/eslint-plugin": "8.54.0",
    "@typescript-eslint/parser": "8.54.0",
    "eslint-config-next": "16.1.6",
    "eslint-plugin-import": "2.32.0",
    "eslint-plugin-mdx": "3.6.2",
    "eslint-plugin-only-warn": "1.1.0",
    "eslint-plugin-prettier": "5.5.5",
    "eslint-plugin-react": "7.37.5",
    "eslint-plugin-react-hooks": "7.0.1",
    "eslint-plugin-simple-import-sort": "12.1.1",
    "eslint-plugin-unused-imports": "4.3.0"
  }
}

```

### apps/website/package.json

```
{
  "name": "website",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "check": "ultracite check",
    "fix": "ultracite fix",
    "prepare": "lefthook install"
  },
  "dependencies": {
    "@ai-sdk/anthropic": "^3.0.44",
    "@ai-sdk/gateway": "^3.0.46",
    "@ai-sdk/react": "^3.0.88",
    "@base-ui/react": "^1.2.0",
    "@hookform/resolvers": "^5.2.2",
    "@paper-design/shaders-react": "^0.0.71",
    "@streamdown/cjk": "^1.0.2",
    "@streamdown/code": "^1.0.2",
    "@streamdown/math": "^1.0.2",
    "@streamdown/mermaid": "^1.0.2",
    "ai": "^6.0.86",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "cmdk": "^1.1.1",
    "date-fns": "^4.1.0",
    "embla-carousel-react": "^8.6.0",
    "framer-motion": "^12.34.0",
    "input-otp": "^1.4.2",
    "lucide-react": "^0.564.0",
    "motion": "^12.34.0",
    "nanoid": "^5.1.6",
    "next": "16.1.6",
    "next-themes": "^0.4.6",
    "nuqs": "^2.8.8",
    "radix-ui": "^1.4.3",
    "react": "19.2.3",
    "react-day-picker": "^9.13.2",
    "react-dom": "19.2.3",
    "react-hook-form": "^7.71.1",
    "react-resizable-panels": "^4.6.3",
    "recharts": "2.15.4",
    "sonner": "^2.0.7",
    "streamdown": "^2.2.0",
    "tailwind-merge": "^3.4.0",
    "unpdf": "1.4.0",
    "use-stick-to-bottom": "^1.1.3",
    "vaul": "^1.1.2",
    "zod": "^4.3.6"
  },
  "devDependencies": {
    "@biomejs/biome": "2.3.15",
    "@tailwindcss/postcss": "^4",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "babel-plugin-react-compiler": "1.0.0",
    "lefthook": "^2.1.1",
    "lint-staged": "^16.2.7",
    "shadcn": "^3.8.4",
    "tailwindcss": "^4",
    "tw-animate-css": "^1.4.0",
    "typescript": "^5",
    "ultracite": "7.2.0"
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx,json,jsonc,css,scss,md,mdx}": [
      "pnpm dlx ultracite fix"
    ]
  }
}

```

### hardware/main.py

```python
import asyncio

from control.server import main

if __name__ == "__main__":
    asyncio.run(main())

```

### apps/test_hardware/app/layout.tsx

```typescript
import "./globals.css";

import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import React from "react";

const geistSans = Geist({
  variable: "--font-geist-sans",
  subsets: ["latin"],
});

const geistMono = Geist_Mono({
  variable: "--font-geist-mono",
  subsets: ["latin"],
});

export const metadata: Metadata = {
  title: "xArm Servo Dashboard",
  description: "WebSocket control panel for xArm bus servos",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={`${geistSans.variable} ${geistMono.variable} antialiased`}>{children}</body>
    </html>
  );
}

```

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