Cross-platform 3D printer management & slicing app built with Flutter + Rust
Overview • Features • Architecture • Getting Started • Build • Structure
Printer Control is an end-to-end 3D printing workflow app that covers the entire pipeline — from importing STL/3MF models, adjusting slicer parameters, generating G-code, to remotely controlling Klipper printers over LAN via the Moonraker protocol.
The core slicing engine is written in Rust for performance, called from Dart via FFI through background isolates, ensuring fast cross-platform slicing without ever blocking the UI thread.
| Feature | Description | |
|---|---|---|
| 🔍 | LAN Discovery | Auto-scan local subnets for Moonraker printers with per-interface progress |
| 🖨️ | Multi-printer Management | Connect and control multiple Klipper printers simultaneously |
| ✂️ | Built-in Slicer | Import STL/3MF → configure parameters → slice → export G-code |
| 📦 | Batch Print | Upload + start print on multiple printers in one action |
| 📁 | Model Library | Manage local model and G-code files with quick slice/print shortcuts |
| 📊 | Real-time Monitoring | Live temperature charts, print progress, and status via WebSocket |
| 🎮 | Printer Control | XY/Z movement pad, extruder control, temperature presets, G-code console |
| 🌐 | Internationalization | Full Chinese & English localization |
| 🌙 | Dark Mode | System-following / light / dark theme |
┌───────────────────────────────────────────────────────┐
│ UI Layer │
│ Screens · Widgets · Responsive Layout │
├───────────────────────────────────────────────────────┤
│ State Layer (Provider) │
│ Connection · PrinterState · Slicer · BatchPrint │
│ ModelLibrary · Settings │
├───────────────────────────────────────────────────────┤
│ Service Layer │
│ MoonrakerService — WebSocket JSON-RPC │
│ SlicerService — Rust FFI via Isolate │
│ LanScanner — Subnet-aware TCP scan │
├───────────────────────────────────────────────────────┤
│ Native Layer (Rust) │
│ slicer_core — mesh parsing · slicing · G-code gen │
└───────────────────────────────────────────────────────┘
Key design decisions:
- Provider + ChangeNotifier with 50ms debounce on high-frequency state updates
- Isolate-based FFI — all Rust calls run in background isolates, never blocking UI
- Semaphore-controlled concurrency — LAN scan uses 50 concurrent TCP connections with exponential backoff retry
- Moonraker WebSocket JSON-RPC 2.0 — real-time printer communication with auto-reconnect
- Flutter SDK ≥ 3.12
- Rust toolchain (for slicer_core)
- Platform tools: Android Studio / Visual Studio / Xcode
git clone https://github.com/Rebort-a/printer_control.git
cd printer_control
flutter pub get
flutter gen-l10n
flutter runRust library compilation is integrated into each platform's build pipeline — no manual steps needed.
flutter build windows # → slicer_core.dll
flutter build apk # → libslicer_core.so (arm64-v8a)
flutter build web # → web bundle (slicer disabled — no FFI on web)Manual Rust build (optional)
cd slicer_core
cargo build --release
# Windows: target/release/slicer_core.dll
# Linux: target/release/libslicer_core.so
# Android: cargo ndk -t arm64-v8a --releaselib/
├── main.dart # Entry + Provider init
├── app.dart # MaterialApp (theme, locale)
├── screens/
│ ├── main_shell.dart # Responsive NavigationRail / Bar
│ ├── device_list_screen.dart # Printer list, LAN discovery, batch print
│ ├── printer_detail_screen.dart # Printer dashboard (tabs)
│ ├── model_library_screen.dart # Model & G-code file management
│ ├── slicer_screen.dart # Model loading, slice settings, export
│ └── settings_screen.dart # Global settings
├── providers/ # State management (ChangeNotifier)
├── service/
│ ├── moonraker_service.dart # WebSocket JSON-RPC client
│ ├── slicer_service.dart # Rust FFI bindings
│ ├── lan_scanner.dart # Subnet-aware LAN scanner
│ └── debug_log.dart # Debug-only logger
├── models/ # Data models
├── widgets/ # MovementPad, TempChart
└── l10n/ # Localization (en + zh)
slicer_core/ # Rust slicing engine
├── src/
│ ├── lib.rs # FFI exports
│ ├── mesh/ # STL/3MF parsing, geometry
│ ├── slicer/ # Layer generation, infill
│ └── gcode/ # G-code writer
└── Cargo.toml
| Layer | Technology |
|---|---|
| UI | Flutter 3.x, Material 3 |
| State | Provider (ChangeNotifier) |
| Network | web_socket_channel, http |
| Native | Rust (slicer_core via dart:ffi) |
| Storage | shared_preferences, file system |
| i18n | flutter_gen_l10n (ARB) |
Printer communication uses Moonraker's WebSocket JSON-RPC 2.0:
| Operation | Method |
|---|---|
| Connect | ws://<ip>:<port>/websocket |
| Identify | server.connection.identify |
| Subscribe | printer.objects.subscribe |
| Send G-code | printer.gcode.script |
| Upload file | HTTP POST /server/files/upload |