Linux label designer for the Brother VC-500W colour (ZINK) label printer – GTK 4 / libadwaita, 26 languages https://etiketto.joshuahirsig.xyz
  • Python 97.8%
  • Shell 1.9%
  • HTML 0.2%
Find a file
joshii-h 6fd3d0c1b9
All checks were successful
CI / quality (push) Successful in 1m37s
CI / test (push) Successful in 1m46s
CI / result (push) Successful in 2s
Tests: compare markup as plain text (apostrophe escaping differs between GLib/libadwaita versions)
2026-11-05 15:13:15 +01:00
.forgejo Merge branch 'docs-site' 2026-11-05 15:09:41 +01:00
.github Release mirroring on GitHub with the built-in GITHUB_TOKEN; no GitHub token stored on Forgejo 2026-11-05 14:40:19 +01:00
build-aux/flatpak Flatpak on GNOME 51; README: build the Flatpak locally 2026-11-05 14:06:29 +01:00
data User documentation with Zensical, published on every release 2026-11-05 15:07:38 +01:00
docs Tests for RTL detection and isolated titles; docs/protocol.md (VC-500W protocol, own description) 2026-11-05 14:17:53 +01:00
etiketto Printer backends; VC-500W colour correction, rawrgb, bw mode, status and cassette info 2026-11-05 15:01:25 +01:00
po Printer backends; VC-500W colour correction, rawrgb, bw mode, status and cassette info 2026-11-05 15:01:25 +01:00
site User documentation with Zensical, published on every release 2026-11-05 15:07:38 +01:00
tests Tests: compare markup as plain text (apostrophe escaping differs between GLib/libadwaita versions) 2026-11-05 15:13:15 +01:00
tools Merge branch 'docs-site' 2026-11-05 15:09:41 +01:00
.gitignore User documentation with Zensical, published on every release 2026-11-05 15:07:38 +01:00
CONTRIBUTING.md Format CONTRIBUTING example; check.sh: one command per line so set -e catches every failure 2026-11-05 15:09:41 +01:00
install.sh Flathub polish: GNOME HIG icon + symbolic icon, AppStream metainfo (summary, branding, light/dark screenshots), default-style screenshots, installer ships metainfo 2026-11-05 13:35:24 +01:00
LICENSE zinklabel: label designer for the Brother VC-500W 2026-11-05 12:19:07 +01:00
pyproject.toml Fix mypy findings without suppressions; RTL from the app's own translation; isolate LTR codes in titles 2026-11-05 14:16:37 +01:00
README.md User documentation with Zensical, published on every release 2026-11-05 15:07:38 +01:00

Etiketto

Label designer for the Brother VC-500W colour label printer (ZINK paper), for the Linux desktop. GTK 4 and libadwaita, in English and 23 more languages: German, French, Italian, Spanish, Portuguese (Portugal and Brazil), Dutch, Swedish, Finnish, Estonian, Polish, Hungarian, Russian, Ukrainian, Turkish, Arabic, Hindi, Thai, Vietnamese, Indonesian, Malay, Korean, Japanese and Chinese (Traditional for Taiwan and Hong Kong, Simplified).

Brother only ships the Color Label Editor for Windows, macOS and phones. Etiketto brings the same workflow to Linux: the inserted cassette is detected, the label grows with its content, and it prints over the network in the printer's own protocol, including the vivid colour mode and the cut modes that AirPrint does not offer.

User documentation (English, German): https://etiketto.joshuahirsig.xyz

Screenshots

Main window: QR code and text on a 50 mm label

Full-colour label with a background image Square sticker with an image and border
Full colour: background image printed edge to edge Sticker: fixed 50 × 50 mm, image and border
Editing a text element Print dialog with cut and colour mode
Text with any font, colour and size Copies, cut mode, vivid or normal colours
German interface, 12 mm cable label
German interface (24 languages in total), 12 mm cable label

Screenshots use the default GNOME style; Etiketto follows your desktop's light or dark mode and accent colour.

The labels shown are in docs/examples; open them with Etiketto.

Features

  • Cassette detection (9, 12, 19, 25, 50 mm) and remaining tape
  • Automatic length (as long as the content) or a fixed length in mm
  • Text with any installed font, bold/italic, colour, multiple lines, size fitted to the tape or fixed in pt; emoji and font fallback via Pango
  • Images and photos, background colour, background image, border
  • QR codes, Code 128 and EAN-13 barcodes
  • Live preview at print resolution: what you see is what is printed
  • Print with vivid or normal colours, full cut, half cut or no cut, copies
  • Save labels as .etiketto files (images embedded) and reuse them as templates
  • Drag and drop images or .etiketto files onto the window
  • Export as PNG

Install

Requirements from your distribution: Python 3.11+, PyGObject with GTK 4 and libadwaita, pycairo, gettext. Everything else goes into a private virtual environment.

git clone https://git.joshuahirsig.xyz/joshii/etiketto.git
cd etiketto
./install.sh                # per user, no root; ./install.sh --uninstall
Distribution system packages
Debian / Ubuntu python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 python3-gi-cairo python3-venv gettext
Fedora python3-gobject gtk4 libadwaita python3-cairo gettext
Arch python-gobject gtk4 libadwaita python-cairo gettext
Gentoo dev-python/pygobject gui-libs/gtk:4 gui-libs/libadwaita dev-python/pycairo sys-devel/gettext

Then start Etiketto from the app menu. On first start enter the printer's host name, e.g. VC-500W1234.local (needs mDNS / nss-mdns) or its IP address. Outside Flatpak the host is also read from ~/.config/labelprinter/config.json if you use the labelprinter CLI. In Flatpak, .local names are resolved through the system's Avahi daemon.

Flatpak (build locally)

flatpak install --user flathub org.gnome.Sdk//51 org.gnome.Platform//51
flatpak-builder --user --install --force-clean build-dir \
    build-aux/flatpak/xyz.joshuahirsig.Etiketto.yml
flatpak run xyz.joshuahirsig.Etiketto

Check it like Flathub does:

flatpak install --user flathub org.flatpak.Builder
flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
    manifest build-aux/flatpak/xyz.joshuahirsig.Etiketto.yml

How labels are laid out

Elements (text, image, code) are placed one after another along the tape, each filling the tape height unless a text has a fixed size. With Automatic length the label is exactly as long as its content plus the spacing; with a fixed length the content is aligned and, if needed, scaled down. The printer adds a few millimetres of unprintable margin at the ends for the cutter.

Printers

Made for the Brother VC-500W, which is currently the only printer using this protocol. Printing goes through labelprinter (native protocol on TCP port 9100).

Development

uv venv --system-site-packages .venv
uv pip install --python .venv/bin/python -e . pytest ruff
.venv/bin/python -m pytest
.venv/bin/ruff check . && .venv/bin/ruff format --check .
LANGUAGE=de .venv/bin/python -m etiketto.app

Translations: xgettext → po/etiketto.pot, strings in tools/strings_<lang>.py, python3 tools/fill_po.py writes the .po files; install.sh compiles them.

Contributing

Contributions are welcome, see CONTRIBUTING.md. Pull requests go to the Forgejo repository; GitHub is a mirror.

Credits

The VC-500W protocol was reverse engineered by m7i.org; Etiketto prints through its descendant labelprinter (m7i.org → lenchan139 → sgrimee).

License

AGPL-3.0-or-later, like labelprinter which it builds on. Not affiliated with Brother Industries; "Brother" and "VC-500W" are trademarks of their owners.