A label editor for label printers such as the Brother QL series. Design labels with text, lines, rectangles and images, then print them directly or save them as PDF. Labels save as .labelgood files, with auto save and crash recovery. Runs on Windows and Linux.
- Installer: x64 · ARM64
- Or in PowerShell:
irm https://raw.githubusercontent.com/NotCoffee418/Labelgood/main/install.ps1 | iex
- Debian/Ubuntu: x64 · ARM64
- Fedora/openSUSE: x64 · ARM64
- AppImage: x64 · ARM64
- Or any distro:
curl -fsSL https://raw.githubusercontent.com/NotCoffee418/Labelgood/main/install.sh | bash
MSI, portable builds and checksums are on the releases page.
Labelgood prints through the system's own printer drivers, so no extra tools are needed:
- Windows: any installed printer. Options such as cutting come from the driver's own settings.
- Linux: CUPS. Use the permanent queue for your printer (e.g.
QL-810W); temporary auto-discovered queues don't report their options.
The print dialog shows whatever options the selected printer's driver offers (cutting, quality, media type, …) and remembers your choices per printer.
- Brother QL-810W (Windows, Linux)
- Any label printer with a CUPS driver, on Linux
See SUPPORTED_DEVICES.md for details, and to report a printer that isn't listed.
Labels save as .labelgood files (File > Save), with images embedded, so one file is the whole label. The installer, the .deb/.rpm packages and install.sh register the file type, so double-clicking a label opens it in Labelgood. Dropping a label onto the window opens it too.
- Auto Save (File menu, on by default) saves a label that already has a file shortly after each change.
- Crash recovery: while a label has unsaved changes, a copy is kept in the app's data folder. If Labelgood closes without saving them (a crash, power loss), the next start offers to restore it. Leftovers are under File > Recover Unsaved Labels.
- Node.js (v24 LTS or later)
- Rust (latest stable)
- System dependencies for Tauri (see Tauri Prerequisites)
npm install # install dependencies
npm run tauri dev # run the app in development mode
npm run tauri build # build the app and its installers/packagessrc/- Svelte frontendroutes/+page.svelte- the app's single page, composed from the components belowlib/components/- UI components (toolbar, canvas, settings panel, print dialog, ...)lib/state/- shared state (runes in.svelte.tsmodules) and the editor's behaviour: elements, undo, mouse gestures, keyboard shortcuts, clipboard, printing, settingslib/- helpers without app state: types, label formats, rich text editing, rendering for print, and typed wrappers for the Rust commands
src-tauri/- Rust backend (printing, PDF generation, fonts, label files, crash recovery)linux/- desktop entry template, file type definition and AppStream metadata for the Linux packages
static/- Static assets.vscode/- Editor settings and recommended extensions
Recommended editor: VS Code with the Svelte, Tauri and rust-analyzer extensions.
Pushing a version tag builds and publishes a release:
git tag v1.0.0
git push origin v1.0.0Tags must be plain vMAJOR.MINOR.PATCH. The tag is the only place the version comes from: the version in Cargo.toml and package.json is a 0.0.0 placeholder that marks development builds, so there's nothing to bump by hand.
The label file format has its own version (FILE_VERSION in src/lib/state/document.svelte.ts), which only changes when the file format does; see the comment there.
The workflow runs the tests, then builds with Tauri's bundler:
- Windows (x64 and ARM64): installer, MSI and portable executable
- Linux (x86_64 and ARM64):
.deb,.rpm, AppImage and plain binary
and creates a GitHub release for the tag with all of them. Linux ARM64 is built natively on GitHub's ARM runners; Windows ARM64 is cross-compiled on x64 Windows.
