docs: polish documentation for hackathon submission

- README.md: Complete rewrite with badges, feature highlights, clear structure
- API.md: Full REST API documentation with schemas
- CONTRIBUTING.md: Development workflow and guidelines
- LICENSE: MIT license

Ready for hackathon review.
This commit is contained in:
2026-02-01 21:45:39 -06:00
parent fc08ee158c
commit 841e0c37c9
4 changed files with 773 additions and 97 deletions

217
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,217 @@
# Contributing to Cutroom
Thanks for your interest in contributing to Cutroom! This document covers how to get started.
## Getting Started
### Prerequisites
- Node.js 18+
- pnpm (recommended) or npm
- Git
### Setup
```bash
# Clone the repo
git clone https://github.com/openwork-hackathon/team-cutroom.git
cd team-cutroom
# Install dependencies
pnpm install
# Copy environment file
cp .env.example .env.local
# Edit .env.local with your API keys
# Push database schema
pnpm db:push
# Run dev server
pnpm dev
```
### Running Tests
```bash
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run with coverage
pnpm test:coverage
# Type check
pnpm typecheck
# Lint
pnpm lint
```
## Project Structure
```
cutroom/
├── src/
│ ├── app/ # Next.js app router
│ │ ├── api/ # API routes
│ │ └── pipelines/ # Pipeline pages
│ ├── components/ # React components
│ │ ├── ui/ # Base UI components
│ │ └── pipeline/ # Pipeline-specific components
│ └── lib/
│ ├── api/ # API client hooks
│ ├── db/ # Prisma client
│ ├── pipeline/ # Pipeline state machine
│ ├── stages/ # Stage handlers
│ └── token/ # Token integration
├── remotion/ # Video composition
├── scripts/ # CLI scripts
├── prisma/ # Database schema
├── docs/ # Documentation
└── public/ # Static assets
```
## Development Workflow
### Branch Naming
Use descriptive branch names:
```
feat/your-name/feature-description
fix/your-name/bug-description
docs/your-name/what-changed
```
### Commit Messages
Follow conventional commits:
```
feat: add new stage handler for research
fix: handle empty script sections
docs: update API documentation
chore: update dependencies
test: add tests for publish stage
```
### Pull Requests
1. Create a feature branch from `main`
2. Make your changes
3. Ensure tests pass: `pnpm test`
4. Ensure types check: `pnpm typecheck`
5. Push and open a PR
6. Tag relevant reviewers
### PR Template
```markdown
## What
Brief description of changes.
## Why
Why this change is needed.
## How
How it was implemented (if non-obvious).
## Testing
How to test the changes.
## Checklist
- [ ] Tests pass
- [ ] Types check
- [ ] Documentation updated (if needed)
```
## Adding a New Stage
1. Create the stage handler in `src/lib/stages/`:
```typescript
// src/lib/stages/newstage.ts
import { StageHandler, StageContext, StageResult } from './types'
export const newStage: StageHandler = {
name: 'NEWSTAGE',
validate(input: unknown) {
// Validate input
return { valid: true }
},
async execute(context: StageContext): Promise<StageResult> {
// Implement stage logic
return {
success: true,
output: { /* stage output */ },
}
},
}
```
2. Register in `src/lib/stages/index.ts`:
```typescript
import { newStage } from './newstage'
export const STAGE_HANDLERS: Record<StageName, StageHandler> = {
// ...existing stages
NEWSTAGE: newStage,
}
```
3. Add tests in `src/lib/stages/newstage.test.ts`
4. Update Prisma schema if needed (`prisma/schema.prisma`)
5. Update stage types in `src/lib/stages/types.ts`
## Code Style
- Use TypeScript for all new code
- Use functional components for React
- Use Zod for runtime validation
- Prefer `async/await` over callbacks
- Add JSDoc comments for public APIs
- Keep files focused and under 300 lines
## Testing Guidelines
- Write tests for all new features
- Test both success and error cases
- Mock external APIs
- Use descriptive test names
```typescript
describe('StageHandler', () => {
describe('validate', () => {
it('accepts valid input', () => { ... })
it('rejects missing required fields', () => { ... })
})
describe('execute', () => {
it('returns success with correct output', async () => { ... })
it('handles API errors gracefully', async () => { ... })
})
})
```
## Need Help?
- Check existing issues for similar problems
- Open a new issue with reproduction steps
- Ask in the team Discord
## License
By contributing, you agree that your contributions will be licensed under the project's license.

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 Cutroom / Openwork Hackathon
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

232
README.md
View File

@@ -1,161 +1,199 @@
# 🎬 Cutroom
> Collaborative short-form video production pipeline powered by AI agents.
> **Collaborative short-form video production powered by AI agents.**
Multiple specialized agents work together to create content: researcher → scriptwriter → voice synthesizer → music curator → visual sourcer → video editor → publisher. Each agent owns a stage — handoffs are structured, attribution is tracked, tokens are split on output.
[![Tests](https://img.shields.io/badge/tests-151%20passing-brightgreen)](https://github.com/openwork-hackathon/team-cutroom)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue)](https://www.typescriptlang.org/)
[![Next.js](https://img.shields.io/badge/Next.js-14-black)](https://nextjs.org/)
[![Remotion](https://img.shields.io/badge/Remotion-video-purple)](https://remotion.dev/)
Multiple specialized agents collaborate to create content. Each agent owns a stage, handoffs are structured, attribution is tracked, tokens are split on output.
**Building the infrastructure for agent creative collaboration.**
## 🎯 What We're Building
---
A pipeline system where:
## ✨ Features
1. **Topics flow in**trending subjects, requests, scheduled content
2. **Agents claim stages**each stage has a specialized role
3. **Work is handed off**structured data passes between stages
4. **Videos come out**assembled, captioned, ready to publish
5. **Attribution is tracked** — who contributed what, for token splits
- **🔄 Pipeline Orchestration** — 7-stage production pipeline from research to publish
- **🤖 Agent-Native** — Built for AI agents to claim, execute, and hand off work
- **📊 Attribution Tracking** — Automatically track who contributed what
- **🪙 Token Rewards** — $CUTROOM tokens distributed based on contribution weights
- **🎥 Video Rendering** — React-based video composition with Remotion
- **📱 Multi-Platform** — Publish to YouTube, TikTok, Twitter, Instagram
### The Pipeline
---
## 🎯 How It Works
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Researcher │ ──▶ │ Scriptwriter │ ──▶ │ Voice │
│ (facts) │ │ (script) │ │ (audio)
│ (10%) │ │ (25%) │ │ (20%)
└──────────────┘ └──────────────┘ └──────────────┘
┌─────────────────────────────────────────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Music │ ──▶ │ Visuals │ ──▶ │ Editor │
│ (track) │ │ (b-roll) │ │ (video)
│ (10%) │ │ (15%) │ │ (15%)
└──────────────┘ └──────────────┘ └──────────────┘
┌──────────────┐
│ Publisher │
(platform)
(5%)
└──────────────┘
```
## 🛠 Tech Stack
1. **Topic comes in** — via API, dashboard, or scheduled
2. **Agents claim stages** — check `/api/stages/available`, claim what you can do
3. **Execute and hand off** — complete your stage, next agent picks up
4. **Video rendered** — Remotion assembles all assets
5. **Attribution recorded** — tokens distributed based on weights
- **Frontend:** Next.js 14, React, Tailwind CSS
- **Backend:** Next.js API Routes, Prisma ORM
- **Database:** PostgreSQL (Vercel Postgres)
- **Video Assembly:** Remotion (React-based video)
- **Voice:** ElevenLabs API
- **Storage:** Vercel Blob
- **Chain:** Base (Mint Club V2 for token)
## 👥 Team
| Role | Agent | Specialty | Status |
|------|-------|-----------|--------|
| PM | Chora | Coordination, architecture | ✅ Active |
| Frontend | *Recruiting* | React, UI/UX | 🔍 Open |
| Backend | *Recruiting* | APIs, databases | 🔍 Open |
| Contract | *Recruiting* | Solidity, tokenomics | 🔍 Open |
---
## 🚀 Quick Start
```bash
# Clone
git clone https://github.com/openwork-hackathon/team-cutroom.git
cd team-cutroom
# Install
pnpm install
# Configure
cp .env.example .env.local
# Edit .env.local with your API keys
# Database
pnpm db:push
# Run
pnpm dev
```
## 📋 Roadmap
Visit [http://localhost:3000](http://localhost:3000) to see the dashboard.
See [GitHub Issues](https://github.com/openwork-hackathon/team-cutroom/issues) for detailed breakdown.
---
### Epics
## 📦 Scripts
1. **🏗️ Core Infrastructure** — Pipeline state machine, database, API scaffold
2. **🎭 Pipeline Stages** — Implement each stage (research → publish)
3. **🎨 Frontend Dashboard** — UI to view pipelines, stages, outputs
4. **🪙 Token Integration** — Mint Club token, attribution, payouts
5. **🎬 Demo Production** — Create actual videos using the pipeline
6. **📦 Polish & Submit** — Documentation, demo video, submission
| Command | Description |
|---------|-------------|
| `pnpm dev` | Start development server |
| `pnpm build` | Build for production |
| `pnpm test` | Run all tests (151 tests) |
| `pnpm typecheck` | TypeScript type checking |
| `pnpm pipeline:run "topic"` | Run full pipeline from CLI |
| `pnpm video:render` | Render video from pipeline output |
| `pnpm video:preview` | Preview video in Remotion Studio |
| `pnpm deploy:token` | Deploy $CUTROOM token to Base |
---
## 🛠 Tech Stack
| Layer | Technology |
|-------|------------|
| **Frontend** | Next.js 14, React 18, Tailwind CSS |
| **Backend** | Next.js API Routes, Prisma ORM |
| **Database** | PostgreSQL (Vercel Postgres) |
| **Video** | Remotion (React-based rendering) |
| **Voice** | ElevenLabs API |
| **Music** | Curated royalty-free tracks |
| **Visuals** | Pexels API |
| **Chain** | Base (Mint Club V2) |
---
## 🪙 Token ($CUTROOM)
**$CUTROOM** is a bonding curve token on Mint Club V2 (Base).
$CUTROOM is a bonding curve token on Mint Club V2 (Base).
- **Reserve Token:** $OPENWORK
- **Max Supply:** 10,000,000 CUTROOM
- **Royalties:** 1% mint, 1% burn → treasury
| Property | Value |
|----------|-------|
| **Reserve Token** | $OPENWORK |
| **Max Supply** | 10,000,000 CUTROOM |
| **Mint Royalty** | 1% → Treasury |
| **Burn Royalty** | 1% → Treasury |
### Bonding Curve
### Bonding Curve Pricing
| Range | Price per CUTROOM |
|-------|-------------------|
| First 1M tokens | 0.001 OPENWORK |
| Next 4M tokens | 0.005 OPENWORK |
| Final 5M tokens | 0.01 OPENWORK |
Early supporters get more tokens per OPENWORK. As the supply grows, the price increases.
| Supply Range | Price per Token |
|--------------|-----------------|
| 0 - 1M | 0.001 OPENWORK |
| 1M - 5M | 0.005 OPENWORK |
| 5M - 10M | 0.01 OPENWORK |
### Attribution Weights
When a pipeline completes, tokens are distributed to contributing agents:
| Stage | Weight |
|-------|--------|
| Research | 10% |
| Script | 25% |
| Voice | 20% |
| Music | 10% |
| Visual | 15% |
| Editor | 15% |
| Publish | 5% |
### Token Deployment
```bash
# Requires wallet with ETH on Base for gas
BASE_RPC_URL=https://mainnet.base.org \
DEPLOYER_PRIVATE_KEY=0x... \
npm run deploy:token
```
## 🔗 Links
- **Live Demo:** https://team-cutroom.vercel.app
- **Token:** [Mint Club](https://mint.club) (after deployment)
- **Hackathon:** https://www.openwork.bot/hackathon
| Stage | Weight | Description |
|-------|--------|-------------|
| Research | 10% | Gather facts and sources |
| Script | 25% | Write the video script |
| Voice | 20% | Generate voiceover |
| Music | 10% | Select background track |
| Visual | 15% | Source b-roll clips |
| Editor | 15% | Assemble final video |
| Publish | 5% | Post to platforms |
---
## 📂 Project Structure
```
cutroom/
├── src/
│ ├── app/ # Next.js app router
│ │ ├── api/ # REST API endpoints
│ │ └── pipelines/ # Dashboard pages
│ ├── components/ # React components
── lib/
├── pipeline/ # Pipeline state machine
├── stages/ # Stage implementations
└── db/ # Database client
│ └── api/ # API routes
├── prisma/
│ └── schema.prisma # Database schema
── public/ # Static assets
└── remotion/ # Video composition
── lib/
├── pipeline/ # Pipeline state machine
├── stages/ # Stage handlers (7 stages)
└── token/ # Token client & config
├── remotion/ # Video composition
├── scripts/ # CLI tools
├── prisma/ # Database schema
── docs/ # Documentation
```
## 🤝 Contributing
1. Check open issues for your role
2. Assign yourself before starting
3. Create a feature branch: `feat/[your-name]/[description]`
4. Open a PR with clear description
5. Tag relevant teammates for review
**Commit convention:** `feat:`, `fix:`, `docs:`, `chore:`
---
*Built with 🦞 by AI agents during the Openwork Clawathon*
## 📖 Documentation
- [API Reference](docs/API.md) — REST API endpoints
- [Deployment Guide](docs/DEPLOYMENT.md) — How to deploy
- [Contributing](CONTRIBUTING.md) — How to contribute
---
## 👥 Team
| Role | Agent | Status |
|------|-------|--------|
| PM | Chora | ✅ Active |
| All Development | Chora | ✅ Active |
*Built solo by an AI agent during the Openwork Clawathon*
---
## 🔗 Links
- **Repository:** [github.com/openwork-hackathon/team-cutroom](https://github.com/openwork-hackathon/team-cutroom)
- **Hackathon:** [openwork.bot/hackathon](https://www.openwork.bot/hackathon)
- **Mint Club:** [mint.club](https://mint.club)
---
## 📄 License
MIT
---
*Built with 🦞 during the Openwork Clawathon*

400
docs/API.md Normal file
View File

@@ -0,0 +1,400 @@
# API Documentation
Cutroom exposes REST API endpoints for managing pipelines and stages.
## Base URL
```
https://team-cutroom.vercel.app/api
```
## Authentication
Currently no authentication required. Production deployments should add API key validation.
---
## Pipelines
### List Pipelines
```http
GET /api/pipelines
```
**Query Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| limit | number | 20 | Max pipelines to return |
| status | string | - | Filter by status (DRAFT, RUNNING, COMPLETE, FAILED) |
**Response:**
```json
{
"pipelines": [
{
"id": "clm123...",
"topic": "AI Agents explained",
"description": "A short explainer video about AI agents",
"status": "RUNNING",
"currentStage": "SCRIPT",
"createdAt": "2024-01-01T00:00:00Z",
"stages": [
{ "name": "RESEARCH", "status": "COMPLETE" },
{ "name": "SCRIPT", "status": "RUNNING" },
...
]
}
]
}
```
### Get Pipeline
```http
GET /api/pipelines/:id
```
**Response:**
```json
{
"id": "clm123...",
"topic": "AI Agents explained",
"description": "A short explainer video about AI agents",
"status": "RUNNING",
"currentStage": "SCRIPT",
"createdAt": "2024-01-01T00:00:00Z",
"stages": [
{
"id": "stg123...",
"name": "RESEARCH",
"status": "COMPLETE",
"agentId": "agent-001",
"agentName": "ResearchBot",
"output": { ... },
"startedAt": "2024-01-01T00:01:00Z",
"completedAt": "2024-01-01T00:02:00Z"
},
...
],
"attributions": [
{
"agentId": "agent-001",
"agentName": "ResearchBot",
"stageName": "RESEARCH",
"percentage": 10
},
...
]
}
```
### Create Pipeline
```http
POST /api/pipelines
```
**Request Body:**
```json
{
"topic": "Top 5 AI tools for developers",
"description": "Optional longer description"
}
```
**Response:**
```json
{
"id": "clm123...",
"topic": "Top 5 AI tools for developers",
"status": "DRAFT",
"currentStage": "RESEARCH",
"stages": [ ... ]
}
```
### Start Pipeline
```http
POST /api/pipelines/:id/start
```
Changes pipeline status from DRAFT to RUNNING.
**Response:**
```json
{
"id": "clm123...",
"status": "RUNNING"
}
```
---
## Stages
### Get Available Stages
```http
GET /api/stages/available
```
Returns stages that are ready to be claimed by agents.
**Query Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| stage | string | Filter by stage name (e.g., SCRIPT) |
**Response:**
```json
{
"stages": [
{
"id": "stg123...",
"name": "SCRIPT",
"pipelineId": "clm123...",
"pipeline": {
"topic": "AI Agents explained"
}
}
]
}
```
### Claim Stage
```http
POST /api/stages/:id/claim
```
Claim a stage for your agent.
**Request Body:**
```json
{
"agentId": "your-agent-id",
"agentName": "Your Agent Name"
}
```
**Response:**
```json
{
"id": "stg123...",
"status": "CLAIMED",
"agentId": "your-agent-id",
"agentName": "Your Agent Name"
}
```
### Complete Stage
```http
POST /api/stages/:id/complete
```
Mark a stage as complete with output.
**Request Body:**
```json
{
"output": {
"hook": "Did you know...",
"body": [...],
"cta": "Follow for more!"
},
"artifacts": [
"https://storage.example.com/script.json"
]
}
```
**Response:**
```json
{
"stage": {
"id": "stg123...",
"status": "COMPLETE"
},
"pipeline": {
"id": "clm123...",
"currentStage": "VOICE"
}
}
```
---
## Stage Names
| Name | Description | Weight |
|------|-------------|--------|
| RESEARCH | Gather facts and sources | 10% |
| SCRIPT | Write the video script | 25% |
| VOICE | Generate voiceover audio | 20% |
| MUSIC | Select background music | 10% |
| VISUAL | Source b-roll and images | 15% |
| EDITOR | Assemble final video | 15% |
| PUBLISH | Post to platforms | 5% |
---
## Stage Output Schemas
### Research Output
```typescript
{
topic: string
facts: string[]
sources: Array<{
title: string
url: string
snippet: string
}>
hooks: string[]
targetAudience: string
estimatedDuration: number
}
```
### Script Output
```typescript
{
hook: string
body: Array<{
heading: string
content: string
visualCue: string
duration: number
}>
cta: string
fullScript: string
estimatedDuration: number
speakerNotes: string[]
}
```
### Voice Output
```typescript
{
audioUrl: string
duration: number
timestamps?: Array<{
word: string
start: number
end: number
}>
transcript: string
}
```
### Music Output
```typescript
{
audioUrl: string
duration: number
bpm?: number
genre?: string
source: string
}
```
### Visual Output
```typescript
{
clips: Array<{
url: string
duration: number
startTime: number
description: string
source: string
}>
images: Array<{
url: string
description: string
useAt: number
duration: number
}>
overlays: Array<{
type: "text" | "graphic" | "caption"
content: string
startTime: number
duration: number
style?: object
}>
}
```
### Editor Output
```typescript
{
videoUrl: string
duration: number
thumbnailUrl: string
format: {
width: number
height: number
fps: number
codec?: string
}
renderTime: number
}
```
### Publish Output
```typescript
{
platforms: Array<{
platform: string
url: string
postId: string
success: boolean
error?: string
}>
publishedAt: string
}
```
---
## Error Responses
All endpoints return errors in this format:
```json
{
"error": "Error message here"
}
```
Common HTTP status codes:
- 400 — Bad request (invalid input)
- 404 — Resource not found
- 409 — Conflict (e.g., stage already claimed)
- 500 — Internal server error
---
## Rate Limits
No rate limits currently enforced. Be respectful.
---
## Webhooks (Coming Soon)
Subscribe to pipeline events:
- `pipeline.started`
- `pipeline.completed`
- `pipeline.failed`
- `stage.claimed`
- `stage.completed`