{"id":47634948,"url":"https://github.com/skynett81/3dprintforge","last_synced_at":"2026-05-03T11:01:14.563Z","repository":{"id":346227821,"uuid":"1167681039","full_name":"skynett81/3dprintforge","owner":"skynett81","description":"Self-hosted web dashboard for Bambu Lab 3D printers","archived":false,"fork":false,"pushed_at":"2026-04-26T12:04:21.000Z","size":17304,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T12:12:35.673Z","etag":null,"topics":["3d-printer","ams","bambu-lab","dashboard","mqtt","nodejs","self-hosted","websocket"],"latest_commit_sha":null,"homepage":"https://skynett81.github.io/3dprintforge/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skynett81.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-26T15:08:26.000Z","updated_at":"2026-04-26T12:04:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/skynett81/3dprintforge","commit_stats":null,"previous_names":["skynett81/bambu-dashboard","skynett81/3dprintforge"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/skynett81/3dprintforge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skynett81%2F3dprintforge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skynett81%2F3dprintforge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skynett81%2F3dprintforge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skynett81%2F3dprintforge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skynett81","download_url":"https://codeload.github.com/skynett81/3dprintforge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skynett81%2F3dprintforge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32566444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d-printer","ams","bambu-lab","dashboard","mqtt","nodejs","self-hosted","websocket"],"created_at":"2026-04-02T00:01:44.533Z","updated_at":"2026-05-03T11:01:14.555Z","avatar_url":"https://github.com/skynett81.png","language":"JavaScript","funding_links":["https://ko-fi.com/V7V21NRKM7"],"categories":[],"sub_categories":[],"readme":"# 3DPrintForge\n\n\u003e Self-hosted web dashboard for monitoring and controlling your 3D printers over your local network.\n\nCreated by **SkyNett81** \u0026bull; [AGPL-3.0 License](LICENSE)\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/V7V21NRKM7)\n\n![3DPrintForge](docs/project/dashboard.png)\n\n---\n\n## Highlights\n\n- **Real-time monitoring** — live temperature gauges, sparkline graphs, print progress, 3D model preview\n- **Multi-printer** — manage all your printers from one dashboard with instant switching\n- **Print Guard** — automatic protection using xcam + 5 sensor monitors (temp, filament, fan, stall, errors)\n- **Print Queue** — multi-printer dispatch with load balancing and pre-print filament checks\n- **Filament Inventory** — favorites, color filters, bulk add, HueForge TD, CSV import, Spoolman sync\n- **Model Forge** — 51 parametric 3D generators across 8 categories: organization (Gridfinity, storage boxes, cable labels), mechanical (gears, pulleys, springs, hinges, snap-fits), printer (spool adapters, cable chains, first-layer tests, nozzle storage), home (hooks, clips, pots, organizers, wall plates, lidded boxes), tech (phone/headphone stands, VESA mounts, Raspberry Pi cases, battery holders), creative (voronoi, topographic maps, 3D QR, shapes, honeycomb, dice towers, miniature bases)\n- **Slicer Studio** — built-in pure-JS slicing engine + Slicer Bridge to OrcaSlicer/BambuStudio/Snapmaker Orca CLI, with profile system and Three.js viewport\n- **Forge Slicer integration** — first-class REST connection to the [skynett81/OrcaSlicer](https://github.com/skynett81/OrcaSlicer) fork running in service mode: live SSE progress, automatic profile sync, slice-and-send to printer in one click. See [docs/forge-slicer-setup.md](website/docs/forge-slicer-setup.md)\n- **Scene Composer** — 3D scene editor with BSP-tree CSG (boolean mesh operations)\n- **AI Model Forge** — text-to-3D generator with intent parser\n- **Mesh Repair Toolkit** — automatic repair of broken STL/3MF files\n- **Cloud Slicer** — upload files, auto-slice with OrcaSlicer/PrusaSlicer, FTPS to printer\n- **7 notification channels** — Telegram, Discord, Email, Webhook, ntfy, Pushover, SMS\n- **17 brands / 75+ models** — Bambu Lab, Snapmaker, Prusa, OctoPrint, Creality, Elegoo, Voron, AnkerMake, QIDI, RatRig, Duet/RRF, FlashForge, Repetier-Server, and any Klipper/Moonraker printer\n- **Security hardened** — CIS/NIS2 aligned: scrypt auth, CSRF, CSP, rate limiting, TOFU cert pinning, SSRF guards\n- **590+ API endpoints** — full REST API with OpenAPI docs at `/api/docs`\n- **English UI** — entire application in English, documentation site available in English and Norwegian\n- **Docusaurus documentation** — available at `/docs/` and on GitHub Pages\n- **Zero frameworks** — pure HTML/CSS/JS frontend, Node.js 22 backend with 11 npm packages\n- **Desktop app (Electron)** — optional native desktop build for Linux (AppImage, deb, rpm, Flatpak, tar.gz), Windows, macOS with system tray, native notifications, auto-updater, and auto-start at login\n\n---\n\n## Requirements\n\n| Requirement | Version | Required | Notes |\n|-------------|---------|----------|-------|\n| **Node.js** | 22.0+ | Yes | Uses built-in SQLite |\n| **npm** | Included with Node.js | Yes | Package manager |\n| **ffmpeg** | Any recent version | No | Only needed for camera livestream |\n| **git** | Any recent version | No | For cloning, auto-updates, and version control |\n| **openssl** | Any recent version | No | For auto-SSL certificate generation (usually pre-installed) |\n\n## Supported Printers\n\n### Bambu Lab (MQTT over LAN)\n\n- **P1 Series** — P1S, P1S Combo, P1P\n- **P2 Series** — P2S, P2S Combo\n- **X1 Series** — X1 Carbon, X1 Carbon Combo, X1E\n- **A1 Series** — A1, A1 Combo, A1 Mini\n- **H2 Series** — H2S, H2D, H2C (toolchanger)\n\n### PrusaLink (HTTP REST API)\n\n- **Prusa** — MK4, MK3.9, Mini+, XL (with PrusaLink firmware)\n\n### Snapmaker SACP (Binary TCP, port 8888)\n\n- **Snapmaker J1**, J1s — IDEX dual-nozzle with mirror/duplicate modes\n- **Snapmaker Artisan** — 400×400×400, dual extruder, enclosure, air purifier\n- Uses official `@snapmaker/snapmaker-sacp-sdk` npm package\n\n### Snapmaker 2.0 HTTP (REST API, port 8080)\n\n- **Snapmaker A150**, A250, A350 — with touchscreen token approval\n- Supports enclosure LED, fan, temperature control\n\n### OctoPrint (HTTP REST API)\n\n- **Ender 3** — all variants (Pro, V2, S1, Neo)\n- **Prusa MK3** — i3 MK3S+ with OctoPrint\n- **Anycubic** — Mega, Kobra, Vyper\n- **Artillery** — Sidewinder, Genius\n- **Any printer** running OctoPrint on Raspberry Pi or similar\n\n### Moonraker / Klipper (WebSocket API)\n\n- **Snapmaker** — U1 (deep integration: NFC filament, AI defect detection, timelapse, entangle detection, calibration trends)\n- **Voron** — all models with Klipper + Moonraker\n- **Creality** — K1, K1 Max, Ender 3 V3, and other Klipper models\n- **Elegoo** — Neptune series with Klipper firmware\n- **AnkerMake** — M5, M5C series. Two options:\n  - **Community Klipper firmware** — Full Moonraker support (recommended)\n  - **Stock firmware** — Use [ankermake-m5-protocol](https://github.com/Ankermgmt/ankermake-m5-protocol) alongside 3DPrintForge for native MQTT+PPPP access (Python-based, requires AnkerMake account token)\n- **QIDI** — X-Max, X-Plus with Moonraker\n- **RatRig** — V-Core, V-Minion\n- Any printer running **Klipper + Moonraker**\n\n## Supported Platforms\n\n| Platform | Support |\n|----------|---------|\n| Linux (Ubuntu, Debian, Fedora, etc.) | Full support |\n| macOS | Full support |\n| Windows | Works with Node.js, no install script |\n| Docker | Full support (`network_mode: host` required) |\n| Pterodactyl / wisp.gg | Egg file included |\n\n---\n\n## Quick Start\n\nFor a detailed step-by-step guide, see **[INSTALL.md](INSTALL.md)**.\n\n### Option 1: Install Script (Recommended)\n\n```bash\ngit clone https://github.com/skynett81/3dprintforge.git\ncd 3dprintforge\n./install.sh\n```\n\nThis will:\n1. Check/install Node.js 22+\n2. Install npm dependencies\n3. Launch a 7-step web setup wizard:\n   - EULA acceptance\n   - System check with auto-install\n   - Network scan (auto-discover printers on LAN)\n   - Add printers (Bambu Lab, Moonraker/Klipper, PrusaLink) with test connection\n   - Create admin account with password\n   - Server settings and quick notification setup\n   - Summary and launch\n\nThe setup wizard runs at `http://\u003cyour-ip\u003e:3000` — open it in your browser to complete setup.\n\nFor a terminal-based install instead:\n```bash\n./install.sh --cli\n```\n\n### Option 2: Manual Install\n\n```bash\ngit clone https://github.com/skynett81/3dprintforge.git\ncd 3dprintforge\nnpm install\ncp config.example.json config.json\n```\n\nEdit `config.json` with your printer details (see [Configuration](#configuration)), then:\n\n```bash\nnpm start\n```\n\nOpen `https://localhost:3443` in your browser (HTTP on port 3000 redirects automatically).\n\n### Option 3: Docker\n\n```bash\ngit clone https://github.com/skynett81/3dprintforge.git\ncd 3dprintforge\ncp config.example.json config.json\n# Edit config.json with your printer details\ndocker compose up -d\n```\n\n\u003e **Important:** `network_mode: host` is required for LAN access to printers via MQTT (port 8883) and camera streams (port 322). This is already set in `docker-compose.yml`.\n\n### Option 4: One-Line Install (curl)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/skynett81/3dprintforge/main/install.sh | bash\n```\n\nOr with wget:\n```bash\nwget -qO- https://raw.githubusercontent.com/skynett81/3dprintforge/main/install.sh | bash\n```\n\n### Option 5: Pterodactyl / wisp.gg\n\nImport the included egg file for game panel hosting:\n\n1. Go to **Admin \u003e Nests \u003e Import Egg**\n2. Upload `egg-3dprintforge.json`\n3. Create a server with the egg — it auto-installs Node.js and dependencies\n4. Set environment variables: `BAMBU_IP`, `BAMBU_SERIAL`, `BAMBU_ACCESS_CODE`\n\n### Option 6: systemd Service (Manual)\n\nAfter any install method, create a systemd service for auto-start:\n\n```bash\nsudo tee /etc/systemd/system/3dprintforge.service \u003e /dev/null \u003c\u003cEOF\n[Unit]\nDescription=3DPrintForge\nAfter=network.target\n\n[Service]\nType=simple\nUser=$(whoami)\nWorkingDirectory=$(pwd)\nExecStart=$(which node) server/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=NODE_ENV=production\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsudo systemctl daemon-reload\nsudo systemctl enable --now 3dprintforge\n```\n\nManage with: `sudo systemctl {start|stop|restart|status} 3dprintforge`\n\n### Option 7: PM2 Process Manager\n\n```bash\nnpm install -g pm2\npm2 start server/index.js --name 3dprintforge\npm2 save\npm2 startup  # auto-start on boot\n```\n\n### Option 8: Demo Mode (No Hardware)\n\nTry the dashboard without a real printer:\n\n```bash\ngit clone https://github.com/skynett81/3dprintforge.git\ncd 3dprintforge\nnpm install\nnpm run demo\n```\n\nThis starts 3 simulated printers (P2S Combo, X1 Carbon, H2D) with live print cycles, telemetry, AMS data, and seeded history.\n\n### Option 9: Raspberry Pi\n\n```bash\n# Install Node.js 22 on Raspberry Pi (ARM64)\ncurl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -\nsudo apt-get install -y nodejs ffmpeg git\n\ngit clone https://github.com/skynett81/3dprintforge.git\ncd 3dprintforge\n./install.sh\n```\n\n\u003e **Tip:** Raspberry Pi 4 (2GB+) or Pi 5 recommended. Pi 3 works but camera streaming may be slow.\n\n### Option 10: Unraid / TrueNAS / NAS\n\nUse the Docker method with the Unraid Community Applications template or TrueNAS TrueCharts:\n\n```bash\ndocker run -d --name 3dprintforge \\\n  --network host \\\n  -v /mnt/user/appdata/3dprintforge/data:/app/data \\\n  -v /mnt/user/appdata/3dprintforge/config.json:/app/config.json \\\n  -v /mnt/user/appdata/3dprintforge/certs:/app/certs \\\n  --restart unless-stopped \\\n  ghcr.io/skynett81/3dprintforge:latest\n```\n\n---\n\n## Configuration\n\nEdit `config.json` (created from `config.example.json`):\n\n```json\n{\n  \"printers\": [\n    {\n      \"id\": \"my-bambu\",\n      \"name\": \"My P1S\",\n      \"ip\": \"192.168.1.100\",\n      \"serial\": \"01S00A000000000\",\n      \"accessCode\": \"12345678\",\n      \"model\": \"P1S\",\n      \"type\": \"bambu\"\n    },\n    {\n      \"id\": \"my-klipper\",\n      \"name\": \"My Voron\",\n      \"ip\": \"192.168.1.200\",\n      \"type\": \"moonraker\",\n      \"port\": 80\n    },\n    {\n      \"id\": \"my-prusa\",\n      \"name\": \"My MK4\",\n      \"ip\": \"192.168.1.150\",\n      \"type\": \"prusalink\",\n      \"accessCode\": \"your-api-key\"\n    }\n  ],\n  \"server\": {\n    \"port\": 3000,\n    \"httpsPort\": 3443,\n    \"cameraWsPortStart\": 9001,\n    \"forceHttps\": true\n  }\n}\n```\n\n### Finding Your Printer Details\n\n**Bambu Lab:**\n\n| Field | Where to Find |\n|-------|--------------|\n| `ip` | Printer screen: Settings \u003e WiFi/Network \u003e IP Address |\n| `serial` | Printer screen: Settings \u003e Device \u003e Serial Number |\n| `accessCode` | Printer screen: Settings \u003e WiFi/Network \u003e LAN Access Code |\n\n**PrusaLink:**\n\n| Field | Where to Find |\n|-------|--------------|\n| `ip` | Printer screen: Settings \u003e Network \u003e IP Address |\n| `accessCode` | PrusaLink API key from printer screen or PrusaSlicer |\n\n**OctoPrint:**\n\n| Field | Where to Find |\n|-------|--------------|\n| `ip` | OctoPrint host IP (e.g. your Raspberry Pi) |\n| `port` | OctoPrint port (default 80) |\n| `accessCode` | OctoPrint API key from Settings → API → Global API Key |\n| `webcamUrl` | Optional: Custom webcam snapshot URL |\n\n**Moonraker / Klipper:**\n\n| Field | Where to Find |\n|-------|--------------|\n| `ip` | Your printer's network IP address |\n| `port` | Moonraker port (default 80) |\n\n\u003e **Tip:** The setup wizard auto-discovers Bambu and Moonraker printers on your network. Printers can also be added, edited, and deleted from the Settings tab in the dashboard — no restart required.\n\n### Multiple Printers\n\nMix Bambu Lab, OctoPrint, PrusaLink, and Moonraker printers in the same `printers` array. Each printer gets its own connection and camera stream (on consecutive ports starting from `cameraWsPortStart`).\n\n---\n\n## HTTPS\n\nHTTPS is enabled by default. On first start, the server auto-generates a self-signed SSL certificate if none exists. HTTPS runs on port 3443, and HTTP traffic on port 3000 is automatically redirected.\n\nTo use your own certificate, place files in `certs/cert.pem` and `certs/key.pem`.\n\nThe server includes HSTS and CSP security headers. To disable forced HTTPS, set `\"forceHttps\": false` in config.json.\n\n---\n\n## Authentication\n\nThe setup wizard guides you through creating an admin account. You can also configure it manually:\n\nAuthentication is **disabled by default**. Enable it to protect the dashboard:\n\n```json\n{\n  \"auth\": {\n    \"enabled\": true,\n    \"password\": \"your-password\",\n    \"username\": \"admin\",\n    \"sessionDurationHours\": 24\n  }\n}\n```\n\nOr use environment variables (for Docker/Pterodactyl):\n```bash\nBAMBU_AUTH_PASSWORD=your-password BAMBU_AUTH_USERNAME=admin npm start\n```\n\n---\n\n## Notifications\n\nConfigure in **Settings \u003e Notifications** in the dashboard:\n\n| Channel | Configuration |\n|---------|--------------|\n| Telegram | Bot token + chat ID |\n| Discord | Webhook URL |\n| Email | SMTP host, port, credentials |\n| Webhook | Custom URL with headers |\n| ntfy | Server URL + topic |\n| Pushover | API token + user key |\n| SMS | Twilio or generic HTTP gateway |\n\n14 events available including print status, errors, maintenance, queue, and filament alerts. Quiet hours supported.\n\n---\n\n## Updating\n\nThe dashboard checks for updates automatically (every 6 hours). When a new version is available, a toast notification appears.\n\n**From the dashboard:** Click \"View details\" on the toast or go to Settings \u003e System \u003e Update Now.\n\n**Manual (git):**\n```bash\ngit pull \u0026\u0026 npm install\n# Restart the server\n```\n\n**Docker:**\n```bash\ndocker compose pull \u0026\u0026 docker compose up -d\n```\n\n---\n\n## Troubleshooting\n\n| Problem | Solution |\n|---------|----------|\n| Bambu printer not connecting | Verify IP (`ping`), access code, port 8883 open, same LAN |\n| Moonraker printer not connecting | Verify IP (`ping`), Moonraker running, port open (default 80) |\n| Camera not working | Install `ffmpeg`, verify camera enabled on printer |\n| SQLite error | Update to Node.js 22+: `node -v` |\n| Docker: printer not found | Ensure `network_mode: host` in docker-compose.yml |\n| Port already in use | Change `server.port` in config.json or set `SERVER_PORT` env var |\n| Dashboard blank after update | Clear browser cache (Ctrl+Shift+R) |\n\n---\n\n## More Documentation\n\n- **[Features](docs/project/features.md)** — complete feature list\n- **[Architecture](docs/project/architecture.md)** — stack, modules, components, project structure\n- **[Changelog](docs/project/changelog.md)** — version history\n- **[Security](docs/system/security.md)** — authentication, encryption, rate limiting, SSRF guards\n- **[Installation Guide](INSTALL.md)** — detailed step-by-step install instructions\n- **[Docusaurus Docs](website/)** — full documentation site at `/docs/` and [GitHub Pages](https://skynett81.github.io/3dprintforge/)\n\n---\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b my-feature`\n3. Run in dev mode: `npm run dev`\n4. Test with demo: `npm run demo`\n5. Submit a pull request\n\n---\n\n## License\n\n[AGPL-3.0](LICENSE) — SkyNett81\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskynett81%2F3dprintforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskynett81%2F3dprintforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskynett81%2F3dprintforge/lists"}