Mechanical drawings → sourced bills of materials.
Drop in a CAD file. Claude reads it, agents source the parts, you get an Excel workbook.
▶ Watch the demo — opens in Google Drive preview.
- Ingest. Files land in S3 via signed upload —
.step,.stp,.pdf,.dwg,.dxf,.iges,.igsup to 100 MB. - Extract. A pure-Python STEP / drawing parser pulls headers, units, and geometry hints. No native CAD runtime required.
- Describe. Claude Haiku generates a plain-English summary; embeddings index the file for semantic search.
- Act. The BOM agent assembles the bill, runs a research pipeline against suppliers, drafts outreach via Gmail, and renders the result to an Excel workbook.
Hours of manual sourcing, done in minutes.
| Layer | Tech |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind, MUI + Radix |
| Backend | Django 5, Django REST Framework, Python 3.11 |
| Auth | Clerk (Google OAuth, magic link) |
| Storage | AWS S3 (LocalStack v3 in dev) |
| Jobs | Celery + Redis — extraction, BOM research, library ingest |
| AI | Anthropic Claude — Haiku for descriptions, Sonnet for agents |
| Database | SQLite in dev, PostgreSQL in prod |
git clone https://github.com/stanislavli3/orbit.git
cd orbit
make setup # venv, pip, npm, env scaffolding
# fill in backend/.env and apps/web/.env (see below)
make dev # LocalStack + Redis + backend + worker + frontend, one commandOpen http://localhost:5173.
| Tool | Version |
|---|---|
| Python | 3.11+ |
| Node | 18+ |
| Docker Desktop | latest |
| Clerk account | free tier — clerk.com |
| Anthropic API key | console.anthropic.com |
SECRET_KEY=<python -c "import secrets; print(secrets.token_hex(50))">
DEBUG=True
ALLOWED_HOSTS=127.0.0.1,localhost
CLERK_JWT_KEY=-----BEGIN PUBLIC KEY-----\nMIIB...\n-----END PUBLIC KEY-----
CLERK_ISSUER=https://your-app.clerk.accounts.dev
CORS_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:5174
AWS_S3_ENDPOINT_URL=http://localhost:4566
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
AWS_S3_REGION_NAME=us-east-1
AWS_STORAGE_BUCKET_NAME=orbit-local
ANTHROPIC_API_KEY=sk-ant-...
CELERY_BROKER_URL=redis://localhost:6379/0Clerk: Dashboard → API Keys → JWT public key. Paste the full PEM on one line, escape newlines as
\n.
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
VITE_API_URL=http://localhost:8000| Command | What it does |
|---|---|
make setup |
First-time install — venv, pip, npm, env scaffolding |
make dev |
LocalStack + Redis + backend + Celery worker + frontend |
make dev-local |
Backend + frontend only (no Docker / S3; jobs run inline) |
make worker |
Celery worker in the foreground (needs Redis running) |
make stop |
Stop backend, worker, frontend + docker compose down |
make restart |
Stop, then start |
make migrate |
Run Django migrations |
make logs |
Tail backend + worker + frontend |
- Sign in. Create a project.
- Upload a CAD file. The row spinner runs while extraction works in the background.
- Status flips to Extracted. An AI summary appears under the filename — edit inline if you want.
- Expand the row to see the raw extraction: schema, units, confidence, parser warnings.
- From the project page, kick off the BOM agent. It assembles the bill, sources parts, drafts supplier emails, and exports an Excel workbook.
orbit/
├── Makefile # one-command dev automation
├── docker-compose.yml # LocalStack (pinned to v3) + Redis (Celery broker)
├── apps/web/ # Vite + React frontend
├── backend/ # Django backend
│ ├── config/ # settings, root URLs, ASGI
│ ├── files_api/ # upload, extraction, AI description
│ │ ├── extractor.py # pure-Python STEP header parser
│ │ ├── ai_description.py # Claude Haiku
│ │ ├── embeddings.py # semantic index
│ │ └── s3_service.py # S3 upload / download
│ ├── bom_agent/ # BOM assembly + supplier research + Gmail + Excel export
│ ├── projects/ # project CRUD
│ ├── assistant/ # in-app chat / Q&A
│ └── accounts/ # Clerk-backed auth
All endpoints require Authorization: Bearer <Clerk JWT>.
| Method | Path | Description |
|---|---|---|
GET |
/api/projects/ |
List projects |
POST |
/api/projects/ |
Create project |
GET |
/api/projects/<id>/ |
Project detail |
POST |
/api/files/upload/ |
Upload (multipart) |
GET |
/api/files/project/<id>/ |
List files in a project |
GET |
/api/files/<id>/result/ |
Extraction result JSON |
PATCH |
/api/files/<id>/description/ |
Update file description |
cd backend
pytest