# Project export: Hexi

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: Healthcare copilot that reduces documentation burden on nurses, improves completeness of patient medical records, all while preserving patient privacy.
- Devpost: https://devpost.com/software/hexi
- GitHub: https://github.com/IvanRatushnyy/TreeHacks-2026
- Video: https://www.youtube.com/embed/H1WF9bsFZb0?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 3 GitHub contributor(s) — Ivan Ratushnyy (10 commits), root (9 commits), ayushgawai (2 commits)

## Devpost submission (written by the team)

### Inspiration

Clinical documentation is one of the largest hidden burdens in healthcare. Nurses often spend hours typing notes and may record notes that lack key context, contributing to the growing problem of unstructured data in healthcare. Concurrently, most AI scribes and copilots send raw patient conversations to cloud models — creating serious privacy, compliance, and data ownership concerns. We asked a simple question: What if we could build a clinical copilot that improves documentation quality while making privacy the default, not a feature? Hexi solves this: it reduces the burden of documentation, identifies missing clinical information in real time, and ensures that sensitive patient data never leaves the browser unprotected.

### What it does

Hexi is a real-time, privacy-first clinical conversation copilot. It: Transcribes patient conversations fully in the browser. Runs a custom 350M parameter LoRA redaction model locally in the browser to detect and censor personal health information. Sends only redacted text to state-of-the-art cloud reasoning models, such as Claude Sonnet. Identifies missing clinical information (HPI gaps, medications, allergies, history, etc.). Guides structured follow-up questions, leading to the construction of a complete patient profile. Knows when to stop asking questions once enough information has been gathered. Unlike typical AI scribes that simply summarize transcripts, Hexi actively detects knowledge gaps and helps clinicians complete structured documentation efficiently. Most importantly, no personal health information is ever sent to the cloud.

### How we built it

Our architecture is privacy-first by design: For our frontend, we use React + TypeScript for type safety. In-browser model execution using ONNX/WebGPU. A custom LoRA fine-tuned 350M parameter model trained using transfer learning from Claude Sonnet 4. Real-time streaming transcription that happens completely on device. Redacted text is sent to a state-of-the-art cloud reasoning engine (Claude Sonnet configured as a multi-turn reasoning agent). The redaction model we used is a state-of-the-art "Liquid Foundation Model" by Liquid AI. These models are small yet offer excellent performance and work well in edge deployments. We also implemented a multi-turn agent framework that: Tracks clinical slot completion. Measures marginal information gain. Prevents infinite follow-up loops. This allows Hexi to stop when sufficient information has been gathered instead of asking endless general questions.

### Challenges we ran into

Running a 350M parameter model efficiently inside the browser. Combining regex-based redaction with model-based entity detection. Preventing the agent from asking overly general or repetitive questions. Implementing a formal stopping condition for “enough information.” Handling malformed JSON outputs from the reasoning model. Maintaining a smooth real-time UX while models load locally.

### Accomplishments we're proud of

Successfully running a 350M parameter redaction model entirely in-browser. Training an accurate model using transfer learning from Claude Sonnet, resulting in a scalable approach. Achieving full privacy-by-default architecture (only redacted text leaves the device). Building a working multi-turn clinical reasoning agent. Implementing a measurable information sufficiency stopping mechanism. In a short timeframe, we built not just a demo, but a functional system with real architectural integrity.

### What we learned

Edge AI in the browser is more viable than most people think, but it requires careful performance tuning. Multi-turn agents need explicit structure; without constraints, they drift into generic questioning. Measuring “enough information” is just as important as generating answers. Privacy-first design simplifies downstream trust and compliance conversations. Clear UX is absolutely essential, especially in rushed healthcare environments.

### What's next

Clarify how we would integrate with patient-led medical record storage systems such as Healthnix. Explore integrations with EHR systems to prevent the double-entry problem, where nurses first enter information in our software and then in the EHR. Refine the information sufficiency scoring system to prevent redundant follow-ups and better characterize what is "enough." Optimize model loading speed on mobile browsers. Conduct clinical usability testing with nurses to assess the real-world impact of our product. Our long-term vision is to make Hexi the default clinical copilot for nurses — one that enhances care quality while protecting patient privacy at its core.

## README (from the GitHub repository)

# Hexi — AI Nurse Copilot 🏥


**Hexi** is an AI-powered nurse copilot that helps healthcare professionals gather complete patient information through intelligent questioning. Built at TreeHacks 2026.

## ✨ Features

- **🌐 3D Knowledge Globe** — Interactive visualization showing what's known (green) vs. unknown (red) about a patient
- **📄 Document Analysis** — Upload PDFs/text files and automatically extract known patient information
- **🎤 Voice Input** — Real-time speech-to-text for hands-free documentation
- **💬 Smart Questioning** — AI suggests the most important questions to ask based on clinical context
- **📊 NCLEX-Aligned** — Question patterns based on nursing case study frameworks
- **📋 PDF Export** — Generate professional reports from conversations

## 🏗️ Architecture

```
TreeHacks-2026/
├── frontend/          # React + Vite frontend
│   ├── src/
│   │   ├── components/
│   │   │   ├── KnowledgeGlobe.jsx    # 3D globe visualization
│   │   │   ├── HexiCore.jsx          # Animated hexagon core
│   │   │   ├── InputArea.jsx         # Chat/voice input
│   │   │   ├── TranscriptionStream.jsx
│   │   │   └── ...
│   │   ├── hooks/
│   │   │   └── useVoiceSession.js    # Voice recording hook
│   │   ├── api.js                    # API client
│   │   └── App.jsx                   # Main application
│   └── md/                           # Design system docs
├── saging-api/        # FastAPI backend
│   └── app/
│       ├── main.py                   # API endpoints
│       ├── biomcp_client.py          # Clinical patterns & scenarios
│       ├── llm.py                    # LLM integration
│       └── prompts.py                # System prompts
├── mimic-mcp/         # MIMIC database MCP server
└── backend/           # Additional backend services
```

## 🚀 Quick Start

### Prerequisites

- Node.js 18+
- Python 3.10+
- OpenAI API key (for LLM features)

### 1. Clone & Setup

```bash
git clone https://github.com/IvanRatushnyy/TreeHacks-2026.git
cd TreeHacks-2026
```

### 2. Start the Backend

```bash
cd saging-api
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# Set your API keys
export OPENAI_API_KEY="your-key-here"
export ANTHROPIC_API_KEY="your-key-here"

# Run the server
./run.sh
# Or manually:
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```

### 3. Start the Frontend

```bash
cd frontend
npm install
npm run dev
```

Open [http://localhost:5173](http://localhost:5173) in your browser.

## 📡 API Endpoints

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/health` | GET | Health check |
| `/api/knowledge-gaps` | POST | Detect knowledge gaps from transcript/document |
| `/api/chat/complete` | POST | Complete a chat session with summary |
| `/api/clinical/validate` | POST | Validate clinical snippet and suggest follow-ups |
| `/api/documents/analyze` | POST | Analyze uploaded document for gaps |
| `/api/workflow/next-question` | POST | Get AI-suggested next question |
| `/api/tts` | POST | Text-to-speech (OpenAI voices) |

### Knowledge Gaps API

```bash
curl -X POST http://localhost:8000/api/knowledge-gaps \
  -H "Content-Type: application/json" \
  -d '{
    "transcript": "Patient is a 16-year-old with type 1 diabetes who fainted at school",
    "symptoms": ["syncope", "diabetes"],
    "file_content": "Optional uploaded document text"
  }'
```

Response includes:
- `gaps[]` — Array of questions with `filled` status (green/red on globe)
- `filled_count` — Number of known items
- `next_question` — Suggested next question to ask

## 🧠 Clinical Scenarios

Hexi supports intelligent questioning for various clinical presentations:

| Scenario | Keywords Detected |
|----------|-------------------|
| Diabetic Hypoglycemia | diabetes, hypoglycemia, syncope, gym |
| Chest Pain | chest pain, cardiac, angina |
| Preeclampsia | pregnant, headache, hypertension |
| Pediatric Anaphylaxis | child, allergic, hives, epipen |
| Syncope | faint, passed out, collapsed |

## 🎨 Design System

The UI follows a medical-professional aesthetic:

- **Primary Blue**: `#134074` — Trust, professionalism
- **Accent Red**: `#DC2626` — Unknown/gaps (action needed)
- **Accent Green**: `#22C55E` — Known/filled information
- **Font**: Inter (body), DM Sans (display)

See [frontend/md/](frontend/md/) for full design documentation.

## 🔧 Development

### Frontend Dev Server

```bash
cd frontend && npm run dev
```

### Backend with Hot Reload

```bash
cd saging-api && uvicorn app.main:app --reload --port 8000
```

### Run Both

```bash
# Terminal 1
cd saging-api && ./run.sh

# Terminal 2  
cd frontend && npm run dev
```

## 📦 Tech Stack

**Frontend:**
- React 18 + Vite
- Canvas API (3D globe rendering)
- Web Speech API (voice input)
- jsPDF + html2canvas (PDF export)

**Backend:**
- FastAPI (Python)
- Anthropic Claude / OpenAI GPT
- Pydantic for validation

## 🏆 TreeHacks 2026

Built with ❤️ at Stanford TreeHacks 2026.

**Team:**
- Ivan Ratushnyy

## 📄 License

MIT License — see [LICENSE](LICENSE) for details.

## Detected evidence (automated analysis)

Indexed codebase: 67 recognized source files, 341 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- Flask (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- OpenAI (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
- AI coding agent: Cursor — evidence: commit authorship or trailers

## Codebase structure (from repository index)

### Files (99 of 99)

```
.gitignore
backend/pdf_redactor.py
backend/pii-model/.gitignore
backend/pii-model/codegen.py
backend/pii-model/fine_tune.py
backend/pii-model/infer.py
backend/pii-model/inference_test.py
backend/pii-model/lfm2-350m-lora/adapter_config.json
backend/pii-model/lfm2-350m-lora/adapter_model.safetensors
backend/pii-model/lfm2-350m-lora/chat_template.jinja
backend/pii-model/lfm2-350m-lora/checkpoint-10/adapter_config.json
backend/pii-model/lfm2-350m-lora/checkpoint-10/adapter_model.safetensors
backend/pii-model/lfm2-350m-lora/checkpoint-10/chat_template.jinja
backend/pii-model/lfm2-350m-lora/checkpoint-10/optimizer.pt
backend/pii-model/lfm2-350m-lora/checkpoint-10/README.md
backend/pii-model/lfm2-350m-lora/checkpoint-10/rng_state.pth
backend/pii-model/lfm2-350m-lora/checkpoint-10/scheduler.pt
backend/pii-model/lfm2-350m-lora/checkpoint-10/tokenizer_config.json
backend/pii-model/lfm2-350m-lora/checkpoint-10/tokenizer.json
backend/pii-model/lfm2-350m-lora/checkpoint-10/trainer_state.json
backend/pii-model/lfm2-350m-lora/README.md
backend/pii-model/lfm2-350m-lora/tokenizer_config.json
backend/pii-model/lfm2-350m-lora/tokenizer.json
backend/pii-model/lfm2-browser-demo/.gitignore
backend/pii-model/lfm2-browser-demo/eslint.config.js
backend/pii-model/lfm2-browser-demo/index.html
backend/pii-model/lfm2-browser-demo/package.json
backend/pii-model/lfm2-browser-demo/README.md
backend/pii-model/lfm2-browser-demo/src/App.css
backend/pii-model/lfm2-browser-demo/src/App.tsx
backend/pii-model/lfm2-browser-demo/src/index.css
backend/pii-model/lfm2-browser-demo/src/main.tsx
backend/pii-model/lfm2-browser-demo/tsconfig.app.json
backend/pii-model/lfm2-browser-demo/tsconfig.json
backend/pii-model/lfm2-browser-demo/tsconfig.node.json
backend/pii-model/lfm2-browser-demo/vite.config.ts
backend/pii-model/merge_lora.py
backend/pii-model/package.json
backend/pii-model/README.md
backend/pii-model/synthetic_train.jsonl
backend/requirements.txt
frontend/.gitignore
frontend/.nvmrc
frontend/eslint.config.js
frontend/index.html
frontend/md/color.md
frontend/md/identity.md
frontend/md/interaction.md
frontend/md/nurse-ux-flow.md
frontend/md/typography.md
frontend/package.json
frontend/README.md
frontend/run.sh
frontend/src/api.js
frontend/src/App.jsx
frontend/src/components/Header.jsx
frontend/src/components/HexiCore.jsx
frontend/src/components/InputArea.jsx
frontend/src/components/KnowledgeGlobe.jsx
frontend/src/components/LiteraturePanel.jsx
frontend/src/components/PatientSummaryModal.jsx
frontend/src/components/QuestionPanel.jsx
frontend/src/components/StartScreen.jsx
frontend/src/components/TranscriptionStream.jsx
frontend/src/components/VitalsGrid.jsx
frontend/src/hooks/useVoiceSession.js
frontend/src/index.css
frontend/src/main.jsx
frontend/TESTING_VOICE.md
frontend/vite.config.js
README.md
run-frontend.sh
saging-api/.gitignore
saging-api/.python-version
saging-api/app/__init__.py
saging-api/app/biomcp_client.py
saging-api/app/config.py
saging-api/app/ddb.py
saging-api/app/documents.py
saging-api/app/llm.py
saging-api/app/main.py
saging-api/app/pii.py
saging-api/app/prompts.py
saging-api/app/secrets.py
saging-api/app/tts.py
saging-api/Dockerfile
saging-api/docs/API_KEYS.md
saging-api/docs/API_OVERVIEW.md
saging-api/docs/DEPLOYMENT.md
saging-api/docs/OVERVIEW_AFTER_STEPS.md
saging-api/docs/REQUIRED_SECRET_KEYS.md
saging-api/LAYOUT.md
saging-api/main.py
saging-api/pyproject.toml
saging-api/README.md
saging-api/requirements.txt
saging-api/run.sh
saging-api/scripts/setup_aws.py
saging-api/STEPS.md
```

### Dependencies

- backend/pii-model/lfm2-browser-demo/package.json: @eslint/js@^9.39.1, @huggingface/transformers@^3.7.6, @types/node@^24.10.1, @types/react@^19.2.7, @types/react-dom@^19.2.3, @vitejs/plugin-react@^5.1.1, eslint@^9.39.1, eslint-plugin-react-hooks@^7.0.1, eslint-plugin-react-refresh@^0.4.24, globals@^16.5.0, react@^19.2.0, react-dom@^19.2.0, typescript@~5.9.3, typescript-eslint@^8.48.0, vite@^7.3.1
- backend/pii-model/package.json: @huggingface/transformers@^4.0.0-next.3
- backend/requirements.txt: Flask@==2.3.0, Flask-CORS@==4.0.0, pymupdf@==1.23.8
- frontend/package.json: @eslint/js@^9.39.1, @tailwindcss/vite@^4.1.18, @types/react@^19.2.7, @types/react-dom@^19.2.3, @vitejs/plugin-react@^5.1.1, eslint@^9.39.1, eslint-plugin-react-hooks@^7.0.1, eslint-plugin-react-refresh@^0.4.24, globals@^16.5.0, react@^19.2.0, react-dom@^19.2.0, tailwindcss@^4.1.18, vite@^7.3.1
- saging-api/requirements.txt: anthropic@>=0.39.0, boto3@>=1.35.0, fastapi@==0.115.6, httpx@>=0.27.0, openai@>=1.0.0, pydantic-settings@==2.6.1, pypdf@>=5.0.0, python-dotenv@==1.0.1, python-multipart@>=0.0.9, uvicorn[standard]@==0.34.0

### Recent commits (newest first)

- even more documentation + README changes from homeer (from ivan laptopgit add .)
- added more docs
- Enhance hexagon gradient with more color variation and dark spots, strip text output, make buttons uppercase
- remove top-level node modules
- Implement timeline-based ordering system with monotonic timestamps for conversation entries
- Merge pull request #2 from IvanRatushnyy/improve
- Merge branch 'main' into improve
- bad
- Update hexagon gradient colors and position: darken to intermediate blue, move down 10px when demo active, and update status text color
- Update KnowledgeGlobe: slower rotation, improved layout spacing, hexagon sizing and transitions
- Merge pull request #1 from IvanRatushnyy/training
- Update KnowledgeGlobe: fade transitions, fixed layout, repositioned hexagon and globe
- Merge branch 'main' into training
- finally got a workable checkpoint here
- Implement nurse agency features: QuestionPanel, LiteraturePanel, pause/resume, demo mode, enhanced conversation UI
- modernized training scripts
- Fix TranscriptionStream: remove leading spaces, fix alignment, remove dot from interim text
- conflicts
- ayush changes
- Update frontend: input area overlay, visualizer, ring behavior, transcript sizing

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

### frontend/TESTING_VOICE.md

```markdown
# Testing voice (Web Speech API + fast LLM)

## Prerequisites

- **Chrome** (recommended for best Web Speech API support).
- Backend running: `cd saging-api && .venv/bin/uvicorn app.main:app --port 8000`
- Frontend: `npm run dev` (or `npx vite`) from `frontend/`. Default URL: http://localhost:5173

## Optional: point frontend at API

If the API is on another host/port, create `frontend/.env`:

```
VITE_API_URL=http://localhost:8000
```

## Test steps

1. Open the app in **Chrome** (e.g. http://localhost:5173).
2. Click **"Start voice (keep talking; follow-ups will flow)"**. Allow microphone when prompted.
3. Speak a short clinical phrase (e.g. "Patient has a headache" or "Patient is dizzy").
4. Confirm:
   - **Live Chat** shows your words as they are transcribed (and keeps updating).
   - Recording stays on (red button, "Stop recording") and the timer (REC: 00:00:xx) counts up.
   - After a short delay, **Follow-up questions** appear below (from the fast LLM).
5. Keep talking; say more (e.g. "It started two days ago"). Transcript should append and follow-ups can update.
6. Click **"Stop recording"** when done. Recording stops; transcript and last follow-ups remain.

## What we test

- **Continuous recording**: Recording does not stop while the LLM responds; you can keep speaking.
- **On-the-fly transcription**: Words appear as you speak (interim and final).
- **Fast LLM**: Suggestions come from `POST /api/clinical/validate` with `fast: true`.
- **No dropped input**: Because we use `continuous: true`, speech is not cut off when we send to the API.

## If voice doesn’t start

- Use **Chrome** and allow the microphone for the page.
- Check the browser console for errors.
- Ensure the API is reachable: open http://localhost:8000/docs and try `POST /api/clinical/validate` with `{"text": "test", "fast": true}`.

```

### saging-api/STEPS.md

```markdown
# Saging — To-Do Steps (come back to these)

Use this list to track what’s done and what’s next. One thing at a time: do a step → test → then move on.

---

## Done recently
- [x] **Generate summary for Practitioner and Patient** — Button shown in both modes; Practitioner label “Generate summary”, Patient “Done & generate summary”.
- [x] **Summary → S3 + DDB** — On generate summary we store in memory, then call `POST /api/summary/persist` to upload to S3 (`summaries/{session_id}.txt`) and log to DynamoDB (masked patient ref + s3_key). Requires `SAGING_S3_BUCKET`; optional `SAGING_DDB_TABLE`.

---

## Next steps (in order)

### 1. Doc upload / scan / media → PII → PDF → S3 + DDB
- [ ] Add UI and API for **uploading docs, scanning docs, or uploading media**.
- [ ] Send upload through **PII system** (existing redaction pipeline).
- [ ] Receive **PDF back** in good format from PII/redaction.
- [ ] **Upload PDF to S3** (e.g. `documents/{id}.pdf`).
- [ ] **Record in DynamoDB** with masked patient details pointing to the file.
- **Deliverable:** User can upload a doc/scan/media → PII runs → PDF stored in S3 + DDB record (masked).

### 2. DynamoDB table (if not already created)
- [ ] Create DynamoDB table for summary records (e.g. `saging-summary-records`) with PK `session_id`, attributes: `s3_key`, `patient_id_masked`, `created_at`, `type`.
- [ ] Same or separate table for document records (doc upload pipeline).
- [ ] Set `SAGING_DDB_TABLE` in env when ready.

### 3. Step 7 — Storage (S3) — polish
- [ ] S3 bucket created; versioning if needed.
- [ ] `POST /api/records` tested; frontend can save records via API.
- [ ] Optional: retention / Object Lock later.

### 4. Step 6 — Voice-to-text (real impl)
- [ ] When teammate is ready: replace `POST /api/transcribe` placeholder with real call (Whisper or their service).

### 5. Step 8 — MCP / Poke (if in scope)
- [ ] MCP server or endpoints so Poke can query patient status / incomplete records.

### 6. Step 9 — Fetch.ai / Billing (if in scope)
- [ ] “Chart complete” → notify billing agent or endpoint for encounter summary.

### 7. Step 10 — Deployment & polish
- [ ] Dockerfile; deploy to one environment; CORS, rate limiting, env-based URLs.

---

## Backlog (later)
- [ ] **DB with protected data:** Encounter/session data in DB; sensitive fields hashed/masked/encrypted.
- [ ] **Source of old patient docs:** Ingest from scan/PII pipeline → standardize → DB + S3; fixed schema doc + Zero Trust questionnaire.
- [ ] **Transcribed + summarized storage:** Persist transcript + summary; endpoint for app to show summary (e.g. GET /api/sessions/{id}/summary).

---

**Reference:** Full layout and history in `LAYOUT.md`.

```

### backend/requirements.txt

```
Flask==2.3.0
Flask-CORS==4.0.0
pymupdf==1.23.8

```

### saging-api/pyproject.toml

```
[project]
name = "saging-api"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.14"
dependencies = []

```

### saging-api/Dockerfile

```
# Simple deployment for demo (EC2, ECS, or any container host)
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app/ ./app/

ENV PORT=8000
EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

```

### saging-api/requirements.txt

```
# Saging API - Step 1 & 2
fastapi==0.115.6
uvicorn[standard]==0.34.0
python-multipart>=0.0.9
python-dotenv==1.0.1
pydantic-settings==2.6.1
# Optional: for USE_AWS_SECRETS=1 (Step 2) and S3/Bedrock
boto3>=1.35.0
# LLM: Claude (primary), OpenAI (fallback)
anthropic>=0.39.0
openai>=1.0.0
# PII: HTTP client for optional external redaction service
httpx>=0.27.0
# Documents: PDF text extraction (like ChatGPT reading PDFs)
pypdf>=5.0.0

```

### frontend/package.json

```
{
  "name": "frontend-app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^19.2.0",
    "react-dom": "^19.2.0"
  },
  "devDependencies": {
    "@eslint/js": "^9.39.1",
    "@tailwindcss/vite": "^4.1.18",
    "@types/react": "^19.2.7",
    "@types/react-dom": "^19.2.3",
    "@vitejs/plugin-react": "^5.1.1",
    "eslint": "^9.39.1",
    "eslint-plugin-react-hooks": "^7.0.1",
    "eslint-plugin-react-refresh": "^0.4.24",
    "globals": "^16.5.0",
    "tailwindcss": "^4.1.18",
    "vite": "^7.3.1"
  }
}

```

### backend/pii-model/package.json

```
{
  "dependencies": {
    "@huggingface/transformers": "^4.0.0-next.3"
  }
}

```

### backend/pii-model/lfm2-browser-demo/package.json

```
{
  "name": "lfm2-browser-demo",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc -b && vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^19.2.0",
    "react-dom": "^19.2.0",
    "@huggingface/transformers": "^3.7.6"
  },
  "devDependencies": {
    "@eslint/js": "^9.39.1",
    "@types/node": "^24.10.1",
    "@types/react": "^19.2.7",
    "@types/react-dom": "^19.2.3",
    "@vitejs/plugin-react": "^5.1.1",
    "eslint": "^9.39.1",
    "eslint-plugin-react-hooks": "^7.0.1",
    "eslint-plugin-react-refresh": "^0.4.24",
    "globals": "^16.5.0",
    "typescript": "~5.9.3",
    "typescript-eslint": "^8.48.0",
    "vite": "^7.3.1"
  }
}

```

### saging-api/main.py

```python
def main():
    print("Hello from saging-api!")


if __name__ == "__main__":
    main()

```

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