# Extrudex — Project Context > **Last updated:** 2026-05-21 > **Repo:** `CubeCraft-Creations/Extrudex` | **Host:** `code.cubecraftcreations.com` > **Local clone:** `/mnt/ai-storage/projects/Extrudex` | **Default branch:** `dev` > **Discord:** `DISCORD_DEV_EXTRUDEX_CHANNEL_ID` > **Linear Epic:** [CUB-110](https://linear.app/cubecraft-creations/issue/CUB-110) --- ## Overview Custom filament inventory and print tracking system for CubeCraft Creations. Tracks spool consumption, material costs, and per-print COGS across a fleet of 6 FDM printers (5 Bambu Lab + 1 Elegoo Centauri Carbon) + resin printers. Kiosk interface on Raspberry Pi 5 with USB barcode scanner. **Active refactor in progress:** .NET → Go + React (CUB-110 epic). ## Tech Stack | Layer | Technology | Notes | |-------|-----------|-------| | Backend (legacy) | ASP.NET Core 9 + EF Core | Being replaced by Go | | Backend (new) | Go 1.24+ | Chi router, pgx (PostgreSQL), gorilla/websocket, paho.mqtt.golang | | Frontend (legacy) | Angular 17+ | Being replaced by React | | Frontend (new) | React 18 + TypeScript + Tailwind CSS | Vite | | Database | PostgreSQL 16+ | snake_case naming | | Real-time | SSE (Server-Sent Events) | Replaces SignalR | | Printer integrations | Moonraker REST + WebSocket, MQTT TLS | Elegoo/Klipper + Bambu Lab | | CI/CD | Gitea Actions | `.gitea/workflows/dev.yml` | | Deployment | Docker/Compose, Pi 5 kiosk | | ## Key Design Decisions 1. **Custom system over Spoolman** — Full control over data model and integrations 2. **MaterialFinish required** on every spool; default is "Basic" 3. **MaterialModifier is optional** 4. **Grams derived from:** `mm_extruded × filament_cross_section_area × material_density` 5. **Push over poll** — SSE + MQTT preferred; Moonraker polling is fallback 6. **Snake_case** for all PostgreSQL identifiers ## Project Structure ``` Extrudex/ ├── backend/ # Original .NET backend (being replaced) │ ├── API/Controllers/ # Filaments, Spools, PrintJobs, Printers, Materials, QR, UsageLogs, Cost │ ├── API/DTOs/ # DTOs per domain │ ├── API/Validators/ # FluentValidation rules │ ├── API/Hubs/ # SignalR PrinterHub │ ├── API/Jobs/ # Background sync jobs │ ├── Domain/Entities/ # EF Core entities (Printer, Spool, PrintJob, MaterialBase, etc.) │ ├── Domain/Enums/ # ConnectionType, DataSource, JobStatus, PrinterStatus, QrResourceType │ ├── Domain/Interfaces/ # Service interfaces │ ├── Infrastructure/Data/ # EF DbContext, Configurations, Migrations, SeedData │ ├── Infrastructure/Services/ # MoonrakerClient, CostPerPrint, UsageLog, FilamentUsage, QR │ └── Program.cs # ASP.NET entry point ├── cmd/server/main.go # Go entrypoint (new), worker discovery, graceful shutdown ├── internal/ # Go backend (new) │ ├── config/config.go # Env vars │ ├── db/db.go # PostgreSQL connection pool (pgx) │ ├── models/models.go # Go domain structs │ ├── router/router.go # Chi HTTP routes │ ├── sse/broadcaster.go # SSE broadcaster │ ├── sse/events.go # SSE event types │ ├── sse/handler.go # SSE HTTP handler │ ├── handlers/ # API handlers (filament, health, material, print_job, printer, usage_log) │ ├── repositories/ # DB access layer │ └── services/ # Business logic + validation ├── migrations/ # Go-migrate SQL migrations │ ├── 000001_initial_schema.up.sql │ ├── 000001_initial_schema.down.sql │ ├── 000002_seed_data.up.sql │ └── 000002_seed_data.down.sql ├── frontend/ # React frontend (new) │ ├── src/ │ │ ├── App.tsx │ │ ├── main.tsx │ │ ├── components/ # ColorSwatch, LoadingSpinner, RecentPrints, SummaryCard │ │ ├── pages/ │ │ │ ├── Dashboard.tsx # Main dashboard with summary cards + recent prints │ │ │ └── InventoryPage.tsx # Filament inventory list (table + filters) │ │ ├── services/ │ │ │ ├── api.ts # Axios client │ │ │ └── filamentService.ts │ │ ├── stores/ # State stores (WIP) │ │ ├── types/ │ │ │ ├── filament.ts │ │ │ └── index.ts │ │ └── hooks/ │ ├── Dockerfile + nginx.conf │ └── vite.config.ts, tailwind.config.js ├── design/ # UX/design specs + mockup images │ ├── homepage-spec.md │ ├── 01-filament-inventory-list.md │ ├── 02-spool-detail-view.md │ ├── 03-smart-intake-workflow.md │ ├── smart-intake-identify-spec.md │ └── *.jpg / *.png # Mockup images (kiosk + mobile) ├── docker-compose.dev.yml └── deploy.sh ``` ## Database Schema (PostgreSQL — .NET EF Core Migrations) Core entities managed by EF Core with full configurations: - **Printers** — id, name, type (BambuLab/Moonraker), connection_type, status, ip_address, mac_address, ams_count - **AmsUnit / AmsSlot** — Bambu Lab AMS tray tracking - **Spools** — filament inventory with material, color, weight, location, QR support - **MaterialBase / MaterialFinish / MaterialModifier** — material taxonomy - **PrintJobs** — job tracking with status, cost, filament consumption - **UsageLogs** — per-printer filament consumption records - **FilamentUsage** — aggregated per-spool consumption tracking - **FilamentUsageSyncJob** — background Moonraker polling - **MoonrakerPrinterSyncJob** — background printer status sync ## API Endpoints (.NET) | Method | Endpoint | Description | |--------|----------|-------------| | GET | /api/filaments | List filaments (paginated, filterable) | | POST | /api/filaments | Create filament | | GET | /api/filaments/{id} | Get filament detail | | PUT | /api/filaments/{id} | Update filament | | DELETE | /api/filaments/{id} | Delete filament | | GET | /api/spools | List spools | | POST | /api/spools | Create spool | | GET | /api/spools/{id} | Get spool detail | | PUT | /api/spools/{id} | Update spool | | DELETE | /api/spools/{id} | Delete spool | | GET | /api/print-jobs | List print jobs | | POST | /api/print-jobs | Create print job | | GET | /api/print-jobs/{id} | Get print job detail | | GET | /api/printers | List printers | | POST | /api/printers | Register printer | | GET | /api/printers/{id} | Get printer detail | | GET | /api/printers/{id}/costs | Per-print cost summary | | GET | /api/printers/{id}/usage | Filament usage history | | GET | /api/materials/bases | List material bases | | POST | /api/materials/bases | Create material base | | GET | /api/materials/finishes | List material finishes | | POST | /api/materials/finishes | Create material finish | | GET | /api/materials/modifiers | List material modifiers | | POST | /api/materials/modifiers | Create modifier | | GET | /api/materials/lookups | Unified material lookup | | GET | /api/qr/resolve/{code} | QR code resolve | | GET | /api/usage-logs | List usage logs | | POST | /api/usage-logs | Create usage log | ## CUB-110 Epic Progress (Go + React Rewrite) | Sub-task | Title | Status | Agent | |----------|-------|--------|-------| | CUB-111 | Design PostgreSQL schema | Done | Hex | | CUB-112 | Scaffold Go backend | Done | Dex | | CUB-113 | Core CRUD API endpoints | Done | Dex | | CUB-116 | Scaffold React frontend | In Review | Rex | | CUB-117 | Moonraker + MQTT integrations | In Progress | Dex | | CUB-118 | (deprecated → CUB-135 + CUB-136) | — | — | | CUB-130 | Add/Edit Filament form | In Review | Rex | | CUB-131 | Filament Detail page | In Review | Rex | | CUB-132 | Filament Inventory list | Done | Rex | | CUB-133 | Dashboard summary cards | In Review | Rex | | CUB-134 | Printers list page | Todo | Rex | | CUB-135 | Subscribe to SSE in React | In Review | Rex | | CUB-136 | Add SSE endpoint in Go | In Review | Dex | | CUB-128 | Settings page | Todo | — | | CUB-129 | Print Jobs list page | Todo | — | | CUB-114 | Pi 5 kiosk deployment | Todo | — | ## Active Branches | Branch | Agent | Issue | Status | |--------|-------|-------|--------| | `agent/dex/CUB-117-moonraker-mqtt-go` | Dex | CUB-117 | Local commit ready | | `agent/dex/CUB-136-sse-endpoint` | Dex | CUB-136 | PR open | | `agent/rex/CUB-130-filament-form` | Rex | CUB-130 | PR open | | `agent/rex/CUB-131-filament-detail` | Rex | CUB-131 | PR open | | `agent/rex/CUB-133-dashboard-cards` | Rex | CUB-133 | PR open | | `agent/rex/CUB-135-sse-subscribe` | Rex | CUB-135 | PR open | ## Known Limitations - Go rewrite is in progress — backend `internal/` is new Go code, but legacy .NET code still serves endpoints - Kiosk deployment not finalized (CUB-114) - Smart intake workflow is designed but not implemented - MQTT Bambu Lab integration is partially complete (CUB-117) ## Default Agent Assignments | Area | Agent | Notes | |------|-------|-------| | Backend (Go API, Moonraker, MQTT) | Dex | gitea-dex MCP | | Database (PostgreSQL schema, migrations) | Hex | gitea-hex MCP | | Frontend (React, Tailwind) | Rex | gitea-rex MCP | | Design (wireframes, UX) | Sketch | | ## Getting Started ```bash cd /mnt/ai-storage/projects/Extrudex git checkout dev git pull origin dev # Legacy .NET backend cd backend && dotnet run # New Go backend go run cmd/server/main.go # React frontend cd frontend && npm install && npm run dev # Docker docker compose -f docker-compose.dev.yml up --build ```