A modern, cross-platform desktop application for designing and printing labels for Phomemo Q30/D30 series Bluetooth thermal printers. Built with Tauri, Svelte 5, and Fabric.js.
- Object-Based Editing: Full manipulation support - move, scale, rotate, and align text, icons, shapes, and rulers
- Integrated Icon Library: Search and insert from over 200,000 icons via the Iconify API
- Professional Typography:
- Searchable Google Fonts picker with live previews
- Built-in font library with ~300 popular fonts (works offline)
- Paginated browsing for high performance
- Precision Tools:
- Visual grid with configurable snapping
- Smart alignment tools (Left, Center, Right, Top, Middle, Bottom)
- Dynamic ruler objects for physical measurements
- Templates: Save, load, and delete label designs using LocalStorage
- Multi-Platform Bluetooth: Works on Linux, Windows, macOS (via native Tauri backend)
- Web Bluetooth Fallback: Also works in modern browsers (Chrome/Edge) without installation
- Dual-Mode Printing: Automatically detects environment and switches between Web Bluetooth and Native Rust bridge
- Phomemo Protocol Support: Full support for the proprietary raster protocol used by Phomemo printers
- Cross-Platform: Linux, Windows, macOS support via Tauri
- Flatpak Support: Easy installation on Linux distributions
- Hardware Workarounds: Built-in fixes for NVIDIA/Wayland compatibility issues
Download the latest release for your platform from the Releases page:
| Platform | Download |
|---|---|
| Linux (AppImage) | web-label-printer_*_amd64.AppImage |
| Linux (DEB) | web-label-printer_*_amd64.deb |
| Linux (Flatpak) | com.phomemo.weblabelprinter.flatpak |
| Windows | web-label-printer_*_x64-setup.exe |
| macOS (Intel) | web-label-printer_*_x64.dmg |
| macOS (Apple Silicon) | web-label-printer_*_aarch64.dmg |
# Download the .flatpak file from releases
flatpak install --user com.phomemo.weblabelprinter.flatpak
# Run
flatpak run com.phomemo.weblabelprinter- Node.js 22+
- Rust 1.77+
- Platform-specific dependencies:
- Linux:
webkit2gtk-4.1,gtk3,openssl,libsoup3 - Windows: Microsoft Visual Studio Build Tools
- macOS: Xcode Command Line Tools
- Linux:
# Clone the repository
git clone https://github.com/Rbanh/web-label-printer.git
cd web-label-printer
# Install dependencies
npm install
# Development mode
npm run dev:linux # Linux (with hardware workarounds)
npm run dev # Windows/macOS
# Build for production
npm run tauri buildnpm run flatpak- Ensure your Phomemo Q30/D30 printer is powered on
- Click "Select Printer" in the app
- Choose your printer from the list
- The printer will be remembered for future sessions
- Use the toolbar to add text, icons, shapes, or rulers
- Select objects by clicking on them
- Drag to move, use corner handles to resize
- Use alignment tools for precise positioning
- Enable grid for snap-to-grid functionality
- Design your label
- Click "Print Label" (or press
P) - The app will connect to your printer and send the label
| Key | Action |
|---|---|
P |
Print Label |
Delete |
Delete selected object |
Ctrl/Cmd + S |
Save template |
Ctrl/Cmd + Z |
Undo |
┌─────────────────────────────────────────────┐
│ Svelte 5 Frontend │
│ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │
│ │ Fabric.js│ │ Iconify │ │ Google Fonts│ │
│ │ Canvas │ │ API │ │ API │ │
│ └─────────┘ └─────────┘ └─────────────┘ │
└─────────────────┬───────────────────────────┘
│ Tauri IPC
┌─────────────────▼───────────────────────────┐
│ Rust Backend (Tauri) │
│ ┌─────────────┐ ┌─────────────────────┐ │
│ │ btleplug │ │ Native Bluetooth │ │
│ │ (BlueZ/ │ │ Protocol Handler │ │
│ │ CoreBluetooth)│ │ │
│ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────┘
The Phomemo printers use a proprietary raster protocol:
- Service UUID:
0000ff00-0000-1000-8000-00805f9b34fb - Write Characteristic:
0000ff02-0000-1000-8000-00805f9b34fb - Protocol: ESC/POS with custom raster commands
web-label-printer/
├── src/ # Svelte frontend
│ ├── App.svelte # Main application component
│ └── main.ts # Entry point
├── src-tauri/ # Tauri/Rust backend
│ ├── src/
│ │ ├── lib.rs # Bluetooth & printing logic
│ │ └── main.rs # Application entry
│ ├── Cargo.toml # Rust dependencies
│ └── tauri.conf.json # Tauri configuration
├── flatpak/ # Flatpak packaging
│ ├── com.phomemo.weblabelprinter.yaml
│ └── build.sh
├── .github/workflows/ # CI/CD pipelines
│ └── release.yml # Multi-platform builds
└── package.json # Node dependencies
The app includes workarounds for NVIDIA driver issues. If you still encounter problems:
WEBKIT_DISABLE_DMABUF_RENDERER=1 GDK_BACKEND=x11 web-label-printer- Ensure BlueZ is running:
systemctl status bluetooth - Make sure printer is not paired in system Bluetooth settings
- Check printer is discoverable (LED should be flashing)
- Ensure printer is powered on and not connected to another device
- Try disconnecting from system Bluetooth settings first
- Restart the app and try again
The app uses ESC/POS raster protocol optimized for Phomemo printers. If labels appear distorted:
- Check your label width setting matches physical label size
- Ensure sufficient label height for your content
- Frontend: Svelte 5, TypeScript, Vite/Rolldown
- Canvas: Fabric.js for object-oriented design
- Backend: Tauri 2.x, Rust
- Bluetooth: btleplug (cross-platform BLE)
- Packaging: Flatpak, NSIS, DMG
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Original Project: dmsc/web-label-printer - The foundation this fork builds upon
- This fork was developed with AI assistance, adding native Bluetooth support, Flatpak packaging, and cross-platform CI/CD
MIT License - see LICENSE for details.
